Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wykład 9 Informatyka 2 MPDI Delphi tablice, rekordy.

Podobne prezentacje


Prezentacja na temat: "Wykład 9 Informatyka 2 MPDI Delphi tablice, rekordy."— Zapis prezentacji:

1 Wykład 9 Informatyka 2 MPDI Delphi tablice, rekordy

2 Typ tablicowy (array) array [ lista typów indeksów ] of typ bazowy (składowych) Pojęcie: - skończony zbiór elementów tego samego typu składowego (homogeniczne) - o położeniu (selekcji) określanym przez indeks(-y) (numery) składowej typ porządkowy (o ograniczonym zakresie):  okrojony integer (najczęściej)  okrojony char  wyliczeniowy  boolean dowolny:  prosty  strukturalny (bez plików) tablica tablic,napisów, rekordów Opis:

3 Uwagi tablice służą do gromadzenia wielu wartości tego samego typu (nietrwałe – tylko w pamięci operacyjnej – później poznamy jak zapisywać do plików) wymiar tablicy 1-wymiarowa -wektor 2-wymiarowa (prostokątna) 3-wymiarowa (przestrzenna) itd.. rozmiar – w każdym wymiarze! zawartość – dowolna – także inna tablica! np. array [1..5,1..5] of array [1..2,1..2] of integer;

4  przykłady: array[ ] of integer; array[ 1..20, 1..30] of real; array[ 1..20] of array[ 1..30] of real; może być też 30 wierszy i 20 kolumn, zależy od wizualizacji

5 Tablica ma:  wymiar  rozmiar w każdym wymiarze  mogą być indeksy ujemne array [ ] of real

6 Zmienne tablicowe indeksowane (składowe)całościowe

7  zmienne indeksowane (składowe) - dostęp do składowych Z [ W 1,..., W n ] Przykłady: var x: array[ ] of real ; begin x[ 2 ] := 10.5; //nadanie wartości y := 10*x[ k ] - 5.2; //użycie w wyrażeniu z:=sin( sqrt( x[ 5 ] ) ) //użycie w wyrażeniu if x[5] >0 then.... //sprawdzenie indeksy  wyrażenia typu zgodnego z typem indeksów zgodne co do liczby, typu i kolejności z deklaracją nazwa tablicy  W typu składowego  użycie - w wyrażeniach lub instrukcjach, jak zmienne typu składowego

8  zmienne całościowe - tylko przypisanie - dla typów tożsamych! brak:+ - * / porównania np: var x, y: array[ 1..5] of integer ; begin y[1] := 35 ; x := y; //przepisz całą zawartość tablicy y do tablicy x..... end

9 const osoby: array[ 1..3] of string[20] = ( 'Nowak', 'Kowalski', 'Nycz' ); Nadanie wartości początkowych zmiennym tablicowym  dla tablic konstrukcja typu: ( (st 11, st 21,..., st n1 ), (st 12, st 22,..., st n2 ),... (st 1m, st 2m,..., st nm ) ) var wyniki: array[ 1..3, 1..4] of real = ( ( 3, 4, 4.5, 5), ( 2, 3.5, 5.0, 4.5), (5.0, 4, 3.5, 2) ); albo zmienna (zmiennym można w programie zmienić wartości a stałym NIE):

10 program p2; {APPTYPE CONSOLE} uses SysUtils; var wyniki: array[ 1..3, 1..4] of real = (( 3, 4, 4.5, 5), ( 2, 3.5, 5.0, 4.5), (5.0, 4, 3.5, 2)); begin writeln (wyniki[1,1]:10:2); //wypisze wartość 3.00 readln; end. Przykład:

11 type tab = array [1..2, 1..5] of real; var t1, t2 : tab; wie,kol: integer; begin write ('Podaj element 1,1:'); readln(t1[1,1]); //itd. // najczęściej operacje w pętli zagnieżdżanej jeśli tablica 2-wymiarowa for wie:=1 to 2 do for kol:= 1 to 5 do t1[wie, kol] :=1; //wyświetlenie na ekranie też w pętli zagnieżdżanej for wie:=1 to 2 do begin for kol:= 1 to 5 do write(t1[wie, kol]); writeln; end; readln; end. Przykłady operacji tablicowych cała tablica wypełniona jedynkami pętla wewnętrzna po kolumnach każdego wiersza pętla zewnętrzna po wierszach po wypisaniu wiersza tabeli przejdź do nowego wiersza

12 Zadanie: w wektorze zsumować co drugi element (nieparzyste indeksy) program test; const N=12; type zakres = 1..N; var k: zakres; suma: real; x: array [ 1.. N ] of real = ( 3, 4, 4.5, 5, 2, 3.5, 5.0, 4.5, 5.0, 4, 3.5, 2) ; begin suma := 0; for k := 1 to N do if (k mod 2) = 1 then suma := suma + x [k]; writeln ( suma :10:3) ; readln end. for k := 1 to ( N+1 ) div 2 do suma := suma + x [ 2*k - 1 ]; albo można tak: zastanowić się!

13 Pamiętajmy: Nie ma gotowych operacji macierzowych (mnożenie, obliczanie wyznacznika, znajdowanie macierzy odwrotnej itp.), trzeba samemu stworzyć algorytm lub posiadać odpowiednie biblioteki z gotowymi podprogramami Przykładowo mnożenie tablic: program mn24; var t1:array[1..2, 1..4] of real = ((1,2,4,-1),(0, -1, 8, 1)); t2 :array[1..4,1..2] of real = ((1,1.1),(4,-2.0),(0, -1),(-3,-2.5)); wyn: array[1..2,1..2] of real; i:1..4; begin // obliczanie elementu 1,1 wyn[1,1]:=0; for i:=1 to 4 do wyn[1,1]:= wyn[1,1]+ t1[1,i]*t2[i,1]; writeln(wyn[1, 1]:10:2); readln; end

14 program mn24; const N=2; M=4; var t1:array[1..N, 1..M] of real = ((1,2,4,-1),(0, -1, 8, 1)); t2 :array[1..M,1..N] of real= ((1,1.1),(4,-2.0),(0, -1),(-3,-2.5)); wyn: array[1..N,1..N] of real; wie,kol, i:1..4; begin //potrójna pętla! for wie:=1 to N do for kol:=1 to N do for i:=1 to M do wyn[wie,kol]:= wyn[wie,kol]+ t1[wie,i]*t2[i,kol]; //wyswietlenie wyniku for wie:=1 to N do begin for kol:= 1 to N do write(wyn[wie, kol]:10:2); //wypisanie wiersza writeln; //zmiana wiersza end; readln; end. Całość:

15 ... begin //potrójna pętla! for wie:=1 to N do begin for kol:=1 to N do begin //utworzenie elementu for i:=1 to M do wyn[wie,kol]:= wyn[wie,kol]+ t1[wie,i]*t2[i,kol]; // i od razu wyświetlenie write(wyn[wie, kol]:10:2); end; writeln; end; readln; end. Można wyświetlać wyniki od razu po utworzeniu elementu

16 Pamiętamy typ string – typ łańcuchowy – zmienna zawiera ciąg znaków var zmienna:string[20]; begin zmienna:= 'lokomotywa'; writeln (zmienna[3]); { wyświetli literę k } {…..} end. Można typ string traktować jako wektor znaków string[20] tożsame z array[0..20] of char;

17 Algorytm przeszukiwania tablic polega na porównywaniu podanego wzorca z kolejnymi elementami tablicy. Pseudokod algorytmu wygląda następująco. 1. Start. 2. Wczytaj tablicę i wzorzec przeszukiwań. 3. Ustaw licznik na wartość Sprawdź czy wzorzec jest równy elementowi tablicy o indeksie równym licznikowi. Jeżeli tak to przejdź do punktu 7, jeśli nie to kontynuuj. 5. Zwiększ licznik o Sprawdź czy licznik nie jest większy od rozmiaru tablicy. Jeśli tak, to napisz, że nie znaleziono wzorca i przejdź do punktu 8, jeśli nie to przejdź do punktu Wypisz licznik i element o indeksie równym aktualnemu licznikowi. 8. Stop. Przeszukiwanie tablic jednowymiarowych Oczywiście algorytm znajdzie tylko pierwsze wystąpienie – co zrobić gdy w tablicy elementy się powtarzają?

18 1. Start. 2. Wczytaj tablicę. 3. Przypisz pierwszy element tablicy do E min. 4. Zwiększ licznik o 1. 6.Sprawdź czy licznik nie jest większy od rozmiaru tablicy. Jeśli tak, przejdź do punktu 9. 7.Sprawdź czy aktualny element jest mniejszy od E min.Jeśli tak wstaw go do E min. 8.Przejdź do punktu Wypisz E min. 10. Stop. Wyznaczanie minimum (maksimum) Algorytm przeszukiwania tablic polega na początkowym założeniu, że minimum (maksimum) X jest pierwszym elementem tablicy. Następnie kolejno sprawdzamy elementy od 2 do N - jeśli analizowany element jest mniejszy (większy) od aktualnego X ustawiane jest nowe X. Pseudokod algorytmu wygląda następująco.

19 program maximum; {$APPTYPE CONSOLE} uses SysUtils; var x:array[1..20] of integer; k,max:1..20; begin randomize; for k:=1 to 20 do // losowe wypełnienie tablicy begin x[k]:= random(100); write(x[k]:5); end; max:= x[1]; for k:=2 to 20 do if x[k]>max then max:=x[k]; writeln; writeln(max:10); readln; end.

20 Algorytm polega porównywaniu kolejnych par elementów sąsiadujących i zamianie miejscami w przypadku niewłaściwej kolejności. Po wykonaniu pierwszego przebiegu porównań i ewentualnych zamian miejscami, element największy znajdzie się na końcu (w przypadku porządku sortowania według kolejności rosnącej). Następnie wykonujemy kolejny przebieg porównań par i tak dalej… Sortowanie bąbelkowe

21 Algorytm polega porównywaniu kolejnych par elementów sąsiadujących i zamianie miejscami w przypadku niewłaściwej kolejności Sortowanie bąbelkowe Sortowanie N N-1 porównań w każdym przebiegu Wykonujemy N przebiegów

22 1 przebieg zamiana zamiana zamiana zamiana zamiana efekt ostatniej zamiany – największy na końcu 2 przebieg zmiana zmiana zmiana przebieg zamiana zamiana przebieg zamiana N=6 zauważamy nadmiarowe porównania

23 5 przebieg zmiana przebieg operacji= (N-1)*N=6*5

24 Algorytm polega na porównywaniu kolejnych par elementów sąsiadujących, z tym, że: - w każdym kolejnym przebiegu liczba analizowanych par jest zmniejszana o 1 - przebiegów wykonujemy N-1 Sortowanie bąbelkowe skrócone

25 1 przebieg zamiana zamiana zamiana zamiana zamiana efekt 2 przebieg zamiana zamiana zamiana efekt 3 przebieg zamiana zamiana efekt 4 przebieg zamiana efekt 5 przebieg zamiana efekt 15 operacji

26 const N=10; var tab:array [1..N] of integer ; k, m:1..N; pom, lop:integer; begin randomize; //wypełnienie losowe tablicy 1-wymiarowej for k:=1 to N do tab[k]:=random(100); //sortowanie for k:=1 to N do for m:=1 to N-1 do begin lop:=lop+1; if tab[m]>tab[m+1] then begin pom:=tab[m]; tab[m]:=tab[m+1]; tab[m+1]:=pom; end; //wypisanie wyniku for k:= 1 to N do write(tab[k]:6); writeln;writeln(lop); readln; end. Bąbelkowe lop=90 zamiana wartości tab[m] i tab[m+1]

27 const N=10; var tab:array [1..N] of integer ; k,m:1..N; pom,lop:integer; begin randomize; //wypełnienie losowe tablicy 1-wymiarowej for k:=1 to N do tab[k]:=random(100); //sortowanie for k:=1 to N-1 do for m:=1 to N-k do begin lop:=lop+1; if tab[m]>tab[m+1] then begin pom:=tab[m]; tab[m]:=tab[m+1]; tab[m+1]:=pom; end; //wypisanie wyniku for k:= 1 to N do write(tab[k]:6); writeln;writeln(lop); readln; end. Bąbelkowe skrócone różnice! lop=45 szybsze

28 Typ rekordowy (record)  pojęcie: - skończony zbiór elementów dowolnego typu składowego tak zwane pola - ułożone jednowymiarowo - o położeniu (selekcji) określanym przez nazwę składowej (pola) - tzw. dostęp kwalifikowany Czyli zestaw nazwanych pól dowolnego typu (i różnego rozmiaru)

29  opis: record lista_nazw_pól: typ1; lista_nazw_pól: typ2;... end typ dowolny:prosty lub strukturalny (bez plików) pole może być liczbą, tekstem, tablicą, napisem, innym rekordem

30 type data = record rok: ; mies: 1..12; dzien: end; var student : record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; stypend: real end; Przykłady:

31  jednakowe składowe  selektor typu indeks  dostęp bezpośredni  statyczny rozmiar  różne składowe  selektorem jest nazwa pola  dostęp bezpośredni  statyczny rozmiar Porównanie: Uwaga: Rekord to jeden zestaw danych (np. dane jednego studenta), jeśli potrzebujemy analizy większej liczby to tworzymy tablicę rekordów

32 var student : record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; stypend: real end; var t1:array [1..5, 1..6] of real; Zmienna tablicowa Zmienna rekordowa Deklaracje (opis) zmiennych type dane = record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; stypend: real end; var student: dane; lub

33 Wykorzystanie zmiennych rekordowych w programie  zmienne całościowe - tylko przypisanie – możliwe jedynie dla typów tożsamych czyli dokładnie takie same składowe! brak:+ - * /porównania wejścia/wyjścia – wczytać lub wypisać można tylko składową (pole) var r1, r2: record.. definicja... end ; begin //… ustalenie zawartości zmiennej r1 r2 := r1; //przepisz zawartość r1 do r2 np:

34  desygnator pola (składowa) - dostęp do pola Z. p nazwa pola  Z typu składowego nazwa zmiennej rekordowej UWAGA: kropka oddzielająca!

35 użycie: w wyrażeniach lub instrukcjach, w zależności od typu składowej Przykład1 type data= record dzien, miesiac, rok:integer end; var student: record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data ; //zdefiniowany typ rekordowy stypend: real end; begin student.nazw:= 'Kowalski'; student.stypend:= 300; student.data_ur.dzien:= 3; student.data_ur.rok := 1993; student.imie[1]:= 'Jan'; writeln(student.imie[1][2] ) ; //to 2-ga litera 1-go imienia //itd. definicje program

36 program test; type data= record dzien, miesiac, rok:integer end; var student: record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; stypend: real end; begin write('Podaj imię1:'); readln(student.imie[1]); write('Podaj drugie imię:'); readln(student.imie[2]); write('Podaj dzien urodzenia:'); readln(student.data_ur.dzien); //itd. writeln(student.imie[1]); //wypisz na ekranie //itd. end. Przykład2:

37 Użycie elementów tablicy i rekordu w części wykonawczej programu: tablicat1[5, 6] rekord student.nazwisko student.imie[1] student.data_ur.rok w zależności od typu indeks (-y) nazwy pól zmienna

38 type data = record rok: ; mies: 1..12; dzien: end; osoba = record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; end; var os1: osoba ; // zmienna rekordowa pomocnicza grupa: array[1..100] of osoba ; //tablica rekordów !!!! TABLICE REKORDÓW Tablice rekordów służą do gromadzenia wielu danych typu rekordowego (zwykle 1-wymiarowe)

39 grupa – zmienna typu tablicowego grupa[k] – zmienna typu rekordowego grupa[1].nazw- zmienna typu string grupa[2].imie – zmienna typu tablicowego grupa[k].imie[1] - zmienna typu string grupa[k].data_ur - zmienna typu rekordowego grupa[k].data_ur.rok – zmienna typu integer grupa[2].imie[2][5] – zmienna typu char Użycie zależne od typu: writeln( grupa[3].nazw); os1.nazw := 'Nowak'; grupa[50]:=os1; os1:= grupa[51]; writeln (grupa[k].imie[1]); writeln(length(grupa[30].nazw)) if grupa[k].data_ur.rok>1970 then…

40 Instrukcja wiążąca - with  dotyczy tylko zmiennych rekordowych (obiektowych)  upraszcza zapis !! with lista_zmiennych_rekordowych do instrukcja; najczęściej begin... end można tu używać nazw pól bez specyfikowania zmiennej rekordowej przykład: student.nazw :='Kowalski'; student.imie[1] := 'Jan'; student.data_ur.rok := 1988; student.stypendium := 420.0; with student do begin nazw :='Kowalski'; imie[1] := 'Jan'; data_ur.rok := 1988; stypendium := 420.0; end; Opis:


Pobierz ppt "Wykład 9 Informatyka 2 MPDI Delphi tablice, rekordy."

Podobne prezentacje


Reklamy Google