Rok akademicki 2013/2014, Pracownia nr 10 2/20 Informatyka 1 Tablica elementów ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia stacjonarne I stopnia Rok akademicki 2014/2015 Pracownia nr 10 (08/11.05.2015) dr inż. Jarosław Forenc wektor macierz 1.2 2.5 2.0 10.0-0.1 4.3 6.2-5.1 0.0 12.2 4.1-2.2 Rok akademicki 2013/2014, Pracownia nr 10 3/20 Rok akademicki 2013/2014, Pracownia nr 10 4/20 Deklaracja tablicy rozmiar nazwa typ elementów indeks rozmiar tablicy to wartość: całkowita, dodatnia znana na etapie kompilacji programu (stała liczbowa: 5, #define N 5, const int n = 5;) int tab[n]; int tab[n]; [ ] - dwuargumentowy operator indeksowania tab[1]; tab[0] tab[1] tab[2] tab[3] tab[4] indeks elementu (drugi argument operatora) nazwa tablicy (pierwszy argument operatora) indeks: stała liczbowa, np. 0, 1, 10 nazwa zmiennej, np. i, idx wyrażenie, np. i*j+5
Rok akademicki 2013/2014, Pracownia nr 10 5/20 Rok akademicki 2013/2014, Pracownia nr 10 6/20 Przykład int x, tab[5]; Liczba: 15, 15 tab[1] = 15; /* zapisanie wartości do tablicy */ x = tab[1]; /* odczytanie wartości z tablicy */ printf("liczba: %d, %d\n", x, tab[1]); return 0; przy odwołaniach do elementów tablicy kompilator nie sprawdza poprawności indeksów tab[5] = 10; tab[0] tab[1] tab[2] tab[3] tab[4] - błąd!!! - nie istnieje element tab[5] kompilator nie zasygnalizuje błędu i wykona operację Rok akademicki 2013/2014, Pracownia nr 10 7/20 Rok akademicki 2013/2014, Pracownia nr 10 8/20 zapisujemy do wszystkich elementów tablicy taką samą wartość: 10 int tab[5], i; tab[0] = 10; tab[1] = 10; tab[2] = 10; tab[3] = 10; tab[4] = 10; for (i=0; i<5; i++) tab[i] = 10; #define N 10 int tab[n]; int i; /* wczytanie elementów wektora */ printf("podaj liczbe nr %d: ",i+1); scanf("%d",&tab[i]);
Rok akademicki 2013/2014, Pracownia nr 10 9/20 Rok akademicki 2013/2014, Pracownia nr 10 10/20 #define N 10 int tab[n]; int i; /* wczytanie elementów wektora */ printf("podaj liczbe nr %d: ",i+1); scanf("%d",&tab[i]); Podaj liczbe nr 1: 15 Podaj liczbe nr 2: 38 Podaj liczbe nr 3: 23 Podaj liczbe nr 4: 96 Podaj liczbe nr 5: 12 Podaj liczbe nr 6: 40 Podaj liczbe nr 7: 33 Podaj liczbe nr 8: 67 Podaj liczbe nr 9: 92 Podaj liczbe nr 10: 12 /* wyświetlenie elementów wektora */ printf("elementy wektora:\n"); printf("%4d", tab[i]); printf("\n"); 15 38 23 96 12 Elementy wektora: 15 38 23 96 12 40 33 67 92 12 5 6 7 8 9 40 33 67 92 12 N = 10 Rok akademicki 2013/2014, Pracownia nr 10 11/20 Rok akademicki 2013/2014, Pracownia nr 10 12/20 /* suma i średnia arytmetyczna elementów wektora */ int suma = 0; float srednia; suma = suma + tab[i]; srednia = (float) suma/n; printf("suma: %d, srednia: %f\n", suma, srednia); /* generowanie pseudolosowe elementów wektora */ srand(time(null)); /* stdlib.h, time.h */ tab[i] = rand() % 100; /* stdlib.h */ 4 82 17 96 87 79 18 10 11 25 15 38 23 96 12 Suma: 428, srednia: 42.799999 5 6 7 8 9 40 33 67 92 12 N = 10 srand(time(null)); - inicjalizacja generatora rand() - zwraca liczbę pseudolosową z zakresu 0...32767 rand() % 100 - zwraca liczbę pseudolosową z zakresu 0...99
Rok akademicki 2013/2014, Pracownia nr 10 13/20 Rok akademicki 2013/2014, Pracownia nr 10 14/20 Inicjalizacja wektora int tab[5] = 1, 2, 3, 4, 5 ; int tab[5] = 1, 2, 3 ; Łańcuch znaków (ciąg znaków, napis, C-string) ciąg złożony z zera lub większej liczby znaków zawartych między znakami cudzysłowu "Pies" int tab[5] = 1, 2, 3, 4, 5, 6 ; - błąd kompilacji Implementacja - tablica, której elementami są pojedyncze znaki (typ char) int tab[] = 1, 2, 3, 4, 5 ; Ostatni znak (\0, liczba zero) oznacza koniec napisu Rok akademicki 2013/2014, Pracownia nr 10 15/20 Rok akademicki 2013/2014, Pracownia nr 10 16/20 W rzeczywistości w tablicy zamiast znaków przechowywane są odpowiadające im kody ASCII - deklaracja Deklaracja zmiennej przechowującej napis char nazwa_zmiennej[rozmiar]; Przykład: chat txt[10]; Tablica txt może przechowywać napisy o maksymalnej długości do 9 znaków
Rok akademicki 2013/2014, Pracownia nr 10 17/20 Rok akademicki 2013/2014, Pracownia nr 10 18/20 - inicjalizacja Inicjalizacja łańcucha znaków char txt1[10] = "Pies"; char txt2[10] = 'P','i','e','s'; char txt3[10] = 80,105,101,115; Pozostałe elementy tablicy otrzymują wartość zero char txt4[] = "Pies"; char *txt5 = "Pies"; Inicjalizacja możliwa jest tylko przy deklaracji char txt[10]; txt = Pies ; /* BŁĄD!!! */ Przypisanie zmiennej txt wartości Pies wymaga zastosowania funkcji strcpy() z pliku nagłówkowego string.h char txt[10]; strcpy(txt, Pies ); Rok akademicki 2013/2014, Pracownia nr 10 19/20 Rok akademicki 2013/2014, Pracownia nr 10 20/20 - string.h strcpy() - kopiuje jeden łańcuch znaków do drugiego strlen() - zwraca długość łańcucha znaków (bez \0 ) strcat() dołącza jeden łańcuch znaków do drugiego strcmp() porównuje dwa łańcuchy strcmpi() porównuje dwa łańcuchy (nie rozróżnia wielkość liter) strlwr() zamienia wielkie litery na małe strupr() zamienia małe litery na wielkie Wyświetlenie i wczytanie tekstu Wyświetlenie tekstu funkcją printf() wymaga specyfikatora formatu %s char napis[15] = Jan Kowalski ; printf( Osoba: %s\n, napis); Wczytanie tekstu funkcją scanf() char napis[15]; scanf( %s, napis); brak znaku &