INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl Zakres wykładu o Tablice Definiowanie tablic Inicjowanie tablic Tablice znakowe Tablice wielowymiarowe Tablice dynamiczne o Typ wyliczeniowy o Struktury o Unie 2 1
Tablica o Tablica jest ciągiem zmiennych jednego typu, określony pojedynczą nazwą. o Do poszczególnych elementów tablicy odwołuje się za pomocą numeru indeksu o W języku C elementy tablicy n elementowej indeksowane są od 0 do n-1 3 Tablica - definiowanie Tablicę definiuje się analogicznie jak zmienne Tablice mogą przechowywać dane tych samych typów co zwykłe zmienne: int, float i char oraz pokrewnych Definiując tablicę należy podać jej typ, nazwę oraz rozmiar int numer[100]; float ocena[20]; 4 2
Tablica o Indeks tablicy jest typu całkowitego (int) o Przy odwoływaniu się do elementu tablicy można podać konkretną wartość: printf( %i,numer[2]); o Można wykorzystać zmienną: printf( %i,numer[x]); o Można to być także wynik działania: printf( %i,numer[(x+y)/2]); 5 Tablica o Dla zadeklarowanej tablicy rezerwowany jest w pamięci operacyjnej niezbędny obszar o Należy pamiętać, że po zadeklarowaniu tablica będzie zawierała losowe dane 6 3
Przykład 1 7 Przykład 1 8 4
Tablica Przykłady zastosowań Wykorzystanie tablicy jako licznika: o Zbierane są odpowiedzi do ankiety o Skala punktowa 1-10 o o W podsumowaniu pokazywana jest liczba odpowiedzi dla każdej wielkości punktowej możliwe do wybrania Program jest ograniczony do jednego pytania 9 Przykład 2 10 5
Przykład 2 11 Tablica Przykłady zastosowań o Przechowywanie kolejnych wyników obliczeń: o Program generujący ciąg liczb pierwszych o Liczba pierwsza jest to liczba podzielna tylko przez 1 i samą siebie o Sprawdzenie czy dana liczba może być pierwsza można zrealizować dzieląc ją przez znane mniejsze liczby pierwsze i sprawdzając czy w wyniku będzie 0 12 6
Przykład 3 13 Tablica - inicjowanie Definiując tablicę można jednocześnie zainicjować ją z przypisaniem wartości o Można zainicjować całą tablice int test[4]={0,1,2,3}; o Można zainicjować kilka początkowych wartości, pozostałe elementy są zerowe int test[4]={0,1}; o Można zainicjować tablicę z przypisaniem wartości dla wybranych indeksów int test[4]={[3]=4,[1]=1}; o Inicjując tablicę nie trzeba podawać liczby elementów int test[]={0,1,2,3}; 14 7
Przykład 4 o Napisać program konwertujący liczbę z systemu 10 na system binarny, ósemkowy lub szesnastkowy o Użytkownik podaje liczbę do konwersji i następnie wybiera docelowy system liczbowy 15 Przykład 4 16 8
Przykład 4 17 Przykład 4 18 9
Tablica wielowymiarowa o Stosowane do tej pory tablice można określić jako wektory tablice jednowymiarowe o W C można definiować tablice wielowymiarowe, tablica dwuwymiarowa macierz o Zasady definiowania i inicjalizacji są analogiczne jak przy tablicy jednowymiarowej 19 Tablice wielowymiarowe o Definiowanie tablicy: int macierz[10][10]; o Można inicjować: int macierz[][]={{1,2,3},{2,3,4},{3,4,5}}; int macierz[3][3]={1,2,3,2,3,4,3,4,5}; o Można inicjować niepełnie: int macierz[3][3]={{1,2},{2},{3,4}}; o Można inicjować przez wskazanie indeksów int macierz[][]={[1][1]=4,[5][5]=10}; 20 10
Tablice wielowymiarowe Stosując metodę Richardsona napisać program rozwiązujący układ równań liniowych Ax=b gdzie: 21 Przykład 5 22 11
Przykład 5 23 Przykład 5 24 12
Tablica znakowa 11:18 o W języku C nie można zdefiniować zmiennej tekstowej, przechowującej ciąg znaków - string o W tablicy znakowej można przechowywać ciągi znakowe (np. teksty) o Ciąg znaków można przypisać jako tekst lub każdy znak osobno char tekst[]= Hello world! ; char tekst[]={ H, e, l, l, o,, w, o, r, l, d, \0 }; 25 Tablica znakowa o Każda tablica znakowa powinna być zakończona znakiem specjalnym \0 o W większości sytuacji wartość ta jest wstawiana automatycznie o Jeżeli do tablicy znakowej n elementowej wprowadzony zostanie ciąg n znaków zabraknie miejsca na znak końca \0 o W takiej sytuacji większość funkcji realizujących operacje na tablicach znakowych może funkcjonować niewłaściwie 26 13
Tablica znakowa o Dane do tablicy znakowej można pobierać za pomocą: char tekst_1[80],tekst_2[4];; scanf( %s,tekst_1); gets(tekst_1); o W efekcie do zmiennych tablicowych zostanie przypisany ciąg znaków wprowadzony przez użytkownika 27 Podstawowe operacje na tablicy znakowej Dane do tablicy znakowej można wprowadzać na kilka sposobów: o W momencie inicjalizacji zmiennej o Jako ciąg znakowy pobierany przez instrukcje wejścia scanf lub gets o Znak po znaku scanf lub getchar o Jako wynik działania funkcji sprintf(zmienna, tekst do wstawienia ); strcpy(zmienna, tekst do wstawienia ); 28 14
Funkcje tekstowe o Język C dostarcza szeregu narzędzi umożliwiających przetwarzanie tablic znakowych o Funkcje te są dostępne w bibliotece standardowej o <stdio.h> o <ctype.h> o <string.h> 29 Rozmiar tablicy o Określenie rozmiaru tablicy ilości elementów możliwych do przechowywania w niej o Realizacja za pomocą funkcji: x=sizeof tablica; o Funkcja ta zwraca informacje o wielkości pamięci przydzielonej dla tablicy o Znając rozmiar pojedynczej komórki tablicy można policzyć ilość elementów tablicy x=(sizeof tablica)/(sizeof *tablica); 30 15
Przykład 6 31 Przykład 6 o Zmienna inicjowana bez podania rozmiaru tablicy rezerwuje tyle komórek ile jest wymaganych dla znaków w tekście plus jeden dla znaku końca ciągu tekstowego o Przy zmiennej zawierającej więcej komórek niż przypisany tekst wolne komórki zawierają znak końca ciągu tekstowego 32 16
Biblioteka <string.h> Biblioteka zawiera ponad 20 funkcji realizujących zadania przetwarzania łańcuchów znakowych x=strlen(tablica); o Funkcja zwraca liczbę znaków przechowywanych w tablicy aż do napotkania \0 strcat(tekst_1,tekst_2); o Funkcja dopisuje znaki z tablicy tekst_2 do tablicy tekst_1 strcpy(tekst_1,tekst_2); o Funkcja kopiuje znaki z tablicy tekst_2 do tablicy tekst_1 33 Biblioteka <string.h> x=strcmp(tekst_1,tekst_2); o Funkcja porównuje dwie tablice znakowe i jeżeli są takie same to zwraca 0, jeżeli nie to 1 - x=strncmp(tekst_1,tekst_2,n); c=strchr(tekst_1, x ); c=strrchr(tekst_1, x ); o Funkcja zwraca wskaźnik do znaku x w łańcuchu (tablica znakowa) lub NULL x=strcspn(tekst_1,tekst_2); o Zwraca numer pierwszego znaku z zmiennej tekst_1 który nie pasuje do zestawu znaków z zmiennej tekst_2 34 17
Biblioteka <string.h> x=strspn(tekst_1,tekst_2); o Zwraca numer pierwszego znaku z zmiennej tekst_1 który pasuje do zestawu znaków z zmiennej tekst_2 *x=strstr(tekst_1,tekst_2); o Zwraca wskaźnik do adresu pierwszego znaku z zmiennej tekst_2 po odnalezieniu go w zmiennej tekst_1 *x=strpbrk(tekst_1,tekst_2); o Funkcja zwraca wskaźnik do pierwszego ze znaków z zmiennej tekst_2 która zostanie odnaleziona w zmiennej tekst_1 35 Przykład 7 o Deklaracje o Bibliotek o Zmiennych tablicowych znakowych o Zmiennych wymaganych do przetestowania funkcji 36 18
Przykład 7 o Wyszukiwanie znaku w tekście, od początku lub końca tablicy o Poszukiwanie znaku z bazy znaków w tekście zapisanym w tablicy o Określenie liczby znaków w zmiennej tablicowej znakowej 37 Przykład 7 o Poszukiwania znaków i łańcucha znaków w tekście o Dzielenie tekstu na wyrazy 38 19
Przykład 7 39 Tablice znakowe o Wykonując operacje na tablicach znakowych należy zachować szczególną ostrożność o Deklaracja tablicy oznacza przydzielenie jej określonego obszaru pamięci. o Wykonując niektóre operacja na tablicach znakowych (np. kopiowanie) możemy zmienić rozmiar przydzielanej dla tej zmiennej pamięci o Może to prowadzić do zmiany zawartości innych zmiennych (tablic) które były także zadeklarowane. 40 20
Przykład 8 41 Przykład 8 42 21
Struktura Struktura (rekord) to: o jedna lub kilka zmiennych, o tego samego lub różnych typów, połączone w taki sposób aby można było odwoływać się do nich przy użyciu jednej, wspólnej nazwy. Struktury ułatwiają organizację złożonych zbiorów danych. Struktury w naturalny sposób znajdują zastosowanie w aplikacjach bazodanowych. 43 Struktura - definicja Definiowanie zmiennej strukturalnej jest procesem dwuetapowym: o Definicja struktury o Definicja lub inicjalizacja zmiennej strukturalnej struct nazwa{ int element_1; char element_2; float element_3;}; struct nazwa nazwa_zmiennej; 44 22
Struktura - odwołanie o Zapisywanie i pobieranie danych ze zmiennej strukturalnej odbywa się na analogicznych zasadach jak dla zwykłych zmiennych o Podawana jest nazwa zmiennej strukturalnej, a po kropce nazwa elementu zmienna.param_1=34; x=zmienna.param; 45 Struktura tablicowa o Elementami struktury mogą być także tablice struct nazwa{ int element_1; int element_2[20];}; o Definiując zmienną strukturalną można zdefiniować ją jako tablicę struct nazwa nowa[5]; x=nowa[3].element_1; y=nowa[3].element_2[4]; 46 23
Struktura - inicjowanie Tak jak zmienne i tablice strukturę także można inicjować podając jej wartości początkowe: struct nowa{ int x; int y; int z}; struct nowa alfa= {1,2,3}; struct nowa beta={1,2}; struct nowa gamma={.y=3,.z=12}; 47 Struktura - funkcje o o o o Struktury są stosowane jako zmienne wejściowe i wyjściowe przez funkcje Przykładem wykorzystania struktur są funkcje czasu dostępne w bibliotece <time.h> W bibliotece <time.h> informacje o aktualnej dacie i godzinie zwracane są poprzez strukturę tw Dostępny jest też nowy typ zmiennej, zmienna czasowa time_t 48 24
Struktura tw Struktura tw ma postać struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; }; 49 Struktura tw Nazwa Znaczenie tm_sec Sekundy domyślnie są wyrażone w zakresie [0..59]. tm_min Minuty. Zakres [0..59] tm_hour Godziny. Zakres [0..23] tm_mday Dzień miesiąca. Zakres [1..31] tm_mon Miesiąc. Zakres [0..11] Obecny rok. Lata zaczynają się liczyć od roku 1900, czyli: tm_year wartość 0 = 1900 rok. Dzień tygodnia. Zakres [0..6]. Znaczenie poszczególnych wartości: 0 = Niedziela 1 = Poniedziałek tm_wday 2 = Wtorek 3 = Środa 4 = Czwartek 5 = Piątek 6 = Sobota tm_yday Dzień roku. Zakres [0..365]. Letnie/zimowe przesunięcie czasowe. Jeśli wartość jest tm_isdst większa od 0 to przesunięcie czasowe jest 'aktywne'. Jeśli wartość mniejsza od 0 to informacja jest niedostępna. 50 25
Biblioteka <time.h> o Pobranie informacji o dacie i czasie systemowym wymaga zainicjowania zmiennej time_t i zmiennej strukturalnej do przechowywania danych time_t czas; struct tw *data_czas; o Przypisanie informacji o aktualnym czasie realizowane jest przez funkcję time time(&czas); 51 Biblioteka <time.h> Pobranie szczegółowych informacji o dacie i czasie poprzez przypisanie ich do zmiennej strukturalnej realizowane jest przez dwie funkcje data_czas=localtime(&czas); //zwraca czas lokalny data_czas=gmtime(&czas); // zwraca czas w Greenwich 52 26
Biblioteka <time.h> o Wyświetlenie zwartych informacji o dacie i godzinie można wyświetlić za pomocą funkcji asctime(data_czas); puts(asctime(data_czas)); o Do poszczególnych danych czasowych dostęp jest realizowany przez elementy struktury o Ponieważ struktura data_czas jest wskaźnikiem dostęp do elementów struktury realizowany jest poprzez wskazanie x=data_czas->tm_mday; 53 Przykład 9 Napisać program wyświetlający aktualną datę i godzinę, oraz przedstawiający ją w formacie. Program pobiera informacje osobowe (imię, nazwisko i data urodzenia) Dzisiaj jest DD.MM.YYYY r. Jest DZIEŃ_TYGODNIA, XXX dzień roku Jest dokładnie GG.MM.SS Miłego dnia Imię Nazwisko. Do twoich urodzi jest jeszcze XX dni. 54 27
Przykład 9 55 Przykład 9 56 28
Przykład 9 57 Typ wyliczeniowy Jest to typ danych definiowany przez użytkownika, składający się ze stałych W pierwszym kroku należy zdefiniować typ danej wyliczeniowy W drugim kroku można przyporządkować zmiennej typ wyliczeniowy enum dzien {pon., wt., sr., czw., pt., sob., niedz.}; enum dzien dzien_tygodnia; 58 29
Typ wyliczeniowy Każdemu elementowi typu wyliczeniowego przyporządkowywany jest indeks, począwszy od 0 Można samemu przypisać indeks do definiowanego elementu, każdego lub wybranego Numer indeksu elementu następującego po ręcznie nadanym jest automatycznie o 1 większy 59 Typ wyliczeniowy enum typ {up, down=3,left,right}; up=0, down=3, left=4, right=5 enum typ {up,down=-1,left,right}; up=0,down=-1, left=0, right=1 60 30
Typ Unia Typ danych bardzo podobny do struktury Jest definiowany w analogiczny sposób unia nazwa{ int element_1; char element_2; float element_3;}; unia nazwa nowa_unia; W danej chwili można korzystać tylko z jednego elementu unii 61 Przykład 10 62 31