[delphi] Wprowadzanie tylko danych numerycznych

0

Piszę program wykonujacy proste obliczenia dot. kola. Problem z ktorym sie borykam to wproadzanie danych tylko numerycznych. Troche juz zrobilem, jednakze dalej utknalem. Chcialbym by nie dalo sie wpisac np. 1-2, innych znakow niz numerki w srodku pola read, by program sie nie wywalal przy wartosciach ,8 lub .8(lub zeby takich sie dalo sie wprowadzic).

program pp1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var a,b,r:string;

Function sprawdz(tekst:string):boolean;
var
   ch:char;
   i:integer;
begin
    sprawdz:=false;
    for i:=1 to Length(tekst) do
    begin
        ch:=tekst[i];
        if ch in ['0'..'9','-','.',','] then
        {if pos('-', tekst)=1 then
        if pos('.', tekst)<>0 then
        if pos(',', tekst)<>0 then    }
          begin
            sprawdz:=true;
          end
        else
          begin
          writeln('Podales nieprawidlowe zmienne. Podaj zmienne calkowite.');
          end;
    end;
end;

label kotwiczka;

begin
  kotwiczka:
  writeln('Podaj wspolrzedna a: ');
	readln(a);
  if (sprawdz(a)=false) then goto kotwiczka;
	writeln('Podaj wspolrzedna b: ');
	readln(b);
  if (sprawdz(b)=false) then goto kotwiczka;
	writeln('Podaj promien r');
	readln(r);
  if (sprawdz(r)=false) then goto kotwiczka;

	if (abs(StrToInt(a))>20) or (abs(StrToInt(b))>20) or (StrToInt(r)<0) or (StrToInt(r)>50) then //or (a mod 1<>0) or (b mod 1<>0) or (r mod 1<>0) then
		begin
      writeln('Wprowadziles bledne dane; a i b moze przyjmowac wartosci z zakresu <-20, 20>,'#10#13' natomiast r z zakresu (0,50)');
      writeln;
    end
    else
		  begin
      writeln;
      writeln('Odleglosc srodka kola od srodka ukladu wspolrzednych wynosi: '#10#13,sqrt(StrToInt(a)*StrToInt(a)+StrToInt(b)*StrToInt(b)):0:2,' jednostek');
      writeln;
      writeln('Pole kola wynosi: '#10#13,StrToInt(r)*StrToInt(r)*Pi:0:2,' jednostek kwadratowych');
      writeln;
		  writeln('Pole trojkata rownoramiennego prostokatnego wpisanego w kolo wynosi: '#10#13,StrToInt(r)*StrToInt(r),' jednostek');
      writeln;
 		  readln;
      end;
    goto kotwiczka;
  { TODO -oUser -cConsole Main : Insert code here }
end.

Jakies sugestie? Dzieki za pomoc.

0

np. tak

var
  i: Integer;
  ok: Boolean;
begin
  ok := False;
  write('Podaj liczbe: ');
  while not ok do
    try
      Readln(i);
      ok := True;
    except
      Write('Zla wartosc! Jeszcze raz: ');
    end;
  Writeln('wynik: ', i);
  Readln;
end.
0

Okej, tylko ze twoja wersja wywala się przy wprowadzeniu liter.
Na razie mam coś takiego:

program pp1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const alfabet : set of char=['0','1','2','3','4','5','6','7','8','9','-'];

var a,b,r:string;


Function sprawdz(tekst:string):boolean;
  var
    ch:char;
    i:integer;
    begin
        sprawdz:=false;
        for i:=0 to Length(tekst) do
        begin
            ch:=tekst[i];
            if ((ch='-') and (i=0)) then
            begin
               sprawdz:=true;
            end
            else
            begin
                sprawdz:=false;
             end;
            if ch in alfabet then
              begin
                sprawdz:=true;
             end
            else
              begin
             sprawdz:=false;
             end;
          end;
      end;

label kotwiczka;

begin
  kotwiczka:
  writeln('Podaj wspolrzedna a: ');
	readln(a);
  if (sprawdz(a)=false) then goto kotwiczka;
	writeln('Podaj wspolrzedna b: ');
	readln(b);
  if (sprawdz(b)=false) then goto kotwiczka;
	writeln('Podaj promien r');
	readln(r);
  if (sprawdz(r)=false) then goto kotwiczka;

	if (abs(StrToInt(a))>20) or (abs(StrToInt(b))>20) or (StrToInt(r)<0) or 

(StrToInt(r)>50) then
		begin
      writeln('Wprowadziles bledne dane; a i b moze przyjmowac wartosci z zakresu <-20, 

20>,'#10#13' natomiast r z zakresu (0,50)');
      writeln;
    end
    else
		  begin
      writeln;
      writeln('Odleglosc srodka kola od srodka ukladu wspolrzednych wynosi: 

'#10#13,sqrt(StrToInt(a)*StrToInt(a)+StrToInt(b)*StrToInt(b)):0:2,' jednostek');
      writeln;
      writeln('Pole kola wynosi: '#10#13,StrToInt(r)*StrToInt(r)*Pi:0:2,' jednostek 

kwadratowych');
      writeln;
		  writeln('Pole trojkata rownoramiennego prostokatnego wpisanego w kolo 

wynosi: '#10#13,StrToInt(r)*StrToInt(r),' jednostek');
      writeln;
 		  readln;
      end;
    goto kotwiczka;

To z kolei wywala się przy wpisaniu --, 1-2, etc.
end.

0
wieczorek1990 napisał(a)

Okej, tylko ze twoja wersja wywala się przy wprowadzeniu liter.
Sprawdzałeś, czy tak sobie napisałeś?

0

odpalilem w delphi 7 personal, wiec moze ten staroc ma z tym problem :)

0

No popatrz a no moim D7 działa ok

Podaj liczbe: uihj
Zla wartosc! Jeszcze raz: retdr
Zla wartosc! Jeszcze raz: hfgh
Zla wartosc! Jeszcze raz: 12-38
Zla wartosc! Jeszcze raz: 12.33
Zla wartosc! Jeszcze raz: 12
wynik: 12
0

Jak odpaliłem z exe, a nie przez Delphi7 to działa cud-miód. Wielki dziękie!

0

Unit SysUtils, funkcja TextToFloat. Konwertuje wartość string na float i jednocześnie zwraca True lub False w zależności czy konwersja się powiedzie.

function IsNumber(Value: String): Boolean;
var
  s: Extended;
begin
  Result := TextToFloat(PChar(Value), s, fvExtended);
end;
0

Misiekd ma racje nie wywalalo Ci bledu w Delphi tylko ostrzezenie, ale po wcisnieciu uruchom program byl wykonywany dalej nie ma sily zeby try except nie dzialalo.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.