Komunikat błędu przy wpisaniu danych innego typu niż Integer

2011-10-11 19:23
0

Jak zabezpieczyć program przed wpisaniem danych innego typu niż integer?
Napisałem program według następującego polecenia:

Dla podanej liczby n (n z przedziału (0,1000>) wyznaczyć i wyświetlić n kolejnych wyrazów ciągu arytmetycznego o pierwszym elemencie a i różnicy r, gdzie a jest liczbą całkowitą z przedziału <0,20>, r jest liczbą całkowitą różną od 0 z przedziału <-10000,10000>. Obliczyć sumę tych elementów.

Wygląda on tak:

program Project2;

var
 i,n,r: Integer;
 a:array[0..1000] of Integer;

label
  koniec;

begin
  writeln('Program wyswietla n kolejnych wyrazow ciagu arytmetycznego');
  writeln('***************************************************************');
  write('Podaj ilosc wyrazow n: '); readln(n);
    if (n<1) or (n>1000) then begin
      writeln('***************************************************************');
      writeln('Bledne dane');
      goto koniec;
    end;
  write('Podaj pierwszy wyraz a[1]: '); readln(a[1]);
    if (a[1]<0) or (a[1]>20) then begin
      writeln('***************************************************************');
      writeln('Bledne dane');
      goto koniec;
    end;
  write('Podaj roznice r: '); readln(r);
    if (r<-10000) or (r>10000) or (r=0) then begin
      writeln('***************************************************************');
      writeln('Bledne dane');
      goto koniec;
    end;
  writeln('***************************************************************');
    i:=1;
    writeln('a[',i,']=',a[i]);
    for i:=2 to n do
      begin
       a[i]:=a[i-1]+r;
       writeln('a[',i,']=',a[i]);
      end;
  writeln('***************************************************************');
    koniec:
    readln;
end.  

I teraz pozostało mi tylko zabezpieczyć program przed tym że ktoś np jako n poda zamiast liczby całkowitej jakiś wyraz lub liczbę zmiennoprzecinkową. Jak temu zaradzić? Szukałem na forum ale nic nie znalazłem

edytowany 1x, ostatnio: madmike, 2011-10-11 19:25

Pozostało 580 znaków

2011-10-11 19:31
0

1.Czytaj znak po znaku.
2.Po wpisaniu tekstu sprawdzaj, czy w stringu są wyłącznie cyfry.


Pozostało 580 znaków

2011-10-11 19:40
0
  1. Nie słuchaj Patryka
  2. Zastosuj procedurę Val i wczytuj liczby jako string
  3. Nie używaj label, ale zamiast tego użyj pętli repeat ... until

Pozostało 580 znaków

2011-10-11 19:44
0

A jak wczytać znak po znaku?
I rozumiem że wtedy zmienna musi być typu string, więc nie muszę jej później przekonwertować na Integer?

simplex a jak działa ta procedura Val? bo właśnie nie mogę się w tym połapać

EDYTUJ SWOJE POSTY, JEŚLI CHCESZ COŚ DODAĆ/ZMIENIĆ - nie twórz posta pod postem... - madmike 2011-10-11 19:52

Pozostało 580 znaków

2011-10-11 19:52
0

Można wykorzystać Val albo tak jak poniżej:

var
  i:Integer;
//...
  WriteLn('Podaj LICZBE');
  {$I-}
  ReadLn(i);
  {$I+}
  if IOResult=0 then
    WriteLn('Wpisales ',i)
  else
    WriteLn('Miales wpisac liczbe!');
//...

Pozostało 580 znaków

2011-10-11 20:05
0

Wpisuje tak podałeś dopasowując do mojego programu i wyskakuje błąd przy (NOResult<>0)

program Project2;

{$APPTYPE CONSOLE}

var
 i,n,r,int,kod: Integer;
 a:array[0..1000] of Integer;
 s: String;

label
  koniec;

begin
  writeln('Program wyswietla n kolejnych wyrazow ciagu arytmetycznego');
  writeln('***************************************************************');
  write('Podaj ilosc wyrazow n: ');
  {$N-}
  readln(n);
  {$N+}
    if (n<1) or (n>1000) or (NOResult<>0) then begin
      writeln('***************************************************************');
      writeln('Bledne dane');
      goto koniec;
    end;
  val(s,n,kod)
  write('Podaj pierwszy wyraz a[1]: '); readln(a[1]);
    if (a[1]<0) or (a[1]>20) then begin
      writeln('***************************************************************');
      writeln('Bledne dane');
      goto koniec;
    end;
  write('Podaj roznice r: '); readln(r);
    if (r<-10000) or (r>10000) or (r=0) then begin
      writeln('***************************************************************');
      writeln('Bledne dane');
      goto koniec;
    end;
  writeln('***************************************************************');
    i:=1;
    writeln('a[',i,']=',a[i]);
    for i:=2 to n do
      begin
       a[i]:=a[i-1]+r;
       writeln('a[',i,']=',a[i]);
      end;
  writeln('***************************************************************');
    koniec:
    readln;
end.
edytowany 3x, ostatnio: piechos, 2011-10-11 20:14
Czyżbym nieczytelnie napisał kod? - pelsta 2011-10-11 20:10
No ale coś nie działa ;/ Do czego służą te wstawki {$N-} {$N+} - piechos 2011-10-11 20:13
Polecałbym pójść spać... i przeczytać ponownie post pelsta... - Patryk27 2011-10-11 20:14
BTW, goto to zło! - Patryk27 2011-10-11 20:15

Pozostało 580 znaków

2011-10-11 20:22
0

Jak stosujesz kod, który podał pelsta, to już procedura Val nie jest potrzebna

Jeżeli jednak chcesz zastosować procedurę Val, to tutaj masz mały przykład

program Project2;

{$APPTYPE CONSOLE}

var
  n, Blad: Integer;
  Liczba: string;
begin
  repeat
    Write('Podaj ilosc wyrazow n: ');
    Readln(Liczba);
    Val(Liczba, n, Blad);
    if Blad <> 0
     then Writeln('To nie jest poprawna liczba!')
    else if (n <= 0) or (n > 1000)
     then Writeln('To nie jest liczba z zakresu (0, 1000>');
  until (Blad = 0) and (n > 0) and (n <= 1000);
  Writeln('OK');
  Readln;
end.

Pozostało 580 znaków

2011-10-13 22:57
0

Bardzo dawno temu napisałem prosty programik w czystym pascalu do zabezpieczenia programu przed wpisaniem innych znaków niż cyfry. Jest bardzo prosty, ale oferuje kilka zabezpieczeń. Poniżej podaję kod, który możesz wykorzystać w swoim programie pod warunkiem, że dostosujesz zabezpieczenia do swoich wymagań. Oczywiście sporo w tym kodzie można zmienić, bo nie jest on najszybszy, ale zostawiłem go w takiej postaci, bo jest to pamiątka :)

program Square;
uses CRT;

var
  sLen, sX, sY: String;
  iLen, iX, iY: Integer;
  ErrorID: Integer;

procedure DrawSquare(const Len, X, Y: Integer);
var
  Ver, Col: Integer;
begin
  ClrScr;
  GoToXY(X, Y);

  for Ver := 0 to Len - 1 do
    begin
      GoToXY(X, Y + Ver);

      for Col := 1 to Len do
        Write('#');
    end;
end;

procedure Erase;
var
  PosX, PosY: Byte;
begin
  PosX := WhereX;
  PosY := WhereY;

  Dec(PosX);

  GoToXY(PosX, PosY);
  Write(' ');
  GoToXY(PosX, PosY);
end;

procedure GetNumber(var Number: String; const Min, Max: Integer);
var
  Num, ErrorID: Integer;
  Key: Char;
  Correct: Boolean;
begin
  Num := 0;
  ErrorID := 0;
  Key := #0;
  Correct := False;

  repeat
    Key := ReadKey;

    if (Key = '0') or (Key = '1') or (Key = '2') or (Key = '3') or
       (Key = '4') or (Key = '5') or (Key = '6') or (Key = '7') or
       (Key = '8') or (Key = '9') then
      begin
        Number := Number + Key;
        Write(Key);
      end
    else
      begin
        if Key = #8 then
          begin
            if Number <> '' then
              begin
                Delete(Number, Length(Number), 1);
                Erase;
              end;
          end
        else
          if Key = #13 then
            if Number <> '' then
              begin
                Val(Number, Num, ErrorID);

                if ErrorID <> 0 then
                  begin
                    Num     := 0;
                    ErrorID := 0;
                  end
                else
                  if (Num >= Min) and (Num <= Max) then
                    Correct := True;
              end;
      end;
  until (Key = #13) and (Number <> '') and (Correct);

  WriteLn;
end;

begin
  ClrScr;

  sLen := '';
  sX   := '';
  sY   := '';

  iLen := 0;
  iX   := 0;
  iY   := 0;

  Write('Podaj dlugosc boku kwadratu [1-20] : ');
  GetNumber(sLen, 1, 20);
  WriteLn;

  Write('Podaj wspolrzedna X [1-60] : ');
  GetNumber(sX, 1, 60);

  Write('Podaj wspolrzedna Y [1-6]  : ');
  GetNumber(sY, 1, 6);

  Val(sLen, iLen, ErrorID);
  Val(sX,   iX,   ErrorID);
  Val(sY,   iY,   ErrorID);

  DrawSquare(iLen, iX, iY);

  ReadLn;
end.

Fajne, co? :)

edytowany 1x, ostatnio: BoZzDoG, 2011-10-13 22:59
Przede wszystkim zamiast Ver powinien być Row... :P - BoZzDoG 2011-10-13 23:04

Pozostało 580 znaków

2011-10-15 12:52
0

Dziękuje bardzo wszystkim za pomoc ;)

Pozostało 580 znaków

2011-10-15 13:02
0

Cd.kodu BoZzDog to to:

    if (Key = '0') or (Key = '1') or (Key = '2') or (Key = '3') or
       (Key = '4') or (Key = '5') or (Key = '6') or (Key = '7') or
       (Key = '8') or (Key = '9') then

Można skrócić do:

if (Key in ['0'..'9']) Then

Taka informacja na przyszłość ;)


ja zawsze w pascalu robiłem tak: (Ord(Key)>=Ord('0')) and (Ord(Key)<=Ord('9')), ale jakbym znał Twoją wersje to pewnie też bym tak robił. dobrze że w C++ nie ma żadnych Ord-ów i Chr-ów. - krwq 2011-10-15 13:08
ale nie trzeba ordów, «if Key >= '0'» też wystarczy. - Azarien 2011-10-16 17:13

Pozostało 580 znaków

2011-10-15 16:44
0
Patryk27 napisał(a)

Taka informacja na przyszłość

Ja to bardzo dobrze wiem :) Dlatego napisałem:

ja napisał(a)

Oczywiście sporo w tym kodzie można zmienić, bo nie jest on najszybszy, ale zostawiłem go w takiej postaci, bo jest to pamiątka

To było bodajże cztery lata temu, jak jeszcze chodziłem do technikum i nie zajmowałem się tym konkretniej. Mam nadzieję, że ten kod się przyda, pozdrawiam.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0