Bardzo szybkie podsumowanie: wykład 2
Transkrypt
Bardzo szybkie podsumowanie: wykład 2
Bardzo szybkie podsumowanie: wykªad 2 wer. 6 z drobnymi mody kacjami! Wojciech Myszka 2016-05-08 17:54:41 +0200 Uwagi 1. Obowi¡zuje caªy materiaª! 2. Tu tylko podsumowanie. Funkcje main wer. 6 z drobnymi mody kacjami pierwiastek lepszy blisko Wojciech Myszka 2016-05-08 15:56:16 +0200 Funkcje 1. Funkcje to sposób na podzielenie duzego programu na mniejsze, ªatwiejsze w zarz¡dzaniu fragmenty. 2. Odpowiedni (umiej¦tny) podziaª programu na moduªy (funkcje) pozwala na powtórne (i wielokrotne) wykorzystanie ich w innych programach. 3. Ukrycie pewnych fragmentów pod postaci¡ funkcji pozwala na uproszczenie struktury programu i uczynienie go bardziej czytelnym. 4. Funkcje to, wreszcie, podstawa programowania strukturalnego. 5. Praktycznie kazdy j¦zyk programowania wyposazony jest w mechanizmy podziaªu na moduªy oraz tworzenia funkcji (i procedur). 6. W matematyce pod poj¦ciem funkcji rozumiemy twór, który pobiera pewn¡ liczb¦ argumentów i zwraca wynik. Je±li dla przykªadu we¹miemy funkcj¦ sin(x) to x b¦dzie zmienn¡ rzeczywist¡, która okre±la k¡t, a w rezultacie otrzymamy inn¡ liczb¦ rzeczywist¡ sinus tego k¡ta. Budowa funkcji De nicja funkcji wygl¡da w sposób nast¦puj¡cy typ_powrotu nazwa_funkcji ( d e k l a r a c j a parametr ów ) { deklaracje i instrukcje } 1. Funkcja musi by¢ zadeklarowana przed pierwszym jej uzyciem! 2. Funkcja zwraca warto±¢ b¦d¡c¡ wynikiem jej dziaªania. 3. Funkcj¦ wywoªuje si¦ najcz¦±ciej w nast¦puj¡cy sposób: a = nazwa_funkcji ( parametry f u n k c j i ) ; zwªaszcza gdy zalezy nam na zapami¦taniu, lub dalszym przetwarzaniu, wyniku zwracanego przez funkcj¦. Gdy nie jest on potrzebny (istotny) lub funkcja nie zwraca zadnych wyników mozna wykona¢ tak: nazwa_funkcji ( parametry f u n k c j i ) ; W ten sposób najcz¦±ciej wywoªywana jest funkcja printf 4. Jezeli funkcja zwraca jak¡± warto±¢ w±ród instrukcji powinna znale¹¢ si¦ instrukcja return wyra z enie ; powoduje ona, ze warto±¢ wyrazenia przypisywana jest jako warto±¢ funkcji! Budowa funkcji Najprostsza funkcja dummy ( ) { } I I I Funkcja nie ma parametrów. Funkcja nie zwraca zadnej warto±ci. Funkcja nic nie robi Uzycie: dummy ( ) ; Program z funkcj¡ void dummy( void ) {} i n t main ( ) { dummy ( ) ; return ( 0 ) ; } Program z funkcj¡ void dummy( void ) { glupia ( ) ; } void g l u p i a ( void ) {} i n t main ( ) { dummy ( ) ; return ( 0 ) ; } ™le !!! Program z funkcj¡ void g l u p i a ( void ) {} void dummy( void ) { glupia ( ) ; } i n t main ( ) { dummy ( ) ; return ( 0 ) ; } OK !!! Funkcje zagniezdzone i n t main ( void ) { void dummy( void ) { void g l u p i a ( void ) { } glupia ( ) ; } dummy ( ) ; return 0 ; } ™le !!! Argumenty funkcji 1. Funkcja nie musi mie¢ argumentów. i n t smieszna ( ) { return 7 ; } i n t smieszna ( void ) { return 7 ; } 2. W takim wypadku wywoªanie funkcji ma posta¢: a = smieszna ( ) ; Nawiasy musz¡ by¢ nawet jak nie ma argumentów! Argumenty funkcji 1. Funkcja nie musi mie¢ argumentów. i n t smieszna ( ) { return 7 ; } i n t smieszna ( void ) { return 7 ; } 2. W takim wypadku wywoªanie funkcji ma posta¢: a = smieszna ( ) ; Nawiasy musz¡ by¢ nawet jak nie ma argumentów! Wynik wykonania funkcji 1. Funkcja (na ogóª) zwraca jakie± wyniki. 2. Do przekazania wyników na zewn¡trz funkcji sªuzy instrukcja return. 3. Program wywoªuj¡cy moze zignorowa¢ zwrócone wyniki. 4. Gdy funkcja nie zwraca wyników nazywana bywa procedur¡. Procedury 1. Procedur¦ deklaruje si¦ w nast¦puj¡cy sposób: void procedurka ( i n t x ) { p r i n t f ( "−−−−−−\n " \ " %d \ n " \ "−−−−−−\n " , \ x ); } 2. Procedur¦ wywoªuje si¦ w nast¦puj¡cy sposób: i n t main ( ) { i n t z = 123; procedurka ( z + 7 ) ; return 1 ; } Kompletny program b¦dzie wygl¡daª tak: #include < s t d i o . h> void procedurka ( i n t x ) { p r i n t f ( "−−−−−−\n " \ " %d \ n " \ "−−−−−−\n " , \ x ); } i n t main ( ) { i n t z = 123; procedurka ( z + 7 ) ; return 1 ; } Procedury kilka uwag 1. Kazda procedura (jak i funkcja) powinna by¢ zadeklarowana przed pierwszym jej uzyciem. 2. Deklaracja to de nicja albo prototyp (a de nicja pó¹niej). 3. Bardzo wiele procedur systemowych deklarowanych jest w plikach nagªówkowych. 4. Pliki nagªówkowe powinny by¢ wczytywane na pocz¡tku. 5. Ogólna struktura programu powinna by¢ zatem taka: I I I wczytanie plików nagªówkowych, de nicje wszystkich procedur, program gªówny. Deklaracja funkcji (prototyp) wygl¡da (jako±) tak: typ nazwa (parametry i ich typ); Program z funkcj¡ i prototypy void g l u p i a ( void ) ; void dummy( void ) ; i n t main ( ) { dummy ( ) ; return ( 0 ) ; } void dummy( void ) { glupia ( ) ; } void g l u p i a ( void ) {} Teraz kolejno±¢ nie jest juz istotna. De nicje i deklaracje lokalne 1. Kazda zmienna musi by¢ zadeklarowana. 2. Zmienna dost¦pna jest tylko w bloku, w którym zostaªa zadeklarowana (i wszystkich blokach w nim zawartych. S¡ to zmienne lokalne. 3. Uwaga: blok to zazwyczaj wszystko co si¦ znajduje wewn¡trz nawiasów klamrowych { } 4. Deklaracje w blokach nizszych przysªaniaj¡ deklaracje z bloków wyzszego poziomu. 5. Po wyj±ciu z bloku zmienne lokalne znikaj¡ . S¡ niedost¦pne, a ich zawarto±¢ jest zapominana. 6. Po powrocie do bloku nie ma dost¦pu do poprzedniej warto±ci zmiennej! 7. Po powrocie do funkcji (w zasadzie) nie ma dost¦pu do poprzednich warto±ci zmiennych. De nicje i deklaracje globalne 1. Zmienne zadeklarowane na zewn¡trz wszystkich moduªów (funkcje, procedury, funkcja main) nazywane s¡ zmiennymi globalnymi. 2. Zmienne globalne dost¦pne s¡ we wszystkich blokach. . . 3. . . . chyba, ze zostan¡ przysªoni¦te przez de nicj¡ lokaln¡. 4. Zmienne globalne mog¡ by¢ wykorzystanie do przekazywania dodatkowych wyników zwracanych przez funkcj¦. Nie jest to najlepsze rozwi¡zanie. . . #include < s t d i o . h> i n t v = 100; void procedurka ( i n t x ) { int v = 7; p r i n t f ( "−−−−−−\n " \ " %d \ n " \ "−−−−−−\n " , \ x ); p r i n t f ( " v = %d \ n " , v ) ; } i n t main ( ) { i n t z = 123; procedurka ( z + 7 ) ; procedurka ( v ) ; return 1 ; } Czym si¦ rózni? int i ; i n t main ( void ) { return 1 ; } i n t main ( void ) { int i ; return 1 ; } Funkcja main 1. 2. 3. 4. Kazdy program w j¦zyku C musi mie¢ segment gªówny. Segment gªówny musi nazywa¢ si¦ main. . . . . . i jest funkcj¡! Warto±¢, któr¡ zwraca funkcja main przekazywana jest do systemu operacyjnego. 5. Warto±¢ ta zazwyczaj informuje czy program zako«czyª si¦ z bª¦dami i, czasami, o typie (rodzaju) bª¦du. 6. Standardowe kody zako«czenia programu zde niowane s¡ w pliku nagªówkowym stdlib.h s¡ to #define #define EXIT_FAILURE EXIT_SUCCESS 1 0 /∗ F a i l i n g e x i t s t a t u s . ∗/ /∗ S u c c e s s f u l e x i t s t a t u s . ∗/ 7. Kazdy segment gªówny powinien si¦ ko«czy¢ poleceniem return. Funkcja main 1. To jest wªa±ciwie poprawny program w j¦zyku C void main ( void ) { ; } Nic nie robi, nie zwraca zadnej informacji. Kompilator sygnalizuje komunikat warning: return type of `main' is not `int ' 2. Zamiana pierwszego void na int i n t main ( void ) { ; } powoduje komunikat warning: control reaches end of non-void function 3. Poprawny program powinien wygl¡da¢ jako± tak: i n t main ( void ) { return 0 ; } Rekurencja 1. Przypadek gdy funkcja (lub procedura) wywoªuje sam¡ siebie nazywamy rekurencj¡. 2. Nie potra ¦ powiedzie¢, czy rekurencja to dobra czy zªa technika programowania. 3. Rekurencja byªa bardzo pozyteczna podczas tworzenia algorytmów. 4. W realizacjach programowych (zwªaszcza bardzo skomplikowanych problemów) stwarza wiele kªopotów. 5. Problemy wynikaj¡ z konieczno±ci przechowania wszystkich argumentów i caªej struktury danych uzywanej przez funkcj¦ gdy wywoªuje ona sam¡ siebie. Rekurencja Silnia schemat blokowy silnia N n==0 return n * silnia(n-1) T return 1 Koniec Rekurencja Silnia # include < s t d i o . h> # include < s t d l i b . h> float s i l n i a ( int n) { i f ( n == 0 ) return 1 . ; else return n ∗ s i l n i a ( n −1); } i n t main ( i n t cnt , char ∗∗ arg ) { int n; n= a t o l ( arg [ 1 ] ) ; p r i n t f ( " %d ! = %g \ n " , n , s i l n i a ( n ) ) ; return 0 ; } Ci¡g Fibonacciego Rekurencja Fn := 0 1 Fn−1 + Fn−2 dla n = 0 dla n = 1 dla n > 1. Ci¡g Fibonacciego Rekurencja # include unsigned unsigned { k ++; if ( } < s t d i o . h> long i n t k ; long i n t f i b ( i n t n ) n == 0 ) return 0 ; e l s e i f ( n == 1 ) return 1 ; else return f i b ( n − 1 ) + f i b ( n − 2 ) ; i n t main ( i n t argc , char ∗∗ ar gv ) { i n t n , m; f o r ( n = 0 ; n < 100; n++ ) { k = 0; m = fib (n); p r i n t f ( " %lu , %lu , % l u \ n " , n , m, k ) ; } return 0 ; } Idea programowania strukturalnego Metoda Newtona-Raphsona: pierwiastek dowolnego stopnia Zaªózmy, ze mamy wyznaczy¢ pierwiastek stopnia n z liczby w, czyli znale¹¢ tak¡ liczb¦ x, ze: lub inaczej: xn = w (1) xn − w = 0 (2) Jezeli oznaczymy f(x) = xn − w to zadanie to mozna zapisa¢ ogólniej: nalezy znale¹¢ takie x, ze f(x) = 0. Idea programowania strukturalnego Metoda Newtona-Raphsona: pierwiastek dowolnego stopnia Jezeli zadanie dodatkowo upro±cimy zakªadaj¡c: I funkcja ma dokªadnie jedno miejsce zerowe, I jest rózniczkowalna, I jej pochodna w caªym przedziale jest albo dodatnia albo ujemna; to mozemy naszkicowa¢ nast¦puj¡cy rysunek ilustruj¡cy nasze zadanie: Idea programowania strukturalnego Metoda Newtona-Raphsona: pierwiastek dowolnego stopnia f(g) g g’ g’’ Idea programowania strukturalnego Metoda Newtona-Raphsona: pierwiastek dowolnego stopnia Zaczynamy w punkcie g; warto±¢ funkcji w tym punkcie wynosi f(g). Musimy w jaki± sposób zdecydowa¢ w którym kierunku nalezy wykona¢ nast¦pny krok. Zauwazmy, ze mozemy w tym celu wykorzysta¢ pochodn¡ (czerwona, przerywana linia na poprzednim rysunku). Jezeli przyblizymy funkcj¦ za pomoc¡ pochodnej (stycznej do funkcji, przechodz¡cej przez punk (g, f(g) to nast¦pnym przyblizeniem b¦dzie punkt przeci¦cia stycznej z osi¡ x. Idea programowania strukturalnego Metoda Newtona-Raphsona: pierwiastek dowolnego stopnia Z równania prostej mamy: czyli f(g) − 0 = f 0 (g) 0 g−g (3) f(g) = g − g0 f 0 (g) (4) f(g) f 0 (g) (5) i dalej g0 = g − Idea programowania strukturalnego Metoda Newtona-Raphsona: pierwiastek dowolnego stopnia Jezeli zauwazymy, ze f(x) = xn − w oraz, ze f 0 (x) = nxn−1 to kolejne przyblizenie wyliczane b¦dzie ze wzoru: g0 = g − gn − w ngn−1 (6) albo ngn − gn + w (n − 1)gn + w 1 w g = = = (n − 1)g + n−1 ngn−1 ngn−1 n g 0 Gdy n = 2, wówczas ! 1 w g = g+ . 2 g 0 ! (7) (8) Umawiamy si¦, ze program ko«czy prac¦ gdy kolejna poprawka g0 nie rózni si¦ zbytnio od poprzednio wyliczonej warto±ci g, czyli |g − g0 | < ε. Idea programowania strukturalnego Realizacja programowa Program b¦dzie si¦ skªadaª z trzech cz¦±ci: 1. blisko(g, gprim) funkcja o warto±ciach logicznych sprawdzaj¡ca czy |g − g0 | ≤ ε, 2. lepszy(n, w, g) funkcja rzeczywista wyliczaj¡ca nast¦pne, lepsze przyblizenie pierwiastka, 3. pierwiastek(n, w, g) funkcja (rzeczywista) wyliczaj¡ca pierwiastek stopnia n z w zaczynaj¡c od przyblizenia g. Uwaga: Dalszy przykªad zakªada n = 2 Realizacja programowa lepszy(w, g) Start lepszy = 0.5*(g+w/g) Koniec Realizacja programowa blisko(g, gprim) Start T abs(g-gprim) <= EPSILON blisko = TRUE N blisko = FALSE Koniec Realizacja programowa pierwiastek(w, g) Start gprim = lepszy(w,g) T blisko (g, gprim) F pierwiastek = pierwiastek (w, gprim) pierwiastek = gprim Koniec Realizacja programowa Program gªówny Start wprowad¹ w ustal 1. przyblizenie g wynik = pierwiastek(w, g) wydrukuj wynik Koniec Metoda Newtona Realizacja programowa Program skªada si¦ z trzech cz¦±ci: 1. blisko(g, gprim) funkcja o warto±ciach logicznych sprawdzaj¡ca czy |g − g0 | ≤ ε, 2. lepszy(n, w, g) funkcja rzeczywista wyliczaj¡ca nast¦pne, lepsze przyblizenie pierwiastka, 3. pierwiastek(n, w, g) funkcja (rzeczywista) wyliczaj¡ca pierwiastek stopnia n z w zaczynaj¡c od przyblizenia g. Uwaga: Dalszy przykªad zakªada n = 2 Realizacja programowa lepszy(w, g) Start lepszy = 0.5*(g+w/g) Koniec double l e p s z y ( double w, double g ) { return 0.5 ∗ ( g + w/g ) ; } Metoda Newtona blisko(g, gprim) Start T abs(g-gprim) <= EPSILON blisko = TRUE N blisko = FALSE Koniec i n t b l i s k o ( double g , \ double gprim ) { return f a b s ( g − gprim ) \ < EPSILON ; } Metoda Newtona pierwiastek(w, g) Start gprim = lepszy(w,g) T blisko (g, gprim) F pierwiastek = pierwiastek (w, gprim) pierwiastek = gprim Koniec double p i e r w i a s t e k ( double w, \ double g ) { double gprim ; gprim = l e p s z y (w, g ) ; i f ( b l i s k o ( g , gprim ) ) return gprim ; else return p i e r w i a s t e k (w, \ gprim ) ; } Metoda Newtona Program gªówny Start wprowad¹ w ustal 1. przylizenie g wynik = pierwiastek(w, g) wydrkuj wynik Koniec i n t main ( void ) { double w, g , wynik ; w = 2.; g = 1.; wynik = s q r t f (w) ; p r i n t f ( " % f \ n " , wynik ) ; wynik = p i e r w i a s t e k (w, g ) ; p r i n t f ( " P i e r w i a s t e k kwadratowy z l i c z b y " \ " % f wynosi % f \ n " , w, wynik ) ; return 0 ; } Metoda Newtona-Raphsona Zadanie domowe 1. Narysowa¢ schemat blokowy dla dowolnego n (wszystko to co byªo to byªo dla n = 2. 2. Napisa¢ program (w C) realizuj¡cy ten schemat blokowy. Tablice (tablice jedno i wielowymiarowe), ªa«cuchy znaków wer. 7 z drobnymi mody kacjami Wojciech Myszka 2016-05-08 15:57:12 +0200 Zmienne Przypomnienie/podsumowanie 1. Wszystkie zmienne musz¡ by¢ zadeklarowane. 2. Nazwa zmiennej skªada si¦ z liter i cyfr, a rozpoczyna si¦ liter¡; znak podkre±lenia zalicza si¦ do liter. 3. Nazwy zmiennych nie powinny si¦ zaczyna¢ od znaku podkre±lenia (tak nazywaj¡ si¦ zmienne systemowe). 4. Deklaracja obowi¡zuje wewn¡trz bloku (i we wszystkich blokach znajduj¡cych si¦ nizej ). 5. W C wyst¦puj¡ zmienne globalne (zewn¦trzne) i lokalne. 6. Deklaracja lokalna przysªania deklaracj¦ globaln¡ (jezeli nawa zmiennej jest taka sama). Tablice 1. Gdy potrzebujemy przechowa¢ kilka zmiennych tego samego typu (i jako± powi¡zanych ze sob¡) stosujemy tablic¦. 2. Tablica to ci¡g zmiennych o tej samej nazwie; dost¦p do poszczególnych elementów odbywa si¦ przez podanie numeru zmiennej (indeksu). 0 1 2 3 4 5 6 7 8 9 3. Elementy numerowane s¡ pocz¡wszy od zera. 4. Deklaracja wygl¡da tak: typ nazwa_tablicy[rozmiar]; Tablice 1. Tablica jest zmienn¡ zªozon¡ (struktur¡ pewnego rodzaju). 2. Sªuzy do przechowywania danych tego samego typu. 3. Jezeli chcemy nada¢ elementom tablicy warto±ci pocz¡tkowe int tablica[3] = {1,2,3}; 4. To jest równiez poprawna deklaracja: int tablica[20] = 1,; (pierwszy element tablicy ma warto±¢ 1, pozostaªe maj¡ warto±¢ 0) 5. Nie zawsze trzeba podawa¢ rozmiar tablicy czasami kompilator moze si¦ domy±li¢ sam: int tablica[] = 1, 2, 3, 4, 5; zostanie zadeklarowana tablica o pi¦ciu elementach. Wielko±¢ tablic 1 2 3 4 5 6 7 8 9 #include < s t d i o . h> i n t main ( void ) { int t [ ] = {1 , 2 , 3 , 4 , } ; int i ; f o r ( i = −1; i < 7 ; i ++) p r i n t f ( " t [%d ] = %d \ n " , i , t [ i ] ) ; return 0 ; } Ile elementów ma tablica t? Wykonany po raz pierwszy t[-1] = 11131 t[0] = 1 t[1] = 2 t[2] = 3 t[3] = 4 t[4] = -1296194160 t[5] = 32767 t[6] = 0 Wykonany po raz drugi t[-1] = 10955 t[0] = 1 t[1] = 2 t[2] = 3 t[3] = 4 t[4] = -868000288 t[5] = 32767 t[6] = 0 Wykonany po raz trzeci t[-1] = 11015 t[0] = 1 t[1] = 2 t[2] = 3 t[3] = 4 t[4] = -143761264 t[5] = 32767 t[6] = 0 Zmienne zewn¦trzne i wewn¦trzne # include < s t d i o . h> i n t a ; // <−−− Zmienna zewnetrzna i n t main ( void ) { i n t b ; // <−−− Zmienna wewnetrzna ... Zmienne zewn¦trzne nazywane bywaj¡ zmiennymi globalnymi (czyli dost¦pnymi dla kazdej funkcji programu). Zmienne statyczne i automatyczne Troch¦ zam¦tu 1. Dodatkowo mozna zaz¡da¢ od zmiennej zeby byªa statyczna (co deklaruje si¦ dodaj¡c sªowo kluczowe static przed nazw¡ typu). static int x; 2. Zmienna statyczna zewn¦trzna pozostaje zde niowana tylko dla funkcji zde niowanych w jednym pliku ¹ródªowym (ukryta jest dla funkcji z innych plików ¹ródªowych). 3. Zmienna statyczna wewn¦trzna zachowuje swoj¡ warto±¢ pomi¦dzy kolejnymi wywoªaniami funkcji. 4. Zmienne, które nie s¡ statyczne nie musz¡ zachowywa¢ warto±ci mi¦dzy wej±ciami do funkcji (ale mog¡) nie mozna na to liczy¢! 5. Dodatkowo zmienne statyczne wewn¦trzne inicjowane s¡ na warto±¢ zero (jezeli programista nie zaz¡da zeby byªo inaczej). Zmienne statyczne i automatyczne # include < s t d i o . h> void f ( void ) { s t a t i c i n t x ; /∗ zmienna s t a t y c z n a ∗/ int y = 0; /∗ zmienna automatyczna ∗/ x ++; y ++; p r i n t f ( " X=%d , Y=%d \ n " , x , y ) ; } i n t main ( ) { f (); f (); f (); return 0 ; } Inicjowanie I 1. W deklaracji obiektu mozna zawrze¢ warto±¢ pocz¡tkow¡ deklarowanego identy katora. 2. Inicjator, który poprzedza si¦ operatorem = jest albo wyrazeniem, albo list¡ inicjatorów zawart¡ w nawiasach klamrowych. 3. Lista moze ko«czy¢ si¦ przecinkiem. 4. Dla obiektów i tablic statycznych wszystkie wyrazenia w inicjatorach musz¡ by¢ wyrazeniami staªymi. 5. Nie inicjowany jawnie obiekt statyczny jest inicjowany tak, jakby jemu, (lub jego skªadowym) przypisano warto±¢ zero. Inicjowanie II 6. Pocz¡tkowa warto±¢ nie zainicjowanego jawnie obiektu automatycznego jest niezde niowana. 7. Inicjatorem dla obiektu arytmetycznego jest pojedyncze wyrazenie (by¢ moze uj¦te w nawiasy klamrowe). 8. Inicjatorem dla struktury jest albo wyrazenie tego samego typu albo uj¦ta w nawiasy klamrowe lista inicjatorów dla jej kolejnych skªadowych. 9. Inicjatorem dla tablicy jest uj¦ta w klamry lista inicjatorów dla jej kolejnych elementów. 10. Je±li nie jest znany rozmiar tablicy to rozmiar ten wylicza si¦ na podstawie liczby inicjatorów. Inicjowanie III 11. Je±li tablica ma ustalony rozmiar liczba inicjatorów nie moze przekroczy¢ liczby elementów tablicy; je±li lista jest krótsza uzupeªniana jest zerami. 12. Specjalnym przypadkiem jest tablica znakowa, która moze by¢ inicjowana napisem (kolejne znaki napisu inicjuj¡ kolejne elementy tablicy). 13. Jezeli nie jest znany rozmiar tablicy znakowej jest on wyliczany na podstawie liczby znaków w napisie (wª¡czaj¡c w to ko«cowy znak zerowy). Tablice wielowymiarowe Przykªad #include < s t d i o . h> i n t main ( void ) { int a [4][3] = { {1 , 3 , 5} , {2 , 4 , 6} , {3 , 5 , 7} , }; int i , j ; for ( i = 0; i < 4; i ++){ f o r ( j = 0 ; j < 3 ; j ++) p r i n t f ( " %d | " , a [ i ] [ j ] ) ; printf ( " \n" ); } return 0 ; } Tablice wielowymiarowe Wynik dziaªania programu 1 2 3 0 | | | | 3 4 5 0 | | | | 5 6 7 0 | | | | Tablice wielowymiarowe Zadanie domowe Zmody kowa¢ tak przykªadowy progam, zeby drukowaª wyniki w nast¦puj¡cej postaci: | | | | 1 2 3 0 | | | | 3 4 5 0 | | | | 5 6 7 0 | | | | Tablice wielowymiarowe Inicjowanie warianty int a [4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 }; 1 2 3 0 | | | | 3 4 5 0 | | | | 5 6 7 0 | | | | Tablice wielowymiarowe Inicjowanie warianty int a [4][3] = { { 1 }, { 2 }, { 3 }, { 4 } }; 1 2 3 4 | | | | 0 0 0 0 | | | | 0 0 0 0 | | | | Napisy 1. Staªa znakowa (zªozona z jednego znaku) zapisywana jest tak ’c’ ( c to dowolny znak lub specjalna staªa zªozona ze znaku backslash (\) i specjalnego symbolu. 2. Staªa tekstowa zapisywana jest w cudzysªowach (podwójne apostrofy) "Ala ma kota" 3. S¡siaduj¡ce ze sob¡ napisy ª¡czone s¡ w jeden napis ("Ala" "ma" "kota" tworzy napis "Alamakota"; "Ala " "ma" " kota" tworzy "Ala ma kota"). 4. Na ko«cu napisu umieszczany jest znak null ('\x00') pozwalaj¡cy rozpozna¢ koniec tekstu. 5. W napisach mozna uzywa¢ wszystkich symboli specjalnych dost¦pnych w staªych znakowych. 6. Typem do przechowywania znaków jest char. 7. Napisy trzeba przechowywa¢ w tablicach typu char. 8. Polskie znaki na razie proponuj¦ o tym zapomnie¢! Tablice znakowe To jest poprawna deklaracja. Tablica b¦dzie miaªa rozmiar 14 (13 znaków napisu i znak null ko«cz¡cy napis). Mozna to sprawdzi¢ za pomoc¡ funkcji sizeof(tekscik). char t e k s c i k [ ] = " Ala ma k o t a l a " ; Ponizej równiez poprawna deklaracja tablicy (o ª¡cznym rozmiarze 21 znaków). Liczba wierszy wyliczana jest automatycznie podczas kompilacji. char t e k s t y [ ] [ 7 ] = { { " Ala " } , { "ma" } , { " kotala " } }; To niepoprawna forma deklaracji: char t e k s t y [ 3 ] [ ] = { { " Ala " } , { "ma" } , { " kotala " } }; Tablice jako argumenty funkcji 1. Trzeba bardzo uwaza¢ i my±le¢ zanim si¦ co± zrobi! 2. Wi¦cej o tym b¦dzie pó¹niej!