Při zadávání čísel dochází často k tomu, že uživatel buď schválně, nebo omylem zadá jiný
znak než je číslice nebo desetinná čárka u reálných čísel.
Užijeme-li příkaz READLN(CISLO), kde CISLO je celočíselná nebo reálná proměnná, a
zadá-li uživatel nějaké písmeno, pak dojde ke generování chyby za běhu programu (Run-time error)
a program se ukončí.
Tomuto je možno zabránit v Turbo (Borland) Pascalu užitím direktivy kompilátoru {$I}.
V některých případech (např. školní projekty), není možno tyto direktivy použít, a proto
zde uvádím několik funkcí, které načtou číslo jako řetězec, pak odstaní písmena a pokusí
se převést zbylý řetězec na číslo.
Ve všech případech používám funkci s VÝSTUPNÍM PARAMETREM, kterým je dané číslo. Sama funkce
vrací údaj o tom, zda se číslo podařilo načíst, což využijeme např. takto:
repeat gotoxy(x,y); until NactiCislo(CISLO);
Zadání:
Function ReadLnReal(var Nr:real):boolean;
{Funkce se pokusi nacist cislo typu real. Hodnota funkce nabude TRUE, byla-li
zadana alespon 1 cislice. Hodnota funkce je FALSE, nebyla-li zadana zadna
cislice nebo byly zadany dve desetinne tecky.}
var Err:integer;
S:string;
begin {ReadLnReal}
readln(S); {Nactu retezec znaku.}
Err:=1; {Err pouziji jako pocitadlo cyklu while.}
while Err<=Length(S) do begin
if not(S[Err] in ['0'..'9','E','.']) then
Delete(S,Err,1) {Byl-li zadan nekorektni znak.}
else Err:=Err+1; {Byl-li zadan korektni znak.}
end; {while}
val(S,Nr,Err); {Snazim se prevest retezec na realne cislo.}
ReadLnReal:=Err=0; {Nepovedlo-li se to, vracim FALSE, jinak TRUE.}
end; {ReadLnReal}
Seznam algoritmů
Zadání:
Function ReadLnWord(var Nr:word):boolean;
{Funkce se pokusi nacist cislo typu word. Hodnota funkce nabude TRUE,
byla-li zadana alespon 1 cislice. Hodnota funkce je FALSE, nebyla-li
zadana zadna cislice. Funkce predpoklada, ze je umozneno porovnavani
dvou retezcu.}
var Err:integer;
S,SMax:string;
begin {ReadLnWord}
readln(S); {Nactu retezec znaku.}
Err:=1; {Err pouziji jako pocitadlo cyklu while.}
while Err <= Length(S) do begin
if not (S[Err] in ['0'..'9']) then
Delete(S,Err,1) {Byl-li zadan nekorektni znak.}
else Err:=Err+1; {Byl-li zadan korektni znak.}
end; {while}
Str(2*MaxInt+1,SMax); {Ulozim maximalni hodnotu typu word.}
if S < SMax then
val(S,Nr,Err); {Snazim se prevest retezec na cele cislo.}
ReadLnWord:=Err=0; {Nepovedlo-li se to, vracim FALSE, jinak TRUE.}
end; {ReadLnWord}
Seznam algoritmů
|
|
16. 3. 2000 |
|
|
||
|
|