Mi nem jó a free pascalban?
Egy olyan gondom lenne hogy itthon unalomból csináltam egy programot amiben a számolást lehet gyakorolni kiírja hogy hány hiba hány jó és hány százalék. A számolás a négy alapművelettel történik Az elején választani lehet hogy melyiket 0, Összeadás 1, Kivonás 2, Szorzás 2,Osztás 4,Véletlen
A program most kb 170 soros ha az elején beírom a 3-ast akkor nem történik semmi vagy kilép és kiír valamit. A ketesnél még müködik, de a véletlennél is összezavarodik kicsit. És ugy van megcsinálva hogy egymás után többször lefut tehát kilépés nélkül akárhányszor lehet probálni jelenleg 10000-szer. A számolásokat és a véletleneket random végzi, de a program tele van for és if ciklusokkal. A kérdés ez miért van hogy a 3-adikat már nem akarja normálisan lefutattni?
#4.: "nem tudom a free pascalból kimásolni. Rámegyek az editben a copyra de csak a pascalban tudom beilleszteni. Erre valami ötlet?"
Az EDIT menüpontjában ott van, hogy:
Copy to Windows
és
Paste from Windows
Ezekkel tudod a Windows vágólapját elérni. Csak egérrel használható.
@SimkoL:
Egyszer már tényleg el kéne néznem tifelétek, állandóan kiderül valami ottani érdekesség. Megvallom, Füzér létezéséről, meg a vár felújításáról általad értesültem először, persze azt nyilván te is belátod, hogy pár ezer ember helyi iparkodásának sosem lehet akkora hírértéke, mint F. Pákó országos jelentőségű kultúraformáló tevékenységének...
@Kérdező:
Hát, az ifjeiddel kapcsolatos elemzés ma is elmarad, viszont megkíséreltem én is csupa iffel megoldani a feladatot, hogy az eddig tanultakhoz képest túl sok újdonság ne kerüljön belé:
Éppen csak kipróbáltam, viszont nem teszteltem igazán, vagyis csúszhattak bele hibák, de te majd kijavítod őket...
Igyekeztem normálisan tagolni, de azt hiszem, abban megegyezhetünk, hogy a végtelenbe nyúló if-láncolat nem igazán kedvez a kód áttekinthetőségének. Mindenesetre szerintem érdemes összehasonlítanod az eljárásokba szedett változattal (annak bénaságait majd tisztább fejjel javítom), hogy hogyan jelennek meg a műveletek a két programban. Remélem, az derül ki majd a számodra, hogy a procedure-használat alapjainak megértése nem is olyan embert próbáló feladat.
Ha valami nem világos, kérdezz.
Az ifekről:
Az if kétféle formában használatos. A rövidebbik változatban a feltétellel úgy kapcsolsz be egy programrészt, hogy az a többi lefutását (legalábbis közvetlenül) nem befolyásolja:
Ha nyitva van a pék, veszek egy kiló kenyeret, azután hazamegyek.
IF PEK = NYITVA THEN
KENYERVETEL;
HAZAMENES;
Tehát vagy tudok kenyeret venni, vagy sem, de ettől függetlenül a hazatéréssel folytatom.
A másik változatban a további tevékenység is a feltételtől függ. Ilyenkor nemcsak azt közlöd, hogy mi a teendő a feltétel esetén, hanem egy ELSE utasítás után azt is, hogy más esetben mi történjék:
Vasárnap sült csirkét eszünk, egyébként spenótot.
IF VASARNAP THEN
CSIRKE
ELSE
SPENOT;
Ebben az esetben tehát nem az történik, hogy vasárnap a csirke után még spenót is következik, hanem az, hogy vagy ezt esszük, vagy amazt. Az ELSE-ágnak
köszönhetően a spenótevés csak akkor lép életbe, ha történetesen nem vasárnap van. Fontos érdekesség, hogy az
IF feltétel THEN
utasítás1
ELSE
utasítás2;
egyetlen kifejezésnek számít, ezért az ELSE előtti utasítás (vagy BEGIN..ELSE utasításblokk) végére nem kell pontosvessző! Ha ugyanis kiteszed, az azt jelenti a fordító számára, hogy ott az utasítás vége (vagyis a rövidebb változatot használtad), és az önmagában értelmetlen ELSE már a következő utasítás akar lenni -- ezért nem is fogadja el, leáll a fordítás.
Te a saját programodban sehol nem használod az ELSE utasítást, tehát -- leegyszerűsítve -- valahogy így vizsgálsz:
IF V = 0 THEN {összeadás};
IF V = 1 THEN {kivonás};
IF V = 2 THEN {szorzás};
IF V = 3 THEN {osztás};
...
Más szóval: Megnézed, hogy nem összeadás-e, és utána az eredménytől függetlenül, sorban ellenőrzöd, hogy hátha kivonás, szorzás, osztás. Ez látható futási hibára nem vezet, hiszen a felsoroltak közül nyilván csak egyik érvényes -- ha viszont az már megtaláltad, tökéletesen fölösleges a többit végigellenőrizgetned. Ez egy ilyen kis program esetén semmi észrevehető problémával nem jár, de más feladatnál, amikor esetleg millió ilyen vizsgálatot kell elvégeztetned, visszaüthet az efféle trehányság, ezért érdemes az ELSE segítségével kizárni a további vizsgálódást, valahogy így (az itt kapcsos zárójelek közé tett szavakkal jelzett programrészek természetesen lehetnek akármilyen hosszú BEGIN..END utasításblokkok):
IF V = 0 THEN
{összeadás}
ELSE
IF V = 1 THEN
{kivonás}
ELSE
IF V = 2 THEN
{szorzás}
ELSE
IF V = 3 THEN
{osztás}
ELSE
{nemtudommi};
...
Látható, hogy itt a behúzások már kényelmetlenül sok helyet foglalnak el a sorból, ezért inkább zavarják, mint segítik a program áttekinthetőségét. Szerencsére ennek nincs jelentősége a fordítás szempontjából, ezért megteheted, hogy kellemesebb tördelést választasz:
IF V = 0 THEN
{összeadás}
ELSE IF V = 1 THEN
{kivonás}
ELSE IF V = 2 THEN
{szorzás}
ELSE IF V = 3 THEN
{osztás}
ELSE
{akármi};
...
Hasonlóan fölösleges vizsgálatot végzel a műveletek kiértékelésénél is (a színezgetést elhagyom, hogy ne zavarjon):
if c2=o2 then
begin
WriteLn('A válasz helyes!');
p2:=p2+1;
end;
if c2<>o2 then
begin
WriteLn('A válasz rossz!');
h2:=h2+1;
end;
Ha már egyszer kiderült, hogy c2 egyenlő-e o2-vel, mi értelme az firtatni, hogy nem egyenlő-e? Vagy egyenlő, ekkor minden további vizsgálódás szükségtelen, vagy nem az, akkor meg nem szorul ellenőrzésre, hogy a másik lehetőség érvényes.
if c2=o2 then
begin
WriteLn('A válasz helyes!');
p2:=p2+1;
end
else
begin
WriteLn('A válasz rossz!');
h2:=h2+1;
end;
Persze ez megint csak egy kicsi, hibát nem okozó pongyolaság, az a néhány kis fölösleges vizsgálat az emberi észlelés sebességéhez képest jelentéktelen. De érdemes nem megszokni, hátha adódik olyan feladat, amelyben az ilyen apróságok halmozódása már észrevehető következményekkel jár.
Annak bemutatására, hogy a „már jó” állapot nem biztos, hogy az egyetlen megoldás, szigorúan csak az érdekesség kedvéért átépítettem a programot teljesen más szerkezetűre. Az eredetihez képest alaposan meg lett kavarva, úgyhogy szó sincs arról, hogy ezt tőled is elvárnám 3 hónap tanulás után. Annak ellenére, hogy hosszasan sorolom a konstansokat, és átkos szokásom ellenére most igyekeztem rendesen, utasításonként tördelni a sorokat, a forráskód is rövidebb lett, meg csodák csodájára a lefordított program is, pedig nagyjából ugyanazt csinálja, viszont még többet színezget, és megpróbálja kiküszöbölni a bevitel hibalehetőségeit.
Itt van a kísérletem egy darabban, eljárások nélkül:
Itt pedig valamivel értelmesebben szervezve:
Raktam bele egy pár számodra szokatlan megoldást, amelyektől a tudakozódási hajlandóságod üdvös növekedését remélem. Egyébként meg bízom benne, hogy SimkoL előbb-utóbb befejezi a fegyverkezést, ugyanis én pont ugyanannyira nem vagyok programozó, mint te, és kíváncsi volnék arra, ő mit hoz ki az anyagból. Gyanúm, hogy érhetnek meglepetések.
#26:
Tanulságos és főként lényeglátó megjegyzés. A hablatyolásomnak pont annyi köze van a pascalhoz, mint az adott feladat megoldásához. Mmm, frappáns.
Off:
@tabaki: a fegyverkezésből átváltottunk karácsonyi fényekre - idénymunka, de jól fizet - így nem nagyon leszek. A pocakból már lement vagy 10 kiló, az asszony azt mondta maradjak még vagy két hetet :) mert a gép mellett csak összefele szedtem magam. Most lassan szép vagyok (leszek), karcsú !!!, üde és kívánatos.....
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!