Ćwiczenie 4 – tablice i pętla for 1. Tablice statyczne – mają

advertisement
Ć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.
-----------------------------------------------------------------------------------------------------------------
Download