Programowanie Proceduralne
Transkrypt
Programowanie Proceduralne
Programowanie Proceduralne Programowanie Proceduralne Bożena Woźna-Szcześniak [email protected] Jan Długosz University, Poland Wykład 1 Programowanie Proceduralne Wprowadzenie Cel wykładów z programowania proceduralnego Wykład jest poświecony ˛ jezykowi ˛ C i jego celem jest nauczenie projektowania i psania programów w tym jezyku. ˛ Zalecana Literatura ◮ Kernighan Brian W., Ritchie Dennis M. Jezyk ˛ ANSI C. Wydawnictwa Naukowo-Techniczne. Warszawa, 2004 i późniejsze. ◮ Stephen Prata. Jezyk ˛ C. Szkoła Programowania. Wydanie V. Wydawnictwo Helion. 2006 i poźniejsze. Programowanie Proceduralne Wprowadzenie Cel wykładów z programowania proceduralnego Wykład jest poświecony ˛ jezykowi ˛ C i jego celem jest nauczenie projektowania i psania programów w tym jezyku. ˛ Zalecana Literatura ◮ Kernighan Brian W., Ritchie Dennis M. Jezyk ˛ ANSI C. Wydawnictwa Naukowo-Techniczne. Warszawa, 2004 i późniejsze. ◮ Stephen Prata. Jezyk ˛ C. Szkoła Programowania. Wydanie V. Wydawnictwo Helion. 2006 i poźniejsze. Programowanie Proceduralne Wprowadzenie Plan ◮ Wprowadzenie do C ◮ Pisanie programów w C ◮ Nasz pierwszy program - podstawy Programowanie Proceduralne Wprowadzenie do C Rozwój jezyka ˛ C ◮ Jezyk ˛ C został zaprojektowany przez Dennisa Ritchie’ego w laboratoriach AT&T Bell na poczatku ˛ lat 70-tych XX wieku. ◮ Poprzednikiem jezyka ˛ C był interpretowany jezyk ˛ B, który Ritchie rozwinał˛ właśnie w jezyk ˛ C. ◮ Pierwszy okres rozwoju jezyka ˛ to lata 1969-1973. ◮ W roku 1973 w jezyku ˛ C udało sie˛ zaimplementować jadro ˛ (ang. kernel) systemu operacyjnego Unix. ◮ W roku 1978 Brian Kernighan i Dennis Ritchie opublikowali dokumentacje˛ jezyka: ˛ The C Programming Language (wydanie polskie, Jezyk ˛ ANSI C). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110163-3. Programowanie Proceduralne Wprowadzenie do C Rozwój jezyka ˛ C ◮ Jezyk ˛ C został zaprojektowany przez Dennisa Ritchie’ego w laboratoriach AT&T Bell na poczatku ˛ lat 70-tych XX wieku. ◮ Poprzednikiem jezyka ˛ C był interpretowany jezyk ˛ B, który Ritchie rozwinał˛ właśnie w jezyk ˛ C. ◮ Pierwszy okres rozwoju jezyka ˛ to lata 1969-1973. ◮ W roku 1973 w jezyku ˛ C udało sie˛ zaimplementować jadro ˛ (ang. kernel) systemu operacyjnego Unix. ◮ W roku 1978 Brian Kernighan i Dennis Ritchie opublikowali dokumentacje˛ jezyka: ˛ The C Programming Language (wydanie polskie, Jezyk ˛ ANSI C). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110163-3. Programowanie Proceduralne Wprowadzenie do C Rozwój jezyka ˛ C ◮ Jezyk ˛ C został zaprojektowany przez Dennisa Ritchie’ego w laboratoriach AT&T Bell na poczatku ˛ lat 70-tych XX wieku. ◮ Poprzednikiem jezyka ˛ C był interpretowany jezyk ˛ B, który Ritchie rozwinał˛ właśnie w jezyk ˛ C. ◮ Pierwszy okres rozwoju jezyka ˛ to lata 1969-1973. ◮ W roku 1973 w jezyku ˛ C udało sie˛ zaimplementować jadro ˛ (ang. kernel) systemu operacyjnego Unix. ◮ W roku 1978 Brian Kernighan i Dennis Ritchie opublikowali dokumentacje˛ jezyka: ˛ The C Programming Language (wydanie polskie, Jezyk ˛ ANSI C). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110163-3. Programowanie Proceduralne Wprowadzenie do C Rozwój jezyka ˛ C ◮ Jezyk ˛ C został zaprojektowany przez Dennisa Ritchie’ego w laboratoriach AT&T Bell na poczatku ˛ lat 70-tych XX wieku. ◮ Poprzednikiem jezyka ˛ C był interpretowany jezyk ˛ B, który Ritchie rozwinał˛ właśnie w jezyk ˛ C. ◮ Pierwszy okres rozwoju jezyka ˛ to lata 1969-1973. ◮ W roku 1973 w jezyku ˛ C udało sie˛ zaimplementować jadro ˛ (ang. kernel) systemu operacyjnego Unix. ◮ W roku 1978 Brian Kernighan i Dennis Ritchie opublikowali dokumentacje˛ jezyka: ˛ The C Programming Language (wydanie polskie, Jezyk ˛ ANSI C). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110163-3. Programowanie Proceduralne Wprowadzenie do C Rozwój jezyka ˛ C ◮ Jezyk ˛ C został zaprojektowany przez Dennisa Ritchie’ego w laboratoriach AT&T Bell na poczatku ˛ lat 70-tych XX wieku. ◮ Poprzednikiem jezyka ˛ C był interpretowany jezyk ˛ B, który Ritchie rozwinał˛ właśnie w jezyk ˛ C. ◮ Pierwszy okres rozwoju jezyka ˛ to lata 1969-1973. ◮ W roku 1973 w jezyku ˛ C udało sie˛ zaimplementować jadro ˛ (ang. kernel) systemu operacyjnego Unix. ◮ W roku 1978 Brian Kernighan i Dennis Ritchie opublikowali dokumentacje˛ jezyka: ˛ The C Programming Language (wydanie polskie, Jezyk ˛ ANSI C). Englewood Cliffs, NJ: Prentice Hall. ISBN 0-13-110163-3. Programowanie Proceduralne Wprowadzenie do C Rozwój jezyka ˛ C ◮ Wersja jezyka ˛ C opisana w The C Programming Language cz˛esto nazywana jest K&R C (od nazwisk autorów), aby odróżnić ja˛ od późniejszego standardu C89 wprowadzonego w roku 1989, nazywanego dziś ANSI C lub też Standard C. ◮ W roku 1990 standard ANSI C został zmodyfikowany i nazwany C90. ◮ W roku 1999 standard C90 został zmodyfikowany i nazwany C99. ◮ W roku 2007 ogłoszono prace˛ nad nowym standardem C1X. ◮ Na wykładzie z programowania prodeduralnego i laboratoriach bedziemy ˛ używać standardu C89/C99. Programowanie Proceduralne Wprowadzenie do C Rozwój jezyka ˛ C ◮ Wersja jezyka ˛ C opisana w The C Programming Language cz˛esto nazywana jest K&R C (od nazwisk autorów), aby odróżnić ja˛ od późniejszego standardu C89 wprowadzonego w roku 1989, nazywanego dziś ANSI C lub też Standard C. ◮ W roku 1990 standard ANSI C został zmodyfikowany i nazwany C90. ◮ W roku 1999 standard C90 został zmodyfikowany i nazwany C99. ◮ W roku 2007 ogłoszono prace˛ nad nowym standardem C1X. ◮ Na wykładzie z programowania prodeduralnego i laboratoriach bedziemy ˛ używać standardu C89/C99. Programowanie Proceduralne Wprowadzenie do C Rozwój jezyka ˛ C ◮ Wersja jezyka ˛ C opisana w The C Programming Language cz˛esto nazywana jest K&R C (od nazwisk autorów), aby odróżnić ja˛ od późniejszego standardu C89 wprowadzonego w roku 1989, nazywanego dziś ANSI C lub też Standard C. ◮ W roku 1990 standard ANSI C został zmodyfikowany i nazwany C90. ◮ W roku 1999 standard C90 został zmodyfikowany i nazwany C99. ◮ W roku 2007 ogłoszono prace˛ nad nowym standardem C1X. ◮ Na wykładzie z programowania prodeduralnego i laboratoriach bedziemy ˛ używać standardu C89/C99. Programowanie Proceduralne Wprowadzenie do C Rozwój jezyka ˛ C ◮ Wersja jezyka ˛ C opisana w The C Programming Language cz˛esto nazywana jest K&R C (od nazwisk autorów), aby odróżnić ja˛ od późniejszego standardu C89 wprowadzonego w roku 1989, nazywanego dziś ANSI C lub też Standard C. ◮ W roku 1990 standard ANSI C został zmodyfikowany i nazwany C90. ◮ W roku 1999 standard C90 został zmodyfikowany i nazwany C99. ◮ W roku 2007 ogłoszono prace˛ nad nowym standardem C1X. ◮ Na wykładzie z programowania prodeduralnego i laboratoriach bedziemy ˛ używać standardu C89/C99. Programowanie Proceduralne Wprowadzenie do C Rozwój jezyka ˛ C ◮ Wersja jezyka ˛ C opisana w The C Programming Language cz˛esto nazywana jest K&R C (od nazwisk autorów), aby odróżnić ja˛ od późniejszego standardu C89 wprowadzonego w roku 1989, nazywanego dziś ANSI C lub też Standard C. ◮ W roku 1990 standard ANSI C został zmodyfikowany i nazwany C90. ◮ W roku 1999 standard C90 został zmodyfikowany i nazwany C99. ◮ W roku 2007 ogłoszono prace˛ nad nowym standardem C1X. ◮ Na wykładzie z programowania prodeduralnego i laboratoriach bedziemy ˛ używać standardu C89/C99. Programowanie Proceduralne Wprowadzenie do C Gdzie jest stosowany jezyk ˛ C? ◮ C stał sie˛ popularny poza Laboratoriami Bella (gdzie powstał) po 1980 roku i stał sie˛ dominujacym ˛ jezykiem ˛ do programowania: ◮ ◮ ◮ ◮ ◮ ◮ systemów operacyjnych z rodziny Linux. mikrokontrolerów: samochody, samolotach, urzadzeniach ˛ kuchennych, itp. systemów wbudowanych: telefony komórkowe, ipod-y, itp. procesorów sygnałowych (ang. digital signal processor DSP), czyli procesorów do cyfrowej obróbki sygnałów: systemy telewizji cyforowej, odtwarzacze audio, itp. ... wszedzie ˛ tam, gdzie zależy nam na pisaniu szybkich i niskopoziomowych programów. Na bazie jezyka ˛ C w latach osiemdziesiatych ˛ Bjarne Stroustrup stworzył jezyk ˛ C++, który wprowadza możliwość programowania obiektowego. Programowanie Proceduralne Wprowadzenie do C Gdzie jest stosowany jezyk ˛ C? ◮ C stał sie˛ popularny poza Laboratoriami Bella (gdzie powstał) po 1980 roku i stał sie˛ dominujacym ˛ jezykiem ˛ do programowania: ◮ ◮ ◮ ◮ ◮ ◮ systemów operacyjnych z rodziny Linux. mikrokontrolerów: samochody, samolotach, urzadzeniach ˛ kuchennych, itp. systemów wbudowanych: telefony komórkowe, ipod-y, itp. procesorów sygnałowych (ang. digital signal processor DSP), czyli procesorów do cyfrowej obróbki sygnałów: systemy telewizji cyforowej, odtwarzacze audio, itp. ... wszedzie ˛ tam, gdzie zależy nam na pisaniu szybkich i niskopoziomowych programów. Na bazie jezyka ˛ C w latach osiemdziesiatych ˛ Bjarne Stroustrup stworzył jezyk ˛ C++, który wprowadza możliwość programowania obiektowego. Programowanie Proceduralne Wprowadzenie do C Gdzie jest stosowany jezyk ˛ C? ◮ C stał sie˛ popularny poza Laboratoriami Bella (gdzie powstał) po 1980 roku i stał sie˛ dominujacym ˛ jezykiem ˛ do programowania: ◮ ◮ ◮ ◮ ◮ ◮ systemów operacyjnych z rodziny Linux. mikrokontrolerów: samochody, samolotach, urzadzeniach ˛ kuchennych, itp. systemów wbudowanych: telefony komórkowe, ipod-y, itp. procesorów sygnałowych (ang. digital signal processor DSP), czyli procesorów do cyfrowej obróbki sygnałów: systemy telewizji cyforowej, odtwarzacze audio, itp. ... wszedzie ˛ tam, gdzie zależy nam na pisaniu szybkich i niskopoziomowych programów. Na bazie jezyka ˛ C w latach osiemdziesiatych ˛ Bjarne Stroustrup stworzył jezyk ˛ C++, który wprowadza możliwość programowania obiektowego. Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C ◮ Niewielka liczba słów kluczowych. auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C ◮ Niewielka liczba słów kluczowych. auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C ◮ Możliwość definiowania złożonych struktur danych: struktury, unie. ◮ Jawne stosowanie wskaźników - zarzadzanie ˛ pamieci ˛ a˛ i tablicami. ◮ Kompilacja do kodu natywnego (ang. native code), czyli kodu pracujacego ˛ z danym procesorem (np. Intel x86) i zbiorem jego instrukcji. ◮ Współpraca z macro preprocessor-em: m.in. obsługa dyrektywy #include, #ifndef, #define, #endif, itp. ◮ Szeroka gama bibliotek standardowych. Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C ◮ Możliwość definiowania złożonych struktur danych: struktury, unie. ◮ Jawne stosowanie wskaźników - zarzadzanie ˛ pamieci ˛ a˛ i tablicami. ◮ Kompilacja do kodu natywnego (ang. native code), czyli kodu pracujacego ˛ z danym procesorem (np. Intel x86) i zbiorem jego instrukcji. ◮ Współpraca z macro preprocessor-em: m.in. obsługa dyrektywy #include, #ifndef, #define, #endif, itp. ◮ Szeroka gama bibliotek standardowych. Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C ◮ Możliwość definiowania złożonych struktur danych: struktury, unie. ◮ Jawne stosowanie wskaźników - zarzadzanie ˛ pamieci ˛ a˛ i tablicami. ◮ Kompilacja do kodu natywnego (ang. native code), czyli kodu pracujacego ˛ z danym procesorem (np. Intel x86) i zbiorem jego instrukcji. ◮ Współpraca z macro preprocessor-em: m.in. obsługa dyrektywy #include, #ifndef, #define, #endif, itp. ◮ Szeroka gama bibliotek standardowych. Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C ◮ Możliwość definiowania złożonych struktur danych: struktury, unie. ◮ Jawne stosowanie wskaźników - zarzadzanie ˛ pamieci ˛ a˛ i tablicami. ◮ Kompilacja do kodu natywnego (ang. native code), czyli kodu pracujacego ˛ z danym procesorem (np. Intel x86) i zbiorem jego instrukcji. ◮ Współpraca z macro preprocessor-em: m.in. obsługa dyrektywy #include, #ifndef, #define, #endif, itp. ◮ Szeroka gama bibliotek standardowych. Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C ◮ Możliwość definiowania złożonych struktur danych: struktury, unie. ◮ Jawne stosowanie wskaźników - zarzadzanie ˛ pamieci ˛ a˛ i tablicami. ◮ Kompilacja do kodu natywnego (ang. native code), czyli kodu pracujacego ˛ z danym procesorem (np. Intel x86) i zbiorem jego instrukcji. ◮ Współpraca z macro preprocessor-em: m.in. obsługa dyrektywy #include, #ifndef, #define, #endif, itp. ◮ Szeroka gama bibliotek standardowych. Programowanie Proceduralne Wprowadzenie do C Standardowe zbiory nagłówkowe ◮ ◮ ◮ ◮ ◮ ◮ ◮ ◮ ◮ ◮ stdio.h - funkcje standardowego wejścia/wyjścia, obsługa plików stdlib.h - najbardziej podstawowe funkcje, np. do zarzadzania ˛ pamieci ˛ a˛ ctype.h - klasyfikowanie znaków. math.h - funkcje matematyczne string.h - funkcje do obsługi łańcuchów znaków limits.h/float.h - właściwości typów całkowitych/zmiennoprzecinkowych zależne od implementacji. time.h - funkcje obsługi czasu. stdarg.h - narz˛edzia dla funkcji ze zmienna˛ liczba˛ argumentów. locale.h - ustawienia miedzynarodowe. ˛ errno.h - deklaracje kodów błedów. ˛ Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C Jezyk ˛ C nie posiada obsługi: ◮ wyjatków. ˛ ◮ sprawdzania zakresów, np. zakresów tablic (ang. range-checking). ◮ sprawdzania zgodności typów podczas czasu wykonania. ◮ automatycznego zarzadzania ˛ dynamicznie przydzielona˛ pamieci ˛ a˛ (ang. garbage collection). ◮ obiektów - nie jest to jezyk ˛ zorientowany na programowanie obiektowe tak ja np. C++, Java, C#, czy Python. ◮ metod/funkcji wirtualnych - możliwość istnienia wielu funkcji o tej samej nazwie, powiazana ˛ z możliwościa˛ wyboru konkretnej metody podczas czasu wykonania (ang. polymorphism). Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C Jezyk ˛ C nie posiada obsługi: ◮ wyjatków. ˛ ◮ sprawdzania zakresów, np. zakresów tablic (ang. range-checking). ◮ sprawdzania zgodności typów podczas czasu wykonania. ◮ automatycznego zarzadzania ˛ dynamicznie przydzielona˛ pamieci ˛ a˛ (ang. garbage collection). ◮ obiektów - nie jest to jezyk ˛ zorientowany na programowanie obiektowe tak ja np. C++, Java, C#, czy Python. ◮ metod/funkcji wirtualnych - możliwość istnienia wielu funkcji o tej samej nazwie, powiazana ˛ z możliwościa˛ wyboru konkretnej metody podczas czasu wykonania (ang. polymorphism). Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C Jezyk ˛ C nie posiada obsługi: ◮ wyjatków. ˛ ◮ sprawdzania zakresów, np. zakresów tablic (ang. range-checking). ◮ sprawdzania zgodności typów podczas czasu wykonania. ◮ automatycznego zarzadzania ˛ dynamicznie przydzielona˛ pamieci ˛ a˛ (ang. garbage collection). ◮ obiektów - nie jest to jezyk ˛ zorientowany na programowanie obiektowe tak ja np. C++, Java, C#, czy Python. ◮ metod/funkcji wirtualnych - możliwość istnienia wielu funkcji o tej samej nazwie, powiazana ˛ z możliwościa˛ wyboru konkretnej metody podczas czasu wykonania (ang. polymorphism). Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C Jezyk ˛ C nie posiada obsługi: ◮ wyjatków. ˛ ◮ sprawdzania zakresów, np. zakresów tablic (ang. range-checking). ◮ sprawdzania zgodności typów podczas czasu wykonania. ◮ automatycznego zarzadzania ˛ dynamicznie przydzielona˛ pamieci ˛ a˛ (ang. garbage collection). ◮ obiektów - nie jest to jezyk ˛ zorientowany na programowanie obiektowe tak ja np. C++, Java, C#, czy Python. ◮ metod/funkcji wirtualnych - możliwość istnienia wielu funkcji o tej samej nazwie, powiazana ˛ z możliwościa˛ wyboru konkretnej metody podczas czasu wykonania (ang. polymorphism). Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C Jezyk ˛ C nie posiada obsługi: ◮ wyjatków. ˛ ◮ sprawdzania zakresów, np. zakresów tablic (ang. range-checking). ◮ sprawdzania zgodności typów podczas czasu wykonania. ◮ automatycznego zarzadzania ˛ dynamicznie przydzielona˛ pamieci ˛ a˛ (ang. garbage collection). ◮ obiektów - nie jest to jezyk ˛ zorientowany na programowanie obiektowe tak ja np. C++, Java, C#, czy Python. ◮ metod/funkcji wirtualnych - możliwość istnienia wielu funkcji o tej samej nazwie, powiazana ˛ z możliwościa˛ wyboru konkretnej metody podczas czasu wykonania (ang. polymorphism). Programowanie Proceduralne Wprowadzenie do C Cechy jezyka ˛ C Jezyk ˛ C nie posiada obsługi: ◮ wyjatków. ˛ ◮ sprawdzania zakresów, np. zakresów tablic (ang. range-checking). ◮ sprawdzania zgodności typów podczas czasu wykonania. ◮ automatycznego zarzadzania ˛ dynamicznie przydzielona˛ pamieci ˛ a˛ (ang. garbage collection). ◮ obiektów - nie jest to jezyk ˛ zorientowany na programowanie obiektowe tak ja np. C++, Java, C#, czy Python. ◮ metod/funkcji wirtualnych - możliwość istnienia wielu funkcji o tej samej nazwie, powiazana ˛ z możliwościa˛ wyboru konkretnej metody podczas czasu wykonania (ang. polymorphism). Programowanie Proceduralne Pisanie programów w C Plan ◮ Wprowadzenie do C ◮ Pisanie programów w C ◮ Nasz pierwszy program - podstawy Programowanie Proceduralne Pisanie programów w C Program w jezyku ˛ C ◮ Program w C to plik (zbiór) tekstowy, który zawiera instrukcje jezyka ˛ C (czyli ciagi ˛ znaków), zgodne z obowiazuj ˛ acym ˛ standardem tego jezyka ˛ (obecnie c99). ◮ Pliki z programami źródłowymi w jezyku ˛ C powinny mieć rozszerzenie c. Programowanie Proceduralne Pisanie programów w C Kompilacja programu w C ◮ Podstawowym (i najprostszym) poleceniem kompilacji pliku o nazwie plik.c jest gcc plik.c które w przypadku pomyślnym generuje plik wykonywalny o nazwie a.out umieszczony w tym samym katalogu, zaś w przypadku niepomyślnym wyświetla liste˛ komunikatów o błedach. ˛ Programowanie Proceduralne Pisanie programów w C Kompilacja programu w C ◮ Jeśli chcemy, żeby plik wynikowy miał dowolna˛ inna˛ ustalona˛ przez nas nazwe˛ (rozszerzenie out nie jest obowiazkowe), ˛ możemy użyć polecenia postaci: gcc plik.c -o nazwa ◮ Polecenie gcc umożliwia również jednoczesna˛ kompilacje˛ i połaczenie ˛ w całość kilku plików źródłowych zawierajacych ˛ różne fragmenty (ale nie dowolne) jednego programu. Programowanie Proceduralne Pisanie programów w C Kompilacja programu w C ◮ Jeśli chcemy, żeby plik wynikowy miał dowolna˛ inna˛ ustalona˛ przez nas nazwe˛ (rozszerzenie out nie jest obowiazkowe), ˛ możemy użyć polecenia postaci: gcc plik.c -o nazwa ◮ Polecenie gcc umożliwia również jednoczesna˛ kompilacje˛ i połaczenie ˛ w całość kilku plików źródłowych zawierajacych ˛ różne fragmenty (ale nie dowolne) jednego programu. Programowanie Proceduralne Pisanie programów w C Kompilacja programu w C ◮ Aby kompilować programy zgodne z najnowszym standardem c99 należy użyć nastepuj ˛ acego ˛ polecenia: gcc -std=c99 plik.c -o nazwa ◮ Aby kompilator gcc traktował ostrzeżenia jako błedy ˛ należy użyć nastepuj ˛ acego ˛ polecenia: gcc -std=c99 -Wall plik.c -o nazwa ◮ Do przeprowadzania bardziej skomplikowanych kompilacji i ˛ z łacze ˛ ń zalecany jest program make współpracujacy zawierajacym ˛ polecenia dla niego plikiem Makefile – o tym na jednym z późniejszych wykładów. Programowanie Proceduralne Pisanie programów w C Kompilacja programu w C ◮ Aby kompilować programy zgodne z najnowszym standardem c99 należy użyć nastepuj ˛ acego ˛ polecenia: gcc -std=c99 plik.c -o nazwa ◮ Aby kompilator gcc traktował ostrzeżenia jako błedy ˛ należy użyć nastepuj ˛ acego ˛ polecenia: gcc -std=c99 -Wall plik.c -o nazwa ◮ Do przeprowadzania bardziej skomplikowanych kompilacji i ˛ z łacze ˛ ń zalecany jest program make współpracujacy zawierajacym ˛ polecenia dla niego plikiem Makefile – o tym na jednym z późniejszych wykładów. Programowanie Proceduralne Pisanie programów w C Kompilacja programu w C ◮ Aby kompilować programy zgodne z najnowszym standardem c99 należy użyć nastepuj ˛ acego ˛ polecenia: gcc -std=c99 plik.c -o nazwa ◮ Aby kompilator gcc traktował ostrzeżenia jako błedy ˛ należy użyć nastepuj ˛ acego ˛ polecenia: gcc -std=c99 -Wall plik.c -o nazwa ◮ Do przeprowadzania bardziej skomplikowanych kompilacji i ˛ z łacze ˛ ń zalecany jest program make współpracujacy zawierajacym ˛ polecenia dla niego plikiem Makefile – o tym na jednym z późniejszych wykładów. Programowanie Proceduralne Pisanie programów w C Kompilacja programu w C ◮ W przypadku pomyślnego przebiegu kompilacji kompilator gcc nie wyświetla żadnego komunikatu, zwraca jedynie sterowanie do linii poleceń. ◮ W przypadku błedów ˛ kompilator gcc wyprowadza na standardowe wyjście błedów ˛ (czyli zazwyczaj na ekran) od razu cała˛ liste˛ wykrytych błedów ˛ wraz z podanymi numerami linii programu, w których wystepuj ˛ a. ˛ Programowanie Proceduralne Pisanie programów w C Kompilacja programu w C ◮ W przypadku pomyślnego przebiegu kompilacji kompilator gcc nie wyświetla żadnego komunikatu, zwraca jedynie sterowanie do linii poleceń. ◮ W przypadku błedów ˛ kompilator gcc wyprowadza na standardowe wyjście błedów ˛ (czyli zazwyczaj na ekran) od razu cała˛ liste˛ wykrytych błedów ˛ wraz z podanymi numerami linii programu, w których wystepuj ˛ a. ˛ Programowanie Proceduralne Pisanie programów w C debugowanie Kompilacja programu w C odrobaczanie/debugowanie, ang. debugging ◮ Aby kompilator gcc przekazał informacje o komilowanym programie do programu debugujacego ˛ gdb należy użyć nastepuj ˛ acego ˛ polecenia: gcc -g -std=c99 -Wall plik.c -o nazwa Programowanie Proceduralne Pisanie programów w C debugowanie Kompilacja programu w C odrobaczanie/debugowanie bws@bws:~/programy$ gcc -g -Wall p1.c -o p1 bws@bws:~/programy$ gdb p1 GNU gdb (GDB) 7.1-ubuntu Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/bws/programy/p1...done. (gdb) r Starting program: /home/bws/programy/p1 Hello word ! Program exited normally. (gdb) q bws@bws:~/programy$ Programowanie Proceduralne Pisanie programów w C debugowanie Kompilacja programu w C - używanie gdb ◮ break linenumber - utwórz punkt zatrzymania programu w linii “linenumber” ◮ break file:linenumber - utwórz punkt zatrzymania programu w linii “linenumber” pliku “file”. ◮ run lub r - uruchom program ◮ c - kontynuuj wykonywanie ◮ next lub n - wykonaj nastepna ˛ linie˛ ◮ step - wykonaj nastepna ˛ linie˛ lub wejdź do funkcji ◮ quit lub q - wyjście z programu gdb ◮ print expression lub p expression - drukuj bieżaca ˛ wartość wyrażenia “expression” ◮ help lub h- help programu Programowanie Proceduralne Pisanie programów w C debugowanie Kompilacja programu w C - używanie gdb bws@bws:~/programy$ gdb p1GNU gdb (GDB) 7.1-ubuntu ... Reading symbols from /home/bws/programy/p1...done. (gdb) break 2 Breakpoint 1 at 0x40056c: file p1.c, line 2. (gdb) r Starting program: /home/bws/programy/p1 Breakpoint 1, main () at p1.c:4 4 printf("Hello word ! \n"); (gdb) n Hello word ! 5 int a = 1; (gdb) next 6 printf("a = %d",a); (gdb) print a $1 = 1 (gdb) p a $2 = 1 (gdb) c Continuing. a = 1 Program exited normally. (gdb) q # i n c l u d e < s t d i o . h> i n t main ( v o i d ) { p r i n t f ( " H e l l o word ! \ n " ) ; i n t a = 1; p r i n t f ( " a = %d " , a ) ; return 0; } Programowanie Proceduralne Pisanie programów w C Debugowanie pamieci ˛ Debugowanie pamieci ˛ - program valgrind bws@bws:~/programy$ valgrind ./p1 ==13211== Memcheck, a memory error detector ==13211== Copyright (C) 2002-2009, and GNU GPL’d, by Julian Seward et al. ==13211== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info ==13211== Command: ./p1 ==13211== Hello word ! a = 1==13211== ==13211== HEAP SUMMARY: ==13211== in use at exit: 0 bytes in 0 blocks ==13211== total heap usage: 0 allocs, 0 frees, 0 bytes allocated ==13211== ==13211== All heap blocks were freed -- no leaks are possible ==13211== ==13211== For counts of detected and suppressed errors, rerun with: -v ==13211== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4) Programowanie Proceduralne Pisanie programów w C Debugowanie pamieci ˛ Debugowanie pamieci ˛ - program valgrind bws@bws:~/programy$ valgrind ls ==13217== Memcheck, a memory error detector ==13217== Copyright (C) 2002-2009, and GNU GPL’d, by Julian Seward et al. ==13217== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info ==13217== Command: ls ==13217== p0.c p1 p1.c p2.c ==13217== ==13217== HEAP SUMMARY: ==13217== in use at exit: 19,194 bytes in 11 blocks ==13217== total heap usage: 538 allocs, 527 frees, 83,869 bytes allocated ==13217== ==13217== LEAK SUMMARY: ==13217== definitely lost: 120 bytes in 1 blocks ==13217== indirectly lost: 0 bytes in 0 blocks ==13217== possibly lost: 0 bytes in 0 blocks ==13217== still reachable: 19,074 bytes in 10 blocks ==13217== suppressed: 0 bytes in 0 blocks ==13217== Rerun with --leak-check=full to see details of leaked memory ==13217== ==13217== For counts of detected and suppressed errors, rerun with: -v ==13217== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4) Programowanie Proceduralne Nasz pierwszy program Plan ◮ Wprowadzenie do C ◮ Pisanie programów w C ◮ Nasz pierwszy program - podstawy Programowanie Proceduralne Nasz pierwszy program Struktura Struktura pliku źródłowego .c /* Rozpocznij od komentarza zawierajacego ˛ opis zawartości pliku */ Dyrektywy #include – dołaczanie ˛ (standardowych) bibliotek Inne definicje dla preprocessora Prototypy funkcji i deklaracje zmiennych Definicja funkcji main() { Ciało funkcji main } Definicje pozostałych funkcji Programowanie Proceduralne Nasz pierwszy program Struktura Komentarze ◮ Jednoliniowy: // this is a simple comment ◮ Wieloliniowy: /* To jest komentarz wieloliniowy Druga linia Trzecia linia */ ◮ Ignorowane przez kompilator ◮ Moga˛ wystapić ˛ prawie wsz˛edzie. ◮ Komentarze wileoliniowe nie moga˛ być zagnieżdżane. Programowanie Proceduralne Nasz pierwszy program Struktura Najprostszy program w C i n t main ( v o i d ) { return 0; } Programowanie Proceduralne Nasz pierwszy program Struktura Dyrektywa #include ◮ Dyrektywa #include < standardowy zbiór nagłówkowy > lub #include “ zbiór nagłówkowy w bieżacym ˛ katalogu programisty ” wczytuje/dołacza ˛ do programu zawartość zbioru nagłówkowego, np. #include <stdio.h> dołacza ˛ do programu zbiór stdio.h zawierajacy ˛ podstawowe funkcje wejścia/wyjścia Programowanie Proceduralne Nasz pierwszy program Struktura Dyrektywa #include ◮ Dyrektywa #include < standardowy zbiór nagłówkowy > lub #include “ zbiór nagłówkowy w bieżacym ˛ katalogu programisty ” wczytuje/dołacza ˛ do programu zawartość zbioru nagłówkowego, np. #include <stdio.h> dołacza ˛ do programu zbiór stdio.h zawierajacy ˛ podstawowe funkcje wejścia/wyjścia Programowanie Proceduralne Nasz pierwszy program Struktura Dyrektywa #include # i n c l u d e < s t d i o . h> i n t main ( v o i d ) { p r i n t f ( " H e l l o word ! " ) ; return 0; } Programowanie Proceduralne Nasz pierwszy program Typy danych Standardowe typy danych Typ Przykłady stałych char bool short unsigned short int unsigned int long unsigned long long long unsigned long long float double long double ’a’, ’\n’ 0, 1 12, -97, 0xFFE0, 0177 12u, 100U, 0XFFu 12L,-2001, 0xffffL 12UL,100ul, 0xffeeUL 0xe5e5e5e5LL, 500ll 12ull, 0xffeeULL 12.34f,3.1e-5f, 0x1.5p10, 0x1P-1 12.24,3.1e-5, 0x.1p3 12.34l,3.1e-5l Formanty funkcji printf %c % d, % u % hd, % hx, % ho % hu,% hx, % ho %d, %i, %x, %o %u, %x, %o %ld, %li, %lx, %lo %ld, %li,%lx, %lo %lld, %llx, %llo %llu, %llx, %llo %f, %e, %g, %a %lf, %e, %g, %a %Lf, %Le, %Lg Programowanie Proceduralne Nasz pierwszy program Definicje zmiennych Definicje zmiennych ◮ Zanim zmienna zostanie użyta musi zostać zdefiniowana: # i n c l u d e < s t d i o . h> i n t main ( v o i d ) { char c ; s h o r t s1 , s2 , s3 ; / / l i s t a zmiennych unsigned s h o r t u s i ; int i ; unsigned i n t u i ; long l ; long i n t l i ; unsigned l o n g u l i ; long long l l i ; unsigned l o n g l o n g u l l ; float f ; double d1 ; l o n g double l d , l d 2 ; / / l i s t a zmiennych return 0; } Programowanie Proceduralne Nasz pierwszy program Definicje zmiennych Definicje zmiennych ◮ Definicje zmiennych dla standardowych typów połaczone ˛ z inicjalizacja. ˛ # i n c l u d e < s t d i o . h> i n t main ( v o i d ) { char c = ’ a ’ ; s h o r t s = 1 2 ; unsigned s h o r t u s i = 1 2 ; i n t i = 12; unsigned i n t u i = 12u ; l o n g l = 12L ; unsigned l o n g u l i = 13UL ; l o n g l o n g l l i = 12LL ; unsigned l o n g l o n g u l l = 12 u l l ; f l o a t f = 12.34 f ; double d = 1 2 . 2 4 ; l o n g double l d = 12.34 l ; return 0; } Programowanie Proceduralne Nasz pierwszy program Operatory Operatory arytmetyczne #include <stdio.h> int main (void) { int a = 100, b = 2, c =25, d = 4, result; result = a - b; // odejmowanie printf ("a - b = %i\n", result); result = b * c; // mnożenie printf ("b * c = %i\n", result); result = a / c; // dzielenie printf ("a / c = %i\n", result); result = a + b * c; // priorytety printf ("a + b * c = %i\n", result); printf ("a * b + c * d = %i\n", a * b + c * d); return 0; } Programowanie Proceduralne Nasz pierwszy program Operatory Wyniki a b a a a * / + * b c c b b = = = * + 98 50 4 c = 150 c * d = 300 Programowanie Proceduralne Nasz pierwszy program Operatory Arytmetyka inaczej #include <stdio.h> int main(void) { int a, b; printf("Podaj pierwsza liczbe: "); scanf("%d", &a); printf("Podaj druga liczbe: "); scanf("%d", &b); printf("%d + %d = %d\n", a, b, a + b); printf("%d - %d = %d\n", a, b, a - b); printf("%d * %d = %d\n", a, b, a * b); printf("%d / %d = %d\n", a, b, a / b); printf("%d %% %d = %d\n", a, b, a % b); return 0; } Programowanie Proceduralne Nasz pierwszy program Operatory Operatory logiczne i porównania Operator > < <= >= == != && || ! Znaczenie wiekszy od mniejszy od mniejszy od lub równy wiekszy od lub równy równy różny iloczyn logiczny (and) suma logiczna (or) negacja (not) Programowanie Proceduralne Nasz pierwszy program Operatory Operatory przypisania a=b=c=d=3; Znaczy tyle samo, co a=3; b=3; c=3; d=3; Programowanie Proceduralne Nasz pierwszy program Operatory Operatory przypisania Operator += −= ∗= /= %= Znaczenie a+ = b znaczy a = a + b a− = b znaczy a = a − b a∗ = b znaczy a = a ∗ b a/ = b znaczy a = a/b a% = b znaczy a = a%b Programowanie Proceduralne Nasz pierwszy program Operatory Operator dekrementacji #include <stdio.h> int main (void) { int a = 3; printf("%d\n", a); // dekrementacja przedrostkowa // najpierw zmniejsz, potem użyj printf("%d\n", --a); printf("%d\n", a); // dekrementacja przyrostkowa // najpierw użyj, potem zmiejsz printf("%d\n", a--); printf("%d\n", a); return 0; } Programowanie Proceduralne Nasz pierwszy program Operatory Operator inkrementacji #include <stdio.h> int main (void) { int a = 3; printf("%d\n", a); // inkrementacja przedrostkowa // najpierw zwi˛ eksz, potem użyj printf("%d\n", ++a); printf("%d\n", a); // inkrementacja przyrostkowa // najpierw użyj, potem zwi˛ eksz printf("%d\n", a++); printf("%d\n", a); return 0; } Programowanie Proceduralne Instrukcja warunkowa if #include <stdio.h> int main(void) { int a, b; printf("Podaj pierwsza˛ liczb˛ e: "); scanf("%d", &a); printf("Podaj druga˛ liczb˛ e: "); scanf("%d", &b); printf("%d + %d = %d\n", a, b, a + b); printf("%d - %d = %d\n", a, b, a - b); printf("%d * %d = %d\n", a, b, a * b); if (b != 0) { printf("%d / %d = %d\n", a, b, a / b); printf("%d %% %d = %d\n", a, b, a % b); } return 0; } Programowanie Proceduralne Instrukcja warunkowa if-else #include <stdio.h> int main (void) { char c; printf ("Podaj pojedyńczy znak: "); scanf ("%c", &c); if ((c>=’a’ && c<=’z’) || (c>=’A’ && printf ("To jest litera.\n"); } else if ( c >= ’0’ && c <= ’9’ ) { printf ("To jest cyfra.\n"); } else { printf ("To jest znak specjalny.\n"); } return 0; } c<=’Z’)) { Programowanie Proceduralne Instrukcje iteracyjne while #include <stdio.h> int main (void) { int k = 0; while ( k < 5 ) { printf ("%d. Hello !\n", k + 1); ++k; } return 0; } Programowanie Proceduralne Instrukcje iteracyjne while - Wypisywanie liczby od prawej do lewej #include <stdio.h> int main (void) { int number, rightDigit; printf ("Podaj liczb˛ e: "); scanf ("%d", &number); while (number != 0) { rightDigit = number % 10; printf ("%d", rightDigit); number /= 10; } printf ("\n"); return 0; } Programowanie Proceduralne Instrukcje iteracyjne do-while #include <stdio.h> int main (void) { int s = 0, a; do { printf("Podaj liczb˛ e: "); scanf("%d", &a); if (a > 0) { continue; } if (a == 0) { break; } s += a; } while(1); printf("Suma wprowadzonych liczb ujemnych = %d\n", s); return 0; } Programowanie Proceduralne Tablice #include <stdio.h> int main(void) { long tab[12]={31,28,31,30,31,30,31,31,30,31,30,31}; // Wypisujemy elementy tablicy tab int k = 0; while (k < 12) { printf("%ld ", tab[k]); ++k; } printf("\n"); // Obliczamy sume wszystkich elementów tablicy tab long s = 0; k = 0; while (k < 12) { s += tab[k]; ++k; } printf("%ld\n", s); return 0; } Programowanie Proceduralne Instrukcja iteracyjna for #include <stdio.h> int main(void) { long a[]={31,28,31,30,31,30,31,31,30,31,30,31}; int const n = sizeof(a) / sizeof(a[0]); // Wypisanie tablicy int k; for (k = 0; k < n; ++k) { printf("%ld ", a[k]); } printf("\n"); // Obliczanie sumy elementów tablicy long s = 0; for (k = 0; k < n; ++k) { s += a[k]; } printf("Suma = %ld\n", s); return 0; }