Pole proměnných

V 11. lekci jsme v ukázce pracovali s čísly tak, že jsme průběžně počítali například průměr a každé nové číslo "přemazalo" předešlé - nebylo možné vrátit se k některé předešlé hodnotě a třeba ji opravit. Ve chvíli, kdy budeme chtít čísla uchovat pro další zpracování (opravy, porovnávání apod.) a tudíž budeme potřebovat větší počet proměnných, potom můžeme využít tzv. pole proměnných - to obsahuje jakoby očíslované (oindexované) proměnné. Vzpomeňte si na práci s řetězci (12. lekce) - řetězec je také pole - očíslovaných znaků (přesněji znakových proměnných).

Pole proměnných je nejprve potřeba nadefinovat jako proměnné v sekci var pomocí klíčového slova array, například:
cisla: array [1..10] of integer;
V definici je uvedeno jméno pole (cisla), za klíčovým slovem array je v hranatých závorkách uvedeno rozmezí indexů (od 1 do 10) a nakonec následuje typ proměnných, které jsou prvky (složkami) tohoto pole - všechny jsou stejného typu (integer). Tato definice by nám umožňovala používat proměnné cisla[1], cisla[2], cisla[3] ... až cisla[10], všechny jsou typu integer.
Prvky pole mohou být ale jakéhokoliv typu, které u proměnných známe (real, string, boolean..).
Právě díky jejich očíslování (indexům) je můžeme snadno používat například ve for cyklech (viz 9. lekce), jak si raději hned ukážeme na následujícím příkladu.


Následující projekt bude velmi podobný projektu z 11. lekce, ovšem se zásadní změnou - bude možné zadaná čísla také opravovat a znovu vypisovat nebo jinak zpracovávat.

Projekt Známky

Projekt slouží pro zápis 10 známek, které můžeme případně opravit (na lepší :-)), vypisovat, sečíst nebo najít nejmenší (nejlepší).
Jak je vidět z obrázku, je kromě Labelů a Buttonů použitý ještě ListBox pro výpis hodnot a SpinEdit pro výběr pořadí opravované známky.

V sekci var nadefinujeme potřebné pole a několik dalších proměnných:
var
Form2: TForm2;
cisla: array [1..10] of integer;
pocet: integer;
n, soucet, min: integer;

Nejprve bude potřeba procedura na tlačíku OK pro zadávání čísel:
procedure TForm2.Button1Click(Sender: TObject);
begin
pocet:=pocet+1;
if pocet<=10 then
begin
cisla[pocet]:=strtoint(Edit1.Text); listbox1.items.Add(inttostr(pocet)+'. číslo: '+edit1.text);
end
else showmessage('Všechna čísla zadána');
end;
Proměnná pocet se po každém zadání čísla zvětší o 1, čili bude počítat pořadí zadaného čísla. Jestliže jich bude zadaných méně nebo rovno 10, uloží se zadané číslo do proměnné cisla[pocet] (ještě jednou - v proměnné pocet je uloženo pořadí čísla od 1 do 10) a vypíše se řádek do listboxu (za then může být jen jeden příkaz, proto musí být tyto dva příkazy "uzavřené" mezi begin a end - bez středníku protože příkaz if ještě pokračuje). Pokud je pocet větší než 10 (else) vypíše se hláška o zapsání všech hodnot.

Tlačítko Oprav by mohlo obsahovat tuto proceduru:
procedure TForm2.Button4Click(Sender: TObject);
begin
n:=spinedit1.value;
cisla[n]:=strtoint(Edit2.Text);
listbox1.Clear;
for n:=1 to 10 do listbox1.items.Add(inttostr(n)+'. číslo: '+inttostr(cisla[n]));
end;
Do proměnné n se uloží hodnota SpinEditu - pořadí opravovaného čísla. Do proměnné z pole cisla určené pořadím v proměnné n se vloží hodnota z Editu. Nakonec se vymaže ListBox a pomocí FOR cyklu se vypíší všechny hodnoty pole cisla.

Procedura na tlačítku Sečti také využívá FOR cyklus:
procedure TForm2.Button3Click(Sender: TObject);
begin
soucet:=0;
for n:=1 to 10 do soucet:=soucet+cisla[n];
listbox1.items.Add('Součet čísel: '+inttostr(soucet));
end;
Vzhledem k jednoduchosti mohla tato procedura zůstat bez komentáře, ale všimněte si, jak jsme opět ve FOR cyklu s výhodou mohli využít toho, že proměnné v poli jsou vlastně očíslované proměnné.

Komu pořád ještě "nedošly" výhody proměnných v poli, snad je pochopí po prohlédnutí procedury na tlačítku Nejmenší:
procedure TForm2.Button6Click(Sender: TObject);
begin
min:=10000;
for n:=1 to 10 do if cisla[n]<min then min:=cisla[n];
listbox1.items.Add('Nejmenší číslo: '+inttostr(min));
end;


Aplikaci ukládej do složky s názvem lekce18 .

Úkoly:

Základní úloha:

Vytvořte aplikaci podle textu lekce (viz ukázka ) a doplňte tlačítko a proceduru pro nalezení největšího čísla (nejhorší známky).


Úloha na plus:

Doplňte vyhodnocení prospěchu - s vyznamenáním prospěl ten, kdo má průměr do 1,5 a nemá horší známku než dvojku, prospěl ten, kdo nemá pětku.


Úlohy na jedničku:

Do hry Videostop ze 14. lekce doplňte tabulku rekordů. Po spuštění bude vynulovaná, každému kdo dosáhne lepšího výsledku než je poslední v tabulce, program umožní zapsat jeho jméno a zařadí ho na správné místo do tabulky.

Vytvořte projekt Soutěž pro zaznamenávání bodů např. pěti soutěžících ve fiktivní televizní soutěži. Na začátku se zapíší jména soutěžících, v každém kole se zadají každému soutěžícímu body, které získal. Body se po každém kole sčítají a průběžně vypisují.


Úloha pro experty:

Projekt Soutěž vylepšete tak, aby se vypisovalo pořadí soutěžících podle počtu bodů.
(Návod: Pro seřazení položek pole podle velikosti existuje řada metod, můžete využít tzv. metodu největšího prvku (jednoduchá, ale neefektivní): v poli nalezněte největší hodnotu a vyměňte ji s první, potom najděte největší číslo mezi druhou až desátou položkou a vyměňte ji s druhou atd. - opět se s výhodou dají použít cykly, tentokrát násobné, vnořené )