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;
}

Podobne dokumenty