PASzSz Készítette: Dr. Kotsis Domokos
Első témakör: 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} Ezt a cthreads, rendszer {$ENDIF}{$ENDIF} elkészíti Classes { you can add units after this }; {$IFDEF WINDOWS}{$R project1.rc}{$ENDIF} begin A WriteLn('Kis Pista vagyok'); végrehajtandó ReadLn; program eleje, end. vége 2012. szeptember 26.
A program
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 egyszerű egész szám
… var x:integer; Értékadás begin x:= 190; WriteLn('Kiss Pista ',x,' cm magas'); ReadLn; A változó end. 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 Byte Word Longword Shortint Smallint Integer
2012. szeptember 26.
Terjedelem 0..255 0..65535 0..429496729 -127..128 -32768..32767 -2147483648.. 2147483647
Formátum 8 bit e.n. 16 bit e.n. 32 bit e.n. 8 bit e. 16 bit e. 32 bit e.
16
Néhány real típus Név
Terjedelem
Single
1,5*10^-39.. 3,4*10^38 7-8 5*10^-324.. 1,7*10^308 15-16 3,6*10^-4951.. 1,1*10^4932 19-20
Real Extended
2012. szeptember 26.
Tizes jegy
Méret (byte) 4 8 10
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 not *, /, div, mod, and +, -, or, xor =, <>, <, >, <=, >=
Precedencia legmagasabb második 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. 37 Readln; szeptember 26.
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 ered := op1 / op2 ; End Else WriteLn(‘Muvelet hiba ! '); hiba := true ; End;
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ó Ax2+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 Writeln('Azonossag') else Writeln('Nincs gyok') else Writeln('Egy gyok van: ',-C/B) else
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