Anglická verze
logolink

< Zpět na seznam lekcí

Pole

AlgoritmyObsah lekce:

  • Charakteristika datového typu pole
  • Definice datového typu pole
  • Naplnění a výpis pole
  • Zadání libovolného počtu prvků pole
  • Program výplaty

Charakteristika datového typu pole

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

  • řádek čtverečkovaného papíru, kde v každém políčku může být napsáno nějaké celé číslo (pole s prvky typu integer)
  • řada šuplíků, kde v každém může být napsán na papíře nějaký text (pole s prvky typu string)

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:

  • Do prvního políčka napiš číslo 5.
  • Do druhého políčka napiš číslo 8.
  • Do třetího políčka napiš číslo 7889.
  • ...
  • Do desátého políčka napiš číslo 2.

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

Definice datového typu pole

Deklarace datového typu pole o n prvcích je následující:

Deklarace datového typu pole o n prvcích
type   pole = array[1..n]of integer;

Po této deklaraci datového typu pole již můžeme deklarovat proměnnou typu pole:

Deklarace datového typu pole o n prvcích
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:

Deklarace datového typu pole o 10 prvcích
type   pole = array[1..10]of integer;
var   p:pole;

Naplnění a výpis 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:

Vložení hodnoty do pole
 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.

Vložení hodnoty do pole
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.

Vložení hodnot do pole
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:

Vložení hodnot do pole
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.

Naplnění a výpis pole
 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.

Naplnění a výpis pole se zadáním počtu vkládaných prvků s kontrolou

Naplnění a výpis pole se zadáním počtu vkládaných prvků
 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.

Naplnění a výpis pole se zadáním počtu vkládaných prvků s kontrolou a konstantou

Naplnění a výpis pole se zadáním počtu vkládaných prvků
 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.

Program výplaty

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 výplaty
 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.

Program výplaty verze 2

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).

Další čtení

Odkazy

Otázky

  1. Co rozumíte v jazyce Pascal pod pojmem pole?
  2. Pokuste se ilustrovat, jak datová struktura pole vypadá?
  3. Jak se deklaruje datový typ pole?
  4. Jaké jsou výhody datového typu pole?
  5. Napište kód, který naplní pole o n prvcích hodnotami od uživatele.
webdesign, xhtml, css, php - Mgr. Michal Mikláš