Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ====== Programowanie Proceduralne ====== <WRAP warrning center round box 60%> W semestrze zimowym 2024/25 wykład odbywa się w poniedziałki w godz. 12-14 w Audytorium Aleksandra Jabłońskiego WFAiIS \\ </WRAP> ===== Wykład ===== ---- {{zajecia:pp_2024_2:pp-wyklad.pdf|Slajdy do wykładu (całość 6.5MB)}} \\ //Uwaga: slajdy moga być aktualizowane w trakcie postępów wykładu// Kody źródłowe prezentowane na wykładzie dostepne są w repozytorium GitHub \\ [[https://github.com/IS-UMK/pp_wyklad|https://github.com/IS-UMK/pp_wyklad]] ---- - {{zajecia:pp_2024_2:00-wstep.pdf|Wstęp}} * Trochę historii komputerów i programowania. * Podstawowe pojęcia, * Języki programowania - historia, klasyfikacja. * Środowiska programistyczne. * Pliki źródłowe: {{zajecia:pp_2024_2:src:hello.c}} - {{zajecia:pp_2024_2:01-algorytmy.pdf|Algorytmy - podstawy}}\\ * Algorytmy i ich cechy. * Zadanie algorytmiczne, specyfikacja. * Formy zapisu algorytmów - np. schematy blokowe. * Przykłady algorytmów: alg. Euclidesa * Pliki źródłowe: * {{zajecia:pp_2024_2:src:euclid1.c}} * {{zajecia:pp_2024_2:src:euclid2.c}} * {{zajecia:pp_2024_2:src:euclid1.pas}} * {{zajecia:pp_2024_2:src:euclid1.f}} * {{zajecia:pp_2024_2:src:euclid2.c}} * {{zajecia:pp_2024_2:src:euclid3.c}} * {{zajecia:pp_2024_2:src:euclid3rekurencja.c}} * [[.:wyklad:zad-algorytmy|Przykładowe zadania]] - {{zajecia:pp_2024_2:02-c-wprowadzenie.pdf|Podstawy języka C}}\\ * Struktura kodu. * Zmienne - deklaracja i inicjalizacja. * Najważniejsze operatory: arytmetyczne, relacji i logiczne * Funkcje: ''printf()'', ''scanf()''. * Instrukcje sterujące: if, else, while * Przykłady programów: pole koła, silnia * Komentarze w C * Standardy C (ANSI C vs. C99) * Graficzna postać kodu: wcięcia * Pliki źródłowe: * {{zajecia:pp_2024_2:src:hello.c}} * {{zajecia:pp_2024_2:src:kolo.c}} * {{zajecia:pp_2024_2:src:silnia.c}} * [[.:wyklad:zad-podstawy-c|Przykładowe zadania]] - {{zajecia:pp_2024_2:narzędzia.pdf|Narzędzia programistyczne}} * kompilator GCC i jego opcje * lintery (cppcheck), narzędzia poprawiające czytelność kodu (astyle) * systemy kontroli wersji (git, GitHub) - {{zajecia:pp_2024_2:03-instrukcje-sterujace.pdf|Instrukcje sterujące}}\\ * Powtórzenie: if, while * Pętla sterowana z dołu: do while * Pętla for vs. while * Instrukcja switch * Instrukcja goto i zasady programowania strukturalnego * continue i break * Przykłady programów: pierwiastek kwadratowy (alg. Herona) * Pliki źródłowe: * {{zajecia:pp_2024_2:src:heron.c}} * {{zajecia:pp_2024_2:src:break.c}} * {{zajecia:pp_2024_2:src:czy-pierwsza.c}}, {{zajecia:pp_2024_2:src:czy-pierwsza2.c}}, {{zajecia:pp_2024_2:src:czy-pierwsza3.c}} * {{zajecia:pp_2024_2:src:continue.c}} * {{zajecia:pp_2024_2:src:switch.c}} * {{zajecia:pp_2024_2:src:prime.c}} * {{zajecia:pp_2024_2:src:goto.c}}, {{zajecia:pp_2024_2:src:goto2.c}} * [[.:wyklad:zad-instrukcje|Przykładowe zadania]] - {{zajecia:pp_2024_2:04-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)) vs. iteracja * Przykłady algorytmów: alg. Euklidesa (NWD), wyznaczanie liczb pierwszych, wzór Herona (pole trójkąta), wyznaczanie silni, elementy ciągu Fibonacciego * Pliki źródłowe: * {{zajecia:pp_2024_2:src:euclid3.c}} - największy wspólny dzialnik * {{zajecia:pp_2024_2:src:pierwsza.c}}, {{zajecia:pp_2024_2:src:pierwsza2.c}} - sprawdzanie czy liczba jest pierwsza * {{zajecia:pp_2024_2:src:heron2.c}} - pole trójkąta o bokach ''a'', ''b'', ''c'' * {{zajecia:pp_2024_2:src:globalne.c}} - demonstracja różnic pomiędzy zm. globalnymi i lokalnymi * {{zajecia:pp_2024_2:src:silnia2.c}} - wyznaczanie silni za pomocą f. rekurencyjnej * {{zajecia:pp_2024_2:src:fib1.c}}, {{zajecia:pp_2024_2:src:fib2.c}} - wyznaczanie elementów ciągu Fibonacciego * [[.:wyklad:zad-funkcje|Przykładowe zadania]] - {{zajecia:pp_2024_2:05-tablice-struktury.pdf|Tablice i struktury, czyli złożone typy danych}}\\ * Tablice - deklaracja, inicjowanie, indeksowanie, operator ''[]''. * Tablice jako argumenty funkcji. * Typowe przykłady użycia tablic: wczytywanie wartości, kopiowanie * Struktury - deklaracja, operator dostępu ''.'', inicjowanie struktur * Typ ''struct'' jako argument funkcji * Struktura jako wartość zwracana z funkcji * Przykłady algorytmów: * przeszukiwanie liniowe * przeszukiwanie liniowe z wartownikiem * wyznaczanie środka masy układu punktów materialnych * Pliki źródłowe: * {{zajecia:pp_2024_2:src:przeszukiwanie.c}} - przeszukiwanie liniowe * {{zajecia:pp_2024_2:src:przeszukiwanie2.c}} - przeszukiwanie liniowe z wartownikiem * wyznaczanie środka masy układu punktów: * {{zajecia:pp_2024_2:src:sm1.c}} - punkt materialny reprezentowany jako tablica ''float punkt[4]'' * {{zajecia:pp_2024_2:src:sm2.c}} - punkt materialny reprezentowany przez strukturę ''struct punkt'' * {{zajecia:pp_2024_2:src:sm3.c}} - punkt materialny reprezentowany przez strukturę zawierającą tablicę ''struct punkt'' * {{zajecia:pp_2024_2:src:sm4.c}} - układ punktów reprezentowany przez tablicę struktur ''float punkt[]'' * {{zajecia:pp_2024_2:src:sm6.c}} - układ punktów reprezentowany przez strukturę z tablicą punktów ''struct chmura'' * [[.:wyklad:zad-tablice-struktury|Przykładowe zadania]] - {{zajecia:pp_2024_2:06-wskazniki.pdf|Wskaźniki, czyli adresy}}\\ * Adresy, wskaźniki, zmienne wskaźnikowe, typ wskaźnikowy. * Deklaracje zmiennych wskaźnikowych. * Operator referencji ''&'' i dereferencji ''*'' * Wskaźniki jako argumenty funkcji. * Wskaźniki jako wartość zwracana z funkcji. * Co wspólnego mają wskaźniki i tablice? * Przykłady algorytmów: * jednoczesne znajdowanie elementu największego i najmniejszego 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_2024_2:src:minmax1.c}} * {{zajecia:pp_2024_2:src:minmax2.c}} - dziel i zwyciężaj * wyznaczanie dominanty w ciągu liczb całkowitych * {{zajecia:pp_2024_2:src:dominanta1.c}} - wersja naiwna * {{zajecia:pp_2024_2:src:dominanta2.c}} - wersja szybsza * [[.:wyklad:zad-wskazniki|Przykładowe zadania]] - {{zajecia:pp_2024_2:07-symbole-short.pdf|Reprezentacja symboli w komputerze: bity, bajty, liczby}}\\ * Bit, bajt i kody bitowe * Pozycyjne systemy liczbowe * Reprezentacja liczby całkowitej i rzeczywistej w komputerze * Limity typów liczbowych. * Niedokładności przy obliczeniach zmiennopozycyjnych * Przykłady algorytmów: * zapis liczby w innym systemie pozycyjnym * Pliki źródłowe: * {{zajecia:pp_2024_2:src:dec2all.c}} zamiana do innego systemu liczbowego * [[.:wyklad:zad-symbole-liczby|Przykładowe zadania]] - {{zajecia:pp_2024_2:08-symbole2-short.pdf|Reprezentacja symboli w komputerze: znaki, łańcuchy znakowe}}\\ * Reprezentacja znaków, kod ASCII * Łańcuchy znakowe * Formatowanie za pomocą printf() i scanf() * Przykłady algorytmów: * wyszukiwanie wzorca * Pliki źródłowe: * {{zajecia:pp_2024_2:src:strindex.c}} wyszukiwanie wzorca metodą naiwną i Boera-Moore'a * [[.:wyklad:zad-symbole-znaki|Przykładowe zadania]] - {{zajecia:pp_2024_2:09-operatory-short.pdf|Operatory: powtórzenie i uzupełnienie.}} * Operatory bitowe, przesunięcie bitowe * Operator rzutowania * Operator warunkowy ''?:'' * Wszystkie operatory i ich priorytety * Przykład: szyfrowanie XOR, maski bitowe * Pliki źródłowe: * {{zajecia:pp_2024_2:src:szyfr-xor.c}} szyfrowanie tekstu za pomocą operacji XOR * [[.:wyklad:zad-operatory|Przykładowe zadania]] - {{zajecia:pp_2024_2:10-typy-zlozone.pdf|Złożone typy danych: powtórzenie i uzupełnienie}} * Typ wyliczeniowy enum * Struktury, unie, pola bitowe * Instrukcja typedef i jej użycie w deklaracji struktur * Pliki źródłowe: * {{zajecia:pp_2024_2:src:enum1.c}}, {{zajecia:pp_2024_2:src:enum2.c}} - demonstracja użycia typu wyliczeniowego * {{zajecia:pp_2024_2:src:typedef1.c}}, {{zajecia:pp_2024_2:src:struct2.c}} - demonstracja użycia instrukcji ''typedef'' * {{zajecia:pp_2024_2:src:union1.c}}, {{zajecia:pp_2024_2:src:union2.c}} - demonstracja użycia unii * {{zajecia:pp_2024_2:src:bitfield.c}} - demonstracja użycia pól bitowych * [[.:wyklad:zad-typy-zlozone|Przykładowe zadania]] - {{zajecia:pp_2024_2:11-strumienie.pdf|Pliki i strumienie}} * Plik i format pliku * Systemy plików * Strumienie * Podstawowe operacje na strumieniach w C * Pliki źródłowe: * {{zajecia:pp_2024_2:src:zapis.c}} przykładowy zapis do pliku * {{zajecia:pp_2024_2:src:odczyt.c}} przykładowy odczyt z pliku * [[.:wyklad:zad-strumienie|Przykładowe zadania]] - {{zajecia:pp_2024_2:12-podsumowanie.pdf|Podsumowanie: elementy inżynierii oprogramowania}} * Co było a czego nie było na wykładzie? * Wstęp do inżynierii oprogramowania. * Kilka dobrych rad * O stylu i standardach kodowania * Obsługa błędów w C ===== Zaliczenie wykładu ===== Warunkami uzyskania zaliczenia z wykładu są: * pozytywna ocena z laboratorium * zaliczenie testu z wynikiem > 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| C reference]] * [[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]] by Tim Love * [[http://www.ioccc.org/|The International Obfuscated C Code Contest]] * [[https://www.learn-c.org/|]] interactive C tutorial. * [[https://www.spoj.com/|sphere online judge]] Become a true programming master * [[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 darmowe Visual Studio Community z kompilatorem Visual C%%++%% * [[https://code.visualstudio.com/|Visua Studio Code]] (Windows/Linux/Mac OS) + wtyczka Microsoft C/C%%++%% extension + kompilator (np. gcc, MinGW). Zobacz [[https://code.visualstudio.com/docs/languages/cpp|C/C++ for Visual Studio Code]] * [[http://www.codeblocks.org/|Code::Blocks]] (GNU Linux, MS Windows, Mac OS X) * [[http://www.bloodshed.net/devcpp.html|Bloodshed Software - Dev-C++]] (MS Windows) Nie rozwijany od 2005 !! \\ Rozwijana nieoficjalna wersja DevC%%++%% [[http://orwelldevcpp.blogspot.com/|Orvel DevC++]] * [[http://www.eclipse.org/|Eclipse]] z wtyczką [[http://www.eclipse.org/cdt/|CDT ]] (GNU Linux, MS 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]] IDE for C and C%%++%%, written for GTK/GNOME (GNU Linux) * [[https://codelite.org/|CodeLitle]] - A Free, open source, cross platform C,C%%++%%,PHP and Node.js IDE * [[https://www.guru99.com/best-c-ide.html|21 Best C IDE (Editor) for Windows & Mac in 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|Compile and Execute C Online]] * [[https://paiza.io/en/projects/new?language=c|paiza.io]] Online C Compiler * [[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]]