GRY-Online.pl --> Archiwum Forum

Pascal

03.12.2009
18:57
[1]

Dym14 [ C L I N I C ]

Pascal

Witam. Może mi jakiś mistrz poradzić dlaczego program wywala exitcode=201 ale tylko gdy wpisze liczbę przekraczającą zakres integer do 10 znaków czyli np. 3333333 a jak wpisze powyżej 10 znaków np. 333333333333333333333333333333333333333 to jest ok i jest komunikat o przekroczonym zakresie?
Z góry dzięki.

Var
liczba:String;
l1,l:Integer;


repeat
writeln('');
writeln('Wpisz pierwsza liczbe');
‹$I-›
readln(liczba);
Val(liczba,l1,l);
‹$I+›
if l=0 then
else if l=10 then writeln('Przekroczyles zakres Integer')
else writeln('Wpisales niedozwolone znaki');
until l=0;

03.12.2009
19:02
[2]

Loczek [ El Loco Boracho ]

co robi funkcja Val? (nie znam pascala)

Najpierw musisz zrobić warunek sprawdzający czy wczytany string moze zostać przekształcony na Integer, a potem funkcje przekształcającą. Nie może być na odwrót bo wywali błąd.

03.12.2009
19:09
[3]

MagMany [ Wielki Wilk ]

Spróbuj może zmienić pascala na którym to piszesz na TMT bądź Turbo albo Dev.

03.12.2009
19:09
[4]

Dym14 [ C L I N I C ]

No właśnie nie bardzo.
Funkcja val przekształca tekst na liczbę.
Składnia val(string,liczba,zmienna_operacji);

jeżeli string będzie 33 to liczba będzie 33 a zmienna_operacji będzie 0

jeżeli string będzie 33kdsd to liczba będzie 0 a zmienna operacji będzie miała inną wartość (0 jest dla operacji bezbłędnej) i wtedy wyświetli Wpisales niedozwolone znaki.

jeżeli string będzie 3333333333333333333333333333 to liczba będzie 0 a zmienna operacji 10 i wyświetli Przekroczyles zakres Integer

jeżeli string będzie 33333333 (powyżej 32767 i poniżej 10 znaków) to program się wywala z błędem.

03.12.2009
19:12
[5]

MagMany [ Wielki Wilk ]

Wydaje mi się że jest to błąd programu.

03.12.2009
19:16
[6]

Dym14 [ C L I N I C ]

MagMany-zaraz sprawdzę bo pisze we free pascalu a turbo mam na laptopie bo na 64bit nie działa.

Wkleje tu na razie cały kod z tym że ma troche niepotrzebnych zmiennych i sprawdzenie wyniku działa tylko dla dodawania.


Program Kalkulator;
Uses
crt;
Var
intmin,intmax:Integer; ‹Zakresy integer›
z,i:Byte; ‹Z - zm.pom.do zakresow, I - zm.do kontynuacji›
dzialanie,c,j:Char; ‹C - zm.do repeat-case | J - zm.do kontynuacji›
l1,l2,l,wynik:Integer; ‹Liczby›
wynikr:Real;
liczba:String;

function dodaj(a:Longint;b:Longint):Integer;
begin
dodaj:=a+b;
end;



function odejmij(a:Longint;b:Longint):Integer;
begin
odejmij:=a-b;
end;




function mnoz(a:Longint;b:Longint):Integer;
begin
mnoz:=a*b;
end;




function dziel(a:Longint;b:Longint):real;
begin
dziel:=a/b;
end;




Begin
intmin:=-32768;
intmax:=32767;
z:=0; ‹Ustawianie zmiennych›
c:='n';
j:='t';
liczba:='';
l1:=0;
clrscr;

repeat
repeat
writeln('');
writeln('Wpisz pierwsza liczbe');
‹$I-›
readln(liczba);
Val(liczba,l1,l);
‹$I+›
if l=0 then
else if l=10 then writeln('Przekroczyles zakres Integer')
else writeln('Wpisales niedozwolone znaki');
until l=0;

repeat
writeln('');
writeln('Wpisz druga liczbe');
readln(liczba);
Val(liczba,l2,l);
if l=0 then
else if l=10 then writeln('Przekroczyles zakres Integer')
else writeln('Wpisales niedozwolone znaki');
until l=0;


writeln('Wybierz dzialanie: Dodawanie = +');
writeln(' Odejmowanie = -');
writeln(' Mnozenie = *');
writeln(' Dzielenie = /');

repeat
dzialanie:=readkey;
case dzialanie of


'+':begin
c:='t';
‹intmin:=intmin-l1;
intmax:=intmax-l1;
if l2<intmin then writeln('Wynik ',l1,dzialanie,l2,' przekroczy zakres Integer.')
else if l2>intmax then writeln('Wynik ',l1,dzialanie,l2,' przekroczy zakres Integer.')
else Begin›
wynik:=dodaj(l1,l2);
writeln('Suma wynosi ',wynik);
writeln('');
end;




'-':begin
c:='t';
wynik:=odejmij(l1,l2);
writeln('Roznica wynosi ',wynik);
writeln('');
end;




'*':begin
c:='t';
wynik:=mnoz(l1,l2);
writeln('Iloczyn wynosi ',wynik);
writeln('');
end;




'/':begin
c:='t';
if l2=0 then writeln('Cholero nie dziel przez zero')
else begin
wynikr:=dziel(l1,l2);
writeln('Iloraz wynosi ',wynikr:1:2);
writeln('');
end;
end;

else writeln('Niepoprawny znak dzialania. Wybierz ponownie');
end;
until c='t';


i:=0;
repeat
writeln('Czy chcesz kontynuowac? T(ak)/N(ie)');
j:=readkey;
case j of
't':i:=1;
'n':i:=1;
else begin
writeln('');
writeln('Nie umiesz czytac?. Wpisz T albo N');
end;
end;
until i=1;


until j='n';

readln
End.

03.12.2009
19:31
[7]

Dym14 [ C L I N I C ]

W turbo pascalu ani jako skompilowane exe też nie działa...

03.12.2009
20:21
[8]

Dym14 [ C L I N I C ]

UP...

03.12.2009
22:22
[9]

MagMany [ Wielki Wilk ]

W TMT pascalu nawet się nie komplikuje. intmin,intmax:Integer; ‹Zakresy integer› Pokazuje że w tym jest błąd w zapisie.

03.12.2009
22:26
[10]

Dym14 [ C L I N I C ]

Bo się przy kopiowaniu komentarze (nawiasy klamrowe) zastąpiły <> ...

03.12.2009
23:03
[11]

Kijano [ Generaďż˝ ]

A kolega słyszał cos o longint,real itp. ?

A i źle prawisz jeśli chodzi o Val
Tutaj masz ładnie wytłumaczone

06.12.2009
14:27
[12]

Dym14 [ C L I N I C ]

Kijano->Jeżeli chodzi o val to możliwe że źle prawie bo jestem samoukiem i to co napisałem to sprawdzałem w napisanym programie tzn. np. u mnie nie działało to że jeżeli wpisze 1945BERLIN to liczba będzie 1945.

A kolega słyszał cos o longint,real itp. ?

A no słyszał, tylko że moje zadanie polega na tym, żeby napisać kalkulator wykonujący 4 podstawowe działania a następnie zabezpieczyć go przed:
-dzieleniem przez zero
-wpisaniem liczb i innych znaków jako liczby
-przekroczeniem zakresu zarówno danych wejściowych jak i wyniku

Przy czym:zarówno zmienne jak i wynik mają być typu integer (przy dzieleniu wiadomo-real).
Co do zmiennych to rozważałem co najmniej trzy sposoby:
1) Wczytywanie znak po znaku i sprawdzanie czy pierwszy wczytany jest x>=-3 and x<=3, i o ile nie został spełniony warunek to drugi x>=-2 and x<=2 itd aż do zakresu Integer czyli od -32768 do 32767. Niestety nie mam pomysłu jak sprawdzić te warunki przy typie char skoro wtedy nie widzi tego jako liczby. Zastosowanie np. Integer też jest kłopotliwe bo wtedy mogę sobie porównywać ale po wpisaniu literki program wywala exitcode=201. Można to załatwić ‹$I-› ‹$I+› i ioresult ale to jest zbyt dużo pierdzielenia się i zbyt dużo kodu. Zresztą radząc się po forach dostałem wskazówki że można to załatwić inaczej i prosto.
2)Funkją val której nie znam za dobrze i stąd ten wątek bo val ma parametry (string,liczba,kod) i w sumie powinno działać na moje oko lecz się wysypuje program. Zresztą nie wiem jakim cudem działa jeżeli wpiszemy 33333333333 a nie działa jak wpiszemy 333333.
3)Wczytać do większych zmiennych i sprawdzić czy mieści się w zakresie integer. Napisałem taki program wkleiłem na forum z pytaniem czy może być i zostałem pojechany że to tylko ucieczka od problemu skoro wczytuje do longint a nie integer.

Co do wyniku to wymyśliłem że np jeżeli ktoś wybierze mnożenie to zanim pomnoży np 10000*4 (zmienne mieszczą się w integer a wynik nie) to bierzemy maksymalny zakres integera i dzielimy go przez 1 liczbę czyli 32767/10000=3,27 ale zawsze zaokrąglamy w dół więc 3. I teraz sprawdzamy czy 2 liczba jest większa od 3 jeżeli tak to nie mnożymy tylko wyświetlamy zbyt duże liczby-działanie przekracza zakres wyniku.

Jeżeli masz jakiś pomysł albo zechciałbyś mi pomóc to byłbym wdzięczny. Pozdrawiam.

© 2000-2026 GRY-OnLine S.A.