Obsah lekce:
Pole si můžeme představit jako proměnnou, která nám umožní uložit posloupnost hodnot (nikoli jen jednu).
Jde o datovou strukturu, která nám umožní uložit posloupnost hodnot. Prázdné pole bychom si mohli představit například takto:
Jak vidíme, tak pole je prázdné (přihrádky nic neobsahují), ale překladač do nich po deklaraci pole při startu programu nějaké hodnoty zpravidla přiřadí (je-li například každý prvek pole typu integer, pak tam Delphi automaticky všude dá číslo 0). Takže aniž bychom cokoli udělali, tak pole ihned po deklaraci vypadá takto:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Takovou datovou strukturu bychom mohli například naplnit čísly:
5 | 8 | 7889 | 1 | 29 | 9 | 126 | 6656 | 778 | 2 |
Jedná se vlastně o strukturu, která obsahuje nějaký počet míst pro uložení hodnot. Dobrou analogií je například
Předchozí pole v programu figuruje jako jedna jediná proměnná, která obsahuje 10 čísel. Jak pole naplnit a používat?
Použijme naši analogii se čtverečkovaným papírem. Uvažujme, že máme k dispozici vystřižený řádek čtverečkovaného papíru o deseti čtverečcích. Chceme po někom (po programu), aby do správných čtverečků na papíře napsal správná čísla (naplnil pole hodnotami). Řekneme tedy třeba něco jako:
Vidíme, že každé políčko má své pořadové číslo. Takovému číslu budeme říkat index. Pomocí indexu a daného pole lze jednoznačně říci, o který prvek se jedná. Situaci ilustruje následující obrázek, kde například na pozici 5 je v poli prvek 29.
index | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
hodnota | 5 | 8 | 7889 | 1 | 29 | 9 | 126 | 6656 | 778 | 2 |
Deklarace datového typu pole o n prvcích je následující:
type
pole = array[1..n]of integer;
Po této deklaraci datového typu pole již můžeme deklarovat proměnnou typu pole:
type
pole = array[1..n]of integer;
var
p:pole;
Chceme-li například použít v programu pole o deseti prvcích, pak v deklarační části napíšeme:
type
pole = array[1..10]of integer;
var
p:pole;
Chceme-li vložit do pole p na některou pozici i (index) nějakou hodnotu, pak to provedeme následujícím způsobem:
p[i]:=hodnota;
Předchozí zápis říká, že na i-tou pozici v poli p vložíme hodnotu. Příklad vložení hodnoty 5 do pole na pozici 1.
type
pole = array[1..10]of integer;
var
p:pole;
begin
p[1]:=5;
end.
Pokud bychom chtěli naplnit celé pole zadanými hodnotami, tak bychom museli každé pozici v poli přiřadit požadovanou hodnotu.
type
pole = array[1..10]of integer;
var
p:pole;
begin
p[1]:=5;
p[2]:=8;
p[3]:=7889;
p[4]:=1;
p[5]:=29;
p[6]:=9;
p[7]:=126;
p[8]:=6656;
p[9]:=778;
p[10]:=2;
end.
Jaké jsou nevýhody předcházejícího postupu? Nedovoluje zadat hodnoty uživateli, ale jen programátorovi. Pokud chceme, aby si hodnoty zadal uživatel sám, pak můžeme přepsat program takto:
type
pole = array[1..10]of integer;
var
p:pole;
begin
readln(p[1]);
readln(p[2]);
readln(p[3]);
readln(p[4]);
readln(p[5]);
readln(p[6]);
readln(p[7]);
readln(p[8]);
readln(p[9]);
readln(p[10]);
end.
Tento postup má nevýhodu v tom, že uživatel nemůže zadat libovolné množství hodnot. A představme si situaci, jak by program vypadal, kdybychom chtěli zadat například 100 hodnot... Druhý problém vyřešíme elegantně pomocí cyklu FOR.
Program NaplneniAVypisPole;
type pole = array[1..10]of integer;
var p:pole;
i:integer;
begin
for i:=1 to 10 do
begin
readln(p[i]);
end;
for i:=1 to 10 do
begin
writeln(p[i]);
end;
readln;
end.
Program NaplneniAVypisPole;
type pole = array[1..5000]of integer;
var p:pole;
i, pocet:integer;
begin
writeln('Zadej pocet vkladanych cisel (1-5000)');
readln(pocet);
while ((pocet<1) or (pocet>5000)) do
begin
writeln('Zadej znovu:');
readln(pocet);
end;
for i:=1 to pocet do
begin
readln(p[i]);
end;
for i:=1 to pocet do
begin
writeln(p[i]);
end;
readln;
end.
Program NaplneniAVypisPole;
const n = 5000;
type pole = array[1..5000]of integer;
var p:pole;
i, pocet:integer;
begin
writeln('Zadej pocet vkladanych cisel (1-',n,')');
readln(pocet);
while ((pocet<1) or (pocet>n)) do
begin
writeln('Zadej znovu:');
readln(pocet);
end;
for i:=1 to pocet do
begin
readln(p[i]);
end;
for i:=1 to pocet do
begin
writeln(p[i]);
end;
readln;
end.
Napište program pro zadání výplat zaměstnanců firmy. Program by měl načítat zadané platy od uživatele tak dlouho, dokud uživatel nezadá číslo 0 (to bude znamenat konec zadávání). Po zadání poslední výplaty program uživateli vypíše zadané výplaty, jejich počet.
Program Vyplaty;
const n = 1000;
type pole = array[1..n]of integer;
var p:pole;
i,pocet,vyplata:integer;
begin
writeln('Zadejte vyplaty (0 konci zadavani):');
vyplata:=1;
i:=1;
while (vyplata<>0) do
begin
readln(vyplata);
p[i]:=vyplata;
i:=i+1;
end;
pocet:=i-2;
writeln('Zadane vyplaty:);
for i:=1 to pocet do
begin
writeln(p[i],' ');
end;
writeln('Pocet zadanych vyplat je ',pocet);
readln;
end.
Předchozí program není napsán zcela správně. Zkuste jeho chyby odhalit a vyřešit.
Napište program pro zadání výplat zaměstnanců (max. 100). Program následně všechny zadané výplaty vypíše, spočítá aritmetický průměr platů a vypíše největší a nejnižší výplatu. Program také vypíše celkovou sumu peněz, která je potřebná k proplacení výplat. Výpis zadaných výplat upravte tak, aby byly vypsané platy odděleny čárkou a mezerou (pozor na poslední výplatu - za ní by měla ve výpisu následovat tečka).