Ćwiczenie 4 – tablice i pętla for 1. Tablice statyczne – mają ustalony rozmiar i nie mogą go zmieniać. Deklaracja, tam gdzie zmienne. Składnia: nazwa_tablicy:array[i..n] of typ_danych;//i,n – indeksy dolny i górny muszą być stałymi Dla tablic dwuwymiarowych: Składnia: nazwa_tablicy:array[i..n] of [j..m] of typ_danych; Dla wielowymiarowych – poprzez analogię. Przykład: var MyArray: array[1..100] of Char;//tablica znaków macierz:array[1..10] of array[1..20] of double;//tablica liczb //zmiennoprzecinkowych Pojedyncza komórka tablicy odwołanie – poprzez indeksy w nawiasie kwadratowym po nazwie tablicy: Przykład: nazwa_tablicy[i,j]:=i*j; myarray[5]:=’b’; Pojedyncza komórka tablicy zachowuje się jak zwykła zmienna. Można na niej wykonywać w zwykły sposób operacje. 2. Tablice dynamiczne – mogą zmieniać rozmiary. Deklaracja jak w pkt. 1 ale bez podania zakresów. Przykład: tab:array of double;//deklaracja jednowymiarowej tablicy (wektora) o //komórkach typu double tab2:array of array of char;//dla dwuwymiarowych Deklaracja rozmiarów następuje w kodzie. Wykorzystuje się do tego celu procedurę setlength. Ma ona dwa parametry nazwę tablicy (parametr pierwszy) i jej docelowy rozmiar (parametr drugi). Jeżeli chcemy stworzyć tablicę regularną (np. prostokątną) to podajemy jej kolejne wymiary jako kolejne parametry. Powiększenie istniejącej tablicy nie kasuje jej poprzedniej zawartości, zmniejszenie usuwa wyraz które znalazły się poza tablicą (mają za duże indeksy). Indeksowanie tablic dynamicznych zaczyna się zawsze od 0. Uwaga! Tablice dwu i więcej wymiarowe nie muszą być regularne (np. dwuwymiarowe nie muszą być prostokątne) ! Tak naprawdę to mamy tablicę podtablic, wymiary podtablic ustalane niezależnie ! Przykład: setlength(tab,6);//wektor o długości 6 (indeksy komórek od 0 do 5) setlength(tab2,3,4);//tablica prostokątna o wymiarach 3 na 4 //tworzenie tablicy nieregularnej setlength(tab2,3);//ustalenie pierwszego wymiaru (ilości podtablic, tj. wektorów) setlength(tab2[0],1);//ustalenie wymiaru pierwszej podtablicy setlength(tab2[1],2);//itd. setlength(tab[2],6);//itd. //uzyskaliśmy tablicę zbudowaną z trzech wektorów o długościach kolejno 1, 2 i 6 Aby uzyskać wymiar tablicy należy zastosować funkcję length. Przyjmuje ona nazwę tablicy (lub podtablicy) i zwraca jej wymiar (długość); Przykład: a:=length(tab);//zwróci wymiar tablicy a do zmiennej a b:=length(tab2[0])//zwróci wymiar pierwszej podtablicy do zmiennej b 3. Pętla for Powtarzanie jakiegoś działania aż do uzyskania przez licznik określonej wartości. a) Składnia for licznik:=dolna_wartosc_licznika to gorna_wartosc_licznika do (działanie) Licznik idzie w górę od dolnej wartości licznika do górnej wartości licznika co 1. Górna i dolna wartość licznika muszą być liczbami całkowitymi. Dla zgrupowania kilku działań w pętli należy użyć begin i end; b) Składnia : for licznik:=górna_wartosc_licznika downto dolna_wartosc_licznika do (działanie) Analogicznie jak w a), ale licznik idzie w dół. Przykład: for i:=0 to 5 do tab[i]:=i*3;//i będzie miało wartości od 0 do 5 włącznie for i:=3 downto 1 do//i będzie miało wartości od 3 do 1 włącznie begin tab[i]:=0; tab2[i,1]:=tab[i]; end; Ćwiczenie: I. Program mnożący macierze 1) Wczytać z plików a.txt i b.txt dane do tablic dwuwymiarowych (o wyrazach typu double) odpowiednio a i b, pierwsza linijka w każdym z plików zawiera 2 liczby naturalne rozdzielone spacją, pierwsza z tych liczb to liczba wierszy w macierzy zawartej w danym pliku, druga to liczba jej kolumn, w pozostałych wierszach znajdują się dane macierzy. 2) wymnożyć macierze, wyniki mnożenia zebrać w tablicy c, przed mnożeniem wyzerować wszystkie elementy tej macierzy. 3) zapisać wyniki mnożenia w pliku c.txt Ćwiczenia pomocnicze II. Program do obliczania średniej arytmetycznej 1) Wczytać do tablicy liczby dane z pliku dane.txt zawierającego kolumnę z 10 liczbami rzeczywistymi (na potrzeby ćwiczenia stworzyć taki plik) 2) Obliczyć średnią arytmetyczną z wczytanych liczb, skorzystamy przy tym z sumowania wyrazów licznika do jakiejś zmiennej – powiedzmy suma, mniej więcej w postaci suma:=suma+x // x – to kolejna liczba do zsumowania – ten fragment będzie nieco podobny do tego co jest potrzebne do sumowania iloczynów przy obliczaniu wartości w komórkach macierzy wynikowej w zadaniu I. 3) Zapisać wartość średniej do pliku wyniki.txt III. Program mnożący dwa wektory liczb o określonej długości 1) wczytać odpowiednio z plików A.txt i B.txt dane do tablic dynamicznych A i B (na potrzeby zadania stowrzyć odpowiednie pliki). 2) pomnożyć odpowiadające sobie wyrazy tych wektorów i zapisać je w tablicy C – mnożenie przyda nam się dla praktyki z operacjami na tablicach, co będzie wykorzystane w zadaniu I, dla tego zadania zapis mnożenia będzie wyglądał mniej więcej tak C[i]:=A[i]*B[i] – oczywiście w pętli for idącej po wszystkich wyrazach tablicy. 3) zapisać wynikowy wektor C w pliku C.txt, jako kolumnę liczb (analogicznie jak w plikach A.txt i B.txt). ----------------------------------------------------------------------------------------------------------------Załącznik SetLength Ustawia rozmiar łańcucha znaków lub dynamicznej tablicy. Moduł: System Kategoria: metody obsługi łańcuchów znaków procedure SetLength(var S; NewLength: Integer); Opis S jest string’iem lub dynamiczną tablicą. Dla short-string’ów, SetLength nadaje znacznikowi długości (znak o numerze danym S[0]) wybraną wartość. W tym przypadku, NewLength musi mieć wartość z zakresu od 0 do 255. Dla long-strin’ów lub tablic dynamicznych, SetLength przenosi (reallocates) string lub tablicę wskazywaną przez S tak by miała wybraną długość. Istniejące znaki string’a lub elementy (komórki) tablicy są zachowane, ale zawartość elementów nowo utworzonych jest niezdefiniowana. Jeżeli nie ma wystarczającą dużo dostępnej pamięci aby realokować (ups) zmienną (tablicę), wystąpi wyjątek (błąd) EOutOfMemory. Po wywołaniu SetLength, S wskazuje na unikalny string lub array (tablicę) – tzn. string lub tablicę z licznikiem odwołań równym jeden. ----------------------------------------------------------------------------------------------------------------Length Zwraca liczbę znaków string’a lub liczbę elementów tablicy. Moduł: System Kategoria: metody obsługi string’ów function Length(S): Integer; Opis Length zwraca liczbę znaków aktualnie użytych w string’u lub liczbę elementów w tablicy. Dla jedno-bajtowych (AnsiString) i wielobajtowych string’ów, Length zwraca liczbę bajtów używanych przez string. Dla łańcuchów znaków Unicode (WideString), Length zwraca liczbę bajtów podzieloną przez dwa. -----------------------------------------------------------------------------------------------------------------