Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Programování v Pascalu Přednáška 6 RNDr. Hana Havelková.

Podobné prezentace


Prezentace na téma: "Programování v Pascalu Přednáška 6 RNDr. Hana Havelková."— Transkript prezentace:

1 Programování v Pascalu Přednáška 6 RNDr. Hana Havelková

2 Pole Deklarace Přístup k prvkům Typové konstanty Jednorozměrná pole Vícerozměrná pole Pole jako parametr procedur a funkcí

3 Deklarace typ indexu ordinální typ arraytyptyp indexu [] of, Pro každou dimenzi pole je třeba uvést typ indexu – ordinální typ s výjimkou longint a jeho podintervalů Deklarace je statická – musíme předem znát maximální počet prvků pole (ve skutečnosti ani tak velké pole třeba nevyužijeme)

4 Příklady – uživatelské typy type TZnamka= 0.. 5; TA_Real = array [ ] of real; TZnaky= array [1..26] of char; TJmena= array [1.. 30] of string; TOdpovedi= array [1.. 50] of boolean; TKody= array ['a'.. 'z'] of char; TDny= array [1.. 7] of string [2];

5 Pole, jehož prvkem je pole – pole polí type TPole1= array [ ] of array[1..10] of integer; TPole2= array [Boolean] of array[1..10] of array ['a'..'e' ] of char; chápe překladač jako array[ , ] of integer event. array [Boolean, 1..10, 'a'..'e' ] of char Poznámka: nejedná se ovšem o identické typy!!!

6 Příklady vícerozměrných polí const POCET_ZAKU = 30; POCET_PREDMETU = 15; MIN = -10; MAX = 20; RADKU = 10; SLOUPCU = 6; type TZnamky= array [1.. POCET_ZAKU, 1.. POCET_PREDMETU] of TZnamka; TKurzy= array[1..365, 1..20] of real; TTeploty= array[1..31, , 1.. 4] of real; TVysledky= array [1.. 12, MIN.. MAX, Boolean] of real; TMatice = array [1..RADKU, 1.. SLOUPCU] of real;

7 Přístup k prvkům pole pomocí indexu v programu píšeme jednotlivé indexy do hranatých závorek oddělené čárkou v textu píšeme jako dolní index (někdy oddělující čárku vynecháváme) funkce Low (pole) vrací hodnotu dolního indexu pole High (pole) vrací hodnotu dolního indexu pole

8 Příklad – měsíce s nadprůměrnými telefonními poplatky var platby : array [1..12] of real; suma, prumer : real; i : ; begin suma := 0; for i := 1 to 12 do begin Write(i, '. měsíc = '); ReadLn(platby[i]); suma := suma + platby[i]; end; prumer := suma / 12; for i := 1 to 12 do if platby[i] > prumer then WriteLn (i, '. měsíc'); ReadLn; end.

9 Četnosti známek z prověrky type TZnamka = 1..5; var Cetnosti : array [TZnamka] of integer; znamka : TZnamka; pocet, i : integer; begin for i:= 1 to 5 do Cetnosti[i] := 0; Write('Pocet zaku: '); ReadLn(pocet); for i := 1 to pocet do begin Write('Znamka ' + i + '. zaka: ');ReadLn(znamka); Cetnosti[znamka] := Cetnosti[znamka] + 1; end; for i:= 1 to 5 do WriteLn(i:2, Cetnosti[i] : 5); ReadLn; end.

10 Četnosti jednotlivých znaků ve větě var C : array ['A'..'Z'] of integer; i : 'A'..'Z'; znak : char; begin for i := 'A' to 'Z' do C[i] := 0; WriteLn ('Zadej vetu ukoncenou tečkou a odradkovanim!'); repeat Read(znak) ; znak := UpCase(znak); if znak in ['A'..'Z'] then Inc(C[znak]); until znak = '.'; for i := 'A' to 'Z' do WriteLn(i, C[i] : 5); ReadLn; end.

11 Skalární součin dvou vektorů var a, b : array [1.. 10] of real; n, s : real; begin Write('Zadej počet složek vektorů'); ReadLn(n); if (n > 10) or (n < 1) then n := 10; s := 0; for i := 1 to n do begin Write('a [', i, '] = '); ReadLn(a[i]) ; end; for i := 1 to n do begin Write('b [', i, '] = '); ReadLn(b[i]) ; end; for i := 1 to n do s := s + a[i] * b[i]; WriteLn('Skalarni soucin je ', s : 10 : 2); ReadLn; end.

12 Skalární součin dvou vektorů – lepší var a, b : array [1.. 10] of real; n, s : real; begin Write('Zadej počet složek vektorů'); ReadLn(n); if (n > 10) or (n < 1) then n := 10; s := 0; for i := 1 to n do begin Write('a [', i, '] = '); ReadLn(a[i]) ; end; for i := 1 to n do begin Write('b [', i, '] = '); ReadLn(b[i]) ; s := s + a[i] * b[i]; end; WriteLn('Skalarni soucin je ', s : 10 : 2); ReadLn; end.

13 Řádkové a sloupcové součty čísel v tabulce (1) const MAX = 50; var tab : array[1.. MAX, 1.. MAX] of real; i, j, radku, sloupcu : 1.. MAX; sumar, sumas : array [1.. MAX] of real; begin Write('Pocet radku '); ReadLn(radku); Write('Pocet sloupcu '); ReadLn(sloupcu); {nulovani souctovych promennych} for i := 1 to MAX do begin sumar[i] := 0; sumas[i] := 0; end;

14 Řádkové a sloupcové součty čísel v tabulce (2) {zadavani a soucasne pricitani hodnot prvku tabulky do patricnych radkovych a sloupcovych souctu} WriteLn('Zadavej cisla po radcich:'); for i := 1 to radku do begin for j := 1 to sloupcu do begin Write('prvek[', i, ', ', j, '] = '); ReadLn (tab[i, j]); sumar[i] := sumar[i] + tab[i, j] ; sumas[j] := sumas[j] + tab[i, j] ; end;

15 Řádkové a sloupcové součty čísel v tabulce (2) {vypis tabulky a radkovych souctu} for i := 1 to radku do begin for j := 1 to sloupcu do begin Write(tab[i, j] : 7 : 2); end; WriteLn(sumar[i] : 7 : 2); end; {vypis sloupcovych souctu} for j := 1 to sloupcu do Write (sumas[j] : 7 : 2); WriteLn; ReadLn; end.

16 Typové konstanty const DNY : array [1.. 7] of string [2] = ('PO', 'UT', 'ST', 'CT', 'PA', 'SO', 'NE') ; BODY : array [1.. 5] of integer = (100, 80, 50, 20, 0) ; PLATIDLA : array[1..12] of integer = (5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1) ; OBDOBI : array [1..4] of string = ('Jaro', 'Leto', 'Podzim', 'Zima') ;

17 Kontrola data {Predpokladame, ze je k dispozici funkce Prestupny(r:word):boolean} const Dny : array [1..12] of byte = (31,28,31,30,31,30,31,31,30,31,30,31); var den, mesic : byte; rok : word; Chyba : boolean; begin Chyba := false; Write('Zadej den, mesic, rok: ') ; ReadLn(den, mesic, rok); if Prestupny(rok) then Dny[2] := 29; if mesic > 12 then Chyba := true else if den > dny[mesic] then Chyba := true; if Chyba then WriteLn('Chyba!') else WriteLn('OK'); ReadLn; end.

18 Pole jako parametr procedur a funkcí vstupní parametr je vše bez problémů obvykle uvádíme jako další parametr počet prvků pole výstupní parametr (volání odkazem) používáme pokud chceme načíst pole v podprogramu chceme změnit hodnoty prvků pole chceme výsledek výpočtů podprogramu uložit do pole u formálního parametru musíme použít var formální a skutečný parametr by měly být shodné

19 Funkce vracející hodnotu maximálního prvku pole const POCET = 10; type TPole = array[1.. POCET] of integer; function MaxPrvek (p : TPole ; N : integer) : integer; var i, max : integer; begin max := p[1]; for i := 2 to N do if p[i] > max then max := p[i] ; MaxPrvek := max; end;

20 Funkce testující rostoucí posloupnost const POCET = 20; type TPole = array[1.. POCET] of real; function JeRostouci(p : TPole ; N : integer) : boolean; var i : integer; test : boolean; begin test := true; for i := 1 to N-1 do if p[i] >= p[i+1] then begin test := false; break; end; JeRostouci := test; end;

21 Procedura vypisující prvky pole const POCET = 10; type TPole = array[1.. POCET] of integer; procedure VypisPole( p : TPole; N : integer); var i : integer; begin for i := 1 to N do WriteLn (p[i]); end;

22 Procedura načítající prvky pole const POCET = 10; type TPole = array[1.. POCET] of integer; procedure NactiPole(var p : TPole; N : integer); var i : integer; begin for i := 1 to N do begin Write(i,'. prvek: '); ReadLn (p[i]); end;

23 Funkce skalární součin vektorů const POCET = 10; type TVektor = array[1.. POCET] of real; function SkalarniSoucin( u, v : TVektor; N : integer) : real; var i : integer; S : real; begin S := 0; for i := 1 to N do S := S + u[i] * v[i] ; SkalarniSoucin := S; end;

24 Zpracování prospěchu procedure ZpracujProspech(Z : TPoleZnamek ; PocetPredmetu : integer; var prumer : real; var prospech : char); var suma, i : integer; pocet5, pocet3_4 : integer; begin suma := 0 ; pocet5 := 0 ; pocet3_4 := 0; for i := 1 to PocetPredmetu do begin suma := suma + Z[i]; if Z[i] = 5 then pocet5 := pocet5 + 1 else if (Z[i] = 3) or (Z[i] = 4) then pocet3_4 := pocet3_4 + 1 ; end; prumer := suma / PocetPredmetu; if pocet5 > 0 then prospech := 'N' else if pocet3_4 > 0 then prospech := 'P' else if prumer > 1.5 then prospech := 'P' else prospech := 'V'; end;

25 Dvourozměrné pole denní i měsíční průměry teplot za jistý měsíc Předpokládejme, že teplota se měří každý den celkem 4x 1. měření v 6:00, 2. měř. v 12:00, 3. měř v 18:00, 4. měření v 24:00 Vstup:počet dní v měsíci, u každého dne zadáme postupně všechny 4 naměřené hodnoty Výstup: denní průměry, měsíční průměry v 6:00, 12:00, 18:00, 24:00 var Teploty : array [1.. 31, 1.. 4] of real; DSuma : array [1.. 31] of real; MSuma : array [1.. 4] of real; pocet, i, j : integer; begin { nulování součtových proměnných } for i := 1 to 31 do DSuma[i] := 0; for i := 1 to 4 do MSuma[i] := 0;

26 Dvourozměrné pole denní i měsíční průměry teplot za jistý měsíc Write ('Zadej počet dní: '); ReadLn(pocet); for i := 1 to pocet do begin for j := 1 to 4 do begin Write ('Zadej teplotu: '); ReadLn (Teploty[i, j]); DSuma[i] := DSuma[i] + Teploty[i, j] ; MSuma[j] := MSuma[j] + Teploty[i, j] ; end; WriteLn('Denní průměry'); for i := 1 to pocet do Write(DSuma[i] / 4 : 8 : 2); WriteLn; WriteLn('Měsíční průměry'); for i := 1 to 4 do Write(MSuma[i] / pocet : 8 : 2); WriteLn; ReadLn; end;

27 Otevřené pole – open array v deklaraci se neuvádí rozsahu indexů pole dolní index je vždy 0 horní index se zjistí pomocí funkce High() je třeba použít direktivu {$P+} umožňuje používat jako parametr procedur a funkcí pole s různým počtem prvků (ale typ prvku je stejný)

28 Open array var A : array [1.. 50] of integer; B : array [ ] of integer; C : array [ ] of integer; jde použít jako skutečný parametr procedury procedure Vypocet (pole : array of integer) pole A má pak indexy od 0 – 49 pole B0 – 30 pole C0 – 10

29 Open array (1) program Otevrene_Pole; { indexy se vzdy chapou od 0, at jsou jakekoli} { tj. Low(pole)=0} { High(pole)=pocet prvku pole} {$P+} uses Crt; const N=5; type pole1 = array [1.. N] of integer; pole2 = array [-N.. N] of integer; const P : pole1= (1, 2, 44, 2, 7); Q : pole2= (2, 5, 8, 3, 9, 2, 0, 11, 4, 9, 1);

30 Open array (2) function Max (a : array of integer) : integer; var i, M : integer; begin M := a [Low(a)]; for i := Low(a) + 1 to High(a) do if M < a[i] then M := a[i]; Max := M; end; begin ClrScr; WriteLn ('Max pole1 je ', Max(P)) ; WriteLn ('Max pole2 je ', Max(Q)) ; ReadLn; end.

31 Vyhledávání v nesetříděném poli {funkce vrací -1, pokud prvek není nalezen, jinak vrací index prvního výskytu prvku} function Hledej (pole : array of real; hodnota : real) : real; var i, pocet, vysledek : integer; begin vysledek := -1; pocet = High(pole) ; for i:= 0 to pocet do if pole [i] = hodnota then begin vysledek := i; break; end; Hledej := vysledek; end;

32 Vyhledávání v setříděném poli (vzestupně) {funkce vrací -1, pokud prvek není nalezen, jinak vrací index prvního výskytu prvku} function Hledej (pole : array of real; hodnota : real) : real; var i, pocet, vysledek : integer; begin vysledek := -1; i := 0; pocet = High(pole) ; repeat if pole [i] < hodnota then i := i + 1 else break; until i = pocet; if (i < pocet ) and (pole[i] = hodnota) then vysledek := i; Hledej := vysledek; end;


Stáhnout ppt "Programování v Pascalu Přednáška 6 RNDr. Hana Havelková."

Podobné prezentace


Reklamy Google