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