PASzSz Készítette: Dr. Kotsis Domokos
Első témakör: Lazarus terminál alkalmazás készítése. Lazarus terminál alkalmazás készítése. Egyszerű algoritmusok leírása, megvalósítása.
Free Pascal A Turbo Pascal és a Delphi Object Pascal alapján készült, objekt orientált programozást is lehetővé tévő, sok platformon is futó nyelv és környezet. Erre épül, s így szintén multi platformos a Lazarus vizuális programfejlesztő rendszer. 2012. szeptember 26. 3
A Free Pascal 2.6 az alábbi operációs rendszereken fut ARM: Game Boy Advance, Nintendo DS, Linux, Windows CE Intel/i386: Dos (GO32v2 extender), FreeBSD, Linux, Mac OS X, Haiku, OS/2, Solaris, Win32, Win64, WinCE PowerPC: Linux, Mac OS X, Nintendo Wii PowerPC64: Linux, Mac OS X SPARC: Linux, Solaris AMD64/x86_64: FreeBSD, Linux, Windows 64-bit 2012. szeptember 26. 4
Legfontosabb Lazarus linkek http://lazarus.freepascal.hu http://wiki.freepascal.org http://www.lazarussupport.com 2012. szeptember 26. 5
Pascal program készítése I. Program alkalmazás: 32-bites program, amely nem grafikus környezetben fut, hanem konzol ablakban Általában kis mennyiségű input és output jellemzi File New és válasszuk a Program elemet Rögtön mentsünk egy új könyvtárba 2012. szeptember 26. 6
Pascal program készítése II. A kis- vagy nagybetűnek nincs jelentősége! Csak az angol abc betűit használjuk! A C# beli { és } helyett a begin end pár használandó Az értékadás jele a := Az összehasonlításé a = 2012. szeptember 26. 7
Program fordítása Használhatjuk az F9 billentyűt Használhatjuk a Run Run parancsot Kattinthatunk a zöld háromszögre 2012. szeptember 26. 8
Program mentése Használhatjuk a File Save (esetleg Save as) parancsot Használhatjuk actrl-s billentyűket 2012. szeptember 26. 9
Program alkalmazás legfontosabb file formátumai A főprogram kiterjesztése: lpr (lazarus project). Az alprogramok kiterjesztése pas (pascal). Az eredmény kiterjesztése exe (futtatható állomány). 2012. szeptember 26. 10
1.1. feladat: Bemutatkozás program Project1; {$mode objfpc}{$h+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { you can add units after this }; Ezt a rendszer elkészíti {$IFDEF WINDOWS}{$R project1.rc}{$endif} begin WriteLn('Kis Pista vagyok'); ReadLn; end. A program A végrehajtandó program eleje, vége 2012. szeptember 26. 11
Változók, deklaráció I. A változókat deklarálni kell, azaz meg kell adni nevüket, típusukat (mire akarjuk őket használni), méretüket, mielőtt a végrehajtható kód blokkra (begin end) sor kerülne, egy var kezdetű blokkban. A végrehajtandó kódban értéket kell nekik adni, azután fel lehet azt használni. 2012. szeptember 26. 12
Deklaráció Var vált1, vált2,... : típus1; vált13, vált4,... : típus2;... Fontos: A deklarációnak meg kell előznie a programblokkot, amiben használni akarjuk! 2012. szeptember 26. 13
Változók, deklaráció II. A deklaráció kezdete var x:integer; begin x:= 190; WriteLn('Kiss Pista ',x,' cm magas'); ReadLn; end. egyszerű egész szám Értékadás A változó felhasználása 2012. szeptember 26. 14
Egyszerű változó típusok I. Számok: Integer típusok: ábrázolás egészként pontos, kis terjedelem. Real típusok: ábrázolás karakterisztika-mantissza rendszerben nem pontos, nagy terjedelem. 2012. szeptember 26. 15
Néhány integer típus Név Terjedelem Formátum Byte 0..255 8 bit e.n. Word 0..65535 16 bit e.n. Longword 0..429496729 32 bit e.n. Shortint -127..128 8 bit e. Smallint -32768..32767 16 bit e. Integer -2147483648.. 2147483647 32 bit e. 2012. szeptember 26. 16
Néhány real típus Név Terjedelem Tizes jegy Méret (byte) Single Real Extended 1,5*10^-39.. 3,4*10^38 7-8 4 5*10^-324.. 1,7*10^308 15-16 8 3,6*10^-4951.. 1,1*10^4932 19-20 10 2012. szeptember 26. 17
Egyszerű változó típusok II. Karakter (char) Egy karakter, a konstans aposztrófok (') között. Logikai (boolean) Logikai érték, true, vagy false. 2012. szeptember 26. 18
Operátorok, műveletek Aritmetikai: +, -, *, /, div, mod Összehasonlító: =, <>, <, >, <=, >= Logikai: not, and, or, xor 2012. szeptember 26. 19
Operátorok precedenciája Operátor Precedencia not legmagasabb *, /, div, mod, and második +, -, or, xor harmadik =, <>, <, >, <=, >= legalacsonyabb Figyelem: Ez más, mint a C#-ban volt! Pl.: if x>3 and y=2; más, mint if (x>3) and (y=2);! 2012. szeptember 26. 20
Egyszerű I/O Read(lista); Readln(lista); Write(lista); Writeln(lista); lista: vesszőkkel elválasztott konstansok, változók : után hossz, real számoknál második : után tizedesek száma 2012. szeptember 26. 21
Szekvencia Egy utasítás, vagy utasítások Begin és End között Utasítások végén ; kell. Utasítás: értékadás, eljárás hívás. 2012. szeptember 26. 22
Elágaztatás I. If állítás Then ez_kell_igaz _állítás _esetén Else ez_kell_hamis _állítás _esetén; ez_kell: egy utasítás, vagy utasítások Begin és End között Utasítások végén ; kell, kivéve Else előtt! Az Else rész elhagyható. 2012. szeptember 26. 23
Elágaztatás II. Case Case selector Of érték1: utasítás;.. értékn: utasítás Else utasítások; End; Case selector: sorszámozható értékű kifejezés. Az Else rész elhagyható. 2012. szeptember 26. 24
Ciklus I. While állítás Do ezt_kell_tenni Újra, amíg az állítás igaz. Repeat ezt_kell_tenni Until állítás Újra, amíg az állítás nem igaz. ezt_kell_tenni: egy utasítás, vagy utasítások Begin és End között 2012. szeptember 26. 25
Ciklus II. For cv:=kezdőérték To végérték Do ezt_kell_tenni Újra, a cv ciklusváltozó egyesével nő a kezdőértéktől a végértékig. For cv:=kezdőérték DownTo végérték Do ezt_kell_tenni Újra, a cv ciklusváltozó egyesével csökken a kezdőértéktől a végértékig. cv: egész típusú változó. ezt_kell_tenni: egy utasítás, vagy utasítások Begin és End között. 2012. szeptember 26. 26
1.2. feladat: Átlag I. Készítsen programot, mely beolvas a billentyűzetről számokat, ha a beírt szám negatív, kiírja az addig beolvasott számok átlagát! A beolvasott string konvertálásához használja a StrTOFloat() függvényt. Ehhez a Uses klauzulába vegye fel a Sysutils tételt! 2012. szeptember 26. 27
Felvétel a Uses klauzulába A Uses klauzulába vegye fel a Sysutils tételt! program Project1; {$mode objfpc}{$h+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, Sysutils { you can add units after this };... 2012. szeptember 26. 28
1.2. feladat: Átlag Ia. var szumma,utolso: real; darab: integer; s1: string; Begin szumma:=0; darab:=0; ReadLn(s1); utolso:= StrToFloat(s1);... 2012. szeptember 26. 29
1.2. feladat: Átlag Ib.... while utolso>=0 do Begin szumma:=szumma+utolso; darab:=darab+1; ReadLn(s1); utolso:= StrToFloat(s1); End;... 2012. szeptember 26. 30
1.2. feladat: Átlag Ic.... if darab>0 then WriteLn((szumma)/(darab)) else WriteLn('Hiba!'); Readln; End. 2012. szeptember 26. 31
1.3. feladat: Átlag II. Készítsen programot, mely beolvas a billentyűzetről számokat, ha a beírt szám negatív, kiírja az addig beolvasott számok átlagát, kivéve a legnagyobb, és a legkisebb nem negatív számot! 2012. szeptember 26. 32
1.3. feladat: Átlag IIa. var szumma,utolso,max,min: real; darab: integer; s1: string; Begin szumma:=0; darab:=0; max:=0; ReadLn(s1); utolso:= StrToFloat(s1); 2012. min:=utolso; szeptember 26. 33
1.3. feladat: Átlag IIb. while utolso>=0 do Begin szumma:=szumma+utolso; darab:=darab+1; if utolso>max then max:=utolso; if utolso<min then min:=utolso; ReadLn(s1); utolso:= StrToFloat(s1); End; 2012. szeptember 26. 34
1.3. feladat: Átlag IIc. if darab>2 then WriteLn((szumma-max-min)/(darab-2)) else WriteLn('Hiba!'); Readln; End. 2012. szeptember 26. 35
A logikai és a karakter típus I. Olvasson be az c és a d változókba egy-egy karaktert. Ha c értéke i, legyen a értéke true, ha d értéke i, legyen b értéke true (egyébként mindkettő legyen false ). Írja a képernyőre, hogy a és b közül melyik igaz ( Mindegyik, Valamelyik, Egyik sem )! 2012. szeptember 26. 36
A logikai és a karakter típus II. var a,b,c: Boolean; d,e,f: char; Begin c:=true; While c do Begin Readln(d); if d='i' then a:=true else a:= false; ReadLn(e); if e='i' then b:=true else b:= false; if (a or b) and not (a and b)then WriteLn('Valamelyik'); if a and b then WriteLn('Mindegyik'); if not(a or b) then WriteLn('Egyik sem'); ReadLn(f); if f='i' then c:=true else c:= false; End; 2012. Readln; szeptember 26. 37
Túlcsordulás Byte típus esetén I. Készítsünk programot, mely 1 byte hosszúságú, (Byte típusú) 255 értékű előjel nélküli egész szám változóhoz 1-t hozzáad. Mi lesz az eredmény? 2012. szeptember 26. 38
Túlcsordulás Byte típus esetén II. var a, b : Byte; begin a:= 255; b:= a+1; WriteLn; WriteLn('a =', a, ', b=a+1=', b, '!!!'); WriteLn; ReadLn; end. 2012. szeptember 26. 39
Túlcsordulás Byte típus esetén III. a=255, b=a+1=0!!! 2012. szeptember 26. 40
Túlcsordulás Shortint típus esetén I. Készítsünk programot, mely 1 byte hosszúságú előjeles (Shortint típusú) -127 értékű egész szám változóból kivon 1-et, majd 2-t. Mi lesz az eredmény? 2012. szeptember 26. 41
Túlcsordulás Shortint típus esetén II. var a, b, c : Shortint; Begin a:= -127; b:= a-1; c:= a-2; WriteLn; WriteLn('a =', a, ', b=a-1= ', b, ', c=a-2=', c, '!!!'); WriteLn; ReadLn; End. 2012. szeptember 26. 42
Túlcsordulás Shortint típus esetén III. a=-127, b=a-1=-128, c=a-2=127!!! 2012. szeptember 26. 43
Pontosság Real típus esetén I. Készítsünk programot, mely egy real típusú lebegőpontos változó értékét 0-tól 1 tizedenként növeli, míg csak az érték 100 nem lesz. (Egyenlőséget vizsgáljon!) A növelést végezze ciklusban. A ciklus magjában helyezzen el vizsgálatot, mely kiírja a változó értékét, ha az nagyobb lesz, mint 200(!). 2012. szeptember 26. 44
Pontosság Real típus esetén II. var a: Real; Begin a:= 0; Repeat a:= a+0.1; If a>200 Then Begin Writeln('a = ', a:5:2, '!!!'); ReadLn; End; Until a=100; WriteLn; WriteLn('a=', a, '!!!'); WriteLn; ReadLn; End. 2012. szeptember 26. 45
Pontosság Real típus esetén III. a =200.10!!! 2012. szeptember 26. 46
1.4. feladat: Alapműveletek Készítsen programot, mely beolvas a billentyűzetről két számot és egy műveleti jelet, majd kiírja a két számmal elvégzett művelet eredményét! Használjon CASE struktúrát! 2012. szeptember 26. 47
Alapműveletek: deklaráció Var op1, op2, ered : real; hiba : boolean; muv : char; 2012. szeptember 26. 48
Alapműveletek: kezdeti értékadás Begin op1 := 0 ; op2 := 0 ; hiba := false; muv := ' '; 2012. szeptember 26. 49
Alapműveletek: adatok beolvasása Writeln; Write('Az elso operandus = '); ReadLn(op1); Write('A muvelet (+-*/) = '); ReadLn(muv); Write('A masodik operandus = '); ReadLn(op2); 2012. szeptember 26. 50
Alapműveletek: case I. Case muv Of '+' : ered := op1 + op2 ; '-' : ered := op1 - op2 ; '*' : ered := op1 * op2 ; '/' : Begin IF Abs(op2) < 1E-20 THEN Begin Writeln( Osztas hiba! '); hiba := true ; End 2012. szeptember 26. 51
Alapműveletek: case I. Case muv Of '+' : ered := op1 + op2 ; '-' : ered := op1 - op2 ; '*' : ered := op1 * op2 ; '/' : Begin IF Abs(op2) < 1E-20 THEN Begin Writeln( Osztas hiba! '); hiba := true ; End 2012. szeptember 26. 52
Alapműveletek: case II. Else Else End; End ered := op1 / op2 ; WriteLn( Muvelet hiba! '); hiba := true ; 2012. szeptember 26. 53
Alapműveletek: kiíratás If Not hiba Then Writeln(op1:5:2,' ',muv,' ', op2:5:2,' = ',ered:5:2); ReadLn; End. 2012. szeptember 26. 54
1.5. feladat: Másodfokú egyenlet Készítsen programot, mely megadja az adott A, B, C együthatókkal felírható Ax 2 +Bx+C=0 egyenlet gyökeit. Készítse el a feladat Pascal programját! Használható az Abs() és az Sqrt() függvény! 2012. szeptember 26. 55
Másodfokú egyenlet megoldása: deklaráció, beolvasás VAR A,B,C,D : real; BEGIN Writeln('Masodfoku egyenlet megoldasa'); Writeln; Writeln('Add meg az egyenlet egyutthatoit!'); Write('A = '); Readln(A); Write('B = '); Readln(B); Write('C= '); Readln(C); 2012. szeptember 26. 56
Másodfokú egyenlet megoldása: vizsgálat If A=0 then if B=0 then if C=0 then else Writeln('Azonossag') else Writeln('Nincs gyok') else Writeln('Egy gyok van: ',-C/B) 2012. szeptember 26. 57
Másodfokú egyenlet megoldása: valós gyökök Begin D:= B*B-4*A*C; If D>= 0 THEN Begin Writeln('X1 = ',(-B+Sqrt(D))/2/A); Writeln('X2 = ',(-B-Sqrt(D))/2/A); End Else 2012. szeptember 26. 58
Másodfokú egyenlet megoldása: komplex gyökök Begin Writeln('X1 = ', -b/2/a,' +',Abs(Sqrt(-D)/2/A),'i'); Writeln('X2 = ', -b/2/a,' -',Abs(Sqrt(-D)/2/A),'i'); End; End; ReadLn; End. 2012. szeptember 26. 59
1.6. feladat: Faktoriális Készítsen programot, mely megadja az adott A szám faktoriálisát. 2012. szeptember 26. 60
1.7. feladat: Prímkeresés Készítsen programot, mely megadja, hogy egy adott a szám (a<3000) prímszám-e. 2012. szeptember 26. 61