To byłby dla mnie zaszczyt, gdybyś złamała mi serce.

Jeśli tablica jest dwu- lub trójwymiarowa, to początek tablicy oznacza zapis: A[0] [0]; A[0) [0] [0]; itd. Zwróć uwagę, że wskaźnik do tablicy *pA oznacza praktycznie wskaźnik do POCZĄT- KOWEGO ELEMENTU TABLICY: "pA = *pA[0] To samo można zapisać w języku C w jeszcze inny sposób. Jeśli A jest nazwą tablicy, to zapis: *A oznacza wskazanie do początku tablicy A, a zapisy: '(A+1 ) *(pA+1 ) A[1 ] *(A+8) *(pA+g) A[8] itd. są równoważne. Podobnie identyczne znaczenie mają zapisy: x=&A[i] x=A+i "pACi] *(A+i) Należy jednak podkreślić, że pomiędzy nazwami tablic (w naszym przykładzie A) a wskaźnikami istnieje zasadnicza różnica. Wskaźnik jest ZMIENNĄ, zatem operacje: pA=A; pA++; są dopuszczalne i sensowne. Nazwa tablicy natomiast jest STAŁĄ, zatem operacje: A = pA; ŻLE! A++; ŹLE! są niedopuszczalne i próba ich wykonania spowoduje błędy! 81 str 82 DEKLAROWANIE I INICJOWANIE TABLIC. Elementom tablicy, podobnie jak zmiennym możemy nadawać watrości. Wartości takie należy podawać w nawiasach klamrowych, a wielkość tablicy - w nawiasach kwadratowych. Przykład int WEKTO R [5] ; Tablica WEKTOR jest jednowymiarowa i składa się z 5 elementów typu int: WEKTOR[0]....WEKTOR[4]. Przykład float Array[10) [5]; Tablica Array jest dwuwymiarowa i składa się z 50 elementów typu float Array[0] [0], Array[0] [1 ] ......Array[0] [9] Array[1 ] [0], Array[1 ] [1 ] ......Array[1 ] [9] Array[4] [0], Array[4) [1 )......Array[4] [9] Przykład const int b[4] ={1,2,33,444}; Elementom jednowymiarowej tablicy (wektora) b przypisano wartośći: b[0] =1; b[1 ] =2; b[2] =33; b[3] =444; Przykład int TAB[2][3]= {{1, 2, 3},{2, 4, 6}}; TAB[0][0] = 1 TAB[0][1) = 2 TAB[0][2) = 3 TAB[1][0] = 2 TAB[1)[1] = 4 TAB[1)[2] = 6 Przykład: Tablica znakowa. Obie formy zapisu dają ten sam efekt char hej[4] ="Ahoj" char hej[4]={'A', 'h', 'o', 'j'}; hej [0] ='A' hej [1 ] ='h' hej [2] ='o' itp. Przykład: Tablica uzupełniona zerami przez domniemanie float T[2] [3] ={{1, 2.22}, {.5}} kompilator uzupełni zerami do postaci: T[0] [0] =1 T[0] [1 ] =2.22 T[0] [2] =0 T[1 ] [0] =0.5 T[1 ] [1 ] =0 T[1 ] [2] =0 Jeśli nawias kwadratowy zawierający wymiar pozostawimy pusty, to kompilator obliczy jego domniemaną zawartość w oparciu o podaną zawartość tablicy. Nie spowoduje więc błędu zapis: char D [] ="Jakis napis" int A[] [2] = {{1,2}, {3,4}, {5,6}} Jeśli nie podamy ani wymiaru, ani zawartości: 82 str 83 int A[] ; kompilator "zbuntuje się" i wykaże błąd. Dla przykładu, skompiluj program [P-20]. Zwróć uwagę na sposób zainicjowania wskaźnika. ~include "stdio.h" ~include int a[] [2] ={ {1,2},{3,4},{5,6},{7,8},{9,10},{11,12} }; char b1]={ "Poniedzialek" }; int i; int *pa; char *pb; void main() pa = &a[0][0]; pb = b; // lub pb = b[0]; clrscr(); for (i=0; i<12; i++) printf(""/od\t"/oc\n", *(pa+i), *(pb+i)); getch ( ) ; Zwróć uwagę, że w języku C każdy wymiar tablicy musi mieć swoją parę nawiasów kwadratowych. Dla przykładu, tablicę trójwymiarową należy deklarować nie tak TAB3D[i, j, k] lecz tak: TAB3D[i] [j] [k]; Jest w dobrym stylu panować nad swoimi danymi i umieszczaćje w tzw. BUFORACH, czyli w wydzielonych obszarach pamięci o znanym adresie, wielkości i przeznaczeniu. W programie [P-21] utworzymy taki bufor w postaci tablicy bufor[20] i zastosujemy zamiast funkcji scanf czytającej bezpośrednio z klawiatury parę funkcji: gets() - GET String - pobierz łańcuch znaków z klawiatury do bufora; sscanf(bufor) - odczytaj z bufora (z pamięci). Aby uniknąć nielubianego goto stosujemy konstrukcję for - break, która działa tak samo - też pozwala nam pętelkować. Dokładniej pętlę for omówimy w lekcji 9. Ponieważ mam nadzieję, że "szkolną" postać pętli for pamiętasz for(i=1; i < 100; i++) pozwalam sobie trochę wyprzedzająco zastosować ją w programie. Niepodobny do Pascala ani do Basica zapis wynika właśnie z tego, że skok następuje bezwarunkowo. For * nie zeruje licznika pętli (zbędne typowe i =1 ); * nie sprawdza żadnego warunku (zbędne i < 100), * nie liczy pęti (i = i + 1 lub i + + też zbędne !). 83 str 84 ~include "stdio.h" ~include "conio.h" int liczba, ile=0, suma=0; void main() ehar bufor[20] ; clrscr(); printf("podaj liczby - ja oblicze SREDNIA i SUMA\n"); printf("ZERO = KONIEC\n"); for(") // Wykonuj petle BEZWARUNKOWO gets(bufor); sscanf(bufor, "o/od", &liczba); suma += liczba; ile++ů if (liczba == 0) break; // JEŚLI ==0 PRZERWIJ PETLE printf("Suma wynosi: o/od\n", suma); printf("Srednia wynosi: o/od\n", suma / ile); getch(); Poniżej trochę bardziej elegancka wersja z zastosowaniem pętli typu while. Więcej o pgtlach dowiesz się z Lekcji 9. ~include < stdio.h > ~include < conio.h > int liczba, ile=1, suma=0; void main() char bufor[20]; clrscr(); printf("podaj liczby - ja oblicze SREDNIA i SUMA\n") printf("ZERO = KONIEC\n"); gets(bufor); sscanf(bufor, "o/od", &liczba); while (liczba != 0) str 85 suma += Iiczba; gets(bufor); sscanf(bufor, ""bd", &liczba); if(liczba == 0) printf("I to by bylo na tyle...\n"); else ile+ +; printf("Suma wynosi: "/od\n", suma); printf("$rednia wynosi: "bd\n", suma / ile); getch(); Program powyższy, choć operuje tablicą, robi to trochę jakby za kulisami. Utwórzmy zatem inną - bardziej dydaktyczną tablicę, której elementy byłyby łatwo rozpoznawalne. Dzięki matematyce bardziej jesteśmy przyzwyczajeni do zapisu tablic w takiej postaci: all a12 a13 a14 a15 a16 a21 a22 a23 a24 a25 a26 a31 a32 a33 a34 a35 a36 a41 a42 a43 a44 a45 a46 gdzie a;~ oznacza element tablicy zlokalizowany w: - wierszu i - kolumnie j Przypiszmy kolejnym elementom tablicy następujące wartości: 11 12 13 14 15 16 21 22 23 24 25 26 31 32 33 34 35 36 41 42 43 44 45 46 Jest to tablica dwuwymiarowa o wymiarach 4WIERSZE X 6KOLUMN, czyli krócej 4X6. Liczby będące elementami tablicy są typu całkowitego. Jeśli zatem nazwiemy ją TABLICA, to zgodnie z zasadami przyjętymi w języku C/C+ + możemy ją zade- klarować: int TABLICA[4] [6]; Pamiętajmy, że język C liczy nie od jedynki a od zera, zatem TABLICA[0] [0] = a11 = 11, TABLIC,~[2][3] = a34 = 34 itd