Informatyka I Wyk lad VIII Rekordy, przeszukiwanie i sortowanie tablic Zagadnienia: rekordy, rekordy jako argumenty procedur i funkcji, operacje na plikach z rekordami, przeszukiwanie tablic: liniowe, binarne, sortowanie tablic: przez wstawianie, drzewiaste, babelkowe, szybkie, przez scalanie.
Rekordy rek.pole1 rek.pole2 rek.polen Typ1 Typ2 TypN rek.pole prosta zmienna TYPE LiczbyZespolone = RECORD Re, Im : REAL; VAR X1,X2,Suma,Iloczyn: LiczbyZespolone; Suma.Re := X1.Re + X2.Re; Suma.Im := X1.Im + X2.Im; Iloczyn.Re := X1.Re * X2.Re - X1.Im * X2.Im; Iloczyn.Im := X1.Re * X2.Im + X1.Im * X2.Re; Pos lugiwanie si e rekordami każde pole musi być podane jawnie kolejność pól w deklaracji jest nieistotna możliwe jest podstawianie ca lych rekordów zmienne rekordowe moga być argumentami procedur i funkcji (ale nie wartościami funkcji!!!) rekordy z wariantami 1
Przyk lady użycia rekordów TYPE Data = RECORD Rok : INTEGER; Miesiac : INTEGER; Dzien : INTEGER; KlasaOkretu= (Barka, Kuter, Tankowiec, Kontenerowiec, Lodolamacz, Holownik, Strazacki, Wojskowy); KlasaNapedu= (Wiosla, Zagle, Para, Diesel, Atomowy); Okret = RECORD Nazwa : String20; Zwodowany : Data; OstatniRemont : Data; Wyplynal : Data; Oczekiwany : Data; wmorzu,zaloga : INTEGER; Klasa : KlasaOkretu; Tonaz,Dlugosc : INTEGER; Naped : KlasaNapedu; VAR S1, S2, S3 : Okret; {...} S1.Nazwa := Moja Zocha ; S1.Klasa := Kuter; S1.Naped := Diesel; S1.Tonaz := 50; S1.Dlugosc := 20; S1.Zaloga := 2; S1.Zwodowany.Rok := 1962; S1.Zwodowany.Miesiac := 4; S1.Zwodowany.Dzien := 1; S1.Wyplynal := S1.Zwodowany; S2 := S1; 2
TYPE String = PACKED ARRAY [1..80] OF CHAR; Napis = RECORD Tekst : String; Dlugosc : INTEGER; Data = RECORD Rok : INTEGER; Miesiac : INTEGER; Dzien : INTEGER; Osoba = RECORD Imie, Nazwisko : Napis; DataUrodzenia : Data; MiejsceUrodzenia : Napis; LiczbaDzieci : INTEGER; ImionaDzieci : ARRAY [1..20] OF Napis; Wyksztalcenie : (brak, podstawowe, srednie, wyzsze); VAR StaryZawislak : Osoba; Kartoteka : ARRAY [1..1000] OF Osoba; {...} StaryZawislak.Wyksztalcenie := srednie; StaryZawislak.Imie.Tekst := Pawel ; StaryZawislak.Imie.Dlugosc := 5; StaryZawislak.Nazwisko.Tekst := Zawislak ; StaryZawislak.Nazwisko.Dlugosc := Dlugosc(StaryZawislak.Nazwisko.Tekst); StaryZawislak.ImionaDzieci[1].Tekst := Balbina ; Kartoteka[1].Nazwisko.Tekst := Nowak ; Kartoteka[7] := StaryZawislak; Kartoteka[1].DataUrodzenia := Kartoteka[7].DataUrodzenia; 3
FUNCTION RoznicaDat(d1, d2: Data): INTEGER; (* Funkcja oblicza PRZYBLIZONA ilosc dni miedzy datami *) (* d1 a d2 w dniach. Jesli d1>d2 to wynik jest ujemny *) RoznicaDat := (d2.rok - d1.rok) * 365 + (d2.miesiac - d1.miesiac) * 30 + (d2.dzien - d1.dzien) (* RoznicaDat *) PROCEDURE PobierzDate(VAR d: Data; s: String20); (* Procedura pyta uzytkownika o date wyswietlajac poda-*) (* ne pytanie; wymusza legalna date w latach 1900-2030.*) WRITELN( Prosze podac date,s); WITH d DO REPEAT WRITELN( Rok: ); READLN(Rok); UNTIL (Rok >= 1900) AND (Rok <= 2030); WITH d DO REPEAT WRITELN( Miesiac: ); READLN(Miesiac); UNTIL (Miesiac >= 1) AND (Miesiac <= 12); WITH d DO REPEAT WRITELN( Dzien: ); READLN(d.Dzien); UNTIL (Dzien >= 1) AND (Dzien <= 31); {PobierzDate} WITH S1 DO PobierzDate(Zwodowany, zwodowania okretu ); PobierzDate(OstatniRemont, ostatniego remontu ); PobierzDate(Wyplynal, wyplyniecia z portu ); PobierzDate(Oczekiwany, oczekiwanego powrotu ); wmorzu := RoznicaDat(Wyplynal,Dzis); 4
Wczytywanie rekordów z pliku PROGRAM rodzina (INPUT,OUTPUT,Dane); CONST Max_Osob = 200; TYPE Osoba = RECORD ImieiNazwisko : String30; PESEL : INTEGER; DataUrodzenia : Data; {...} TabOsob = ARRAY [1..Max_Osob] OF Osoba; VAR NOsoby : INTEGER; Rodzina : TabOsob; Dane : FILE OF Osoba; {...} RESET(Dane); {pomijamy kwestie nazwy pliku} NOsoby := 0; WHILE (NOT EOF(Dane)) AND (NOsoby < Max_Osob) DO NOsoby := NOsoby + 1; READ(Dane,Rodzina[NOsoby]); {WRITE(...) przy REWRITE} {...} END. 5
Przeszukiwanie tablic liniowe! #"%$&'(*)%+, -#. /0 1#23%4!576 8#9: ; <>=@?%ABC!D!E@FGIH JK%L!M@N>O PQIR#S TU V#WXZYI[I\ ]^_a` b*c jlknm o%prq sltvuxwyzn{} #~ ƒ r ˆ x Š# œ #ž d egfih ŒŽ 7 7 7 š binarne _=`badcfebg@h ikj1lfm n oprqts6udv wkxzy6{b }t~ 1 t dƒ6 r ˆt bš ŒŽ + 6 b 1 r r + f 1š zœ+ Žž Ÿb t 1 t d : ª «b z±!"$#&%(')+*, -&. ÆÈÇ3É ÊÌËÍÎÏÐÑSÒÓ á]â ã Ô Õ Ö ÌØÙÚÛÜÝÞàß /1032 46587:9 ;=<(>@?ACBEDGFIHKJ1L M N O P QSR T=U(VCW1XZY []\ ^ ²1³3 3µ 8 : ¹ º3»r¼(½ ¾E 1À(ÁKÂ1à ÄfÅ ärå1æ çrè1é 6
Przeszukiwanie liniowe CONST MaxWartosci = 30; TYPE Wartosci = ARRAY[1..MaxWartosci] OF INTEGER; FUNCTION Przeszukaj(tab: Wartosci; Klucz: INTEGER; min,max,domysl: INTEGER): INTEGER; (* Wyszukuje wartosc Klucz w tablicy pomiedzy min i max*) (* Zwraca jej index lub domysl gdy nie znaleziona *) VAR znaleziony: BOOLEAN; znaleziony := FALSE; WHILE ((NOT znaleziony) AND (min <= max)) DO Przeszukiwanie binarne FUNCTION Przeszukaj2(tab: Wartosci; Klucz: INTEGER; min,max,domysl:integer): INTEGER; (* Wyszukuje wartosc Klucz w sortowanej tablicy tab *) (* pomiedzy indeksami min i max, *) (* Zwraca jej index lub domysl gdy nie znaleziona *) VAR znaleziony: BOOLEAN; srodek: INTEGER; znaleziony := FALSE; WHILE ((NOT znaleziony) AND (min <= max)) DO IF Porownanie(tab[min],Klucz) THEN znaleziony := TRUE ELSE min := min + 1 IF znaleziony THEN Przeszukaj := min ELSE Przeszukaj := domysl { Przeszukaj } srodek := (min + max) div 2; CASE Porownanie(tab[srodek],Klucz) OF 0: znaleziony := TRUE -1: max := srodek - 1 1: min := srodek + 1 END IF znaleziony THEN Przeszukaj2 := srodek ELSE Przeszukaj2 := domysl { Przeszukaj2 } 7
przez wstawianie Sortowanie przez proste wstawianie przez wstawianie po lówkowe przez wybieranie drzewiaste przez zamian e babelkowe szybkie przez scalanie 8
Rekordy, przeszukiwanie i sortowanie tablic Sortowanie przez proste wstawianie! "# $%&('*)!+,.-(/ 012 3 PQSR TVUXWZY8[Z\ ]X^`_ adb cdbegfih «.±8²³Ḱµ º¹¼»K½¼¾ ÀÁÂ*ÃļŠÆ.Ç ÈKÉ ÊËÌÍÏÎÐ Ñ ÒÓÕÔ Ö 9;:< =>?@BADCFEBG H IKJMLON žÿ j kl`mdn o(pqrss tù vdw x yz {;}i~ é ê ë Û ÜÝ`ÞDß àâá;ãä8åvæxçzè! " # ( K Fƒ F Fˆ; KŠD Œ Ž O š Oœ ؼÙÚ 4 5(687 B * ª 9
- Rekordy, przeszukiwanie i sortowanie tablic Sortowanie drzewiaste "! 78 9:;=</>'? @)A BDCEFG H I/J KMLN OPQRTSU V'WXZY'[ \ ]^=_`)acbd efghcikjlm n'opq'r sutv=wzxy z{ 6}k~ ) ƒ ˆŠ Œ" Ž= ) ) c /šœ ž'ÿc = ) Z 'ª«) ±³² )µ4 )¹º» #$ %'&)(+*,-/.0 ', ( ) * + 1 24365!"#$&% 10
Rekordy, przeszukiwanie i sortowanie tablic Sortowanie babelkowe "! 46587 #%$&%'( )+*,- jk8l }E~E v ƒw ˆ ešz SŒ ZŽ 9;:=<?> @ACBED=FHGJI K LNM OPHQSR T;UWV e monqpr8s Wš œ ž ŸE v ª J«o ± ² ³o µ S o¹ º» ¼ gzhi #! " tvunwyx1z{ ced f XZY[ \]_^`ba. /1032 11
Sortowanie babelkowe "! 46587 jk8l }E~E v ƒw ˆ ešz SŒ e monqpr8s Wš œ ž ŸE v ª J«o ± ² ³o µ S o¹ º» ¼ gzhi ZŽ #%$&%'( )+*,- 9;:=<?> @ACBED=FHGJI K LNM OPHQSR T;UWV PROCEDURE BubbleSort(VAR Tab : Wartosci; min, max : INTEGER); VAR i, j: INTEGER; FOR j := min TO (max - 1) DO FOR i := min TO (max - 1) DO IF Tab[i] > Tab[i+1] THEN Zamien(Tab[i], Tab[i+1]) { BubbleSort } tvunwyx1z{ ced f XZY[ \]_^`ba. /1032 12
Rekordy, przeszukiwanie i sortowanie tablic ̹kº¼» ½ ¾IÀ ÁT ÃÄÆÅÇ È\É :<;>=?@>A BDCDEGFIHKJMLONPRQTSVUIW XZY\[! " #%$'& ( ) *,+-. / 0 132 Sortowanie szybkie ; <>=@?A +-,/.10324/5!6 7 8:9! "$#&%'(&) * cd e fg h\ikjl mno ]^>_`ba prq s z{ } ~ \ k ƒ tvurvrwyx rˆ Ì á 4 Š \Œy Ž, I D I Z GšI œmž ŸKZ G I < >ª«± V² ³rµy ÊrË Í ÎÐÏ Ñ ÒÓÔ â ãvä åçæ èvéoê ë%ìîí ÕrÖ Ø ÙZÚ<Û ÜÝÞ ï ðiñ òtó ôõæö ø\ù ßrà 57698 13
< J I H E F G A # Rekordy, przeszukiwanie i sortowanie tablic Sortowanie przez scalanie NPORQTSVUXWVY "! 8:9;<= >?A@BCD E F"GIHKJML(N5O P Q"RSTU(V #$ %&('*)+",-./0 1 Z\[^]`_ba cbd egf^h`ibj kml W:XYKZ[ \^]`_a(b^c dkef ghkï jklm n oqpsrqtkuqvwyxz{ }~K ƒ" ^ ˆ ŠqŒ Ž s ( š qœ žÿ!" : " K ª"«±²³ µ ¹"º»½¼¾ KÀÁ ÂÃÄÅÆÇ ÈÉÊË Ì ÍqÎ 2 35476 $ % & ' ( ) * + nporqmsutwv^xuy zp{} b~ w w? @ = > BDC, / -. 2 3 0 1 } } š D œÿž ª «±}² ³u šµ` ¹»º ¼ ½š¾ À Á Â}Ã Ä Å Æ Ç ƒ VˆŠ V Œ Ž KML 4 9 5 6 : ; 7 8 14