Pascal másodfokú függvény program?
Na jó. Lehet, hogy csak megkavarlak a csirke-szintű értelmezésemmel, de megpróbálok legalább annyit megmagyarázni, amennyi a feladathoz kell. Az egésznek a kulcsa a változók közt felsorolt
f : text;
Ezt a némiképpen megtévesztő nevű text típust próbáld meg egy eszközként elképzelni, mint a billentyűzetet, vagy a képernyőt. De ez az eszköz nem a gombnyomásokból, hanem egy megadott fájlból olvassa az adatokat, illetve, ha úgy állítod be, akkor egy fájlba ír, nem pedig a monitorra. A dolog a fenti sorral kezdődik, vagyis közlöd a fordítóval, hogy szükséged van ilyen eszközre, rakjon be egyet (vagy amennyit használni akarsz) a programodba. Az „f” elnevezés helyett állhat akármi, ez mindössze egy egyszerű és hagyományos név, de ha ez a megértést segíti, nyugodtan nevezheted másképp is. Mivel itt úgyis csak beolvasásra használod, írhatod ezt is:
fajlbol : text;
A következő lépés, hogy a kívánt fájlt hozzárendeld a létrehozott eszközhöz, erre szolgál az Assign utasítás:
Assign(fajlbol, 'adatok.txt');
Ezzel beállítod, hogy a „fajlbol” eszköz most éppen az adatok.txt nevű fájllal foglalkozzon (merthogy a program során ugyanezzel más fájlokat is kezelhetsz). Ha a fájlnevet elérési út nélkül használod, akkor a fájlnak a programmal azonos mappában kell lennie. Ezután a Reset utasítással meghatározod, hogy az eszközt most beolvasásra akarod használni:
Reset(fajlbol);
Az egyéb fájlműveletekkel nem foglalkozom, majd utánanézel. Innentől nagyon egyszerű: Mivel a fájl minden számot külön sorba írva tartalmaz, az adatokat ugyanolyan ReadLn utasításokkal olvashatod be, mint amit a billentyűzeten megszoktál, csak éppen a zárójelben jelezned kell, hogy most „fajlbol” eszközt használja a program az alapértelmezett helyett:
ReadLn(fajlbol, a);
ReadLn(fajlbol, b);
ReadLn(fajlbol, c);
Amikor elkészültél, az eszközt mindig le kell zárni, vagyis megszüntetni a kapcsolatot a fájllal. Ez biztosítja, hogy a program ne hagyjon maga után fölöslegesen lekötött memóriát, a nyitott fájl se sérülhessen valami meggondolatlan kikapcsolás miatt, illetve, hogy az eszköz más célra is használható legyen a programban:
Close(fajlbol);
Szerintem ez nem túl bonyolult, más kérdés, hogy tényleg csak a feladatra szorítkozó minimum, a fájlkezelés egésze jóval összetettebb megoldásokat kínál.
A text típus használata csak egyike a sokféle lehetőségnek, és ha belegondolsz, számok esetén nem is éppen magától értetődő, hiszen egy szöveg számként nem értelmezhető karaktereket is tartalmazhat. Amikor a program ilyet talál, ugyanúgy hibára fut, mint amikor billentyűzetről várt szám helyett kap valami mást. Hogyha azonban csak számokat kap, akkor szerencsére megérti az egyszerű, hagyományosan begépelt és szövegszerkesztőből mentett adatokat is. Itt ennyi is elegendő.
A fájlok használata során sokféle hibalehetőség adódik, például nincs is meg a fájl, sérült, vagy nincs jogod megnyitni, helytelen, vagy a kívánttól eltérő formátumú adatok lehetnek benne. Ezért a fentebb bemutatott szimpla forma egyáltalán nem szokásos, ezeket a műveleteket mindig hibakezeléssel alkalmazzák, legalább olyan szinten, hogy a program észlelje és kiírja, hogy a fájllal valami gond van, ahelyett, hogy minden eleganciát nélkülözve elszállna a fenébe. Ennek a módjára szintén keress rá, de itt és most így is működni fog.
Még annyit: A leírt módszer unit bevonása nélkül, az alaprendszerben is használható, de kissé divatjamúlt. A naprakészebb fájl-és hibakezelési utasításokat a sysutils unitban találod.
Pascalban a file-ok kezeléséhez (számodra) mindössze három utasítás ismerete elég.
Ezek az assign (vagy assignfile), amivel a file nevét hozzárendeled egy változóhoz, hogy írhass bele vagy olvashass belőle.
A másik a reset (file megnyitása), a harmadik meg a close (vagy fileclose (file lezárása)).
Ezek mindegyike elérhető a neten, magyar nyelven is legalább három példányban.
jav: fileclose = closefile.
--
Amit tabaki ír, annak egy része hülyeség.
program Beolvas;
var
i : integer;
T : array[0..2] of integer;
MyFile : text;
begin
assignfile(MyFile,'bemenet.txt');
reset(MyFile);
for i := 0 to 0 do
begin
readln(MyFile,T[1],T[2],T[3]);
writeln(T[1],' ',T[2],' ',T[3]);
end;
closefile(MyFile);
readln();
end.
---
Bemenet.txt tartalma:
23
45
67
@#15:
Kockázatos dolog a jóslás, de ez legalább három ok miatt nem fog működni.
tabaki: Nem kivánlak megbántani, de kettőnk közül azt hiszem én vagyok az, aki tudja is, hogy mit ír, és miért úgy, ahogy.
Én itt soha nem tettem közzé olyan kódot, amit más, egy az egyben, annak megértése és korrekciója nélkül felhasználhatott volna. Okkal.
Ha kritikai énedet kivánod csiszolgatni, akkor javaslom a saját bejegyzéseid módszeresebb kontrollját, még a begépelés előtt. Ez a saját ismeretanyagodat is bővítené.
Hm, igazad lehet, kár volt elhamarkodnom, alighanem érdemes lett volna előre tisztáznunk, hogy ki melyik pascal-változatról beszél. {$mode objfpc} direktívával Free Pascalban is lefordul a te változatod is, sőt, a warningok ellenére helyesen működik.
A nagyobb hozzáértésedet nem vonom kétségbe, hiszen végül is semmi közöm a programozáshoz. Mindazonáltal egyrészt remélem, hogy az én bevallottan gyermeteg gyakorlati megközelítésem többet segített az elindulásban, mint a semmitmondó lesajnálás, másrészt rossz kódot Kérdező is tud írni, ebben a legszebb pedagógiai elvek nevében sem érdemes támogatni. És ezek az olyan, a témához végképp nem kapcsolódó értelmetlenségek becsempészését végképp nem mentik a szememben, mint a rafinált túlindexelés, vagy a fölöslegesen berakott ál-ciklus. Bizonyára a beolvasáson belül is találhattál volna valami tanulságos megoldani valót; annak, hogy kalapból előrántott marhaságokkal belerondíts a bemutatódba, semmi értelmét nem látom.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, 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!