Jak zabezpieczyć program, żeby się nie wykrzaczył, gdy przy wczytywaniu liczb procedurą readln poda się litery

ŁF

Są dwie metody; prostsza jest taka: liczbę wczytuje się nie do zmiennej liczbowej, ale do stringa, a ze stringa wyciąga procedurą val. Jeśli trzeci parametr zapodany procedurze val jest różny od zera, to liczba została niepoprawnie wpisana, w przeciwnym wypadku prawidłowa liczba znajduje się w zmiennej, która robiła za drugi parametr w val-u.
Jak działa procedura val? Zajrzyj do helpa.
Druga metoda nie wymaga silnych czarów, wystarczy tylko kontrolować znak po znaku to, co użytkownik wpisuje. Robi się to za pomocą funkcji readkey, przyjmując tylko znaki '0'..'9' i ewentualnie '.' i '-' i zrzucając je po kolei do stringa; dalej jak wyżej :) z tym, że skoro string zawsze zawiera prawidłową liczbę, to nie musimy przeprowadzać kontroli (czy trzeci parametr po wywołaniu val jest równy zeru).

FAQ

4 komentarzy

gg: 1624062 - Przemek Mackowski - Pozdrawiam!!

VAR
i : integer; {wczytywana wartosc}
blad : byte; {przypominam byte jest z zakresu 0 do 255] chyba wystarczy co ?:)}

BEGIN
RePeat
clrscr;
WriteLn('Podaj liczbe');
{$I-}ReadLn(i);{$I+} {to nie są komentarze tylko dyrektywy kompilatora}
blad:=IOResult; {zdaje sie ze jak klikniesz literke wartosc ta wynosic bedzie 106 :) wiec bedzie rozna od zera (patrz nastepna linijka}

IF blad <> 0 Then writeln('podales ciag znakow a nie liczbe');
Until (blad=0);

write('Poszlo dalej'); {:)))}
END.

Wydaje mi sie za na koncu procedury Artura przydalo by sie postawic jeszcze {$I+} poza tym wszystko OK

Polecam stosowanie tej drugiej metody do wczytywania tekstu, jest najbardziej uniwersalna (np. readln w trybie graficznym nie wyświetli wpisywanego tekstu tam, gdzie chcesz, tylko w lewym górnym rogu ekranu)

Można też skorzystać z tzw dyrektywy i funkcji IOResult
{$I-}{<-to nie jest komentarz tylko dyrektywa}
readln(liczba);{tu czytamy liczbę}
if IOResult<>0 then{wczytano nie liczbę}
writeln('Podałeś ciąg znaków a nie liczbę');{oczywiście po then może być coś innego}