Przekraczanie skali typu okrojonego

0

Witam Was serdecznie!

Mimo, że jestem początkujący, to staram się najpierw szukać, później pytać. Przeszukałem chyba wszystkie strony po polsku i po angielsku (pomoc Delphi/ Pascala też) i teraz zwracam się z problemem do Was.
Otóż napisałem sobie programik konsolowy w Delphi i mam problem z dobrym ustawieniem zakresu zmiennej. Chciałem sobie ustawić, żeby była to liczba całkowita zwierająca się w przedziale <-99,99> i przy małym wykroczeniu poza zakres wszystko ładnie działa, ale jeżeli np. przy wczytywaniu zmiennej "a" podam 1000 (co wychodzi już poza skalę), to nie dość, że program to zaakceptuje, to przerobi jeszcze ten 1000 na -24...
Może ktoś wie dlaczego i mi pomoże :)

program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils,
  Math;

type
  zmienna = -99..99;


function wczyt(x:zmienna; z:string):zmienna;
begin
  try
    repeat
      begin
        write('Podaj zmienna ',z,': ');
          readln(x);
        end;
      until (x > -100) AND (x < 100);
       wczyt := x;
    except
      on EInOutError do x:=wczyt(x,z);
    end;
  end;

var
  a, b : zmienna;
begin
  try
    a := wczyt(a,'a');
    b := wczyt(b,'b');

    writeln; writeln;
    write('a * b = ',a,' * ',b,' = ',a*b);
    readln;
  except
    on E: Exception do Writeln(E.ClassName, ': ', E.Message);
  end;
end.

dodanie znacznika <code class="delphi"> - fp

2

function wczyt(x:integer; z:string):integer;

spróbuj tak.

0

O! Dzięki wielkie! Działa :)
Ale teraz nasunęło mi się jeszcze coś:
program akceptuje wartości xa,xb,xc,xd,xe,xf. Wiem, że to ma jakiś związek z systemem szesnastkowym, ale jako tako to nie są cyfry, więc "EInOutError" powinno jakoś reagować. Dlaczego tak jest??

2
var
  x_str : ANSIString;
begin
  ... 
  readln(x_str);
  if not tryStrToInt( x_str, x ) then Continue;
  ...
end;

{jesli nei zadziała to: }

var
  x_str : ANSIString;
begin
  ... 
  readln(x_str);
 { if UpperCase( x_str[1] ) =  'x' then Continue; }
 if UpperCase( x_str[1] ) =  'X' then Continue;
  ...
end;
0

Dopowiem tylko, że wywołanie funkcji UpperCase w tym wypadku:

if UpperCase( x_str[1] ) =  'x' then Continue;

nie jest konieczne - nieco szkoda czasu; Można zamiast tego wykorzystać funkcję Ord lub zwykłe rzutowanie na Byte i porównać taką wartość z kodem ASCII znaku x:

if Ord(x_str[1]) = 120 then Continue; //lub "if Byte(x_str[1]) = 120"

A jak już koniecznie musi się skorzystać z tego typu funkcji, to niech przynajmniej typ parametru będzie odpowiedni; Czyli proponowałbym użycie UpCase, która przyjmuje w argumencie pojedynczy znak zamiast UpperCase, który oczekuje łańcucha znaków.

0

Teraz to dostrzegłem. Tymbardziej, że za cholerę UpperCase(JakaKolwiekLitera) nie będzie nigdy = MalaLitera. Nazwa funkcji nie wzieła się od czapy.

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