Title: Podstawy programowania
1Podstawy programowania
2Sprawy formalne
- 30 godz. wykladu 30 godz. cwiczen (15 godz. w
laboratorium) - zaliczenie laboratorium i egzamin
- obecnosc na wykladach nieobowiazkowa!
3Plan wykladu
Podstawowe informacje o jezyku C (podstawowe typy danych, deklaracje zmiennych i stalych)
Operacje wejscia-wyjscia
Operatory i wyrazenia (priorytety, konwersja typów)
Instrukcja warunkowa i instrukcja wyboru
Instrukcje iteracyjne i sterujace wykonaniem programu
Typy wskaznikowe i tablicowe
Funkcje (metody przekazywania argumentów)
Preprocesor i budowa programu (generowanie kodu wynikowego)
Typy zlozone - struktury i unie
Operacje plikowe
Funkcje rekurencyjne
Standardowe biblioteki (matematyczne, lancuchy znakowe)
Dynamiczne struktury danych (lista, kolejka, stos)
Struktury drzewiaste (sterta, drzewo)
Grafika tekstowa i punktowa
4Programowanie
- Jezyk C
- B. W. Kernighan, Dennis M. Ritchie Jezyk ANSI
C - kompilator GCC
- http//gcc.gnu.org
- system operacyjny Microsoft Windows XP
- srodowisko programistyczne DEV-C
- http//www.bloodshed.net/devcpp.html
5Odrobina historii jezyka C
- 1969 Martin Richards jezyk BCPL
- 1970 Ken Thompson jezyk B
- adaptacja dla UNIX na maszynie DEC PDP-7
- 1972 Dennis Ritchie jezyk C
- DEC PDP-11
- 1983-1989 standaryzacja ANSI
- American National Standards Institute
- 1990 standard ISO
- International Organization for Standardization
6Podstawowe cechy jezyka C
- jezyk ogólnego stosowania
- wzglednie niski poziom
- jezyk imperatywny (proceduralny)
- podstawowe konstrukcje sterujace programowania
strukturalnego - grupowanie instrukcji, podejmowanie decyzji,
wybór przypadku, powtarzanie ze sprawdzaniem
warunku zatrzymania na poczatku i koncu petli,
przerwanie petli
7Podstawowe cechy jezyka C c.d.
- jezyk typowy
- typy podstawowe znaki, liczby calkowite i
zmiennopozycyjne w róznych zakresach - typy pochodne wskazniki, tablice, struktury,
unie - wyrazenia buduje sie z operatorów i ich
argumentów - wyrazenie moze pelnic role instrukcji
- wlacznie z przypisaniem i wywolaniem funkcji
- input/output jest czescia biblioteki a nie jezyka
- przenosny - niezalezny od architektury
- system UNIX jest rozwijany w jezyku C
8Elementarz
- Nie mozna sie nauczyc programowania bez
samodzielnego pisania programów! - proces kompilacji
- edycja kodu zródlowego (.c)
- asemblacja (.o)
- konsolidacja (plik uruchamialny, np. .exe)
- pierwszy program
- Wypisanie na konsoli napisu Hello World!
9Podstawowe typy danych
- int
- -32768 ... 32767 (przynajmniej 2 bajty)
- float
- 1.E-36 1.E36 (4 bajty, precyzja do 7 miejsc)
- double
- 1.E-303 1.E303 (8 bajtów, precyzja do 13
miejsc) - char
- 0 255 (1 bajt)
10Deklaracje zmiennych i stalych
- typ nazwa-zmiennej
- int a
- int x,y,z
- int count7
- const typ nazwa-stalej wartosc
- const int NUM123
- const float PI3.14
11Dodatkowe deklaratory typu
- short
- short int short
- long
- long int long
- signed
- unsigned
12Stale znakowe i liczbowe
- "string"
- A, a,
- A 65
- \ooo
- \xhh
- \n, \t, \r,
- 1234
- 123456789L (123456789l)
- 123U (123u)
- 31 037 0x1f 0X1F
13Formatowany input/output
- printf()
- int res7 printf("Result d",res)
- int a2 int res resa7 printf("Ind,
Result d",a,res) - scanf()
- int dat scanf("d",dat)
- char str20 scanf("s",str)
14Formatowany input/output c.d.
- Usual variable type Display
- c char single
character - d (i) int signed integer
- e (E) float or double exponential
format - f float or double signed decimal
- g (G) float or double use f or e
as required - o int unsigned octal
value - p pointer address stored
in pointer - s array of char sequence of
characters - u int unsigned
decimal - x (X) int unsigned hex
value
15Formatowany input/output c.d.
- flag width.precision
- flag meaning
-
- - left justify
- always display sign
- space display space if there is no sign
- 0 pad with leading zeros
- use alternate form of specifier
16Formatowany input/output c.d.
- o adds a leading 0 to the octal value
- x adds a leading 0x to the hex value
- f or
- e ensures decimal point is printed
- g displays trailing zeros
17Operacje i operatory
- Arytmetyczne
- , -, , /, (modulo)
- Inkrementacja
- , -- (x, x)
- Przypisanie
- , , -, , /,
- Relacyjne
- , !, lt, gt, lt, gt
- Logiczne
- , , !
- Bitowe
- (AND), (OR), (XOR), ltlt, gtgt,
- Koercja/rzutowanie (ang. cast)
- (typ) wyrazenie
- (float)2/5
18Wyrazenia warunkowe
- wyr1 ? wyr2 wyr3
- Np. z(agtb) ? a b
- /zmax(a,b)/
19Instrukcja warunkowa
- if (wyrazenie) instrukcja
- instrukcja zlozona
- if (wyrazenie) instrukcja1 else instrukcja2
- if (wyrazenie1) instrukcja1else if (wyrazenie2)
instrukcja2else if (wyrazenieX)
instrukcjaXelse instrukcja
20Instrukcja wyboru
- switch (wyrazenie) case wyrazenie-stale1
instrukcje1 case wyrazenie-stale2 instrukcje2
default instrukcje - break
21Instrukcje skoku
- bezwarunkowe przekazanie sterowania do innego
miejsca - return wyrazenieopc
- break
- continue
- goto etykieta
- etykieta - poprawny identyfikator
- skok w obrebie tej samej funkcji
- nie nalezy naduzywac!
- uzasadnione w przypadku wyskoku z kilku petli
jednoczesnie
22Instrukcje iteracyjne (petli)
- while (wyrazenie) instrukcja
- do instrukcja while (wyrazenie)
- for (wyr1opc wyr2opc wyr3opc) instrukcja
- mozna opuscic wyrazenia
- for () instrukcja
- for ()
- ominiecie wyr2 jest równowazne wystapieniu stalej
róznej od zera
23Instrukcje petli - przerywanie
- break
- przerwanie "najciasniej otaczajacej" petli
- continue
- przekazanie sterowania do miejsca wznowienia
"najciasniej otaczajacej" petli
24Przerywanie petli - c.d.
while (...) do
for(...) ...
...
...
while (...) br
br
br
- break jest równowazne goto br jesli w ciele
petli nie wystepuje "ciasniejsza" petla
25Przerywanie petli - c.d.
while (...) do
for(...) ...
...
... contin
contin contin
while (...)
- continue jest równowazne goto contin jesli w
ciele petli nie wystepuje "ciasniejsza" petla
26Instrukcje petli - równowaznosc
- for (wyr1 wyr2 wyr3) instrukcja
- wyr1 while (wyr2) instrukcjawyr3
- Uwaga petle sa równowazne gdy instrukcja nie
zawiera continue
27Instrukcje petli - porównanie
- while (wyrazenie) instrukcja
- wyrazenie sprawdzane na poczatku - instrukcja nie
musi byc wykonana ani razu - np. odczyt z pliku
- do instrukcja while (wyrazenie)
- wyrazenie sprawdzane na koncu - instrukcja musi
byc wykonana przynajmniej raz - for (wyr1 wyr2 wyr3) instrukcja
- zwykle wyr1 to inicjalizacja a wyr3 to
inkrementacja - np. ustalona liczba iteracji
28Tablice
- deklaracjatyp identyfikator rozmiar
- np. int array7 char tab256
- Wniosek elementy jednolitego typu
- indeksowanie
- xarray6
- tabi'Z'
- Uwaga indeksowanie od 0 !
29Tablice -c.d.
- deklaracja tablicy wielowymiarowejtyp
identyfikator rozmiar1rozmiar1... - np. int array72 char tab25610100
- inicjowanie
- int arr4 2,3,4,5
- int arr 2,3,4,5
- float f231,2,3, 4,5,6
- Uwaga najlatwiej przetwarzac petla for
30Tablice i wskazniki
- wskaznik to zmienna zawierajaca adres innej
zmiennej - postac deklaracji typ zmienna
- np. char c
- korzysci z uzycia wskazników
- bardziej zwarty i efektywny kod
- czasami jedyny sposób implementacji pewnych
algorytmów w jezyku C - mozliwosc dynamicznego tworzenia zmiennych (w
trakcie pracy programu) - Uwaga latwo mozna napisac zupelnie niezrozumialy
lub bledny kod gdy nie zachowuje sie ostroznosci!
31Tablice i wskazniki -c.d.
- pamiec komputera mozna przedstawic jako tablice
kolejno numerowanych (adresowanych) komórek
pamieci - komórkami pamieci mozna manipulowac indywidualnie
lub calymi grupami - bajtowi odpowiada typ char
- dwóm bajtom odpowiada typ short int
- czterem bajtom odpowiada typ long int
- wskaznik jest grupa komórek, która moze pomiescic
adres - 2 bajty (komputery 16-bitowe)
- 4 bajty (komputery 32-bitowe)
32Tablice i wskazniki -c.d.
- operator adresowy () i wskaznikowy ()
- - referencja, - dereferencja
- przyklad
- int x1, y2, z10
- int ip
- ip jest wskaznikiem do obiektów typu int
- ipx
- teraz ip wskazuje na x
- yip
- y ma teraz wartosc 1
- ip0
- x ma teraz wartosc 0
- ipz0
- teraz ip wskazuje na element z0
33Tablice i wskazniki -c.d.
- równowaznosc tablic i wskazników
- przyklad
- int a10
- int pa paa0
- xpa xa0
- paa0 paa
- xa3 xpa3
- arytmetyka na adresach
- adresy mozna inkrementowac () i dekrementowac
(--) - pa1 - wskazuje na nastepny obiekt
- pai ai
- (pai) ai
34Specjalne typy wskaznikowe
- wskazniki na znak (tablice znakowe) mozna
inicjowac poprzez stale lancuchowe - char str "blah, blah, blah"
- nie mozna zmienic wartosci str
- char ptr " blah, blah, blah"
- mozna przypisac zmiennej ptr inne wskazniki
- wskaznik na typ void moze przechowywac wskazniki
na dowolny typ - void v char p int q ... vp ... vq ...
- v nie moze byc uzyty do adresowania posredniego
(wymaga rzutowania - cast) - p(char)v
35Funkcje w jezyku C
- program w C jest "zbiorem funkcji"
- musi zawierac przynajmniej jedna funkcje (main)
- funkcja to podprogram realizujacy okreslone
zadanie mogacy zwracac do miejsca wywolania
wartosc okreslonego typu - mozna stosowac wielokrotnie
- moze przyjmowac parametry
- ukrywa szczególy implementacji przed innymi
czesciami programu - mozna pisac funkcje w róznych plikach
kompilowanych oddzielnie - mozna laczyc funkcje w biblioteki
- Uwaga raczej kilka malych niz jedna duza funkcja!
36Funkcje w C - ograniczenia
- funkcji nie mozna "zagniezdzac"
- cala funkcja musi byc umieszczona w jednym pliku
- funkcje zawsze przekazuja parametry "przez
wartosc" - konieczne jest uzywanie wskazników
- uzywana funkcja musi byc uprzednio zadeklarowana
37Funkcje w C - c.d.
- deklaracjatyp-wyniku nazwa (parametryopc)
- definicjatyp-wyniku nazwa (parametryopc)
... instrukcje ...return wyrazenieopc - standaryzacja w ANSI C
38Funkcje w C - c.d.
- domyslny typ wyniku to int
- gdy funkcja nie zwraca wartosci stosuje sie typ
void - parametry maja postac typ1 zmienna1, typ2
zmienna2... - w deklaracji moga wystepowac tylko nazwy typów
- liste parametrów mozna pominac w deklaracji - nie
beda wtedy sprawdzane przez kompilator! - dla funkcji bez parametrów stosuje sie zapis
(void) jako liste parametrów
39Funkcje w C - c.d.
- zmienne globalne - zewnetrzne (extern)
- deklaracja poza cialem funkcji
- dostepne z kazdej funkcji
- nie nalezy naduzywac - komplikuje to wieksze
programy - inicjalizacja na 0 gdy brak przypisania
- extern int x
- extern jest domyslne poza funkcja
- zmienne statyczne (static)
- przechowuja wartosc we wszystkich wywolaniach tej
samej funkcji - static int x
- inicjalizacja na 0 gdy brak przypisania
40Funkcje rekurencyjne w C
- Funkcja moze wywolywac sama siebie
- bezposrednio
- posrednio (równiez rekurencja wzajemna!)
- konieczny jest mechanizm stosowy
- kazde wznowienie funkcji otrzymuje na stosie swój
komplet wszystkich zmiennych automatycznych
(niezalezny od poprzedniego) - zalety rekurencji
- bardziej zwarta postac
- bardzo latwo implementowac struktury danych
zdefiniowane w sposób rekurencyjny, np. drzewa - wady rekurencji
- zwykle dluzszy czas dzialania
- zwykle wieksze zuzycie pamieci
41Rekurencja - przyklady
- potega
- xnx x ... x (n razy)
- x01 , xn1x xn
- silnia
- n!12...n
- 0!1, n!(n-1)!n
- liczby Fibonacciego
- realizacja iteracyjna
- realizacja rekurencyjna
- realizacja poprzez formule Bineta
42Rekurencja - przyklady c.d.
- klasyczny problem "Wieze Hanoi"
- szybkie sortowanie (QuickSort)
43Struktury
- struktura w C to obiekt zlozony z jednej lub
kilku zmiennych, byc moze róznych typów,
zgrupowanych "dla wygody" pod jedna nazwa - ulatwiaja zorganizowanie skomplikowanych danych
- umozliwiaja traktowanie zwiazanych ze soba danych
jako jeden obiekt - przyklad - pozycja listy plac
- pracownik ma imie, nazwisko, adres,
wynagrodzenie, itp. - adres to miejscowosc, ulica, numer domu, itp. -
elementem struktury moze byc inna struktura
44Struktury - c.d.
- standard ANSI C daje mozliwosc
- przypisywania struktur
- przypisywania wartosci poczatkowych
- przekazywania jako parametrów do funkcji
- zwracania jako wartosc funkcji
- Uwaga przekazywanie do funkcji przez wartosc
moze byc kosztowne - czasami lepiej uzyc wskaznika
45Struktury - c.d.
- definicja
- struct nazwaopc typ1 skladowa1 typ2
skladowa2... zmienneopc - nazwa jest etykieta - moze byc wykorzystana przy
pózniejszych deklaracjach - bez zmiennych mamy tylko opis ksztaltu struktury
- nie jest rezerwowana zadna pamiec - odwolania
- nazwa-struktury . skladowa
- wskaznik-do-struktury -gt skladowa (np. p-gts
zamiast (p).s) - inicjalizacja jak dla tablicy (poprzez stale)
46Struktury - przyklady
- struct point int x int y
- struct point pt
- struct point maxpoint640,480
- struct point int x int y p,q,r
- struct rect struct point pt1struct point
pt2 - struct rect r
- r.pt1.y100
47Struktury - przyklady - c.d.
- struct rect r, rp r
- równowazne wyrazenia
- r.pt1.x
- rp-gtpt1.x
- (r.pt1).x
- (rp-gtpt1).x
- Uwaga operatory strukturowe (.), (-gt), podobnie
jak nawiasy otaczajace parametry funkcji (()) i
indeksowanie tablic ( ) znajduja sie na
szczycie hierarchii priorytetów - wiaza
najmocniej
48Deklaracja typedef
- mechanizm typedef umozliwia tworzenie nowych nazw
dla typów danych, np. - typedef int Length
- Length len, maxlen
- typedef char String
- typ deklarowany w typedef pojawia sie skladniowo
w miejscu zmiennej - konstruowanie struktur "rekurencyjnie" - np.
drzew - typedef struct tnode Treeptrtypedef struct
tnode char word int count Treeptr
left Treeptr right Treenode
49Unie
- unia w C to zmienna, która moze zawierac obiekty
róznych typów i rozmiarów - przyklad definicji
- union u_tag int ival floaf fval char
sval u - odwolania
- nazwa-unii . skladowa
- wskaznik-do-unii -gt skladowa
50Unie - c.d.
- kompilator "troszczy" sie o zgodnosc polozenia i
pamieci - unia jest wystarczajaco obszerna zeby pomiescic
wartosc najwiekszego z zadeklarowanych w niej
typów - skladnia zblizona do struktury
- unia de facto jest struktura o skladowych nie
przesunietych wzgledem jej poczatku - inicjalizacja tylko wartoscia pierwszego typu
- programista musi sie troszczyc o to, aby
pobierane dane byly zgodne z typem ostatnio
zapisanym
51Unie - przyklad unii w strukturze
- struct char name int flags int
utype union int ival float fval char
sval u symtabNSYM - odwolanie do skladowej ival
- symtabi.u.ival
- odwolanie do pierwszego znaku tekstu w sval
- symtabi.u.sval
- symtabi.u.sval0
52Pola bitowe
- moga reprezentowac znaczniki jednobitowe
- umozliwiaja upakowanie wielu znaczników w jedno
slowo maszyny (zalezne od implementacji) - oszczednosc
- narzucone fomaty danych, np. lacza z urzadzeniami
zewnetrznymi moga wymagac dostepu do kawalków slów
53Pola bitowe - c.d.
- Przyklad
- maski odpowiadajace wlasciwym pozycjom bitów moga
byc zdefiniowane jako stale - define KEYWORD 01
- define EXTERNAL 02
- define STATIC 04
- lub poprzez typ wyliczeniowy
- enum KEYWORD01, EXTERNAL02,STATIC04
- (liczby w maskach musza byc potegami dwójki)
54Pola bitowe - c.d.
- flags EXTERNAL STATIC
- ustawia bity EXTERNAL i STATIC w zmiennej flags
- flags (EXTERNAL STATIC)
- kasuje powyzsze bity
- if (flags (EXTERNAL STATIC)0)...
- warunek jest prawdziwy gdy oba bity sa skasowane
55Pola bitowe - c.d.
- definicja poprzez pola bitowe
- struct unsigned int is_keyword 1unsigned
int is_extern 1unsigned int is_static 1
flags - flags.is_externflags.is_static1
- flags.is_externflags.is_static0
- if (flags.is_extern0 flags.is_static0)...
56Pola bitowe - c.d.
- podobna definicja poprzez pola bitowe
- struct unsigned int is_keyword 1unsigned
int is_extern 1unsigned int is_static 1
flags - unsigned int gwarantuje wartosc bez znaku
- nazwaopc rozmiar
- brak nazwy mozna wykorzystac do "zalatania
dziury" - rozmiar 0 wymusza przesuniecie kolejnych pól do
nastepnego slowa - maszyny wypelniaja pola od lewej do prawej lub
odwrotnie - Uwaga pola nie maja adresów - nie mozna stosowac
operatora
57Obsluga plików
- standardowe wejscie (stdin), wyjscie (stdout) i
wyjscie bledów (stderr) - typ plikowy FILE
- struktura zdefiniowana w pliku naglówkowym
stdio.h - w programach wykorzystuje sie wskaznik do
struktury FILE jako stala umozliwiajaca - otwarcie
- odczyt
- zapis
58Obsluga plików - c.d.
- podstawowe operacje
- FILE fopen(char name, char mode)
- "r" - read
- "w" - write
- "a" - append
- "b" - dla plików binarnych
- "r", "w", "a" - aktualizacja czytanie i
pisanie - miedzy czytaniem nalezy wywolac funkcje
pozycjonujaca - int fclose(FILE fp)
- wywolywana automatycznie na koncu programu
- int fflush(FILE fp)
- FILE reopen(char name, char mode, FILE fp)
- zwykle uzywa sie do zmiany plików zwiazanych z
stdin, stdout, stderr
59Obsluga plików - c.d.
- int ferror(FILE fp)
- wartosc niezerowa gdy wystapil jakis blad
- int feof(FILE fp)
- wartosc niezerowa po napotkaniu konca pliku
- int getc(FILE fp)
- zwraca wczytany znak lub EOF gdy wystapi blad
- getchar
- int putc(int c, FILE fp)
- zwraca wypisany znak lub EOF gdy wystapi blad
- putchar
- int ungetc(int c, FILE fp)
- "oddaje" znak do pliku
60Obsluga plików - c.d.
- pliki tekstowe
- char fgets(char line, int maxline, FILE fp)
- czyta co najwyzej maxline-1 znaków wraz ze
wskaznikiem nowej linii do tablicy line i dodaje
znak '\0' - normalnie wartoscia jest wskaznik do tablicy line
- po napotkaniu bledu lub konca pliku wartoscia
jest NULL - int fputs(char line, FILE fp)
- wpisuje tekst do pliku (nie musi zawierac znaku
nowej linii) - wartoscia jest 0 lub EOF w przypadku bledu
- gets
- uzywa stdin, kasuje znak nowej linii
- puts
- uzywa stdout, dodaje znak nowej linii
61Obsluga plików - c.d.
- formatowane wejscie/wyjscie
- int fprintf(FILE fp, char format, ...)
- int fscanf(FILE fp, char format, ...)
- int sprintf(char s, char format, ...)
- int sscanf(char s, char format, ...)
62Obsluga plików - c.d.
- bezposrednie wejscie/wyjscie
- size_t fread(void p, size_t s, size_t n, FILE
fp) - size_t fwrite(void p, size_t s, size_t n, FILE
fp) - dostep bezposredni (nie sekwencyjny)
- int fseek(FILE fp, long offset, int origin)
- SEEK_SET, SEEK_CUR, SEEK_END
- long ftell(FILE fp)
- void rewind(FILE fp)
- int fgetpos(FILE fp, fpos_t ptr)
- int fsetpos(FILE fp, fpos_t ptr)
63Biblioteka standardowa ltctype.hgt
- funkcje do klasyfikacji znaków - wynik jest typu
int - rózny od 0 gdy argument spelnia dany
warunek - int isalpha(int c)
- int isdigit(int c)
- int isalnum(int c)
- int islower(int c) int tolower(int c)
- int isupper(int c) int toupper(int c)
- int isspace(int c)
- int isxdigit(int c)
- int iscntrl(int c)
64Biblioteka standardowa ltstring.hgt
- funkcje operujace na tekstach - argumenty s i t
sa typu char, cs i ct sa typu const char, n
jest typu size_t, a c ma typ int przeksztalcony
do char - char strcpy(s,ct)
- char strncpy(s,ct,n)
- char strcat(s,ct)
- char strncat(s,ct,n)
- int strcmp(cs,ct)
- int strncmp(cs,ct,n)
- size_t strlen(cs)
65ltstring.hgt - c.d.
- char strchr(cs,c)
- char strrchr(cs,c)
- size_t strspn(cs,ct)
- size_t strcspn(cs,ct)
- char strpbrk(cs,ct)
- char strstr(cs,ct)
- char strtok(s,ct)
- za pierwszym razem wywoluje sie funkcje z
argumentem s róznym od NULL - kolejne wywolania z s równym NULL
- ct moze byc rózny za kazdym razem
- na koncu zwraca NULL
66ltstring.hgt - c.d.
- funkcje operujace na obiektach traktowanych jako
tablice znakowe - argumenty s i t sa typu void,
cs i ct sa typu const void, n jest typu size_t,
a c ma typ int przeksztalcony do unsigned char - void memcpy(s,ct,n)
- void memmove(s,ct,n)
- dziala, gdy obiekty "zachodza" na siebie
- int memcmp(cs,ct,n)
- void memchr(cs,c,n)
- void memset(s,c,n)
67Biblioteka standardowa ltmath.hgt
- funkcje matematyczne - argumenty x i y sa typu
double, n jest typu int, zwracaja wynik typu
double - sin(x) cos(x) tan(x)
- asin(x) acos(x) atan(x)
- exp(x) log(x) log10(x)
- pow(x,y) sqrt(x)
- ceil(x) floor(x)
- fabs(x)
- fmod(x,y)
- modf(x, double ip)
68Biblioteka standardowa ltstdlib.hgt
- funkcje narzedziowe - konwersja liczb,
przydzielanie pamieci, interakcja z systemem
operacyjnym - double atof(const char s)
- int atoi(const char s)
- long atol(const char s)
- double strtod(const char s, char endp)
- jesli endp jest rózny od NULL - nieprzetworzona
czesc napisu - long strtol(const char s,char endp, int b)
- b - podstawa (2-36)
69ltstdlib.hgt - c.d.
- int rand(void)
- wartosc pseudolosowa z przedzialu od 0 do
RAND_MAX (co najmniej 32767) - void srand(unsigned int seed)
- poczatkowy zarodek jest równy 1
70ltstdlib.hgt - c.d.
- void bsearch(const void key, const void base,
size_t n, size_t size,int (cmp)(const void
keyval, const void datum) ) - Uwaga tablica musi byc uporzadkowana rosnaco!
- funkcja cmp musi zwracac -1, 0 lub 1 gdy keyval
poprzedza, jest równy lub nastepuje po datum - void qsort(void base, size_t n, size_t size,
int (cmp)(const void , const void ) ) - porzadkuje w kolejnosci rosnacej
- funkcja porównujaca taka sama jak dla bsearch
71Dynamiczny przydzial pamieci
- ltstdlib.hgt
- void malloc (size_t size)
- zwraca wskaznik do obiektu o rozmiarze size
utworzonego dynamicznie - zwraca NULL gdy nie moze zrealizowac polecenia
- void calloc(size_t n, size_t size)
- tworzy tablice n elementów o rozmiarach size
- obszar jest inicjalizowany zerami
- void realloc(void p, size_t size)
- zmienia rozmiar obiektu wskazywanego przez p na
size - void free(void p)
- zwalnia pamiec przydzielona uprzednio przez
malloc, calloc, lub realloc - nie robi nic gdy p jest równy NULL
72Lista jednokierunkowa
- typedef struct intelem liststruct intelem
int val list next - funkcje
- read / print
- insert
- reverse
- join
- empty
73Drzewa binarne
- typedef struct tnode TreePtrstruct tnode
char word int count TreePtr
left TreePtr right - przyklad zastosowania
- szybkie zliczanie wystapien slów w tekscie
74Preprocesor kompilatora C
- Pierwsza faza (przebieg) kompilacji
- przed tlumaczeniem, asemblacja i konsolidacja
- gcc -E ...
- dyrektywy preprocesora to wiersze rozpoczynajace
sie od znaku - gramatyka niezalezna od jezyka C
- moga wystapic w dowolnym miejscu programu
- dzialanie konczy sie wraz z koncem jednostki
tlumaczenia
75Preprocesor - c.d.
- Kolejne (logiczne) fazy preprocesora
- zastepowanie tzw. sekwencji trzyznakowych
- sklejanie wierszy
- wystapienia \ltnew linegt sa zamieniane na
pojedyncze odstepy - przeksztalcenie kodu programu na ciag leksemów
oddzielonych odstepami - komentarze zamieniane sa na pojedynczy odstep
- wykonanie dyrektyw (kazda w osobnej linii)
- rozwiniecie makr
- zastepowanie sekwencji specjalnych w stalych
znakowych i napisach oraz laczenie sasiadujacych
napisów - np. \n, \123 itp.
- tlumaczenie wyniku i laczenie z innymi
programami/bibliotekami - zapewnienie powiazania zewnetrznych funkcji i
obiektów z ich definicjami
76Sekwencje trzyznakowe
- ??
- ??/ \
- ??'
- ??(
- ??)
- ??!
- ??lt
- ??gt
- ??-
- zgodnosc ze zbiorem znaków ISO 646-1983 -
niezaleznosc od zestawu znaków - gcc -trigraphs ...
77Definicje stalych i makr
- define identyfikator ciag-leksemów
- zlecenie zastepowania wszystkich wystapien
identyfikator przez ciag-leksemów opuszczajac
odstepy otaczajace ciag-leksemów - ponowne uzycie define jest bledne gdy
definiowane ciagi sie róznia - define identyfikator( lista-identyfikatorów )
ciag-leksemów - Uwaga konieczny jest brak odstepu pomiedzy
identyfikatorem a otwierajacym nawiasem - opuszczanie odstepów i ponowne definiowanie - j/w
- undef identyfikator
- "zapomnienie" (byc moze niezdefiniowanej)
definicji
78Rozwijanie makr
- wystapienie identyfikator( lista-identyfikatorów
) jest wywolaniem makra - po nawiasie moze wystapic odstep
- lista jest separowana przecinkami
- przecinki sa "chronione" przez apostrofy,
cudzyslów i zagniezdzone nawiasy - ilosc argumentów musi odpowiadac definicji
- argumenty sa izolowane poprzez usuniecie
otaczajacych odstepów - makra wystepujace w
argumentach nie sa na razie rozwijane - specjalna obróbka znaku i operatora
- rozwijanie makrowywolan wystepujacych w leksemach
argumentów tuz przez zastapieniem
79Rozwijanie makr - c.d.
- jesli w definicji makra w zastepujacym ciagu
znaków wystapienie argumentu jest poprzedzone
znakiem to parametr jest zastepowany ciagiem
otoczonym przez cudzyslów - znaki " i \ wystepujace w argumencie w stalych
znakowych napisach sa poprzedzane przez znak \ - jesli w definicji makra wystapi infiksowy
operator to po zastapieniu parametrów jest on
usuwany powodujac "sklejenie" sasiadujacych
leksemów - operator nie moze wystapic na poczatku ani
koncu zastepujacego ciagu leksemów
80Rozwijanie makr - przyklady
- define ABSDIFF(a,b) ((a)gt(b) ? (a) - (b) (b) -
(a)) - w przeciwienstwie do podobnej funkcji, argumenty
i wynik moga byc dowolnego typu arytmetycznego
lub nawet moga byc wskaznikami - Uwaga argumenty sa tu obliczane dwa razy -
róznica gdy maja "efekty uboczne" - define tempfile(dir) dir "/s"
- wywolanie tempfile(/usr/tmp) produkuje"/usr/tmp"
"/s" co jest nastepnie sklejane w jeden napis
81Rozwijanie makr - przyklady - c.d.
- define cat(x,y) x y
- cat(1,2) produkuje 12
- cat(cat(1,2),3) produkuje niepoprawny cat ( 1, 2
)3 - define xcat(x,y) cat(x,y)
- makro "drugiego poziomu"
- xcat(xcat(1,2),3) produkuje 123
82Preprocesor - wlaczanie plików
- include "nazwa-pliku"lub include
ltnazwa-plikugt - przeszukiwanie biezacej kartoteki lub listy
lokalizacji zaleznej od implementacji - wlaczanie plików mozna zagniezdzac
- mozna uzyc konstrukcji include ciag-leksemów
aby wywolac rozwiniecie makra do jednej z postaci
j/w
83Preprocesor - kompilacja warunkowa
- if wyrazenie-stale
- ifdef identyfikator
- ifndef identyfikator
- else
- elif wyrazenie-stale
- endif
- defined (identyfikator) lub defined identyfikator
- Uwagi
- wyrazenia sa przedmiotem makrorozwiniec
- wyrazenia sa podstawiane przez 0L lub 1L
84Preprocesor - symbole specjalne
- zawsze zdefiniowane - nie mozna ich zmienic
(podobnie jak operatora defined) - _ _LINE_ _
- dziesietna stala o numerze biezacego wiersza
programu - _ _FILE_ _
- nazwa tlumaczonego pliku
- _ _DATE_ _
- napis w postaci "Mmm dd rrrr" - data kompilacji
- _ _TIME_ _
- napis w postaci "ggmmss" - czas kompilacji
- _ _STDC_ _
- 1 dla kompilatorów dostosowanych do standardu
85Preprocesor - pozostale dyrektywy
- error ciag-leksemów
- wypisanie komunikatu diagnostycznego podczas
kompilacji - line stala lub line stala "nazwa-pliku"
- przypisanie numeru linii - moze byc
wykorzystywane do celów diagnostycznych - pragma ciag-leksemów
- zalezne od implementacji kompilatora
- ignorowane jesli kompilator nie obsluguje
-
- pusta dyrektywa preprocesora
86Zmienne listy argumentów
- przyklad z biblioteki standardowej
- int printf(const char format, ...)
- plik naglówkowy ltstdarg.hgt
- typ va_list - reprezentuje wskaznik na kolejny
argument - makra
- void va_start(va_list ap, ostatni_nazwany_parametr
) - typ va_arg(va_list ap, typ)
- void va_end(va_list ap)
- przyklad
- typer myfunc(type1 par1,..., typek park , ...)
... va_list ap va_start(ap, park) ...
typek1 x va_arg(ap, typek1) ...
va_end(ap) ...
87Skoki odlegle (long jumps)
- zastosowanie - ominiecie ciagu wywolan funkcji i
powrotów (wyskok z zagniezdzonych funkcji) - plik naglówkowy ltsetjmp.hgt
- jmp_buf - typ do przechowania stanu programu w
chwili wywolania funkcji setjmp - int setjmp(jmp_buf env)
- void longjmp(jmp_buf env, int val)
- przyklad
- if (setjmp(env)0)... / kod wykonywany
bezposrednio po wejsciu/else ... / kod
wykonywany po wolaniu longjmp /
88Interakcja z systemem operacyjnym
- plik naglówkowy ltstdlib.hgt
- char getenv(const char name)
- zwraca wartosc zmiennej srodowiskowej name
- int system(const char prog)
- uruchamia program prog i zwraca jego kod wyjscia
- void exit (int status)
- konczy program z kodem status
- stale EXIT_SUCCESS, EXIT_FAILURE
- int atexit(void (func)(void))
- rejestruje funkcje func do wykonania przy wyjsciu
z programu - powstaje lancuch funkcji - void abort(void)
- bezwzgledne zakonczenie programu
89Obsluga daty i czasu
- plik naglówkowy lttime.hgt
- clock_t, time_t - typy arytmetyczne
- struct tm - skladniki czasu kalendarzowego
- int tm_sec
- int tm_min
- int tm_hour
- int tm_mday
- int tm_mon
- int tm_year - lata, które uplynely od 1900 r.
- int tm_wday
- int tm_yday
- int tm_isdst - znacznik czasu letniego
90Obsluga daty i czasu - c.d.
- wybrane funkcje do obslugi czasu
- time_t time(time_t tp)
- aktualny czas kalendarzowy (tp moze byc NULL)
- double difftime(time_t t1, time_t t2)
- róznica czasów wyrazona w sekundach
- struct tm gmtime(const time_t tp)
- struct tm localtime(const time_t tp)
- char asctime(const struct tm tp)
- size_t strftime(char s, size_t max, const
char fmt, const struct tm tp) - format podobny do printf, np. d - dzien
miesiaca,H - godzina, itp.
91Obsluga sygnalów
- plik naglówkowy ltsignal.hgt
- void (signal(int sig, void (handler)(int)))(int)
- SIG_DFL, SIG_IGN - predefiniowane handlery
- na poczatku obslugi przywracana jest domyslna
wartosc handlera - nalezy ustawic go na nowo
wewnatrz handlera - int raise(int sig)
- wybrane sygnaly
- SIGFPE
- SIGINT
- SIGSEGV
- SIGABRT
- SIGTERM
92Obsluga diagnostyczna
- plik naglówkowy ltassert.hgt
- makro assert(int wyrazenie)
- Assertion failed wyrazenie, file ..., line ...
- _ _FILE_ _
- _ _LINE_ _
- wywolanie funkcji abort
- zdefiniowanie NDEBUG przed wlaczeniem pliku
naglówkowego assert.h sprawia, ze makro assert
jest ignorowane
93Microsoft Windows API
- API (Application Programming Interface)
- kernel32.dll, user32.dll, gdi32.dll, shell32.dll,
... - C/C
- include ltwindows.hgt
- Dokumentacja
- http//msdn2.microsoft.com/en-us/library/
- http//www.winprog.org/tutorial/
94Microsoft Windows API - c.d.
- WinMain
- include ltwindows.hgt int WINAPI WinMain(
HINSTANCE hInstance, HINSTANCE
hPrevInstance, LPSTR lpCmdLine, int
nCmdShow) - MessageBox(NULL,"Hello world!", "Note",
MB_OK) return 0
95Microsoft Windows API - c.d.
- Funkcja "Call-back"
- LRESULT CALLBACK WindowProcedure( HWND hwnd,
UINT message, WPARAM wParam, LPARAM
lParam) - ... switch (message) ... default
return DefWindowProc (hwnd, message,
wParam, lParam) ...
96Microsoft Windows API
97Wstep do technik tworzenia parserów
- Co to jest parser?
- program przetwarzajacy dane zapisane w
sformalizowanym jezyku zgodnie z jego gramatyka - liczne przyklady zastosowania
- kompilatory jezyków programowania
- interpretatory polecen
- obsluga interfejsów uzytkownika
- przetwarzanie formalnych dokumentów
- HTML, TEX, XML, Mizar, ...
98Techniki tworzenia parserów - c.d.
- Formalny opis jezyka
- gramatyka
- gramatyka bezkontekstowa (context-free grammar)
- zbiór rodzajów syntaktycznych wyrazen
- zestaw regul ich tworzenia z podwyrazen
- notacja BNF (Backus-Naur Form)
- stworzona do specyfikacji jezyka Algol 60
- gramatyki (LA)LR
- mozliwosc przetworzenia dowolnych danych
wejsciowych z pojedynczym wyprzedzeniem
(look-ahead) - tokenizacja (scanning)
- symbole terminalne i nieterminalne
99Techniki tworzenia parserów - c.d.
- Przyklad tokenizacji
- int / keyword int' / square (int x) /
identifier,open-paren,keyword int',identifier,clo
se-paren / / open-brace /
return x x / keyword return',
identifier, asterisk, identifier, semicolon /
/ close-brace / - jest to definicja funkcji
- zawiera ona jedna deklaracje i jedna instrukcje
- w instrukcji kazdy 'x' jest wyrazeniem a takze 'x
x' jest wyrazeniem
100Tworzenie skanerów
- LEX
- GNU Flex (fast scanner generator)
- wyrazenia regularne w pliku wejsciowym
- output w postaci kodu C (lex.yy.c)
- funkcja int yylex()
- konsolidacja z biblioteka fl (gcc -l fl ...)
- format pliku wejsciowego
- definitions rules user code
101Tworzenie parserów
- Yacc
- GNU Bison (general-purpose LALR generator)
- wyrazenia regularne w pliku wejsciowym
- output w postaci kodu C (plik.tab.c) - parser
- funkcja int yyparse()
- wymaga funkcji yylex
- kompatybilny z Lex
- format pliku wejsciowego
- Prologue Bison declarations Grammar
rules Epilogue