====== Programowanie proceduralne ====== W semestrze zimowym 2026/27 wykład odbywa się we wtorki w godz. 14:00-16:00 w Audytorium Aleksandra Jabłońskiego (AAJ), WFAiIS.\\ ===== Wykład ===== ---- {{zajecia:pp_2026_2:pp-wyklad.pdf|Slajdy do wykładu (całość: 6,5 MB)}} \\ //Uwaga: slajdy mogą być aktualizowane w trakcie wykładu. Data ostatniej aktualizacji znajduje się na pierwszej stronie slajdów.// Kody źródłowe prezentowane na wykładzie są dostępne w repozytorium GitHub:\\\n*** End Patch [[https://github.com/IS-UMK/pp_wyklad|https://github.com/IS-UMK/pp_wyklad]] ---- - {{zajecia:pp_2026_2:pp-01-wstep.pdf|Wstęp}} * Trochę historii komputerów i programowania. * Podstawowe pojęcia. * Języki programowania - historia i klasyfikacja. * Środowiska programistyczne. * Pliki źródłowe: {{zajecia:pp_2026_2:src:hello.c}} - {{zajecia:pp_2026_2:pp-02-algorytmy.pdf|Algorytmy - podstawy}} * Algorytmy i ich cechy. * Zadanie algorytmiczne, specyfikacja. * Formy zapisu algorytmów, np. schematy blokowe. * Przykład algorytmu: algorytm Euklidesa. * Pliki źródłowe: * {{zajecia:pp_2026_2:src:euclid1.c}} * {{zajecia:pp_2026_2:src:euclid2.c}} * {{zajecia:pp_2026_2:src:euclid1.pas}} * {{zajecia:pp_2026_2:src:euclid1.f}} * {{zajecia:pp_2026_2:src:euclid2.c}} * {{zajecia:pp_2026_2:src:euclid3.c}} * {{zajecia:pp_2026_2:src:euclid3rekurencja.c}} * [[.:wyklad:zad-algorytmy|Zadania]] - {{zajecia:pp_2026_2:pp-03-c-wprowadzenie.pdf|Podstawy języka C}} * Struktura kodu. * Zmienne - deklaracja i inicjalizacja. * Najważniejsze operatory: arytmetyczne, relacyjne i logiczne. * Funkcje: ''printf()'', ''scanf()''. * Instrukcje sterujące: if, else, while. * Przykłady programów: obliczanie pola koła i silni. * Komentarze w języku C. * Standardy języka C (ANSI C i C99). * Graficzna postać kodu - wcięcia. * Pliki źródłowe: * {{zajecia:pp_2026_2:src:hello.c}} * {{zajecia:pp_2026_2:src:kolo.c}} * {{zajecia:pp_2026_2:src:silnia.c}} * [[.:wyklad:zad-podstawy-c|Zadania]] - {{zajecia:pp_2026_2:pp-04-narzędzia.pdf|Narzędzia programistyczne}} * Kompilator GCC i jego opcje. * Lintery (''cppcheck'') i narzędzia poprawiające czytelność kodu (''astyle''). * Systemy kontroli wersji (Git, GitHub). - {{zajecia:pp_2026_2:pp-05-instrukcje-sterujace.pdf|Instrukcje sterujące}} * Powtórzenie: if, while * Pętla sterowana z dołu: do while * Pętla for a while. * Instrukcja switch. * Instrukcja goto i zasady programowania strukturalnego. * Instrukcje continue i break. * Przykład programu: obliczanie pierwiastka kwadratowego (algorytm Herona). * Pliki źródłowe: * {{zajecia:pp_2026_2:src:heron.c}} * {{zajecia:pp_2026_2:src:break.c}} * {{zajecia:pp_2026_2:src:czy-pierwsza.c}}, {{zajecia:pp_2026_2:src:czy-pierwsza2.c}}, {{zajecia:pp_2026_2:src:czy-pierwsza3.c}} * {{zajecia:pp_2026_2:src:continue.c}} * {{zajecia:pp_2026_2:src:switch.c}} * {{zajecia:pp_2026_2:src:prime.c}} * {{zajecia:pp_2026_2:src:goto.c}}, {{zajecia:pp_2026_2:src:goto2.c}} * [[.:wyklad:zad-instrukcje|Zadania]] - {{zajecia:pp_2026_2:pp-06-funkcje.pdf|Funkcje, czyli programowanie proceduralne}} * Anatomia funkcji. * Deklaracje i definicje funkcji. * Parametry formalne i aktualne. * Zmienne na stosie. * Zmienne globalne i lokalne. * Funkcje i procedury. * Biblioteki standardowe. * Biblioteka ''math.h'' * Rekurencja (rekurencja (rekurencja)) a iteracja. * Przykłady algorytmów: algorytm Euklidesa (NWD), sprawdzanie, czy liczba jest pierwsza, wzór Herona (obliczanie pola trójkąta), obliczanie silni i wyznaczanie elementów ciągu Fibonacciego. * Pliki źródłowe: * {{zajecia:pp_2026_2:src:euclid3.c}} - wyznaczanie największego wspólnego dzielnika * {{zajecia:pp_2026_2:src:pierwsza.c}}, {{zajecia:pp_2026_2:src:pierwsza2.c}} - sprawdzanie, czy liczba jest pierwsza * {{zajecia:pp_2026_2:src:heron2.c}} - obliczanie pola trójkąta o bokach ''a'', ''b'' i ''c'' * {{zajecia:pp_2026_2:src:globalne.c}} - demonstracja różnic między zmiennymi globalnymi i lokalnymi * {{zajecia:pp_2026_2:src:silnia2.c}} - wyznaczanie silni za pomocą funkcji rekurencyjnej * {{zajecia:pp_2026_2:src:fib1.c}}, {{zajecia:pp_2026_2:src:fib2.c}} - wyznaczanie elementów ciągu Fibonacciego * [[.:wyklad:zad-funkcje|Zadania]] - {{zajecia:pp_2026_2:pp-07-tablice-struktury.pdf|Tablice i struktury, czyli złożone typy danych}} * Tablice - deklaracja, inicjalizacja, indeksowanie i operator ''[]''. * Tablice jako argumenty funkcji. * Typowe przykłady użycia tablic: wczytywanie i kopiowanie wartości. * Struktury - deklaracja, inicjalizacja i operator dostępu ''.''. * Typ ''struct'' jako argument funkcji. * Struktura jako wartość zwracana przez funkcję. * Przykłady algorytmów: * przeszukiwanie liniowe * przeszukiwanie liniowe z wartownikiem * wyznaczanie środka masy układu punktów materialnych. * Pliki źródłowe: * {{zajecia:pp_2026_2:src:przeszukiwanie.c}} - przeszukiwanie liniowe * {{zajecia:pp_2026_2:src:przeszukiwanie2.c}} - przeszukiwanie liniowe z wartownikiem * Wyznaczanie środka masy układu punktów: * {{zajecia:pp_2026_2:src:sm1.c}} - punkt materialny reprezentowany jako tablica ''float punkt[4]'' * {{zajecia:pp_2026_2:src:sm2.c}} - punkt materialny reprezentowany przez strukturę ''struct punkt'' * {{zajecia:pp_2026_2:src:sm3.c}} - punkt materialny reprezentowany przez strukturę zawierającą tablicę ''struct punkt'' * {{zajecia:pp_2026_2:src:sm4.c}} - układ punktów reprezentowany przez tablicę struktur ''float punkt[]'' * {{zajecia:pp_2026_2:src:sm6.c}} - układ punktów reprezentowany przez strukturę z tablicą punktów ''struct chmura'' * [[.:wyklad:zad-tablice-struktury|Zadania]] - {{zajecia:pp_2026_2:pp-08-wskazniki.pdf|Wskaźniki, czyli adresy}} * Adresy, wskaźniki, zmienne wskaźnikowe i typ wskaźnikowy. * Deklaracje zmiennych wskaźnikowych. * Operatory pobrania adresu ''&'' i dereferencji ''*''. * Wskaźniki jako argumenty funkcji. * Wskaźniki jako wartości zwracane przez funkcję. * Co wspólnego mają wskaźniki i tablice? * Przykłady algorytmów: * jednoczesne znajdowanie największego i najmniejszego elementu w ciągu * wyznaczanie najczęściej występującego elementu w ciągu. * Pliki źródłowe: * Wyznaczanie największej i najmniejszej liczby całkowitej: * {{zajecia:pp_2026_2:src:minmax1.c}} * {{zajecia:pp_2026_2:src:minmax2.c}} - metoda „dziel i zwyciężaj” * Wyznaczanie dominanty w ciągu liczb całkowitych: * {{zajecia:pp_2026_2:src:dominanta1.c}} - wersja naiwna * {{zajecia:pp_2026_2:src:dominanta2.c}} - wersja szybsza * [[.:wyklad:zad-wskazniki|Zadania]] - {{zajecia:pp_2026_2:pp-09-symbole.pdf|Reprezentacja symboli w komputerze: bity, bajty, liczby}} * Bit, bajt i kody bitowe * Pozycyjne systemy liczbowe * Reprezentacja liczby całkowitej i rzeczywistej w komputerze * Zakresy typów liczbowych. * Niedokładności obliczeń zmiennoprzecinkowych. * Przykład algorytmu: * zapis liczby w innym systemie pozycyjnym. * Pliki źródłowe: * {{zajecia:pp_2026_2:src:dec2all.c}} - zamiana liczby na zapis w innym systemie liczbowym * [[.:wyklad:zad-symbole-liczby|Zadania]] - {{zajecia:pp_2026_2:pp-10-symbole2.pdf|Reprezentacja symboli w komputerze: znaki, łańcuchy znakowe}} * Reprezentacja znaków i kod ASCII. * Łańcuchy znakowe. * Formatowanie za pomocą funkcji ''printf()'' i ''scanf()''. * Przykład algorytmu: * wyszukiwanie wzorca. * Pliki źródłowe: * {{zajecia:pp_2026_2:src:strindex.c}} - wyszukiwanie wzorca metodą naiwną i algorytmem Boyera-Moore’a * [[.:wyklad:zad-symbole-znaki|Zadania]] - {{zajecia:pp_2026_2:pp-11-operatory.pdf|Operatory: powtórzenie i uzupełnienie}} * Operatory bitowe i przesunięcia bitowe. * Operator rzutowania. * Operator warunkowy ''?:''. * Wszystkie operatory i ich priorytety. * Przykład: szyfrowanie za pomocą XOR i maski bitowe. * Pliki źródłowe: * {{zajecia:pp_2026_2:src:szyfr-xor.c}} - szyfrowanie tekstu za pomocą operacji XOR * [[.:wyklad:zad-operatory|Zadania]] - {{zajecia:pp_2026_2:pp-12-typy-zlozone.pdf|Złożone typy danych: powtórzenie i uzupełnienie}} * Typ wyliczeniowy ''enum''. * Struktury, unie i pola bitowe. * Instrukcja ''typedef'' i jej użycie w deklaracjach struktur. * Pliki źródłowe: * {{zajecia:pp_2026_2:src:enum1.c}}, {{zajecia:pp_2026_2:src:enum2.c}} - demonstracja użycia typu wyliczeniowego * {{zajecia:pp_2026_2:src:typedef1.c}}, {{zajecia:pp_2026_2:src:struct2.c}} - demonstracja użycia instrukcji ''typedef'' * {{zajecia:pp_2026_2:src:union1.c}}, {{zajecia:pp_2026_2:src:union2.c}} - demonstracja użycia unii * {{zajecia:pp_2026_2:src:bitfield.c}} - demonstracja użycia pól bitowych * [[.:wyklad:zad-typy-zlozone|Zadania]] - {{zajecia:pp_2026_2:pp-13-strumienie.pdf|Pliki i strumienie}} * Plik i format pliku. * Systemy plików. * Strumienie. * Podstawowe operacje na strumieniach w języku C. * Pliki źródłowe: * {{zajecia:pp_2026_2:src:zapis.c}} - przykład zapisu do pliku * {{zajecia:pp_2026_2:src:odczyt.c}} - przykład odczytu z pliku * [[.:wyklad:zad-strumienie|Zadania]] ===== Zaliczenie wykładu ===== Warunkami uzyskania zaliczenia z wykładu są: * pozytywna ocena z laboratorium * zaliczenie testu z wynikiem powyżej 50% ===== Literatura ===== * Brian W. Kernighan, Dennis M. Ritchie, //Język ANSI C//\\ * [[http://pl.wikibooks.org/wiki/C|Programowanie w C (WikiBook)]] ({{https://upload.wikimedia.org/wikibooks/pl/6/6a/C.pdf|PDF}}) * Maciej M. Sysło, //"Algorytmy"//, WSiP, Warszawa, 2002. * David Griffiths, Dawn Griffiths, //"Rusz głową! C"//, Helion, Gliwice, 2013. * (prawie) wszystkie książki na temat języka C\\ * [[google>programowanie w języku ANSI C |WWW]] ===== Kilka przydatnych odnośników ===== * [[..:pp:ide_wstep|Ściąga dotycząca programowania w C w Visual Studio]] * [[http://en.cppreference.com/w/c|Dokumentacja języka C (cppreference)]] * [[http://en.wikibooks.org/wiki/C_Programming|Programming C (wikibook)]] ([[http://pl.wikibooks.org/wiki/C|wersja polska)]] * [[http://pl.wikibooks.org/wiki/Programowanie:C:Biblioteka_standardowa:Indeks_alfabetyczny|Alfabetyczny spis funkcji biblioteki standardowej ANSI C (tzw. libc) w wersji C89]] * [[https://freecomputerbooks.com/ANSI-C-for-Programmers-on-UNIX-Systems.html|ANSI C for Programmers on UNIX Systems]] autorstwa Tima Love’a * [[http://www.ioccc.org/|The International Obfuscated C Code Contest]] * [[https://www.learn-c.org/|Interaktywny kurs języka C]]. * [[https://www.spoj.com/|Sphere Online Judge]] - platforma do rozwiązywania zadań programistycznych. * [[https://www.geeksforgeeks.org/c-programming-language/|C Programming Language Tutorial]] ===== Zintegrowane środowiska programistyczne (IDE) ===== * [[https://visualstudio.microsoft.com/pl/vs|Visual Studio]] (Windows) - wystarczy bezpłatna wersja Visual Studio Community z kompilatorem Visual C%%++%%. * [[https://code.visualstudio.com/|Visual Studio Code]] (Windows/Linux/macOS) - wtyczka Microsoft C/C%%++%% Extension i kompilator (np. GCC lub MinGW). Zobacz [[https://code.visualstudio.com/docs/languages/cpp|C/C++ for Visual Studio Code]]. * [[http://www.codeblocks.org/|Code::Blocks]] (GNU/Linux, Windows, macOS). * [[https://dev-cpp.com/Dev-Cpp-5/|Dev-C++]] (Windows). * [[http://www.eclipse.org/|Eclipse]] z wtyczką [[http://www.eclipse.org/cdt/|CDT]] (GNU/Linux, Windows). * [[http://netbeans.org/features/cpp/|NetBeans IDE C and C++ Development]] * [[http://www.kdevelop.org/|KDevelop]] (KDE Development Environment, GNU/Linux). * [[http://anjuta.sourceforge.net/|Anjuta DevStudio]] - środowisko IDE dla C i C%%++%%, oparte na GTK/GNOME (GNU/Linux). * [[https://codelite.org/|CodeLite]] - bezpłatne, otwarte i wieloplatformowe środowisko IDE dla C, C%%++%%, PHP i Node.js. * [[https://www.guru99.com/best-c-ide.html|21 najlepszych edytorów i środowisk IDE dla C na Windows i macOS (2022)]] ===== Kompilatory C online ===== * [[http://ideone.com/|Ideone - kompilator online]] * [[https://www.onlinegdb.com/online_c_compiler|OnlineGDB]] * [[https://www.jdoodle.com/c-online-compiler|jdoodle]] * [[https://www.tutorialspoint.com/compile_c_online.php|Kompiluj i uruchamiaj programy w języku C online]] * [[https://paiza.io/en/projects/new?language=c|paiza.io]] - kompilator języka C online * [[https://www.programiz.com/c-programming/online-compiler/|Programiz C online compiler]] ===== Formatowanie kodu online ===== * [[https://formatter.org/cpp-formatter|C/C++ Formatter]] * [[https://codebeautify.org/c-formatter-beautifier|C formatter]]