Mért nem működik megfelelően a program pascalban?
program asd;
uses crt;
var a,b,d,e:integer;
c:char;
begin
clrscr;
writeln('Add emg az első számot');
readln(a);
writeln('Add meg a második számot');
readln(b);
writeln('Összeadni vagy kivonni akarod ' , a, '-t', ' és ' , b, '-t'?');
readln(c);
if c= '+'then writeln(a, ' ‚s ' , b, 'összege: ');
readln(d);
if d=a+b then writeln('helyes válasz');
if d<>a+b then writeln('A válasz helytelen');
if c= '-' then writeln(a, ' ‚s ', b, 'különbsége: ');
readln(e);
if e=a-b then writeln('A válasz helyes');
if e<>a-b then writeln('A válasz helytelen');
end.
Eltekintve SimkoL igazától, te még egy kissé hátrébb tartasz, ezért elsőként szánj egy kis időt az IF megértésére. Ha két lehetőséged van, akkor az első lehetőség bekövetkezése után minek vizsgálni, hogy a másik igaz-e? Itt van például ez a két sorod:
if d=a+b then writeln('helyes válasz');
if d<>a+b then writeln('A válasz helytelen');
Megvizsgálod, hogy egyenlő-e, azután -- akkor is, ha igen -- ellenőrzöd, hogy különbözik-e. Minek, amikor már tudod? Egy ilyen egyszerű esetben ez nem okoz fennakadást, de később rengeteg problémát okozhatnak az átgondolatlanul odaszórt feltételvizsgálatok. Ebben az esetben ennyi elég:
if d=a+b then writeln('helyes válasz') else writeln('A válasz helytelen');
A programod egyébként ettől (és a kiíratás pongyolaságaitól) függetlenül is számtalan sebből vérzik. Azt, hogy nem fordítható, egy fölösleges aposztróf okozza, de ennek a helyesbítése után is tökéletes értelmetlenségbe fullad az egész, megint csak az IF meg nem értésének köszönhetően. Láthatólag nem tudsz mit kezdeni azzal, hogy az IF után a pascal nem annyi utasítást hajt végre, amennyit szeretnél, hanem csak _egyet_. Ennek függvényében próbáld magyarra fordítani, hogy mit kérsz a programtól, és látni fogod, mi a baj.
A megoldás az, hogy ez a bizonyos "egy" utasítás lehet egy BEGIN és END közé fogott utasításcsoportból álló _összetett utasítás_ is, tehát mindazt, amit egy feltételhez rendelve akarsz megvalósítani, BEGIN és END közé kell írnod.
Mindjárt megpróbálom neked így megírni a programodat -- nem lesz olyan elegáns, mint SimkoL-é, de valahogy összehozom csupa IF-ből.
Na jó. Első változat. Szerintem azt tudja, amit te szerettél volna, a következő feltételek mellett:
1. Linuxon futtatod (stimmelnek az ékezetes betűk).
2. Terminálban (látod az eredményt a lefutás után).
3. Jó szándékú a felhasználó (tényleg egész számokat és a lehetséges két egy karakteres műveleti jelet írja be.
(Az alulvonások természetesen nem kellenek, csak a behúzásokat helyettesítik. A tördelés ilyetén módja sem kötelező, csak az áttekinthetőséget szolgálja.)
program asd;
uses crt;
var a,b,d:integer;
c:char;
begin
clrscr;
write('Add meg az első számot: '); readln(a);
write('Add meg a második számot: '); readln(b);
write('Összeadni vagy kivonni akarod ' , a, '-t', ' és ' , b, '-t? '); readln(c);
if c='+' then
__begin
____writeln(a, ' és ' , b, ' összege: '); readln(d);
____if d=a+b then writeln('Helyes válasz.') else writeln('A válasz helytelen.');
__end
else
__begin
____writeln(a, ' és ' , b, ' különbsége: '); readln(d);
____if d=a-b then writeln('Helyes válasz.') else writeln('A válasz helytelen.');
__end;
end.
Második változat, jelentéktelen lépés az értelem és a bolondbiztosabb program felé. Értelmes változóneveket használ betűk helyett, és észreveszi, ha nem jó műveleti jelet kapott, billentyűütésig képernyőn tartja az eredményt. Mivel a helytelen számértékek továbbra is hibára futtatják, valóban használható programhoz mindent STRINGként kéne beolvasnod, átalakítanod, kiértékelned, és aszerint kezelned.
program asd;
uses crt;
var egyik,masik,tipp:integer;
muvelet:char;
begin
clrscr;
write('Add meg az első számot: '); readln(egyik);
write('Add meg a második számot: '); readln(masik);
write('Összeadni vagy kivonni akarod ' , egyik, '-t', ' és ' , masik, '-t? '); readln(muvelet);
if muvelet='+' then
__begin
____writeln(egyik, ' és ' , masik, ' összege: '); readln(tipp);
____if tipp=egyik+masik then writeln('Helyes válasz') else writeln('A válasz helytelen');
__end
else
__if muvelet='-' then
____begin
______writeln(egyik, ' és ' , masik, ' különbsége: '); readln(tipp);
______if tipp=egyik-masik then writeln('Helyes válasz') else writeln('A válasz helytelen');
____end
__else
____writeln('Nem értem!');
readkey;
end.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!