Programowanie Proceduralne
W semestrze zimowym 2024/25 wykład odbywa się w poniedziałki w godz. 12-14 w Audytorium Aleksandra Jabłońskiego WFAiIS
Wykład
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
-
- Trochę historii komputerów i programowania.
- Podstawowe pojęcia,
- Języki programowania - historia, klasyfikacja.
- Środowiska programistyczne.
- Pliki źródłowe: hello.c
-
- Algorytmy i ich cechy.
- Zadanie algorytmiczne, specyfikacja.
- Formy zapisu algorytmów - np. schematy blokowe.
- Przykłady algorytmów: alg. Euclidesa
- Pliki źródłowe:
-
- 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:
-
- kompilator GCC i jego opcje
- lintery (cppcheck), narzędzia poprawiające czytelność kodu (astyle)
- systemy kontroli wersji (git, GitHub)
-
- 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:
-
- 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:
- euclid3.c - największy wspólny dzialnik
- pierwsza.c, pierwsza2.c - sprawdzanie czy liczba jest pierwsza
- globalne.c - demonstracja różnic pomiędzy zm. globalnymi i lokalnymi
- silnia2.c - wyznaczanie silni za pomocą f. rekurencyjnej
-
- 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:
- przeszukiwanie.c - przeszukiwanie liniowe
- przeszukiwanie2.c - przeszukiwanie liniowe z wartownikiem
- wyznaczanie środka masy układu punktów:
- sm1.c - punkt materialny reprezentowany jako tablica
float punkt[4]
- sm2.c - punkt materialny reprezentowany przez strukturę
struct punkt
- sm3.c - punkt materialny reprezentowany przez strukturę zawierającą tablicę
struct punkt
- sm4.c - układ punktów reprezentowany przez tablicę struktur
float punkt[]
- sm6.c - układ punktów reprezentowany przez strukturę z tablicą punktów
struct chmura
-
- 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:
- minmax2.c - dziel i zwyciężaj
- wyznaczanie dominanty w ciągu liczb całkowitych
- dominanta1.c - wersja naiwna
- dominanta2.c - wersja szybsza
-
- 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:
- dec2all.c zamiana do innego systemu liczbowego
-
- Reprezentacja znaków, kod ASCII
- Łańcuchy znakowe
- Formatowanie za pomocą printf() i scanf()
- Przykłady algorytmów:
- wyszukiwanie wzorca
- Pliki źródłowe:
- strindex.c wyszukiwanie wzorca metodą naiwną i Boera-Moore'a
-
- Operatory bitowe, przesunięcie bitowe
- Operator rzutowania
- Operator warunkowy
?:
- Wszystkie operatory i ich priorytety
- Przykład: szyfrowanie XOR, maski bitowe
- Pliki źródłowe:
- szyfr-xor.c szyfrowanie tekstu za pomocą operacji XOR
-
- Typ wyliczeniowy enum
- Struktury, unie, pola bitowe
- Instrukcja typedef i jej użycie w deklaracji struktur
- Pliki źródłowe:
- bitfield.c - demonstracja użycia pól bitowych
-
- 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
- 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
Kilka przydatnych odnośników
- ANSI C for Programmers on UNIX Systems by Tim Love
- https://www.learn-c.org/ interactive C tutorial.
- sphere online judge Become a true programming master
Zintegrowane środowiska programistyczne (IDE)
- Visual Studio (Windows) wystarczy darmowe Visual Studio Community z kompilatorem Visual C++
- Visua Studio Code (Windows/Linux/Mac OS) + wtyczka Microsoft C/C++ extension + kompilator (np. gcc, MinGW). Zobacz C/C++ for Visual Studio Code
- Code::Blocks (GNU Linux, MS Windows, Mac OS X)
- Bloodshed Software - Dev-C++ (MS Windows) Nie rozwijany od 2005 !!
Rozwijana nieoficjalna wersja DevC++ Orvel DevC++ - Kdevelop KDE Development Environment (GNU Linux)
- Anjuta DevStudio IDE for C and C++, written for GTK/GNOME (GNU Linux)
- CodeLitle - A Free, open source, cross platform C,C++,PHP and Node.js IDE
Kompilatory C Online
- paiza.io Online C Compiler