Język C++ Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka
= *= /= %= += -= <<= >>= &= |= ^= Tablice Tablica – agregat składający się z określonej liczby obiektów tego samego typu zajmujący w pamięci ciągły obszar. Operator odwołania się do elementu tablicy: [] Tablice definiuje się również za pomocą []. Jeżeli po nazwie znajduje się otwarty nawias kwadratowy, to nazwa jest nazwą tablicy! Definiując tablicę podajemy jej nazwę oraz liczbę i typ przechowywanych elementów, np.: int tablica[10]; 18 17 ++ -- POST () [] 16 ++ -- PRE + - ! ~ 15 14 * / % 13 + - 12 << >> 11 < <= > >= 10 == != 9 & 8 ^ 7 | 6 && 5 || 4 ? : 3 = *= /= %= += -= <<= >>= &= |= ^= 2 1 ,
typ_elementu nazwa_tablicy[liczba_elementów]; Tablice Postać definicji tablicy: typ_elementu nazwa_tablicy[liczba_elementów]; Typ elementu: jeden z typów fundamentalnych (z wyjątkiem void) typ wyliczeniowy (enum) wskaźnik inna tablica typ zdefiniowany przez użytkownika wskaźnik do pokazywania na składniki klasy Liczba elementów rozmiar tablicy musi być wyrażeniem stałym (lub stałą), o wartości znanej w trakcie kompilacji
Definiowanie tablic - przykłady int a[4]; - 4-ro elementowa tablica elementów typy int const int n=10; char tab[n]; int n=10; Niektóre kompilatory dopuszczają powyższą formę, ale nie jest ona zgodna ze standardem języka (taki zapis nie „kompiluje się” na kartce). a a[0] a[1] a[2] OK a[3] BŁĄD
Stała, ale nie jest znana na etapie kompilacji Definiowanie tablic Próba oszukania kompilatora int a; cin>>a; const int n=a; int tab[n]; się nie uda. Będzie błąd. Stała, ale nie jest znana na etapie kompilacji
Odwołania do elementów tablicy Do elementów tablicy można się odwołać korzystając z operatora indeksowania [] Elementy tablicy są numerowane kolejnymi liczbami naturalnymi, począwszy od zera Numery elementów w tablicy nazywane są indeksami. Tablica n-elementowa ma elementy o indeksach od 0 do n-1 const int n=5; int tab[n]; tab[0]=1; tab[1]=tab[0]; tab[2]=4; tab[3]=tab[4]=7; tab[5]=10; Element o indeksie 5 nie istnieje
Inicjalizacja tablic Tablice podobnie jak inne zmienne można inicjalizować podczas definiowania Inicjalizacja tablicy – nadanie wartości elementom tablicy w momencie jej definicji. int t[4]={1,2,3,4}; jest równoważne z int t[4]; t[0]=1; t[1]=2; t[2]=3; t[3]=4; Tablice można zainicjalizować częściowo: int t[4]={1,2}; int t[4]={1,2,0,0};
Inicjalizacja tablic Lista inicjalizacyjna tablicy może zawierać stałe oraz zmienne: int n1 = 0, n2 = 1, n3 = 2; int t[4] = {n1, n2, n3, 5};
Inicjalizacja tablic Możliwe jest zdefiniowanie tablicy bez jawnego podawania jej rozmiaru – wymaga to jednak jednoczesnej inicjalizacji tablicy. Kompilator na podstawie liczby elementów podanych na liście inicjalizacyjnej rezerwuje odpowiednią ilość miejsca pamięci: int t[]={1,2,3,4};
Odwołania do elementów tablicy Najczęstszą konstrukcją języka używaną do przetwarzania tablic jest pętla for const int n = 4; int t[n]; for(int i = 0; i < n; ++i) t[i] = i+2; for(int i = 0; i <= n - 1; ++i)
Nazwa tablicy jest jednocześnie adresem jej zerowego elementu! Wypisywanie tablic int main() { const int n=4; int tab[n]; for (int i=0; i<n; ++i) tab[i]=i+2; cout<<tab<<endl; cout<<tab[i]<<endl; } Nazwa tablicy jest jednocześnie adresem jej zerowego elementu! 0027FD40 2 3 4 5
Stałe tablice Stała tablica – tablica zawierająca stałe elementy. Tablica obiektów stałych musi podczas definicji zostać zainicjalizowana co najmniej jednym elementem lub pustą listą inicjalizacyjną. Elementy niezainicjalizowane są inicjalizowane zerami odpowiedniego typu.
Stałe tablice const int a = 7; int b = 7; const int t1[3] = {2, 4, a}; const int t2[3] = {2, 4, b}; const int t3[3] = {2}; //równoważne {2,0,0} const int t4[3] = {}; //równoważne {0,0,0} const int t5[3]; BŁĄD t1[1] = 0; BŁĄD
char tekst[20]={"przyklad"}; Tablice znakowe Tablice ciągów znaków reprezentujące napis – na końcu zawsze dodawany jest znak o kodzie 0, NULL: '\0‘ char tekst[20]={"przyklad"}; Znak NULL jest automatycznie dodawany do końca ciągu, ponieważ ciąg "przyklad" ujęto w cudzysłów.
Tablice znakowe AGH ----- AGH-- 3 AGH 3 AGH - int main() { char tab1[]={"AGH"}; char tab2[]={"-----"}; char tab3[]={"-----"}; cout<<tab1<<endl<<tab2<<endl<<tab3<<endl; int i=0; while (tab1[i]) tab2[i]=tab1[i]; ++i; } cout<<tab2<<endl; cout<<i<<endl; i=-1; while (++i,tab3[i]=tab1[i]); cout<<tab3<<endl; for (i=0; i<5; ++i) cout<<tab3[i]; cout<<endl; return 0; AGH ----- AGH-- 3 AGH 3 AGH -
char tekst[20] = {'p','r','z','y','k','l','a','d'}; Tablice znakowe Tablice o elementach typu znakowego nie muszą być traktowane jako napisy: char tekst[20] = {'p','r','z','y','k','l','a','d'}; tu jest znak Null ponieważ reszta tablicy jest wypełniana zerami char tekst[] = {'p','r','z','y','k','l','a','d'}; tu znaku Null nie będzie ponieważ zostanie stworzona tablica 8 elementowa
Tablice wielowymiarowe Postać definicji tablicy: typ_elementu nazwa_tablicy[l1][l2]...[ln]; Liczba elementów tablicy równa jest l1*l2*...*ln Liczba wymiarów tablicy odpowiada liczbie użytych par nawiasów kwadratowych [] w definicji, np.: tablica dwuwymiarowa, łącznie 16 elementów: double tab2D[2][8]; tablica czterowymiarowa, łącznie 400 elementów: unsigned int tab4D[2][2][5][20];
Tablice wielowymiarowe Deklaracja wymiarów umożliwia obliczenie położenia elementów tablicy w kolejnych wymiarów, np.: int a[2][4]; Element a[i][j] leży w stosunku do początku tablicy o (i*4)+j elementów od początku tablicy Statycznie zdefiniowana tablica wielowymiarowa może być traktowana jako ciągły obszar pamięci a a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[1][2] leży 1*4+2 elementów od początku tablicy
Przekazywanie tablic do funkcji Argumentem formalnym funkcji może być typ tablicowy. Jako argument aktualny przesyłany jest tylko adres początku tablicy. Rozmiar tablicy można przekazać tylko jawnie jako inny parametr funkcji. deklaracja funkcji: int fx1(double []); int fx2(double [], unsigned int); definicja tablicy: double tablica[4]; wywołania funkcji: fx1(tablica); fx2(tablica, 4);
Przekazywanie tablic do funkcji int fx1(double []); double tablica[4]; W wywołaniu funkcji przyjmującej tablicę podajemy tylko nazwę tablicy! fx1(tablica); fx1(tablica[]); fx1(tablica[4]); OK Błąd kompilacji Próba wysłania do funkcji elementu tablicy o indeksie 4 (JEDNEJ LICZBY)
Przekazywanie tablic do funkcji void f(double t[]) { cout<<sizeof(t)<<endl; } int main() double t[5]; f(t); return 0; 4 40
Przekazywanie tablic do funkcji void fun(int [], int); int main() { int tab[]={1,2,3,4}; for (int i=0; i<4; ++i) cout<<tab[i]<<' '; cout<<endl; fun(tab,4); } void fun(int a[], int n) for (int i=0; i<n; ++i) a[i]++; 1 2 3 4 2 3 4 5
Przekazywanie tablic do funkcji Przekazanie do funkcji tablicy n–wymiarowej wymaga zadeklarowania co najmniej n-1 ostatnich wymiarów void fx3D(float [][4][3]); void fx3D(float [][][3]); BŁĄD Podane wymiary muszą być wyrażeniami stałymi, znanymi na etapie kompilacji. Zadeklarowane wymiary są używane przez kompilator w celu: sprawdzenia zgodności typu tablicowego z argumentem aktualnym – przy wywołaniu funkcji, obliczenia położenia kolejnych wierszy najwyższego wymiaru tablicy i wierszy następnych wymiarów – wewnątrz ciała funkcji.
Przekazywanie tablic do funkcji const int a = 4, b = 3; void fx3D(int tab[][a][b], int n) { int l = 0; for (int i = 0; i < n; ++i) for (int j = 0; j < a; ++j) for (int k = 0; k < b; ++k) tab[i][j][k] = l++; } int main() int t1[5][4][3]; int t2[5][3][4]; fx3D(t1,5); fx3D(t2,5); BŁĄD
Przekazywanie tablic do funkcji #include<iostream> using namespace std; void podwoj(int [][2]); void wypisz(int [][2]); int main() { int tab[][2]={1,2,3,4}; wypisz(tab); podwoj(tab); return 0; } void podwoj(int a[][2]) { for (int i=0; i<2; ++i) for (int j=0; j<2; ++j) a[i][j]*=2; } wypisz(a); void wypisz(int a[][2]) cout << a[i][j] << '\t'; cout << endl; 2 4 6 8 2 3 4 2 4 6 8
Przekazywanie stałych tablic do funkcji #include<iostream> using namespace std; void wypisz(int [], int); int main() { const int tab[]={1,2,3,4}; wypisz(tab,4); } void wypisz(int a[], int n) for (int i=0; i<n; ++i) cout << a[i] << '\t'; cout << endl; BŁĄD
Przekazywanie stałych tablic do funkcji #include<iostream> using namespace std; void wypisz(const int [], int); int main() { const int tab[]={1,2,3,4}; wypisz(tab,4); } void wypisz(const int a[], int n) for (int i=0; i<n; ++i) cout << a[i] << '\t'; cout << endl;
Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie: http://creativecommons.org/licenses/by-sa/3.0/deed.pl