Hogyan és miből lehet a legkönnyebben megtanulni a pascal nyelvet?
Néhány hete kezdtem el tanulni önszorgalomból benne programozni,mert érdekes saját dolgokat alkotni (FreePas). Próbálkoztam 1-2 könyvből példákat megoldani, próbálkoztam PDF fájlból és más netes forrásokból is, de ahogy bonyolódnak a feladatok, egyre jobban nem értem őket. Képtelen vagyok megjegyezni,bizonyos hasznos függvényeket és utasításokat, amelyeket a pascal használ és nem tudom hogy mikor melyiket kellene egy adott feladathoz, vagy éppen saját programhoz, "program készítésnél, egy un. kihíváshoz" használni, vagy éppen elővenni. A könyv sem segít a megértéshez és az internet sem úgy érzem. Próbáltam bizonyos dolgokat felírni füzetbe és bemagolni, de állandóan azt veszem észre hogy folyton utána kell néznem az adott feladathoz bizonyos dolgoknak. Néztem a pascalos témába illő hozzászólásokat és láttam, hogy vannak itt nagyon jó programozók benne. Ti hogyan és miből tudtatok ilyen jól megtanulni programozni? Én vagyok hozzá agyilag gyenge, rossz a felfogásom, vagy valóban nehéz ez a nyelv és más módszert kellene alkalmaznom a tanulásához?
Van egy elképzelésem,de ha rossz cáfoljatok meg, hogy sokan, vagy esetleg ti is meglévő példákat és megoldásokat irtok át, vagy abból építkeztek fel, vagy teljesen fejből "vágjátok", oldjátok meg a különböző jellegű feladatokat?
Egyszóval hogyan van ez az egész?
Várom a sok ötletet.
Köszi!
Javítva:
program ciklusos_pelda;
uses crt;
var ke:integer;
var ve:integer;
var szam:longint;
begin
clrscr;
Write('Elso ertek: ');
readln(ke);
Write('Masodik ertek: ');
readln(ve);
for szam:=ke to ve do begin
Write (szam,' ');
delay(500);
end;
readln;
end.
Felesleges elolvasni pár ezer oldalt a Pascal rejtelmeiről, mivel elég a szintaxisát, utasításkészletét, kulcsszavait ismerni, a szükséges függvényekre meg időközben rábukkansz dokumentációkból, StackOverflow-ról. Ha nagyon elakadsz egy probléma megoldásában, valószínűleg SO-n már rég megkérdezte valaki és elérhető a válasz.
A nehezebbik rész inkább az, hogy megtanulj különböző matematikai, logikai tételeket, sok-sok összefüggést és módszert, amelyekkel egy problémának a megoldási idejét jelentősen redukálhatod és a futásidő tekintetében is hatékonyabb a kód.
Az általad írt példához szükség van egy szálkezelő unitra, olvasd el ezt a bejegyzést: [link]
Nos mielőtt belehülyültem volna a szálkezelésbe, anélkül is megoldottam a feladatot és így nekem már jó is. Itt a teljes forráskód, miként lehet kilépni a for ciklusból, ami mégsem lehetetlen és felülmúlja a continue és break módszereket is. Annak biztos hasznos, aki vagy belebonyolódott a szálkezelésbe, vagy más utasításokkal kísérletezgetett, vagy nem a for ciklussal oldotta meg a feladatot. Egy billentyűlenyomással és az "m" billentyű lenyomásával máris kilép:
//Örülök hogy sikerült, ezért van még kedvem kínozni magam a pascal rejtelmeivel :))
program ciklusos_pelda;
uses crt;
var ke:integer;
var ve:integer;
var szam:longint;
var ch:char;
begin
repeat
clrscr;
textcolor(15);
Write('Elso ertek: ');
readln(ke);
Write('Masodik ertek: ');
readln(ve);
for szam:=ke to ve do begin
{if szam>500 then break;}
if keypressed then begin ch:=readkey;
if readkey='m' then begin
textcolor(12);
writeln;
write('Kilepes most!');
readln;
halt;
textcolor(15);
readln;
end;
textcolor(15);
end;
textcolor(2);
Write (szam,' ');
delay(500);
end;
readln;
until keypressed;
end.
Kicsit még szórakoztam vele: :))
program ciklusos_pelda;
uses crt;
var ke,ve:string;
var a,b:longint;
var szam:longint;
var ch:char;
var s:string;
var code:word;
label a1;
begin
a1:
repeat
clrscr;
textcolor(15);
Write('Elso ertek: ');
readln(ke);
if (ke>=#67) and (ke<>'v') then begin
clrscr;
textcolor(11);
Writeln('Ez a betu nem tamogatott!');
readln;
textcolor(15);
clrscr;
end;
if ke='v' then begin
textcolor(12);
writeln;
write('Kilepes most!');
readln;
halt;
textcolor(15);
end;
val(ke,a,code);
Write('Masodik ertek: ');
readln(ve);
if (ve>=#67) and (ve<>'v') then begin
clrscr;
textcolor(11);
Writeln('Ez a betu nem tamogatott!');
readln;
textcolor(15);
clrscr;
end;
if ve='v' then begin
textcolor(12);
writeln;
write('Kilepes most!');
readln;
halt;
textcolor(15);
{readln;}
end;
val(ve,b,code);
for szam:=a to b do begin
{if szam>500 then break;}
if keypressed then begin ch:=readkey;
if readkey='v' then begin
textcolor(12);
writeln;
write('Kilepes most!');
readln;
halt;
textcolor(15);
{readln;}
end;
textcolor(15);
end;
textcolor(2);
if b=0 then begin
clrscr;
textcolor(6);
write('Nincs ertek megadva!');
readln;
textcolor(15);
goto a1;
end;
Write (szam,' ');
delay(500);
end;
readln;
until keypressed;
end.
A "var" szót elég egyszer leírni, utána a változókat adhatod meg, nem kell minden sor elejére.
Itt találsz példákat:
Nekünk anno ez volt:
Mit mondjak, kissé már régi...
Könyvként pedig Angster Erzsébet - Kertész László könyvét használtuk.
Nem tudom, hol lehet még őket beszerezni, antikváriumban valószínűleg...
Neten is sokminden fent van:
Fentebbi linkhez mégegy:
Ha Google-be beírod, hogy "Pascal programozás", vagy "pascal programozás jegyzet", sokmindent találhatsz.
A [link] egy linkgyűjtemény, itt is találhatsz hasznos dolgokat.
Angolul pedig még többet (ha angolul is értesz).
Kicsit belejavítottam a programodba:
program ciklusos_pelda;
uses Crt;
var instr: string;
a, b, szam, code: integer;
ch: char;
begin
repeat
{Egyszerre állítjuk be a háttér és a betűszínt. Értékét hexademicális
számként célszerű megadni
TextAttr := $0F --> TextBackground(0); TextColor(15)}
TextAttr := $0F;
ClrScr;
code := -1;
{Amig a Val eljárásban értéket kapott code változó nem 0 addig ismételjük}
while code <> 0 do
begin
Write('Kérem az első értéket: ');
ReadLn(instr);
Val(instr, a, code);
{Ha az input stringünk első karaktere benne van a halmazban, mely jelen esetben
'v' és 'V' tartalmú, feltételezzük, hogy ki akar lépni a felhasználó}
if instr[1] in ['v', 'V'] then
begin
TextAttr := $0C;
WriteLn('Kilépés most!');
ReadLn;
{Beállítjuk a kilépési kódot, azt egy batch file-ból az errorlevel változó
lekérdezésével érjük el}
Halt(1);
end;
end;
code := -1;
while code <> 0 do
begin
Write('Kérem a második értéket: ');
ReadLn(instr);
Val(instr, b, code);
if instr[1] in ['v', 'V'] then
begin
TextAttr := $0C;
WriteLn('Kilépés most!');
ReadLn;
Halt(2);
end;
{Ha a Val eljárás sikeres volt, de b kisebb mint a, a code változót
nullától eltérőre állítjuk, hogy a ciklusunk újra lefusson és kiíratjuk
az erre vonatkozó hibaüzenetet}
if (code = 0) and (b < a) then
begin
code := -1;
Write('A második érték nem lehet kisebb az elsőnél !');
ReadLn;
end;
end;
for szam := a to b do
begin
if KeyPressed then
begin
ch := ReadKey;
if ch in ['v', 'V'] then
begin
TextAttr := $0C;
WriteLn('Kilépés most!');
ReadLn;
Halt(3);
end;
end;
Write(szam, ' ');
Delay(500);
end;
ReadLn;
until False; //Végtelen ciklus
end.
Valamint még ajánlom figyelmedbe ezt a pici oldalamat: [link]
Szia.
Nem bántani akarlak, hanem segiteni, tehát igy értelmezd amit irok :
Lépésenként kell haladni, és gyakorolni, gyakorolni, illetve az adott szintnek megfelelő példákat megpróbálni megoldani - értelemszerűen ezekből minél többet. (Mindennek megvan a maga folyamata csdak is lépésenként tudsz előrehaladni, mint a házépítésnél addig nem lehet a cserepeket felrakni a házra, amíg nincs kész az alap, a fal, a tető, nincs belécezve, stb,stb).
Most Te is olyasmiket akarsz megoldani, amihez még nem nagyon értél el tanulásilag (nem tudom, hogyan tanulsz, de gondolom, 1-11 lecke, nem nagyon tartalmazza a ciklusból való váratlan és szabályos kilépést - mint ahogy a szálkezelést sem tartalmazza, de ehhez a feladathoz még nem kell szálkezelés).
Az, hogy nem jut eszedbe bizonyos utasitás, azzal semmi gond sincs, ez is - mint minden más szakmában -, gyakorlat/gyakorlás kérdése. Mindenkinek meg kell tanulni a saját szakmáját. Ha Neked is meg lesz a kellő gyakorlatod akkor ezzel nem lesz semmi baj sem (persze mindig lesznek olyan dolgok - mint ahogy nekem is vannak még mindig olyan dolgok - amiket elsőre nem tudok/tudsz megoldani, erre van a google ahol találhatsz a problémádra megfelelő megoldást (feltéve, ha meg tudod frappánsan fogalmazni a problémát) - illetve ezért is vannak az ilyen jelegű fórumok is ahol tudsz kérdezni és kaphatsz a kérdésedre választ (azt, hogy milyen válaszokat kapsz azt most ne feszegessük)).
Más dolog, a programodhoz kapcsolódóan egy pár gondolat :
Pl. itt van ez az utasitás :
if (ke>=#67) and (ke<>'v') then begin
Ez eleve nem megfelelő, hiszen egy stringet vizsgálsz (ami több karakterből is állhat, de csak egy karakterrel hasonlitod össze). Miért éppen 67-nál nagyobb karakter az összehasonlitási alap ami a "C" betű ? A "v"-vel való nem egyenlőség az tiszta, de mi a helyzet a pl a "Vv"-vel, illeve a többi karakterrel amit nem vizsgálsz (33-as karaktertől a 66-os karakterig terjedő karakterekkel (!@#$%^&*()_+, stb,stb) amiknek csak egy része a szám ?
Ha igy akarod megoldani a feladatot akkor eleve meg kell irni azt a rutint ami karakteres beolvasást tesz lehetővé és nem stringből hasonlitod a dolgokat.
Illetve, ha tudod, hogy ki fogsz (lehetőség van kilépni a ciklusból) akkor azt nem for ciklussal oldjuk meg, hanem vagy while vagy repeat ciklussal. (Gondolom még ezek a ciklusok nem nagyon jöttek szóba), mivel a for ciklusból nem nagyon lehet szabályosan kilépni, csak a HALT utasítással, de az még egy nagyobb program esetében átláthatatlanná teszi/teheti a kódot, igy csak a végszükség esetén használjuk (mig az általam említett két ciklusból van szabályos kilépési mód - vagy feltétel vagy ciklusváltozó végértékre való beállitásával).
A másik dolog az előbb emlitettem a halt utasitást, hogy nem nagyon használjuk, mert átláthatatlanná teszi a kódod.
Ezeket a feltételeket inkább a másik oldaláról kellene megközelíteni, tehát nem úgy hogy kilépjen a program hanem úgy hogy ha teljesül a feltétel akkor menjen tovább a program (illetve minden If-nek lehet else ága is, tehát ha tájékoztatni akarod a felhasználót a történésekről akkor az else ágban megteheted pl (maradva a példádnál - de irtam string és karakter nem a legjobb megoldás mivel a stringben több karakter is lehet és akkor az már nem esik a vizsgálat alá - addig működőképes az általad irt, illetve ez én feltételem is amig egy karaktert adunk be a stringbe).
if ('0'<=ke) and (ke<='9') and <>'v') then begin
{ Itt történik a feldolgozás}
end else begin
{ Itt pediglen a felhasználó tájékoztatása arról, hogy nem jó karaktert adott meg}
end ;
Amúgy ügyesen megtaláltad, a "v" betű lenyomását kezelő pascal utasitásokat.
De azért ide is tennék egy megjegyzést : A speciális billentyűknek két kódja van (F1-F12, illetve irányitó billentyűk : Nyilak, Home, End, PageUp, PageDown, stb) Az első kód az a nulla aztán adja be a második kódod ami a végüli kód (ezt nem kezeli a programod) és ebből - nem ebben az esetben - de adódhatnak furcsa, megmagyarázhatatlan program müködések (mármint abból, hogy két kódot kapsz a redkeytől és nincs lekezelve a két kódos dolog).
Amúgy meg csak kitartás, és minnél több energiát fektess bele (pl. gyakorlás, forráskódok olvasása, elemzése, megértése - mit miért csinál az a bizonyos kód) mert igy tudod elsajátítani a programozás alapjait, illetve ami talán a legfontosabb a programozási GONDOLKOZÁSMÓDOT.
Sok sikert.
üdv.
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!