
Pole v jazyku Pascal (druhá časť)prvá časť -- druhá časť V predchádzajúcej časti sme si ukázali, ako spojiť daný počet premenných do jedného poľa. Jednotlivé prvky poľa sú očíslované. Pri deklarácii premennej typu pole sa uvádza rozsah čísel, napríklad "Array[1..5]" znamená, že prvky majú čísla od 1 do 5. To nám vyhovuje, ak vieme, že budeme potrebovať práve 5 čísel. (Číslovanie nemusí byť nutne od 1 do 5, programátori so znalosťou iných jazykov možno dajú prednosť číslovaniu od 0 do 4.) Čo však urobíme v prípade, keď nevieme, koľko tých prvkov budeme potrebovať? Existujú dve základné riešenia. Tomu zložitejšiemu sa dnes nebudeme venovať (pre zvedavých: vyžaduje používanie ukazovateľov a dynamické prideľovanie pamäte). Jednoduché riešenie spočíva v tom, že si vyhradíme dostatočne veľký počet čísel, napríklad 100, a využijeme iba niektoré z nich. Toto riešenie sa ľahko programuje, a má dve nevýhody: ak si ako maximálny počet prvkov stanovíme 100, nemôžeme do poľa nikdy uložiť viac ako 100 prvkov; ak ale použijeme omnoho menej prvkov, plytváme nevyužitou pamäťou. Okrem premennej typu pole použijeme aj pomocnú premennú, ktorá bude hovoriť, koľko prvkov poľa je naozaj využitých. var
prvky : Array[1..10] of Integer;
pocet : Integer;
i : Integer;
begin
Write('Kolko prvkov chces zadat? (mozes aspon 1, ale najviac 10) '); ReadLn(pocet);
if (1 <= pocet) and (pocet <= 10) then begin
for i := 1 to pocet do begin
Write('Zadaj prvok cislo ', i, ': '); ReadLn(prvky[i]);
end;
Write('OK, zadal si tieto cisla:');
for i := 1 to pocet do begin
Write(' ', prvky[i])
end;
WriteLn(' -- spolu ich bolo ', pocet)
end else begin
WriteLn('Povedal som, ze iba od 1 do 10!')
end
end
Týmto sa dostávame k temnej stránke programovania, hľadaniu chýb. Zrejme ste už zažili, že napísaný program nefungoval, pretože v ňom bol preklep. Takéto chyby sú pre začiatočníkov nepríjemné, ale v porovnaní s ostatnými chybami sú ešte v pohode; počítač sám zistí, že ste urobili chybu, a ukáže kde približne. Ťažší prípad je, keď počítač program úspešne preloží a spustí, a ukáže sa, že program robí niečo iné než ste pôvodne chceli, pretože ste niečo zabudli napísať, alebo napísali v nesprávnom poradí. Tu síce počítač nepovie, kde presne je chyba, ale väčšinou rýchlo zistíte, že tam nejakú chybu máte. V horeuvedenom príklade sa dostávame k ešte zákernejšiemu druhu chýb: program môže za bežných okolností fungovať správne, ale niekedy (napríklad pri zadaní nesprávneho čísla) urobí chybu. Máme vyhradené pole pre 10 prvkov, a keby sme sa pokúsili doňho uložiť jedenásty prvok, nastala by chyba. K jednotlivým prvkov však pristupujeme pomocou zápisu "prvky[i]", a tam nie je jasné, či je to v poriadku alebo nie, dokiaľ nevieme hodnotu premennej "i". Preto si musíme sami kontrolovať, aby nedošlo k použitiu hodnoty mimo povoleného rozsahu. V tomto príklade testujeme povolený rozsah pomocou príkazu "if". Keby sme na tento test zabudli, program by fungoval správne... dokiaľ by niekto nezadal počet prvkov väčší ako 10. A čo sa stane v prípade, keď sa pokúsime zapísať hodnotu do neexistujúceho prvku poľa? V jazyku Pascal je voliteľné nastavenie, či má program automaticky kontrolovať rozsah poľa pri každom prístupe k jeho prvkom. Ak je to nastavenie zapnuté a program zistí chybu, nevie čo s ňou, a tak len vypíše na obrazovke chybovú hlášku a okamžite sa ukončí, čiže "spadne". Z toho používateľ veľmi nadšený nebude. Navyše táto automatická kontrola spomaľuje beh programu; pri týchto ukážkových príkladoch nás to nemusí trápiť, ale ak ideme robiť milióny výpočtov za sekundu, môže sa takáto kontrola pri každom kroku výpočtu viditeľne prejaviť. A ak je toto nastavenie vypnuté, znamená to, že program danú hodnotu napíše na viacmenej náhodné miesto v pamäti počítača. A to môže znamenať všeličo; možno si nevšimneme žiadnu zmenu, možno program vráti nesprávnu chybu výpočtu, možno sa začne nejako čudne správať, možno spadne. Takéto správanie je úplná katastrofa. Takže automatická kontrola by síce mala byť zapnutá (nájdete ju v nastaveniach kompilátora pod názvom "Range checking"), ale hodnoty zadané používateľom by ste vždy mali skontrolovať, a nesprávny vstup odmietnuť. Kontrolu rozsahu poľa si môžeme napísať aj sami. Namiesto priameho zápisu a čítania "prvky[i]" budeme používať pomocné funkcie "dajPrvok(i, hodnota)" a "berPrvok(i)", ktoré skontrolujú, či je číslo "i" v stanovenom rozsahu. Ak chceme zapísať do neexistujúceho prvku, funkcia neurobí nič; ak chceme načítať z neexistujúceho prvku, funkcia vráti nulu. const MAX_PRVKOV = 3;
var
prvky : Array[1..MAX_PRVKOV] of Integer;
procedure dajPrvok(poradie : Integer; hodnota : Integer);
begin
if (0 < poradie) and (poradie <= MAX_PRVKOV) then begin
prvky[poradie] := hodnota
end
end;
function berPrvok(poradie : Integer) : Integer;
begin
if (0 < poradie) and (poradie <= MAX_PRVKOV) then begin
berPrvok := prvky[poradie]
end else begin
berPrvok := 0
end
end;
var
pocet : Integer;
i : Integer;
hodnota : Integer;
begin
Write('Zadaj pocet prvkov: '); ReadLn(pocet);
for i := 1 to pocet do begin
Write('Zadaj prvok cislo ', i, ': ');
ReadLn(hodnota);
dajPrvok(i, hodnota)
end;
Write('OK, zadaj si tieto cisla:');
for i := 1 to pocet do begin
Write(' ', berPrvok(i))
end;
WriteLn(' -- spolu ich bolo ', pocet)
end
Spustite si program a úmyselne zadajte počet prvkov väčší ako tri! |
Viliam Búr [sk] domáca stránka (feed) viliam@bur.sk ICQ: 133571943 Blog: JavaScript pre začiatočníkov (3) JavaScript pre začiatočníkov (2) Linky: Sponzorované odkazy: |