Nie obrażaj więc mojej inteligencji poprzez czynione na pokaz zaniżanie własnej.
Tablice
• grupa obiektów tego samego typu ë tablica • tablica – ciąg obiektów tego samego typu , zajmuj ą cy ci ą gły obszar w pami ę ci • korzyść – zamiast wielu definicji poszczególnych obiektów jedna wspólna; odniesienia do n-tego elementu tablicy • składnia definicji typ nazwa_tablicy [ rozmiar ] np. int a[10]; rezerwuje w pamięci miejsce dla 10 liczb typu int rozmiar – to musi być stała, znana juŜ w trakcie kompilacji; niedopuszczalne rozwiązanie jak niŜej: int rozmiar; cout << ”Jaki ma by ć rozmiar tabeli ? ”; cin >> rozmiar; { int tablica[rozmiar]; /* TU JEST Ź LE */ ... } • moŜliwość definicji tablicy o wielkości dopasowanej do potrzeb – dynamiczna alokacja tablicy Elementy tablicy • definicja int a[4]; określa tablicę 4-elementów: a[0], a[1], a[2], a[3] • numeracja zaczyna się od zera, kończy na (rozmiar–1) (inaczej niŜ w innych językach !!!) • gdy się będziemy odnosili do zakresu 1..rozmiar, to: o zapominamy o a[0] ë tracimy jeden element o próbujemy zmieniać wartość elementu a[rozmiar] – to juŜ nie jest element tablicy o kompilator nie kontroluje dopuszczalnego zakresu indeksu tablicy, nie blokuje próby zmiany wartości a[rozmiar] – to na ogół prowadzi do zniszczenia zawartości innej komórki pamięci (zwykle przyległej do tablicy a) Przykład: int a, b[4], c; int k; a=c=0; for (k=0; k<=4; k++) b[k]=2*k+1; cout << a << endl; a=9 Wnioski: • tablica n-elementowa: numeracja 0..n-1 • element o indeksie n (czyli a[n]) nie istnieje • kompilator nie zajmuje się sprawdzaniem poprawności zakresu – to jest rola programisty • zysk – szybszy dostęp do tablicy • próba podstawienia elementu o indeksie n – zniszczenie wartości innych zmiennych Obsługa tablic • na ogół pętle for; dwie moŜliwe formy for (k=0; k<rozmiar; k++) lub: for (k=0; k<=rozmiar-1; k++) Inicjalizacja tablic • podobnie jak dla typów fundamentalnych moŜliwa inicjalizacja w trakcie definicji int a[4] = {15,3,0,-7}; /*równowaŜne poniŜszemu ciągowi*/ int a[4]; a[0]=15; a[1]=3; a[2]=0; a[3]=-7; • gdy lista krótsza niŜ rozmiar tablicy – pozostałe elementy podstawiane zerami int a[4] = {15, 3}; // a[0]=15; a[1]=3; a[2]=0; a[3]=0; int a[4] = { }; // zerowanie tablicy • gdy lista dłuŜsza niŜ rozmiar tablicy – błąd kompilacji int a[4] = {15, 3, 0, -7, 8} // błąd kompilacji !!! • jeszcze jedna forma definicji i inicjalizacji zbiorczej int a[ ] = {1, 2, 3, 4, 5, 6}; o nie podajemy rozmiaru tablicy o kompilator liczy ilość elementów w liście, na tej podstawie ustala rozmiar tablicy, rezerwuje pamięć i ją inicjalizuje Działania na tablicach • w C nie ma globalnych operacji na tablicach • musimy określić działanie dla kaŜdej ze składowych int a[4] = {0, 1, 2, 3}; int b[4] = {1, 2, 3, 4}; int c[4], k; c = a + b; // operacja nielegalna !!!!! for (k=0; k<4; k++) c[k] = a[k] + b[k]; Tablica jako argument funkcji • dwa przypadki o funkcja zaleŜy od pojedynczego (skalarnego) argumentu i jest wywoływana z argumentem aktualnym równym jednemu z elementów tablicy o funkcja zaleŜy od tablicy jako całości • przypadek pierwszy int kwadrat(int k) { return k*k; } int main() { int w1, w2, m=5; int a[100]={1,2,3,4,5,6}; w1=kwadrat(m); w2=kwadrat(a[4]); } • przekazanie poprzez wartość (jak do tej pory) • mechanizm taki sam, jak dla typów fundamentalnych • przypadek drugi Przykłady: • funkcja, która oblicza długość wektora reprezentowanego przez tablicę • transformacja tablicy zawierającej temp. Fahrenheita na tablicę z temperaturami w skali Celsjusza Problemy: • jak przekazać całą tablicę (często – duŜo wartości)? • jak zwrócić wynik, który jest tablicą? Rozwiązanie – przekazanie tablicy przez adres. Jest ono oparte na dwóch zasadach ogólnych: 1. Tablicę przekazujemy do funkcji podając adres jej początku 2. Nazwa tablicy jest jednocześnie adresem jej zerowego elementu #include <cmath> #include <iostream> using namespace std; double dlugosc(double x[ ], int n) { int k; double s=0.0; for (k=0; k<n; k++) s+=x[k]*x[k]; return sqrt(s); } int main() { double a[3]={1.1, -0.7, 1.0}; cout << “Dlugosc wektora ddd = ” << dlugosc(a, 3)) << endl; } |
Menu
|