Vícerozměrná pole

V praxi se častěji setkáváme s potřebou polí s více "rozměry". V minulé lekci jsme zapisovali známky jednomu žákovi, jenže ve třídě jich bývá více (bohužel pro učitele), chceme-li zapsat více známek více žákům, budeme už potřebovat pole se dvěma rozměry. Pro představu takového pole může posloužit tabulka s více řádky a více sloupci, kterou využijeme v následujícím příkladě.

Deklarace pole s více rozměry může vypadat například takto:
znamky: array[1..3,1..5] of integer;
Všimněte si indexů v hranaté závorce, tentokrát jsou dva - první od 1 do 3, druhý od 1 do 5. Touto deklarací je definováno 3x5 = 15 proměnných, které mají indexy:
znamky[1,1], znamky[1,2], znamky[1,3], znamky[1,4], znamky[1,5]
znamky[2,1], znamky[2,2], znamky[2,3], znamky[2,4], znamky[2,5]
znamky[3,1], znamky[3,2], znamky[3,3], znamky[3,4], znamky[3,5]
Takže se můžeme představit, že jde o tři řádky po pěti hodnotách (proměnných), přičemž musí být opět všechny stejného typu (v tomto příkladě integer).


Právě pole se dvěma rozměry (neboli proměnné se dvěma indexy) můžeme využít pro zápis více známek více žákům. Protože ale při našich pokusech budeme nejednou známky vyplňovat, omezíme se v ukázce raději na tři žáky s pěti známkami.

Projekt Třída

Na obrázku si všimněte další nové komponenty (tabulky), která je vhodná pro náš případ, to jest zápis hodnot proměnných pole se dvěma rozměry. Komponenta se jmenuje StringGrid a najdete ji v kategorii Additional. Z jejích mnoha vlastností se nám nyní bude hodit:
- ColCount, RowCount - počet sloupců a řádků
- Cells - buňky tabulky
- FixedCols, FixedRows - počet "fixovaných" sloupců a řádků (záhlaví a legendy), které se "nerolují", v našem případě je nulový
- Option - goEditing - True - můžeme editovat
- goTabs - true - pro přesun mezi položkami lze použít tabelátor (po potvrzení hotnoty Entrem se k pohybu po buňkách dají použít i kurzorové šipky)

Tlačítko Zapsáno uloží hodnoty zapsané v tabulce do pole proměnných (nezapomeňte na jeho deklaraci - viz výše):
procedure TForm2.Button2Click(Sender: TObject);
begin
for x:=1 to 3 do
for y:=1 to 5 do znamky[x,y]:=strtoint(stringgrid1.cells[y-1,x-1]);
end;
Pro každé x od jedné do tří (neboli pro každého ze tří žáků) se projde celý řádek - y se mění od 1 do 5. Hodnota z každé buňky, se uloží do příslušné proměnné pole - buňky komponenty StringGrid jsou číslované od nuly a jejich souřadnice jsou v pořadí sloupec, řádek, proto znamky[x,y]:=cells[y-1,x-1].

Druhé tlačítko vypočte průměry jednotlivých žáků (neboli v řádcích pole či tabulky):
procedure TForm2.Button1Click(Sender: TObject);
begin
for x:=1 to 3 do
begin
sum:=0;
for y:=1 to 5 do sum:=sum+znamky[x,y];
ListBox1.Items.Add('průměr '+inttostr(x)+ '. žáka je: '+floattostr(sum/5));
end;
end;
Pro každé x od 1 do 3 se vykonají příkazy mezi následujícím beginem a endem - vynuluje se proměnná sum, do které se v cyklu pro y od 1 do 5 sečtou známky x-tého žáka. Tento vypočtený součet se potom využije k výpisu průměru do ListBoxu.


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

Úkoly:

Základní úloha:

Vytvořte aplikaci podle textu lekce (viz ukázka ) a zkuste najít a upravit barvu pozadí tabulky.


Úlohy na plus:

Přidejte tlačítko pro výpočet průměru předmětů (sloupců).


Doplňte tlačítko pro určení nejlepšího žáka.


Úloha na jedničku:

Doplňte projekt tak, aby bylo na začátku možné zadat počet žáků i předmětů. Projekt by měl obsahovat tlačítka pro výpočet průměru žáků, průměru předmětů a určení nejlepšího žáka.


Úlohy pro experty:

Doplňte projekt na jedničku o zadání jmen žáků, názvů předmětů a seřazení žáků podle průměru.


TIC-TAC-TOE
Vytvořte projekt pro hraní jednoduché "piškvorkové" hry s hracím plánem 3x3 políčka. Můžete využít zdroj základu a doplnit jej tak, aby program dokázal určit, kdo ze dvou hráčů vyhrál a aby bylo možné hrát proti počítači.


PIŠKVORKY
Komponenta StringGrid se dá použít také pro základ piškvorek, protože má funkci MouseToCell(x, y, sl, rad);, která převádí souřadnice "myšího" kurzoru na sloupec a řádek tabulky. Zkuste základ doplnit o kontrolu, který ze dvou hráčů vyhrál. Můžete využít zdroj základu .