Podstawy programowania - PowerPoint PPT Presentation

About This Presentation
Title:

Podstawy programowania

Description:

Podstawy programowania Adam Naumowicz Sprawy formalne 30 godz. wyk adu + 30 godz. wicze (15 godz. w laboratorium) zaliczenie laboratorium i egzamin obecno na ... – PowerPoint PPT presentation

Number of Views:70
Avg rating:3.0/5.0
Slides: 102
Provided by: Adam1204
Category:

less

Transcript and Presenter's Notes

Title: Podstawy programowania


1
Podstawy programowania
  • Adam Naumowicz

2
Sprawy formalne
  • 30 godz. wykladu 30 godz. cwiczen (15 godz. w
    laboratorium)
  • zaliczenie laboratorium i egzamin
  • obecnosc na wykladach nieobowiazkowa!

3
Plan 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
4
Programowanie
  • 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

5
Odrobina 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

6
Podstawowe 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

7
Podstawowe 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

8
Elementarz
  • 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!

9
Podstawowe 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)

10
Deklaracje 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

11
Dodatkowe deklaratory typu
  • short
  • short int short
  • long
  • long int long
  • signed
  • unsigned

12
Stale znakowe i liczbowe
  • "string"
  • A, a,
  • A 65
  • \ooo
  • \xhh
  • \n, \t, \r,
  • 1234
  • 123456789L (123456789l)
  • 123U (123u)
  • 31 037 0x1f 0X1F

13
Formatowany 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)

14
Formatowany 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

15
Formatowany 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

16
Formatowany 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

17
Operacje 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

18
Wyrazenia warunkowe
  • wyr1 ? wyr2 wyr3
  • Np. z(agtb) ? a b
  • /zmax(a,b)/

19
Instrukcja warunkowa
  • if (wyrazenie) instrukcja
  • instrukcja zlozona
  • if (wyrazenie) instrukcja1 else instrukcja2
  • if (wyrazenie1) instrukcja1else if (wyrazenie2)
    instrukcja2else if (wyrazenieX)
    instrukcjaXelse instrukcja

20
Instrukcja wyboru
  • switch (wyrazenie) case wyrazenie-stale1
    instrukcje1 case wyrazenie-stale2 instrukcje2
    default instrukcje
  • break

21
Instrukcje 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

22
Instrukcje 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

23
Instrukcje petli - przerywanie
  • break
  • przerwanie "najciasniej otaczajacej" petli
  • continue
  • przekazanie sterowania do miejsca wznowienia
    "najciasniej otaczajacej" petli

24
Przerywanie petli - c.d.
while (...) do
for(...) ...
...
...
while (...) br
br
br
  • break jest równowazne goto br jesli w ciele
    petli nie wystepuje "ciasniejsza" petla

25
Przerywanie petli - c.d.
while (...) do
for(...) ...
...
... contin
contin contin
while (...)
  • continue jest równowazne goto contin jesli w
    ciele petli nie wystepuje "ciasniejsza" petla

26
Instrukcje petli - równowaznosc
  • for (wyr1 wyr2 wyr3) instrukcja
  • wyr1 while (wyr2) instrukcjawyr3
  • Uwaga petle sa równowazne gdy instrukcja nie
    zawiera continue

27
Instrukcje 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

28
Tablice
  • deklaracjatyp identyfikator rozmiar
  • np. int array7 char tab256
  • Wniosek elementy jednolitego typu
  • indeksowanie
  • xarray6
  • tabi'Z'
  • Uwaga indeksowanie od 0 !

29
Tablice -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

30
Tablice 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!

31
Tablice 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)

32
Tablice 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

33
Tablice 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

34
Specjalne 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

35
Funkcje 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!

36
Funkcje 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

37
Funkcje w C - c.d.
  • deklaracjatyp-wyniku nazwa (parametryopc)
  • definicjatyp-wyniku nazwa (parametryopc)
    ... instrukcje ...return wyrazenieopc
  • standaryzacja w ANSI C

38
Funkcje 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

39
Funkcje 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

40
Funkcje 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

41
Rekurencja - 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

42
Rekurencja - przyklady c.d.
  • klasyczny problem "Wieze Hanoi"
  • szybkie sortowanie (QuickSort)

43
Struktury
  • 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

44
Struktury - 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

45
Struktury - 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)

46
Struktury - 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

47
Struktury - 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

48
Deklaracja 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

49
Unie
  • 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

50
Unie - 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

51
Unie - 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

52
Pola 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

53
Pola 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)

54
Pola 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

55
Pola 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)...

56
Pola 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

57
Obsluga 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

58
Obsluga 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

59
Obsluga 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

60
Obsluga 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

61
Obsluga 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, ...)

62
Obsluga 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)

63
Biblioteka 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)

64
Biblioteka 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)

65
ltstring.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

66
ltstring.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)

67
Biblioteka 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)

68
Biblioteka 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)

69
ltstdlib.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

70
ltstdlib.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

71
Dynamiczny 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

72
Lista jednokierunkowa
  • typedef struct intelem liststruct intelem
    int val list next
  • funkcje
  • read / print
  • insert
  • reverse
  • join
  • empty

73
Drzewa binarne
  • typedef struct tnode TreePtrstruct tnode
    char word int count TreePtr
    left TreePtr right
  • przyklad zastosowania
  • szybkie zliczanie wystapien slów w tekscie

74
Preprocesor 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

75
Preprocesor - 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

76
Sekwencje trzyznakowe
  • ??
  • ??/ \
  • ??'
  • ??(
  • ??)
  • ??!
  • ??lt
  • ??gt
  • ??-
  • zgodnosc ze zbiorem znaków ISO 646-1983 -
    niezaleznosc od zestawu znaków
  • gcc -trigraphs ...

77
Definicje 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

78
Rozwijanie 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

79
Rozwijanie 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

80
Rozwijanie 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

81
Rozwijanie 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

82
Preprocesor - 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

83
Preprocesor - 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

84
Preprocesor - 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

85
Preprocesor - 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

86
Zmienne 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) ...

87
Skoki 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 /

88
Interakcja 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

89
Obsluga 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

90
Obsluga 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.

91
Obsluga 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

92
Obsluga 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

93
Microsoft 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/

94
Microsoft 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

95
Microsoft 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) ...

96
Microsoft Windows API
97
Wstep 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, ...

98
Techniki 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

99
Techniki 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

100
Tworzenie 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

101
Tworzenie 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
Write a Comment
User Comments (0)
About PowerShow.com