plik


ÿþPodstawy Programowania WykBad IV Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki Robert MuszyDski ZPCiR IIAiR PWr Zagadnienia: specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, formatowane wej[cie i wyj[cie, struktury sterujce, rekurencja, niebezpieczeDstwa rekurencji, wskazniki, tablice, funkcje operuj- ce na tablicach, argumenty funkcji a wskazniki, arytmetyka wskaz- ników, rzutowanie. Copyright © 2007 2011 Robert MuszyDski Niniejszy dokument zawiera materiaBy do wykBadu na temat podstaw programowania w jzykach wysokiego poziomu. Jest on udostpniony pod warunkiem wykorzystania wyBcznie do wBasnych, prywatnych potrzeb i mo|e by kopiowany wyBcznie w caBo[ci, razem ze stron tytuBow.  SkBad FoilTEX  Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 1 Specyfikacja funkcji Specyfikacja powinna zawiera komplet informacji, niezbdnych do napisania poprawnego wywoBania funkcji.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 1 Specyfikacja funkcji Specyfikacja powinna zawiera komplet informacji, niezbdnych do napisania poprawnego wywoBania funkcji. A w[ród nich: (a) co dana funkcja robi, w tym równie| okre[lenie warto[ci, któr wylicza i zwraca,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 1 Specyfikacja funkcji Specyfikacja powinna zawiera komplet informacji, niezbdnych do napisania poprawnego wywoBania funkcji. A w[ród nich: (a) co dana funkcja robi, w tym równie| okre[lenie warto[ci, któr wylicza i zwraca, (b) znaczenie wszystkich jej argumentów,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 1 Specyfikacja funkcji Specyfikacja powinna zawiera komplet informacji, niezbdnych do napisania poprawnego wywoBania funkcji. A w[ród nich: (a) co dana funkcja robi, w tym równie| okre[lenie warto[ci, któr wylicza i zwraca, (b) znaczenie wszystkich jej argumentów, (c) warunki, które musz by speBnione, aby funkcja dzia- BaBa poprawnie, np. przedziaB dopuszczalnych warto[ci argumentów,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 1 Specyfikacja funkcji Specyfikacja powinna zawiera komplet informacji, niezbdnych do napisania poprawnego wywoBania funkcji. A w[ród nich: (a) co dana funkcja robi, w tym równie| okre[lenie warto[ci, któr wylicza i zwraca, (b) znaczenie wszystkich jej argumentów, (c) warunki, które musz by speBnione, aby funkcja dzia- BaBa poprawnie, np. przedziaB dopuszczalnych warto[ci argumentów, oraz (d) opis trwaBych zmian dokonywanych przez funkcj, takich jak: zmiana warto[ci zmiennych globalnych(!), stanu pli- ków zewntrznych, informacje wy[wietlane na standardo- we wyj[cie, itp.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 2 Zapis specyfikacji  warunki PRE i POST Specyfikacja czsto przybiera posta odpowiednich komentarzy. PRE  okre[laj wymagania, które musz by speBnione, aby funkcja dziaBaBa poprawnie.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 2 Zapis specyfikacji  warunki PRE i POST Specyfikacja czsto przybiera posta odpowiednich komentarzy. PRE  okre[laj wymagania, które musz by speBnione, aby funkcja dziaBaBa poprawnie. POST  opisuj zmiany, które nastpiBy w wyniku zadzia- Bania funkcji.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 2 Zapis specyfikacji  warunki PRE i POST Specyfikacja czsto przybiera posta odpowiednich komentarzy. PRE  okre[laj wymagania, które musz by speBnione, aby funkcja dziaBaBa poprawnie. POST  opisuj zmiany, które nastpiBy w wyniku zadzia- Bania funkcji. PrzykBadowo: " PRE: program wymaga podania warto[ci w przedziale [0, 21]  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 2 Zapis specyfikacji  warunki PRE i POST Specyfikacja czsto przybiera posta odpowiednich komentarzy. PRE  okre[laj wymagania, które musz by speBnione, aby funkcja dziaBaBa poprawnie. POST  opisuj zmiany, które nastpiBy w wyniku zadzia- Bania funkcji. PrzykBadowo: " PRE: program wymaga podania warto[ci w przedziale [0, 21] " POST: program zwraca liczb szcz[liwych dni do koDca roku  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 3 Warunki PRE i POST " PRE: warto[ parametru N musi by zawarta w przedziale [0,100]  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 3 Warunki PRE i POST " PRE: warto[ parametru N musi by zawarta w przedziale [0,100] " PRE: parametry A, B, C musz speBnia warunek istnienia rozwizaD rze- czywistych równania kwadratowego: B B - 4 A C >= 0 oraz A ! = 0  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 3 Warunki PRE i POST " PRE: warto[ parametru N musi by zawarta w przedziale [0,100] " PRE: parametry A, B, C musz speBnia warunek istnienia rozwizaD rze- czywistych równania kwadratowego: B B - 4 A C >= 0 oraz A ! = 0 " PRE: parametr Oper musi mie jedn z warto[ci:  + ,  - ,  * ,  /  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 3 Warunki PRE i POST " PRE: warto[ parametru N musi by zawarta w przedziale [0,100] " PRE: parametry A, B, C musz speBnia warunek istnienia rozwizaD rze- czywistych równania kwadratowego: B B - 4 A C >= 0 oraz A ! = 0 " PRE: parametr Oper musi mie jedn z warto[ci:  + ,  - ,  * ,  / " PRE: staBe globalne MinWart i MaxWart musz speBnia zale|no[ MinWart <= MaxWart  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 3 Warunki PRE i POST " PRE: warto[ parametru N musi by zawarta w przedziale [0,100] " PRE: parametry A, B, C musz speBnia warunek istnienia rozwizaD rze- czywistych równania kwadratowego: B B - 4 A C >= 0 oraz A ! = 0 " PRE: parametr Oper musi mie jedn z warto[ci:  + ,  - ,  * ,  / " PRE: staBe globalne MinWart i MaxWart musz speBnia zale|no[ MinWart <= MaxWart " PRE: zmienna plikowa f1 musi by zwizana z przygotowanym do zapisu plikiem zewntrznym (wykonane fopen w trybie  append )  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 3 Warunki PRE i POST " PRE: warto[ parametru N musi by zawarta w przedziale [0,100] " PRE: parametry A, B, C musz speBnia warunek istnienia rozwizaD rze- czywistych równania kwadratowego: B B - 4 A C >= 0 oraz A ! = 0 " PRE: parametr Oper musi mie jedn z warto[ci:  + ,  - ,  * ,  / " PRE: staBe globalne MinWart i MaxWart musz speBnia zale|no[ MinWart <= MaxWart " PRE: zmienna plikowa f1 musi by zwizana z przygotowanym do zapisu plikiem zewntrznym (wykonane fopen w trybie  append ) " POST: parametry X1, X2 przyjmuj warto[ci pierwiastków równania kwa- dratowego zadanego parametrami A, B, C  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 3 Warunki PRE i POST " PRE: warto[ parametru N musi by zawarta w przedziale [0,100] " PRE: parametry A, B, C musz speBnia warunek istnienia rozwizaD rze- czywistych równania kwadratowego: B B - 4 A C >= 0 oraz A ! = 0 " PRE: parametr Oper musi mie jedn z warto[ci:  + ,  - ,  * ,  / " PRE: staBe globalne MinWart i MaxWart musz speBnia zale|no[ MinWart <= MaxWart " PRE: zmienna plikowa f1 musi by zwizana z przygotowanym do zapisu plikiem zewntrznym (wykonane fopen w trybie  append ) " POST: parametry X1, X2 przyjmuj warto[ci pierwiastków równania kwa- dratowego zadanego parametrami A, B, C " POST: warto[ci funkcji jest wpisana przez u|ytkownika z klawiatury liczba z przedziaBu [0,N] lub liczba -1, je[li u|ytkownik wpisaB na klawiaturze liczb spoza tego przedziaBu  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 3 Warunki PRE i POST " PRE: warto[ parametru N musi by zawarta w przedziale [0,100] " PRE: parametry A, B, C musz speBnia warunek istnienia rozwizaD rze- czywistych równania kwadratowego: B B - 4 A C >= 0 oraz A ! = 0 " PRE: parametr Oper musi mie jedn z warto[ci:  + ,  - ,  * ,  / " PRE: staBe globalne MinWart i MaxWart musz speBnia zale|no[ MinWart <= MaxWart " PRE: zmienna plikowa f1 musi by zwizana z przygotowanym do zapisu plikiem zewntrznym (wykonane fopen w trybie  append ) " POST: parametry X1, X2 przyjmuj warto[ci pierwiastków równania kwa- dratowego zadanego parametrami A, B, C " POST: warto[ci funkcji jest wpisana przez u|ytkownika z klawiatury liczba z przedziaBu [0,N] lub liczba -1, je[li u|ytkownik wpisaB na klawiaturze liczb spoza tego przedziaBu " POST: na pliku zewntrznym zwizanym ze zmienn plikow PLIK zostaBa zapisana linia zawierajca warto[ci parametrów X1, X2, X3  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 4 Operacje wej[cia i wyj[cia na plikach " Do plików odwoBujemy si poprzez zmienn wskaznikow typuFILE FILE *plik;  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 4 Operacje wej[cia i wyj[cia na plikach " Do plików odwoBujemy si poprzez zmienn wskaznikow typuFILE FILE *plik; " ka|dy wykorzystywany plik musi zosta otwarty w odpowiednim trybie funk- cjfopen FILE *fopen(char *nazwa, char *tryb); która jest zdefiniwana w nagBówkustdio,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 4 Operacje wej[cia i wyj[cia na plikach " Do plików odwoBujemy si poprzez zmienn wskaznikow typuFILE FILE *plik; " ka|dy wykorzystywany plik musi zosta otwarty w odpowiednim trybie funk- cjfopen FILE *fopen(char *nazwa, char *tryb); która jest zdefiniwana w nagBówkustdio, " w programie przykBadowe wywoBanie funkcjifopenmo|e mie posta plik = fopen("kubus.txt", "r"); mo|liwe tryby:"r" czytanie,"w" pisanie,"a" dopisywanie  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 4 Operacje wej[cia i wyj[cia na plikach " Do plików odwoBujemy si poprzez zmienn wskaznikow typuFILE FILE *plik; " ka|dy wykorzystywany plik musi zosta otwarty w odpowiednim trybie funk- cjfopen FILE *fopen(char *nazwa, char *tryb); która jest zdefiniwana w nagBówkustdio, " w programie przykBadowe wywoBanie funkcjifopenmo|e mie posta plik = fopen("kubus.txt", "r"); mo|liwe tryby:"r" czytanie,"w" pisanie,"a" dopisywanie " w przypadku bBdu funkcjafopenzwraca warto[NULL,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 4 Operacje wej[cia i wyj[cia na plikach " Do plików odwoBujemy si poprzez zmienn wskaznikow typuFILE FILE *plik; " ka|dy wykorzystywany plik musi zosta otwarty w odpowiednim trybie funk- cjfopen FILE *fopen(char *nazwa, char *tryb); która jest zdefiniwana w nagBówkustdio, " w programie przykBadowe wywoBanie funkcjifopenmo|e mie posta plik = fopen("kubus.txt", "r"); mo|liwe tryby:"r" czytanie,"w" pisanie,"a" dopisywanie " w przypadku bBdu funkcjafopenzwraca warto[NULL, " do wczytania znaku z pliku sBu|y funkcjaint getc(FILE *plik), która zwraca kolejny znak ze strumienia wskazywanego przezpliklubEOF,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 4 Operacje wej[cia i wyj[cia na plikach " Do plików odwoBujemy si poprzez zmienn wskaznikow typuFILE FILE *plik; " ka|dy wykorzystywany plik musi zosta otwarty w odpowiednim trybie funk- cjfopen FILE *fopen(char *nazwa, char *tryb); która jest zdefiniwana w nagBówkustdio, " w programie przykBadowe wywoBanie funkcjifopenmo|e mie posta plik = fopen("kubus.txt", "r"); mo|liwe tryby:"r" czytanie,"w" pisanie,"a" dopisywanie " w przypadku bBdu funkcjafopenzwraca warto[NULL, " do wczytania znaku z pliku sBu|y funkcjaint getc(FILE *plik), która zwraca kolejny znak ze strumienia wskazywanego przezpliklubEOF, " by zapisaznakdo pliku wskazywanego przezpliknale|y u|y funkcji int putc(int znak, FILE *plik), która zwraca warto[ tego znaku lub EOFjako sygnaB wystpienia bBdu,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 5 Operacje wej[cia i wyj[cia na plikach cd. " jakoplikmo|na u|y standardowychstdin,stdoutistderr,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 5 Operacje wej[cia i wyj[cia na plikach cd. " jakoplikmo|na u|y standardowychstdin,stdoutistderr, " by zamkn otwarty strumieD danych nale|y si posBu|y funkcjfclose int fclose(FILE *plik); która zwraca 0 w przypadku pomy[lnego zamknicia strumienia lubEOF w przeciwnym razie,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 5 Operacje wej[cia i wyj[cia na plikach cd. " jakoplikmo|na u|y standardowychstdin,stdoutistderr, " by zamkn otwarty strumieD danych nale|y si posBu|y funkcjfclose int fclose(FILE *plik); która zwraca 0 w przypadku pomy[lnego zamknicia strumienia lubEOF w przeciwnym razie, " wikszo[ systemów operacyjnych nakBada ograniczenie na liczb jedno- cze[nie otwartych plików w jednym programie,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 5 Operacje wej[cia i wyj[cia na plikach cd. " jakoplikmo|na u|y standardowychstdin,stdoutistderr, " by zamkn otwarty strumieD danych nale|y si posBu|y funkcjfclose int fclose(FILE *plik); która zwraca 0 w przypadku pomy[lnego zamknicia strumienia lubEOF w przeciwnym razie, " wikszo[ systemów operacyjnych nakBada ograniczenie na liczb jedno- cze[nie otwartych plików w jednym programie, " wszystkie operacje wej[cia i wyj[cia s buforowane,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 5 Operacje wej[cia i wyj[cia na plikach cd. " jakoplikmo|na u|y standardowychstdin,stdoutistderr, " by zamkn otwarty strumieD danych nale|y si posBu|y funkcjfclose int fclose(FILE *plik); która zwraca 0 w przypadku pomy[lnego zamknicia strumienia lubEOF w przeciwnym razie, " wikszo[ systemów operacyjnych nakBada ograniczenie na liczb jedno- cze[nie otwartych plików w jednym programie, " wszystkie operacje wej[cia i wyj[cia s buforowane, " u|ycie funkcjifcloseopró|nia bufor,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 5 Operacje wej[cia i wyj[cia na plikach cd. " jakoplikmo|na u|y standardowychstdin,stdoutistderr, " by zamkn otwarty strumieD danych nale|y si posBu|y funkcjfclose int fclose(FILE *plik); która zwraca 0 w przypadku pomy[lnego zamknicia strumienia lubEOF w przeciwnym razie, " wikszo[ systemów operacyjnych nakBada ograniczenie na liczb jedno- cze[nie otwartych plików w jednym programie, " wszystkie operacje wej[cia i wyj[cia s buforowane, " u|ycie funkcjifcloseopró|nia bufor, " funkcja fclose jest wywoBywana automatycznie dla wszystkich jeszcze otwartych plików, gdy program koDczy si normalnie.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 6 Operacje wej[cia i wyj[cia na plikach  przykBad #include<stdio.h> /* kopiuj: kopiuje zawartosc pliku wej do pliku wyj */ void kopiuj(FILE *wej, FILE *wyj){ int znak while ((znak = getc(wej)) != EOF) putc(znak, wyj); }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 6 Operacje wej[cia i wyj[cia na plikach  przykBad #include<stdio.h> int main(){ /* kopiowanie pliku na standardowe wyjscie */ FILE *plik; void kopiuj(FILE *, FILE *); if ((plik=fopen("kubus.txt", "r")) == NULL){ printf("kopiuj: nie moge otworzyc kubusia"); return 1; } else { kopiuj(plik,stdout); fclose(plik); } return 0; } /* kopiuj: kopiuje zawartosc pliku wej do pliku wyj */ void kopiuj(FILE *wej, FILE *wyj){ int znak while ((znak = getc(wej)) != EOF) putc(znak, wyj); }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 7 Formatowane wej[cia i wyj[cia na plikach Przy formatowanym czytaniu z i pisaniu do plików mo|emy korzysta z funkcji fscanfifprintf int fscanf(FILE *plik, char *format, ...) int fprintf(FILE *plik, char *format, ...)  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 7 Formatowane wej[cia i wyj[cia na plikach Przy formatowanym czytaniu z i pisaniu do plików mo|emy korzysta z funkcji fscanfifprintf int fscanf(FILE *plik, char *format, ...) int fprintf(FILE *plik, char *format, ...) " WywoBanieprintf(...)jest równoznaczne zfprintf(stdout,...) " WywoBaniescanf(...)jest równoznaczne zfscanf(stdin,...)  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 7 Formatowane wej[cia i wyj[cia na plikach Przy formatowanym czytaniu z i pisaniu do plików mo|emy korzysta z funkcji fscanfifprintf int fscanf(FILE *plik, char *format, ...) int fprintf(FILE *plik, char *format, ...) " WywoBanieprintf(...)jest równoznaczne zfprintf(stdout,...) " WywoBaniescanf(...)jest równoznaczne zfscanf(stdin,...) " By wysBa komunikat nastderrnale|y posBu|y si funkcjfprintf fprintf(stderr, "%s: blad pisania do stdout\n", program); fprintf(stderr, "%s: nie moge otworzyc %s\n", program, nazwa);  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 8 Iteracje a rekurencja Struktury sterujce: " bezpo[rednie nastpstwo,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 8 Iteracje a rekurencja Struktury sterujce: " bezpo[rednie nastpstwo, " wybór warunkowy,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 8 Iteracje a rekurencja Struktury sterujce: " bezpo[rednie nastpstwo, " wybór warunkowy, " iteracja ograniczona,  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 8 Iteracje a rekurencja Struktury sterujce: " bezpo[rednie nastpstwo, " wybór warunkowy, " iteracja ograniczona, " iteracja nieograniczona (warunkowa).  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 8 Iteracje a rekurencja Struktury sterujce: " bezpo[rednie nastpstwo, " wybór warunkowy, " iteracja ograniczona, " iteracja nieograniczona (warunkowa). Inna metoda tworzenia powtórzeD  rekurencja.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 8 Iteracje a rekurencja Struktury sterujce: " bezpo[rednie nastpstwo, " wybór warunkowy, " iteracja ograniczona, " iteracja nieograniczona (warunkowa). Inna metoda tworzenia powtórzeD  rekurencja. Rodzaje rekurencji (rekursji): " Rekurencja bezpo[rednia  zdolno[ funkcji do wywoBania sa- mej siebie.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 8 Iteracje a rekurencja Struktury sterujce: " bezpo[rednie nastpstwo, " wybór warunkowy, " iteracja ograniczona, " iteracja nieograniczona (warunkowa). Inna metoda tworzenia powtórzeD  rekurencja. Rodzaje rekurencji (rekursji): " Rekurencja bezpo[rednia  zdolno[ funkcji do wywoBania sa- mej siebie. " Rekurencja po[rednia  wzajemne wywoBywanie si dwóch lub wikszej liczby funkcji.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 9 Rekurencja a iteracje int silnia(int n;) /* Funkcja wylicza rekurencyjnie */ /* wartosc silni. */ /* UWAGA: dla n <= 0 zwraca 1 */ { if (n <= 1) return 1; else return n *silnia(n-1); }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 9 Rekurencja a iteracje int silnia(int n;) /* Funkcja wylicza rekurencyjnie */ /* wartosc silni. */ /* UWAGA: dla n <= 0 zwraca 1 */ { if (n <= 1) return 1; else return n *silnia(n-1); }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 9 Rekurencja a iteracje int silnia(int n;) int silnia(int n;) /* Funkcja wylicza rekurencyjnie */ /* Funkcja wylicza iteracyjnie */ /* wartosc silni. */ /* wartosc silni. */ /* UWAGA: dla n <= 0 zwraca 1 */ /* UWAGA: dla n <= 0 zwraca 1 */ { { if (n <= 1) int wynik = 1; return 1; else while (n > 1) return n *silnia(n-1); { wynik *= n; } n--; } return wynik; }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 10 NiebezpieczeDstwa rekurencji " zBo|ono[ obliczeniowa int fib(int n;) /* Funkcja wylicza rekurencyjnie liczby */ /* Fibonacciego. UWAGA: n musi byc >= 0 */ { if (n == 0) return 0; else if (n == 1) return 1; else return +fib(n-2); fib(n-1) }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 10 NiebezpieczeDstwa rekurencji " zBo|ono[ obliczeniowa int fib(int n;) /* Funkcja wylicza rekurencyjnie liczby */ /* Fibonacciego. UWAGA: n musi byc >= 0 */ { Diagram wywoBaD dlan=5: if (n == 0) return 0; else if (n == 1) return 1; else return +fib(n-2); fib(n-1) 5 }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 10 NiebezpieczeDstwa rekurencji " zBo|ono[ obliczeniowa int fib(int n;) /* Funkcja wylicza rekurencyjnie liczby */ /* Fibonacciego. UWAGA: n musi byc >= 0 */ { Diagram wywoBaD dlan=5: if (n == 0) return 0; else if (n == 1) return 1; else return +fib(n-2); fib(n-1) 5 } 4  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 10 NiebezpieczeDstwa rekurencji " zBo|ono[ obliczeniowa int fib(int n;) /* Funkcja wylicza rekurencyjnie liczby */ /* Fibonacciego. UWAGA: n musi byc >= 0 */ { Diagram wywoBaD dlan=5: if (n == 0) return 0; else if (n == 1) return 1; else return +fib(n-2); fib(n-1) 5 } 3 4  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 10 NiebezpieczeDstwa rekurencji " zBo|ono[ obliczeniowa int fib(int n;) /* Funkcja wylicza rekurencyjnie liczby */ /* Fibonacciego. UWAGA: n musi byc >= 0 */ { Diagram wywoBaD dlan=5: if (n == 0) return 0; else if (n == 1) return 1; else return +fib(n-2); fib(n-1) 5 } 3 4 3  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 10 NiebezpieczeDstwa rekurencji " zBo|ono[ obliczeniowa int fib(int n;) /* Funkcja wylicza rekurencyjnie liczby */ /* Fibonacciego. UWAGA: n musi byc >= 0 */ { Diagram wywoBaD dlan=5: if (n == 0) return 0; else if (n == 1) return 1; else return +fib(n-2); fib(n-1) 5 } 3 4 3 2  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 10 NiebezpieczeDstwa rekurencji " zBo|ono[ obliczeniowa int fib(int n;) /* Funkcja wylicza rekurencyjnie liczby */ /* Fibonacciego. UWAGA: n musi byc >= 0 */ { Diagram wywoBaD dlan=5: if (n == 0) return 0; else if (n == 1) return 1; else return +fib(n-2); fib(n-1) 5 } 3 4 3 2 2  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 10 NiebezpieczeDstwa rekurencji " zBo|ono[ obliczeniowa int fib(int n;) /* Funkcja wylicza rekurencyjnie liczby */ /* Fibonacciego. UWAGA: n musi byc >= 0 */ { Diagram wywoBaD dlan=5: if (n == 0) return 0; else if (n == 1) return 1; else return +fib(n-2); fib(n-1) 5 } 3 4 3 2 2 1  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 10 NiebezpieczeDstwa rekurencji " zBo|ono[ obliczeniowa int fib(int n;) /* Funkcja wylicza rekurencyjnie liczby */ /* Fibonacciego. UWAGA: n musi byc >= 0 */ { Diagram wywoBaD dlan=5: if (n == 0) return 0; else if (n == 1) return 1; else return +fib(n-2); fib(n-1) 5 } 3 4 3 2 2 1 2 1 1 0 1 0 1 0  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 10 NiebezpieczeDstwa rekurencji " zBo|ono[ obliczeniowa int fib(int n;) /* Funkcja wylicza rekurencyjnie liczby */ /* Fibonacciego. UWAGA: n musi byc >= 0 */ { Diagram wywoBaD dlan=5: if (n == 0) return 0; else if (n == 1) return 1; else return +fib(n-2); fib(n-1) 5 } 3 4 3 2 2 1 2 1 1 0 1 0 1 0 " problem stopu  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 11 Wskazniki " Pami zorganizowana jest zazwyczaj w cig kolejno numerowanych komórek  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 11 Wskazniki " Pami zorganizowana jest zazwyczaj w cig kolejno numerowanych komórek " Adres obiektu (zmiennej) podaje jednoargumentowy operator adresu (referencji)& p = &c Teraz zmiennap wskazuje na zmiennc. Zmiennapjest wskaznikiem.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 11 Wskazniki " Pami zorganizowana jest zazwyczaj w cig kolejno numerowanych komórek " Adres obiektu (zmiennej) podaje jednoargumentowy operator adresu (referencji)& p = &c Teraz zmiennap wskazuje na zmiennc. Zmiennapjest wskaznikiem. " By odwoBa si do warto[ci zmiennej wskazywanej przez wskaznikpnale|y u|y operatora odwoBania po[redniego (wyBuskania, dereferencji), oznaczanego symbolem* zm = *p /* rownowazne zm = c */ *p = cos if (*p == c)... /* zawsze prawdziwe */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 11 Wskazniki " Pami zorganizowana jest zazwyczaj w cig kolejno numerowanych komórek " Adres obiektu (zmiennej) podaje jednoargumentowy operator adresu (referencji)& p = &c Teraz zmiennap wskazuje na zmiennc. Zmiennapjest wskaznikiem. " By odwoBa si do warto[ci zmiennej wskazywanej przez wskaznikpnale|y u|y operatora odwoBania po[redniego (wyBuskania, dereferencji), oznaczanego symbolem* zm = *p /* rownowazne zm = c */ *p = cos if (*p == c)... /* zawsze prawdziwe */ " By zadeklarowa zmienn wskaznikow równie| nale|y si posBu|y operatorem* int x = 1, y = 2; int *ip; /* ip jest wskaznikiem do obiektow typu int */ ip = &x; /* teraz ip wskazuje na x */ y = *ip; /* y ma teraz wartosc 1 */ *ip = 0; /* x ma teraz wartosc 0 */ ip = &y; /* teraz ip wskazuje na y */ *ip = 0; /* y ma teraz wartosc 0 */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 12 Wskazniki cd " Gdy wskaznikipwskazuje na zmienn caBkowitx, to*ipmo|e wystpi wszdzie tam, gdzie mo|e wystpix *ip = *ip +1;  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 12 Wskazniki cd " Gdy wskaznikipwskazuje na zmienn caBkowitx, to*ipmo|e wystpi wszdzie tam, gdzie mo|e wystpix *ip = *ip +1; " Jednoargumentowe operatory&i*wi| silniej ni| operatory arytmetycz- ne, tak wic, by zwikszy zmienn wskazywan przezipmo|na tak|e napisa *ip += 1; ++*ip; (*ip)++ /* *ip++ zwiekszy wartosc wskaznika */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 12 Wskazniki cd " Gdy wskaznikipwskazuje na zmienn caBkowitx, to*ipmo|e wystpi wszdzie tam, gdzie mo|e wystpix *ip = *ip +1; " Jednoargumentowe operatory&i*wi| silniej ni| operatory arytmetycz- ne, tak wic, by zwikszy zmienn wskazywan przezipmo|na tak|e napisa *ip += 1; ++*ip; (*ip)++ /* *ip++ zwiekszy wartosc wskaznika */ " Wskazniki s zwykBymi zmiennymi int x, *ip, *iq; ip = &x; /* teraz ip wskazuje na x */ iq = ip; /* teraz takze iq wskazuje na x */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 12 Wskazniki cd " Gdy wskaznikipwskazuje na zmienn caBkowitx, to*ipmo|e wystpi wszdzie tam, gdzie mo|e wystpix *ip = *ip +1; " Jednoargumentowe operatory&i*wi| silniej ni| operatory arytmetycz- ne, tak wic, by zwikszy zmienn wskazywan przezipmo|na tak|e napisa *ip += 1; ++*ip; (*ip)++ /* *ip++ zwiekszy wartosc wskaznika */ " Wskazniki s zwykBymi zmiennymi int x, *ip, *iq; ip = &x; /* teraz ip wskazuje na x */ iq = ip; /* teraz takze iq wskazuje na x */ " Wiemy wic ju|, dlaczego w funkcjiscanfu|ywali[my konstrukcji z opera- torem adresu&, postaci&zmienna  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 13 Tablice " Tablica jednowymiarowa N elementowa tab[0] tab[1] tab[2] · · · tab[N-1]  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 13 Tablice " Tablica jednowymiarowa N elementowa tab[0] tab[1] tab[2] · · · tab[N-1] tab[i] Ô! prosta zmienna  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 13 Tablice " Tablica jednowymiarowa N elementowa tab[0] tab[1] tab[2] · · · tab[N-1] tab[i] Ô! prosta zmienna " Deklaracja tablicy ma posta int oceny[10]; /* dziesiecioelementowa tablica liczb int */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 13 Tablice " Tablica jednowymiarowa N elementowa tab[0] tab[1] tab[2] · · · tab[N-1] tab[i] Ô! prosta zmienna " Deklaracja tablicy ma posta int oceny[10]; /* dziesiecioelementowa tablica liczb int */ " By odwoBa si do elementu tablicy mo|na napisa oceny[1] = 5; /* element 1 tablicy oceny ma wartosc 5 */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 13 Tablice " Tablica jednowymiarowa N elementowa tab[0] tab[1] tab[2] · · · tab[N-1] tab[i] Ô! prosta zmienna " Deklaracja tablicy ma posta int oceny[10]; /* dziesiecioelementowa tablica liczb int */ " By odwoBa si do elementu tablicy mo|na napisa oceny[1] = 5; /* element 1 tablicy oceny ma wartosc 5 */ i = 5; oceny[i] = 3; /* element 5 tablicy oceny ma wartosc 3 */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 13 Tablice " Tablica jednowymiarowa N elementowa tab[0] tab[1] tab[2] · · · tab[N-1] tab[i] Ô! prosta zmienna " Deklaracja tablicy ma posta int oceny[10]; /* dziesiecioelementowa tablica liczb int */ " By odwoBa si do elementu tablicy mo|na napisa oceny[1] = 5; /* element 1 tablicy oceny ma wartosc 5 */ i = 5; oceny[i] = 3; /* element 5 tablicy oceny ma wartosc 3 */ oceny[i++] = 1; /* element 5 tablicy oceny ma wartosc 1 */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 13 Tablice " Tablica jednowymiarowa N elementowa tab[0] tab[1] tab[2] · · · tab[N-1] tab[i] Ô! prosta zmienna " Deklaracja tablicy ma posta int oceny[10]; /* dziesiecioelementowa tablica liczb int */ " By odwoBa si do elementu tablicy mo|na napisa oceny[1] = 5; /* element 1 tablicy oceny ma wartosc 5 */ i = 5; oceny[i] = 3; /* element 5 tablicy oceny ma wartosc 3 */ oceny[i++] = 1; /* element 5 tablicy oceny ma wartosc 1 */ oceny[i] = 4; /* element 6 tablicy oceny ma wartosc 4 */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 13 Tablice " Tablica jednowymiarowa N elementowa tab[0] tab[1] tab[2] · · · tab[N-1] tab[i] Ô! prosta zmienna " Deklaracja tablicy ma posta int oceny[10]; /* dziesiecioelementowa tablica liczb int */ " By odwoBa si do elementu tablicy mo|na napisa oceny[1] = 5; /* element 1 tablicy oceny ma wartosc 5 */ i = 5; oceny[i] = 3; /* element 5 tablicy oceny ma wartosc 3 */ oceny[i++] = 1; /* element 5 tablicy oceny ma wartosc 1 */ oceny[i] = 4; /* element 6 tablicy oceny ma wartosc 4 */ oceny[++i] = 0; /* element 7 tablicy oceny ma wartosc 0 */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 14 #define NSTUDENTOW 200 /* calkowita liczba studentow */ int main() { int Grupa[NSTUDENTOW]: int stud, min, max, srednia, suma; /************************************************************/ suma = 0; min = 10; max = 0; for (stud = 0; stud < NSTUDENTOW; stud++) { printf("Prosze podac zaliczenie dla studenta %d",stud); scanf("%d",&(Grupa[stud])); /* mozna to zrobic ladniej */ suma += Grupa[stud]; if (Grupa[stud] > max) max = Grupa[stud]; if (Grupa[stud] < min) min = Grupa[stud]; } srednia = suma / NStudentow;  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 14 #define NSTUDENTOW 200 /* calkowita liczba studentow */ int main() { int Grupa[NSTUDENTOW]: int stud, min, max, srednia, suma; /************************************************************/ suma = 0; min = 10; max = 0; for (stud = 0; stud < NSTUDENTOW; stud++) { printf("Prosze podac zaliczenie dla studenta %d",stud); scanf("%d",&(Grupa[stud])); /* mozna to zrobic ladniej */ suma += Grupa[stud]; if (Grupa[stud] > max) max = Grupa[stud]; if (Grupa[stud] < min) min = Grupa[stud]; } srednia = suma / NStudentow;  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 14 #define NSTUDENTOW 200 /* calkowita liczba studentow */ int main() { int Grupa[NSTUDENTOW]: int stud, min, max, srednia, suma; /************************************************************/ suma = 0; min = 10; max = 0; for (stud = 0; stud < NSTUDENTOW; stud++) { printf("Prosze podac zaliczenie dla studenta %d",stud); scanf("%d",&(Grupa[stud])); /* mozna to zrobic ladniej */ suma += Grupa[stud]; if (Grupa[stud] > max) max = Grupa[stud]; if (Grupa[stud] < min) min = Grupa[stud]; } srednia = suma / NStudentow;  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 15 Tablice jednowymiarowe a wskazniki " Nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu  jest wskaznikiem na ten element:nazwa_tablicyÔ!&nazwa_tablicy[0] *oceny = 2; /* element 0 tablicy oceny ma wartosc 2 */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 15 Tablice jednowymiarowe a wskazniki " Nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu  jest wskaznikiem na ten element:nazwa_tablicyÔ!&nazwa_tablicy[0] *oceny = 2; /* element 0 tablicy oceny ma wartosc 2 */ *(oceny+2) = 3; /* element 2 tablicy oceny ma wartosc 3 */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 15 Tablice jednowymiarowe a wskazniki " Nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu  jest wskaznikiem na ten element:nazwa_tablicyÔ!&nazwa_tablicy[0] *oceny = 2; /* element 0 tablicy oceny ma wartosc 2 */ *(oceny+2) = 3; /* element 2 tablicy oceny ma wartosc 3 */ " elementy tablicy mog by wskazywane przez zmienne wskaznikowe od- powiedniego typu int *ptr; /* ptr jest wskaznikiem do obiektow typu int */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 15 Tablice jednowymiarowe a wskazniki " Nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu  jest wskaznikiem na ten element:nazwa_tablicyÔ!&nazwa_tablicy[0] *oceny = 2; /* element 0 tablicy oceny ma wartosc 2 */ *(oceny+2) = 3; /* element 2 tablicy oceny ma wartosc 3 */ " elementy tablicy mog by wskazywane przez zmienne wskaznikowe od- powiedniego typu int *ptr; /* ptr jest wskaznikiem do obiektow typu int */ ptr = &oceny[0]; /* ptr wskazuje na 0. element tablicy oceny */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 15 Tablice jednowymiarowe a wskazniki " Nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu  jest wskaznikiem na ten element:nazwa_tablicyÔ!&nazwa_tablicy[0] *oceny = 2; /* element 0 tablicy oceny ma wartosc 2 */ *(oceny+2) = 3; /* element 2 tablicy oceny ma wartosc 3 */ " elementy tablicy mog by wskazywane przez zmienne wskaznikowe od- powiedniego typu int *ptr; /* ptr jest wskaznikiem do obiektow typu int */ ptr = &oceny[0]; /* ptr wskazuje na 0. element tablicy oceny */ ptr = oceny; /* jak powyzej tylko prosciej */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 15 Tablice jednowymiarowe a wskazniki " Nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu  jest wskaznikiem na ten element:nazwa_tablicyÔ!&nazwa_tablicy[0] *oceny = 2; /* element 0 tablicy oceny ma wartosc 2 */ *(oceny+2) = 3; /* element 2 tablicy oceny ma wartosc 3 */ " elementy tablicy mog by wskazywane przez zmienne wskaznikowe od- powiedniego typu int *ptr; /* ptr jest wskaznikiem do obiektow typu int */ ptr = &oceny[0]; /* ptr wskazuje na 0. element tablicy oceny */ ptr = oceny; /* jak powyzej tylko prosciej */ x = *ptr; /* zawartosc oceny[0] zostaje skopiowana do x */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 15 Tablice jednowymiarowe a wskazniki " Nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu  jest wskaznikiem na ten element:nazwa_tablicyÔ!&nazwa_tablicy[0] *oceny = 2; /* element 0 tablicy oceny ma wartosc 2 */ *(oceny+2) = 3; /* element 2 tablicy oceny ma wartosc 3 */ " elementy tablicy mog by wskazywane przez zmienne wskaznikowe od- powiedniego typu int *ptr; /* ptr jest wskaznikiem do obiektow typu int */ ptr = &oceny[0]; /* ptr wskazuje na 0. element tablicy oceny */ ptr = oceny; /* jak powyzej tylko prosciej */ x = *ptr; /* zawartosc oceny[0] zostaje skopiowana do x */ x = *(ptr+1); /* zawartosc oceny[1] zostaje skopiowana do x */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 15 Tablice jednowymiarowe a wskazniki " Nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu  jest wskaznikiem na ten element:nazwa_tablicyÔ!&nazwa_tablicy[0] *oceny = 2; /* element 0 tablicy oceny ma wartosc 2 */ *(oceny+2) = 3; /* element 2 tablicy oceny ma wartosc 3 */ " elementy tablicy mog by wskazywane przez zmienne wskaznikowe od- powiedniego typu int *ptr; /* ptr jest wskaznikiem do obiektow typu int */ ptr = &oceny[0]; /* ptr wskazuje na 0. element tablicy oceny */ ptr = oceny; /* jak powyzej tylko prosciej */ x = *ptr; /* zawartosc oceny[0] zostaje skopiowana do x */ x = *(ptr+1); /* zawartosc oceny[1] zostaje skopiowana do x */ x = *(++ptr); /* jw, tyle ze teraz ptr pokazuje na oceny[1] */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 15 Tablice jednowymiarowe a wskazniki " Nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu  jest wskaznikiem na ten element:nazwa_tablicyÔ!&nazwa_tablicy[0] *oceny = 2; /* element 0 tablicy oceny ma wartosc 2 */ *(oceny+2) = 3; /* element 2 tablicy oceny ma wartosc 3 */ " elementy tablicy mog by wskazywane przez zmienne wskaznikowe od- powiedniego typu int *ptr; /* ptr jest wskaznikiem do obiektow typu int */ ptr = &oceny[0]; /* ptr wskazuje na 0. element tablicy oceny */ ptr = oceny; /* jak powyzej tylko prosciej */ x = *ptr; /* zawartosc oceny[0] zostaje skopiowana do x */ x = *(ptr+1); /* zawartosc oceny[1] zostaje skopiowana do x */ x = *(++ptr); /* jw, tyle ze teraz ptr pokazuje na oceny[1] */ x = *ptr++; /* x ma wart. oceny[1], ptr pokazuje na oceny[2]*/  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 16 Proste operacje na tablicach Przy wykonywaniu operacji na tablicach nale|y pamita, |e: " pierwszy element tablicy w jzyku C ma indeks 0, " nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu, " w jzyku C nie jest sprawdzana poprawno[ (zakres) indeksów!  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 16 Proste operacje na tablicach Przy wykonywaniu operacji na tablicach nale|y pamita, |e: " pierwszy element tablicy w jzyku C ma indeks 0, " nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu, " w jzyku C nie jest sprawdzana poprawno[ (zakres) indeksów! Zainicjowanie elementów tablicy #define ROZMIAR 100 /* Rozmiar tablicy danych */ int tablica[ROZMIAR], i;  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 16 Proste operacje na tablicach Przy wykonywaniu operacji na tablicach nale|y pamita, |e: " pierwszy element tablicy w jzyku C ma indeks 0, " nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu, " w jzyku C nie jest sprawdzana poprawno[ (zakres) indeksów! Zainicjowanie elementów tablicy #define ROZMIAR 100 /* Rozmiar tablicy danych */ int tablica[ROZMIAR], i; . . . for(i = 0; i < ROZMIAR; i++) tablica[i] = 0;  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 16 Proste operacje na tablicach Przy wykonywaniu operacji na tablicach nale|y pamita, |e: " pierwszy element tablicy w jzyku C ma indeks 0, " nazwa tablicy reprezentuje poBo|enie jej pocztkowego elementu, " w jzyku C nie jest sprawdzana poprawno[ (zakres) indeksów! Zainicjowanie elementów tablicy #define ROZMIAR 100 /* Rozmiar tablicy danych */ int tablica[ROZMIAR], i; . . . for(i = 0; i < ROZMIAR; i++) tablica[i] = 0; Wypisanie wszystkich elementów tablicy for(i = 0; i < ROZMIAR; i++) printf("Tablica[%2d] = %5d\n", i, tablica[i]);  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 17 Funkcje operujce na tablicach #define ROZMIAR 10 void WczytajTablice(double tablica[]){ int i; printf("Podaj wartosci elementow tablicy \n"); for(i = 0; i < ROZMIAR; i++){ printf("Tab[%2d] = ", i+1); scanf("%f", &tablica[i]); } }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 17 Funkcje operujce na tablicach #define ROZMIAR 10 void WczytajTablice(double tablica[]){ int i; printf("Podaj wartosci elementow tablicy \n"); for(i = 0; i < ROZMIAR; i++){ printf("Tab[%2d] = ", i+1); scanf("%f", &tablica[i]); } } void WyswietlTablice(double tablica[]){ ... }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 17 Funkcje operujce na tablicach #define ROZMIAR 10 void WczytajTablice(double tablica[]){ int i; printf("Podaj wartosci elementow tablicy \n"); for(i = 0; i < ROZMIAR; i++){ printf("Tab[%2d] = ", i+1); scanf("%f", &tablica[i]); } } void WyswietlTablice(double tablica[]){ ... } void DodajTablice(double wej_1[], double wej_2[], double wynik[]){ int i; for(i = 0; i < ROZMIAR; i++) wynik[i] = wej_1[i] + wej_2[i]; }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 17 Funkcje operujce na tablicach #define ROZMIAR 10 void WczytajTablice(double tablica[]){ int i; printf("Podaj wartosci elementow tablicy \n"); for(i = 0; i < ROZMIAR; i++){ printf("Tab[%2d] = ", i+1); scanf("%f", &tablica[i]); } } void WyswietlTablice(double tablica[]){ ... } void DodajTablice(double wej_1[], double wej_2[], double wynik[]){ int i; for(i = 0; i < ROZMIAR; i++) wynik[i] = wej_1[i] + wej_2[i]; } int main(void){ double A[ROZMIAR], B[ROZMIAR], C[ROZMIAR]; WczytajTablice(A); WyswietlTablice(A); WczytajTablice(B); DodajTablice(A, B, C); WyswietlTablice(C); }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 18 Funkcje operujce na tablicach cd. void KopiujNapis(char wej[], char wyj[]) { /* wersja z indeksowaniem tablic */ int i=0; while ((wyj[i] = wej[i]) !=  \0 ) i++; }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 18 Funkcje operujce na tablicach cd. void KopiujNapis(char wej[], char wyj[]) { /* wersja z indeksowaniem tablic */ int i=0; while ((wyj[i] = wej[i]) !=  \0 ) i++; } void KopiujNapis(char *wej, char *wyj) /* naglowki rownowazne! */ { /* wersja wskaznikowa 1 */ while ((*wyj = *wej) !=  \0 ){ wej++; wyj++; } }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 18 Funkcje operujce na tablicach cd. void KopiujNapis(char wej[], char wyj[]) { /* wersja z indeksowaniem tablic */ int i=0; while ((wyj[i] = wej[i]) !=  \0 ) i++; } void KopiujNapis(char *wej, char *wyj) /* naglowki rownowazne! */ { /* wersja wskaznikowa 1 */ while ((*wyj = *wej) !=  \0 ){ wej++; wyj++; } } void KopiujNapis(char *wej, char *wyj) { /* wersja wskaznikowa 2 */ while ((*wyj++ = *wej++) !=  \0 ); }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 19 Tablice a wskazniki  przydziaB pamici Widzieli[my, |e w deklaracji nagBówka funkcji napisy char wej[] char *wej s równowa|ne. Jednak|e, gdy zadeklarujemy char tab[] = "To jest string."; char *ptr = "Jak rowniez to.";  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 19 Tablice a wskazniki  przydziaB pamici Widzieli[my, |e w deklaracji nagBówka funkcji napisy char wej[] char *wej s równowa|ne. Jednak|e, gdy zadeklarujemy char tab[] = "To jest string."; char *ptr = "Jak rowniez to."; " tabjest tablic, której zawarto[ jest zainicjalizowana okre[lonymi znaka- mi, której nie mo|na zmieni jako zmiennej, ale której wszystkie pozycje znakowe mog by dowolnie zmieniane.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 19 Tablice a wskazniki  przydziaB pamici Widzieli[my, |e w deklaracji nagBówka funkcji napisy char wej[] char *wej s równowa|ne. Jednak|e, gdy zadeklarujemy char tab[] = "To jest string."; char *ptr = "Jak rowniez to."; " tabjest tablic, której zawarto[ jest zainicjalizowana okre[lonymi znaka- mi, której nie mo|na zmieni jako zmiennej, ale której wszystkie pozycje znakowe mog by dowolnie zmieniane. " ptrjest zmienn wskaznikow zainicjalizowan wskaznikiem na napis zna- kowy. Warto[ tej zmiennej wskaznikowej mo|na zmienia dowolnie, lecz zawarto[ci pozycji znakowych nie (napis jest tablic staB, przydzielon w pamici staBych).  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 20 Tablice a wskazniki  przydziaB pamici cd. Tak wic, przy rzeczonych deklaracjach char tab[] = "To jest string."; char *ptr = "Jak rowniez to."; mamy co nastpuje: tab[1] = ptr[1]; /* poprawne kopiowanie znakow */ *(tab+1) = *(ptr+1); /* rowniez poprawne */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 20 Tablice a wskazniki  przydziaB pamici cd. Tak wic, przy rzeczonych deklaracjach char tab[] = "To jest string."; char *ptr = "Jak rowniez to."; mamy co nastpuje: tab[1] = ptr[1]; /* poprawne kopiowanie znakow */ *(tab+1) = *(ptr+1); /* rowniez poprawne */ ptr[1] = tab[1]; /* kopiowanie znakow NIEDOZWOLONE */ *(ptr+1) = *(tab+1); /* rowniez NIEDOZWOLONE */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 20 Tablice a wskazniki  przydziaB pamici cd. Tak wic, przy rzeczonych deklaracjach char tab[] = "To jest string."; char *ptr = "Jak rowniez to."; mamy co nastpuje: tab[1] = ptr[1]; /* poprawne kopiowanie znakow */ *(tab+1) = *(ptr+1); /* rowniez poprawne */ ptr[1] = tab[1]; /* kopiowanie znakow NIEDOZWOLONE */ *(ptr+1) = *(tab+1); /* rowniez NIEDOZWOLONE */ tab = ptr; /* to przypisanie jest NIEDOZWOLONE */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 20 Tablice a wskazniki  przydziaB pamici cd. Tak wic, przy rzeczonych deklaracjach char tab[] = "To jest string."; char *ptr = "Jak rowniez to."; mamy co nastpuje: tab[1] = ptr[1]; /* poprawne kopiowanie znakow */ *(tab+1) = *(ptr+1); /* rowniez poprawne */ ptr[1] = tab[1]; /* kopiowanie znakow NIEDOZWOLONE */ *(ptr+1) = *(tab+1); /* rowniez NIEDOZWOLONE */ tab = ptr; /* to przypisanie jest NIEDOZWOLONE */ ptr = tab; /* poprawne, choc gubi pamiec */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 21 Wskazniki a argumenty funkcji void zamien(int x, int y) /* !!!!!!!!! Z L E !!!!!!!!!!! */ { /* zamiana wartosci argumentow */ int tmp; tmp = x; x = y; y = tmp; }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 21 Wskazniki a argumenty funkcji void zamien(int x, int y) /* !!!!!!!!! Z L E !!!!!!!!!!! */ { /* zamiana wartosci argumentow */ int tmp; tmp = x; x = y; y = tmp; } void zamien(int *px, int *py) /* !!!!!! D O B R Z E !!!!!!!! */ { /* zamiana wartosci argumentow */ int tmp; tmp = *px; *px = *py; *py = tmp; }  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 21 Wskazniki a argumenty funkcji void zamien(int x, int y) /* !!!!!!!!! Z L E !!!!!!!!!!! */ { /* zamiana wartosci argumentow */ int tmp; tmp = x; x = y; y = tmp; } void zamien(int *px, int *py) /* !!!!!! D O B R Z E !!!!!!!! */ { /* zamiana wartosci argumentow */ int tmp; tmp = *px; *px = *py; *py = tmp; } WywoBanie:zamien(&a, &b);przyint a, b;  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 22 Arytmetyka wskazników " Wskazniki stanowi dane typu wskaznikowego, który jest podobny do typu liczb caBkowitych. Pod wskaznik mo|na podstawi warto[, warto[ wskaz- nika mo|na wy[wietli funkcj printf. char c, *cp; int i, *ip; ip = 0; /* inicjalizacja wartoscia 0 */ ip = &i; /* inicjalizacja poprawna wartoscia wskaznikowa */ printf("ip = %d\n", ip);  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 22 Arytmetyka wskazników " Wskazniki stanowi dane typu wskaznikowego, który jest podobny do typu liczb caBkowitych. Pod wskaznik mo|na podstawi warto[, warto[ wskaz- nika mo|na wy[wietli funkcj printf. char c, *cp; int i, *ip; ip = 0; /* inicjalizacja wartoscia 0 */ ip = &i; /* inicjalizacja poprawna wartoscia wskaznikowa */ printf("ip = %d\n", ip); " Warto[ wskazników mo|na powiksza lub zmniejsza, powodujc, |e wskaznik wskazuje na nastpne/poprzednie elementy wzgldem wskazy- wanego przed zmian warto[ci cp = &c; cp += 1; /* cp wskazuje do nastepnego elementu po c */ ip += 1; /* ip wskazuje do nastepnego elementu po i */ Warto[ liczbowa wskaznikacpzwikszyBa si o 1, natomiast wskaznikip zwikszyB si by mo|e o 4 (dokBadniej: o liczb bajtów przypadajc na zmienn typuint, która mo|e by ró|na na ró|nych systemach (sizeof)).  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 23 Arytmetyka wskazników cd. Do poprawnych operacji wskaznikowych nale|: " przypisanie wskazników do obiektów tego samego typu  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 23 Arytmetyka wskazników cd. Do poprawnych operacji wskaznikowych nale|: " przypisanie wskazników do obiektów tego samego typu " przypisanie wskaznikowi warto[ci zero (NULL) " przyrównanie wskaznika do zera (NULL)  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 23 Arytmetyka wskazników cd. Do poprawnych operacji wskaznikowych nale|: " przypisanie wskazników do obiektów tego samego typu " przypisanie wskaznikowi warto[ci zero (NULL) " przyrównanie wskaznika do zera (NULL) " dodawanie lub odejmowanie wskaznika i liczby caBkowitej  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 23 Arytmetyka wskazników cd. Do poprawnych operacji wskaznikowych nale|: " przypisanie wskazników do obiektów tego samego typu " przypisanie wskaznikowi warto[ci zero (NULL) " przyrównanie wskaznika do zera (NULL) " dodawanie lub odejmowanie wskaznika i liczby caBkowitej " odejmowanie bdz porównywanie dwóch wskazników do elementów tej sa- mej tablicy  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 23 Arytmetyka wskazników cd. Do poprawnych operacji wskaznikowych nale|: " przypisanie wskazników do obiektów tego samego typu " przypisanie wskaznikowi warto[ci zero (NULL) " przyrównanie wskaznika do zera (NULL) " dodawanie lub odejmowanie wskaznika i liczby caBkowitej " odejmowanie bdz porównywanie dwóch wskazników do elementów tej sa- mej tablicy Wszystkie inne operacje na wskaznikach s nielegalne  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 23 Arytmetyka wskazników cd. Do poprawnych operacji wskaznikowych nale|: " przypisanie wskazników do obiektów tego samego typu " przypisanie wskaznikowi warto[ci zero (NULL) " przyrównanie wskaznika do zera (NULL) " dodawanie lub odejmowanie wskaznika i liczby caBkowitej " odejmowanie bdz porównywanie dwóch wskazników do elementów tej sa- mej tablicy Wszystkie inne operacje na wskaznikach s nielegalne " dodawanie do siebie wskazników " ich mno|enie, dzielenie, przesuwanie, skBadanie z maskami " dodawanie do nich liczby typufloatlubdouble " nie wolno nawet (z wyjtkiem typuvoid *) wskaznikowi do obiektów jed- nego typu przypisywa bez rzutowania wskaznika do obiektów innego typu  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 24 Rzutowanie " Zadaniem rzutowania jest konwersja danej jednego typu na dan innego typu. Konwersja mo|e by niejawna (domy[lna konwersja przyjta przez kompilator) lub jawna (podana explicite przez programist).  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 24 Rzutowanie " Zadaniem rzutowania jest konwersja danej jednego typu na dan innego typu. Konwersja mo|e by niejawna (domy[lna konwersja przyjta przez kompilator) lub jawna (podana explicite przez programist). " PrzykBady konwersji niejawnej: int i = 42.7; /* konwersja z double do int */ float f = i; /* konwersja z int do float */ double d = f; /* konwersja z float do double */ unsigned u = i; /* konwersja z int do unsigned int */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 24 Rzutowanie " Zadaniem rzutowania jest konwersja danej jednego typu na dan innego typu. Konwersja mo|e by niejawna (domy[lna konwersja przyjta przez kompilator) lub jawna (podana explicite przez programist). " PrzykBady konwersji niejawnej: int i = 42.7; /* konwersja z double do int */ float f = i; /* konwersja z int do float */ double d = f; /* konwersja z float do double */ unsigned u = i; /* konwersja z int do unsigned int */ " Do jawnego wymuszenia konwersji sBu|y jednoargumentowy operator rzu- towania(typ), np.: double d = 3.14; int pi = (int) d; /* konwersja z double do int */ d = (double) pi; /* konwersja z int do double */  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 24 Rzutowanie " Zadaniem rzutowania jest konwersja danej jednego typu na dan innego typu. Konwersja mo|e by niejawna (domy[lna konwersja przyjta przez kompilator) lub jawna (podana explicite przez programist). " PrzykBady konwersji niejawnej: int i = 42.7; /* konwersja z double do int */ float f = i; /* konwersja z int do float */ double d = f; /* konwersja z float do double */ unsigned u = i; /* konwersja z int do unsigned int */ " Do jawnego wymuszenia konwersji sBu|y jednoargumentowy operator rzu- towania(typ), np.: double d = 3.14; int pi = (int) d; /* konwersja z double do int */ d = (double) pi; /* konwersja z int do double */ Nigdy nie nale|y stosowa rzutowania by  uciszy kompilator .  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 25 Rzutowanie cd. " Rzutowanie mo|e prowadzi do utraty informacji: int i; char c; c = i; i = c;  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 25 Rzutowanie cd. " Rzutowanie mo|e prowadzi do utraty informacji: aczkolwiek nie zawsze: int i; int i; char c; char c; c = i; i = c; i = c; c = i;  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 25 Rzutowanie cd. " Rzutowanie mo|e prowadzi do utraty informacji: aczkolwiek nie zawsze: int i; int i; char c; char c; c = i; i = c; i = c; c = i; " By  poeksperymentowa z rzutowaniem mo|na posBu|y si konstrukcjami w rodzaju: int i = 17; float f = 22.5; printf ("i bez rzutowania jako float %f\n", i); printf ("i z rzutowaniem jako float %f\n", (float) i); printf ("f bez rzutowania jako int %d\n", f); printf ("f z rzutowaniem jako int %d\n", (int) f);  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 26 Podsumowanie " Zagadnienia podstawowe 1. Wska| elementy, które powinna zawiera specyfikacja funkcji. 2. Czy wewntrz warunków PRE i POST umieszcza si opis dziaBania funkcji? 3. Czy w cz[ci PRE specyfikacji funkcji powinna by podana informacja o tym, jakiego typu funkcja zwraca warto[? 4. Czy warunek POST: wszystkie parametry funkcji musza byc dodatnie jest po- prawny? 5. Jaka warto[ zostanie zwrócona przez funkcjfopen, je[li u|ytkownik nie ma prawa do odczytu wskazanego w jej argumencie pliku? 6. Jakie s konsekwencje nie zamknicia funkcjfcloseotwartego w programie strumie- nia danych? 7. W jaki sposób mo|na sprawdzi warto[ kolejnego znaku wystpujcego w pliku tak, aby w dalszej cz[ci programu byBo mo|liwe jego ponowne odczytanie? 8. WymieD zalety iteracji i rekurencji. 9. Czy istnieje mo|liwo[, aby dwie zmienne wskazywaBy na to samo miejsce w pamici? 10. Czy zapisint &x;jest prawidBowy? 11. Czy dla#define LICZBA 10mo|liwe jest przypisaniex = &LICZBA? 12. Czy odwoBania do i-tego elementu tablicy jednowymiarowejtpostacit[i]oraz*(t+i) s zawsze równowa|ne?  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 27 13. Wska| ró|nice pomidzy przekazywaniem zmiennej jako argumentu do funkcji poprzez jej warto[ a poprzez wskaznik na ni. Podaj wady i zalety ka|dego z rozwizaD. " Zagadnienia rozszerzajce 1. W jaki sposób mo|na poda [cie|k do pliku w funkcjifopen(wzgldn, bezwzgldn)? 2. W jaki sposób sprawdzi, jaki bBd spowodowaBo niepowodzenie otwarcia pliku lub operacji wej[ciawyj[cia? 3. Czy poprawna jest instrukcjafclose(stdout);? 4. Czy mo|na dowolny algorytm iteracyjny zapisa w formie rekurencyjnej? A na odwrót? 5. Jakie trudno[ci, poza okre[leniem warunku stopu, mog si pojawi podczas wykorzy- stywania rekurencji? 6. Rozró|nia si rekurencje zwykB i ogonow  czym one si od siebie ró|ni? 7. Czy istnieje mo|liwo[ zdefiniowania wskaznika navoid? Je[li tak, to w jakim celu mo|na to wykorzysta? 8. Jakie mog by skutki rzutowania zmiennej o mniejszym rozmiarze na zmienn o roz- miarze wikszym? A wikszej na mniejsz? " Zadania 1. Napisz program, który we wskazanym pliku policzy liczb znaków, sBow (jednostki od- dzielone od siebie biaBymi znakami) oraz linii.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010 Specyfikacja funkcji, operacje wej[cia i wyj[cia na plikach, rekurencja, tablice i wskazniki ! ’! 28 2. Napisz program, który we wskazanym pliku znajdzie linie, które zawieraj podany wzo- rzec. 3. Napisz funkcjvoid UsunZnak(char *napis, char znak)usuwajc wszystkie znaki znakz napisunapis. 4. Stwórz iteracyjn i rekurencyjn wersj programu wyliczajcego n-ty element cigu arytmetycznego. 5. Wczytaj do tablicy n liczb. Korzystajc ze wskazników znajdz najwiksz z nich. 6. Napisz program umo|liwiajcy wczytanie stopnia wielomianu i wspóBczynników stoj- cych przy zmiennej, a nastpnie wyliczajcy warto[ci wielomianu dla wprowadzanych warto[ci tej zmiennej. Uwzgldnij mo|liwo[ zapisywania wyników do pliku. 7. Dwuwymiarow tablic mo|na wykorzysta m.in. do zapisania planszy do gry w  wilka i owce (takiej jak w warcabach). Napisz program, w którym u|ytkownicy (gracze) na przemian mogliby wykonywa ruchy pionków na takiej planszy, wpisujc pocztkowe i koDcowe numery wiersza i kolumny.  SkBad FoilTEX  Indeks © R. MuszyDski, 29 pazdziernika 2010

Wyszukiwarka