Felhasználói eszközök

Eszközök a webhelyen


oktatas:programozas:pascal:pascal_nyelv

< Pascal

Pascal tananyag

  • Szerző: Sallai András
  • Copyright © Sallai András, 2008, 2012, 2013, 2014, 2015, 2018
  • Licenc: GNU Free Documentation License 1.3

Bevezetés

A Pascal nyelv általános célú nyelv, amely minden területen megállja a helyét. Az oktatásban különösen hasznos, de megállja a helyét vállalati környezeteben is. Igaz sokan lekicsinylik, mert valaki azt mondta nekik, hogy a Pascal nyelv „elavult”.

A Pascal nyelv azonban köszöni jól van. A Pascal nyelv temetése egyébként onnan ered, hogy eredetileg a Borland cég fordítóját használtuk e nagyvilágban, amelynek neve Turbo Pascal volt, viszont annak a fejlesztésével felhagyott a cég és az utolsó kiadás 1992-es. Mivel nagyon népszerű volt, és nem fejlesztik tovább, néhányan a Pascal nyelv halálának gondolják.

A Pascal nyelvet azért Borland cég is tovább támogatja BorlandPascal fejlesztői környezet néven, amelyből később a Delphi nevű fejlesztői környezet növi ki magát.

A Delphi viszont már vizuális fejlesztői környezet, alapja azonban ennek is Pascal. Valaki azt mondja „Delphi nyelv”. Ez azonban csak a Pascal nyelv egy változata.

Azóta azonban lett nekünk FreePascal, amely folyamatos fejlesztés alatt áll, és a Delphi rendszernek is lett egy klónja a Lazarus. A Lazarus a FreePascal fordítóját használja, tulajdonképpen a FreePascalnak egy vizuális fejlesztői felülete. Mindkettő nyílt forráskódú szoftver rendszer. A Lazarus erőssége a nyílt forráskód és a könnyű használhatóság mellett, hogy több platformra létezik. Windows, MacOS, Linux és még más rendszerek is.

Néhány ismert Pascal nyelven írt program:

  • Total Commander (Delphi)
  • Skype (Delphi és Objecitve-C és C++)

Más programok:

Helló Világ

Helló Világ nevű program:

program hello;
begin
      WriteLn('Helló Világ!');
end.

Az első sorban a „program” a program nevét vezeti be. Utána megadjuk az általunk kitalált nevet. A programnévben nem lehet szóköz, nem lehet ékezetes karakter és nem kezdődhet számmal.

A begin és end. közzé írjuk saját utasításainkat. Minden utasítást pontosvesszővel zárunk. A Pascalban minden karaktersorozatot, amelyet megadunk aposztrófok közzé kell tenni:

'Helló Világ'

A programozás során elkészítjük a program forráskódját. A forráskódból tárgykód, vagy más néven objekt fájl készül, abból pedig a futtatható, vagy más néven bináris állomány.

A Linux rendszereken a futtatható fájloknak nincs kiterjesztésük alapértelmezetten. A Windowsos programok esetén viszont kötelező a .exe kiterjesztés. A fordító így Linuxon egy kiterjesztés nélküli állományt hoz létre, míg Windowson egy .exe kiterjesztésű fájlt hoz létre.

Megjegyzések

A Pascal nyelven többsoros megjegyzést tehetünk a kapcsos zárójel párossal vagy szimpla zárójele csillaggal. Egy soros megjegyzést tehetünk a két perjellel (A régi TurboPascalban nem működött):

program Program01;
 
{ Több 
  soros
  megjegyzés
}
 
(* Több 
   soros
   megjegyzés
*)
 
//Egy soros megjegyzés
begin
 
{Több soros megjegyzés}
(* Több soros megjegyzés *)
//Egy soros megjegyzés
 
end.

Kivitel

Fentebb láttuk, hogy a karaktersorozat állandók meghatározásakor azokat aposztrófok közzé kell tenni.

WriteLn('karakter sorozat');

A karaktersorozatban természetesen lehetnek számok is.

Ha számot adunk, meg azt nem szükséges aposztrófok közzé írni.

WriteLn(382);

A számok is megadhatók karaktersorozatként:

WriteLn('382');

Ha viszont nem karaktersorozatként adom meg, akkor számításokat is végezhetek vele. A következő utasítás például kiszámítja 8 * 2 értékét:

WriteLn(8 * 2);

Amikor leírom, hogy 8, ez egy egész szám. Dolgozhatunk azonban valós számokkal is. A magyar nyelvben egy valós számot így írok le:

382,82

Az angolban azonban a vessző helyett pontot használunk, ennek megfelelően a Pascal nyelvben az előbbi szám:

382.82

A képernyőre íráshoz használható a Write() utasítás is. A Write() nem tesz sortörést a kiírt adatok végén. Próbáljuk ki a következő utasítás:

Write('egy');
Write('ketto');
WriteLn('harom');
Write('negy');

A Write() és WriteLn() eljárásoknak több paraméter is megadható:

Write(3+5, " ", 8 * 7);

Literálisnak nevezzük a forráskódba írt szám, karakter és karaktersorozat állandókat. Ha leírom 'alma', akkor megadtam egy literálist. Ha leírom Write(354), a 354 egy számliterális.

Különleges karakterek

Láttuk, hogy az aposztróf, vagy felső-vessző, speciális szerepet tölt be, mivel ezzel adunk meg egy karaktersorozat literálist. Akkor hogyan íratunk a képernyőre egy ilyen felső-vesszőt?

A következőkben két megoldást látunk a kiíratásra.

begin
	WriteLn('''');
end.

A másik megoldás:

BEGIN
	WriteLn(#39);
END.

A második megoldásban egy # kettős-kereszt után írtuk a felső-vessző ASCII kódját, decimálisan megadva. Ezzel a módszerrel más különleges karakterek is a képernyőre írathatók. Ilyenek lehet a sortörés, tabulátor, stb.

Tabulátor:

WriteLn('alma'#9'szilva');

Sortörés:

WriteLn('alma'#13#10'szilva');

Unicode karakter kódját is megadhatjuk a $ dollárjellel bevezetve:

WriteLn('alma'#$0065'körte');

A program egy „e” betűt ír a két gyümölcs neve közzé.

A # kettős-kereszttel megadott karaktereket kontrollkarakternek nevezzük. A kettős-kereszt után megadható egy ASCII kód vagy egy UTF-8 kód.

néhány karakter ASCII kódja
karakter decimális ASCII kód
# 35
$ 36
' 39
( 40
) 41
^ 94
{ 123
| 124
} 125

Változók, állandók és típusok

Változók

A változó tulajdonképpen egy memóriahely amelyet lefoglaltunk azzal a céllal, hogy valamilyen értéket fogunk ott eltárolni. „Változó” néven azért említjük mert a program további részében értéke bármikor megváltoztatható.

Változók deklarálása (példa):

var 
    a : integer;
    b : real;
begin
    a := 3;
    b := 4;
    WriteLn(a + b);
end.

Típusok

Egész típusok
shortint -128..127 1 bájt
smallint -32768..32767 2 bájt
longint -2147483648..2147483647 4 bájt
int64 -9223372036854775808..9223372036854775807 8 bájt
integer smallint, shortint vagy int64 előjeles 2, 4 vagy 8 bájt
byte 0..255 1 bájt
word 0..65535 2 bájt
longword 0..4294967295 4 bájt
qword 0..18446744073709551615
cardinal word, longword vagy qword 2, 4 vagy 8 bájt
Valós típusok
real single vagy double 4 vagy 8 bájt
single 1.5e-45 .. 3.4e+38 4 bájt
double 5.0e-324 .. 1.7e+308 8 bájt
extended 3.4e-4932 .. 1.1e+4932 10 bájt
comp -263 + 1 .. 263 - 1 8 bájt
currency -922337203685477.5808..922337203685477.5807 8 bájt
Logikai típusok
Boolean false..true 1 bájt
ByteBool false..true 1 bájt
WordBool false..true 2 bájt
LongBool false..true 4 bájt
Karaktere típusok
char
AnsiChar
WideChar (WChar)
Karaktersorozat típusok
Típus Max hossz
ShortString 255
AnsiString platformfüggő
String 255, illetve
platformfüggő
WideString platformfüggő
PChar platformfüggő
PAnsiChar platformfüggő
PWideChar 1 gigabájt

Állandók

Állandókat eddig is használtunk a programjainkban, hiszen amikor leírjuk például 'alma', ez is állandó. Állandó, mert a program futása során, a számítógép memóriájában ez az érték már biztosan nem változik. Ezeket neveztük literális állandóknak. Most egy újabb fajta állandóval ismerkedünk meg, ezek a nevesített állandók. Mint nevük is mutatja van nevük.

A programozó azt vállalja, hogy ezeket a memóriahelyeket a program további részében nem fogja megváltoztatni. Állandókat a Const kulcsszó után hozhatunk létre, hasonlóan a változókhoz, de itt kettőspont helyett, egyenlőségjelet teszünk, mivel azonnal meg kell adnunk az állandó értékét.

const
Azonosito1 = value;
Azonosit2 = value;
Azonosit3 = value;
const
  Nev = 'Nagy József';
  Betu = 'a';
  Ev = 1997;
  pi = 3.1415926535897932;
  UsingNCSAMosaic = TRUE;

Az állandókat a Pascal nyelvben a változók előtt vezetjük be:

program01.pas
const
    max = 30;
var 
    a : integer;
begin
    a := max;
    WriteLn(a);
end.

Formázott kimenet

Pascal formázás

A Pascal nyelv lehetővé teszi az értékek kiírásának szélességét megadni.

var 
  a : Real;
BEGIN
    a := 323.1234567;
    WriteLn(a:20:2);
END.

Az „A” változó tartalmát 20 szélesen, két tizedesjegy pontossággal írjuk ki. Egész számok esetén a második szám értelemszerűen nem adható meg:

var 
  a : Integer;
BEGIN
    a := 323;
    WriteLn(a:20);
END.

Bár a precizitás megadása valós szám esetén sem kötelező.

Format függvény

A format() függvény az eddigieknél kifinomultabb beállítást tesz lehetővé, a sysutils unitban található a FreePascal rendszerekben.

A format() függvények minimum két paramétere van. Az első paraméter kötelezően a formátum-karaktersorozat, amit értelemszerűen aposztrófok között adunk meg. A második paraméter szögletes zárójelek között megadott, számok, változók vagy állandók, vesszővel szeparálva.

format('formátum-karaktersorozat', [45])
format('formátum-karaktersorozat', [45, 20])
format('formátum-karaktersorozat', [45, 20, 63])

A formátum-karaktersorozat tartalmazhat egy úgynevezett formátumkódot. Formátumkódot akkor teszünk a formátum-karaktersorozatba, ha írunk minimum egy következő paramétert is. A formátumkódot mindig % százalékjellel kezdjük:

format('%d Ft', [450])

A második paraméterhez, és az azt következő paraméterekhez szükség van egy-egy formátumkódra. Ha van harmadik paraméter is, akkor újabb formátumkódot írunk:

format('%d kg   %d Ft', [12, 450])

A formátumkód annál többet tud, mint szimpla megjelenítés.

A formátumkód általánosan így néz ki:

'%' [[index]':'] ['-'] [szélesség] ['.' precizitás] ArgumentumTípusa
'%' A formátum string így indul
index ':' A megjelenítés sorrendje
'-' balra igazítás
szélesség A kiíratás szélessége
'.' precizitás Precizitás
Formátumkód Leírás
D Decimális formátum.
E Tudományos formátum
F Fixpontos formátum
G Elsődleges számformátum
M Pénznem formátum
N Számformátum (megegyezik a fixpontos formával)
S String formátum
U Előjel nélküli decimális formátum
X Hexadecimális formátum
Program01.pas
uses sysutils;
var
	a : Real;
BEGIN
 
	a := 3438.1234567;
 
	WriteLn(Format('%.3F', [a]));
 
	ReadLn;
 
END.
Program01.pas
uses sysutils;
var
	a , b : Real;
BEGIN
 
	a := 3438.1234567;
	b := 2234.56789;
 
	WriteLn(Format('%.3F %.1F', [a, b]));
 
 
	ReadLn;
 
END.

Matematikai függvények

WriteLn(Pi());

Az eredmény tudományos alakban kapjuk:

3.1415926535897932E+0000

Egy kis formázással fixpontos alakra hozhatjuk:

WriteLn(Pi():0:4);

Számok szinuszát szeretnénk megkapni. Paraméterként meg kell adni az adott szöget radiánban:

WriteLn(Sin(1 * Pi() / 180):0:4);

Számok négyzetgyöke:

WriteLn(sqrt(9));
  • Abs Abszolút érték számítása
  • Arctan Arkusz tangens számítása
  • Cos Koszinusz fok számítása
  • Dec Egy változó értékének csökkentése
  • Exp Exponenciális
  • Frac Az argumentum tizedes részével tér vissza
  • Hi Egy byte/word érték felső részével tér vissza
  • Inc Egy változó értékének növelése
  • Int Lebegőpontos érték egész része
  • Ln Logaritmus számítása
  • Lo Egy byte/word érték alsó részével tér vissza
  • Odd A szám páratlan-e
  • Pi Pi értékével tér vissza
  • Random Véletlen szám generálása
  • Randomize A véletlen szám generátor inicializálása
  • Round Lebegőpontos számot a legközelebbi egészre kerekíti
  • Sin Szinusz fok számítása
  • Sqr Érték négyzetének számítása
  • Sqrt Érték négyzetgyökének számítása
  • Swap Az alsó és a felső byte/words érték alsó és felső részének cseréje
  • Trunc A szám egész részével tér vissza

Néhány függvény fejléce

function sqr( l: LongInt ):LongInt;
function sqrt( d: ValReal ):ValReal;
function trunc( d: ValReal ):Int64;
function odd( l: LongInt ):Boolean;
function round( d: ValReal ):Int64;
function frac( d: ValReal ):ValReal;
function sin( d: ValReal ):ValReal;
function cos( d: ValReal ):ValReal;
 
function swap( X: Word ):Word;
function swap( X: Integer ):Integer;
function swap( X: LongInt ):LongInt;
function swap( X: Cardinal ):Cardinal;
function swap( X: QWord ):QWord;
function swap( X: Int64 ):Int64;

A math unit

Hatványozáshoz szükségünk van a math unitra:

Program01.pas
program Program01;
 
uses math;
 
BEGIN	
	WriteLn(Power(2,5):0:0);
 
	ReadLn;
END.
math unit függvényei (nem teljes)
power() hatvány
ceil() kerekítés felfelé
floor() kerekítés lefelé
log10() Tízes alapú logaritmus
log2() Kettes alapú logaritmus
logn() N alapú logaritmus
radtodeg() Radián átalakítása fokba
degtorad() Szög átalakítása radiánba

A logn() függvény a következő formában használható:

logn(n, x)

Vegyes függvények

  • Assert – Feltételes program megszakítás hibával (ha a paraméter igaz értéket ad, akkor a program megszakad)
  • Break – Az aktuális ciklus megszakítása
  • Continue – Az aktuális ciklusban a következő ciklus kerül végrehajtásra.
  • Exclude – Egy elem kizárás egy halmazból
  • Exit – Kilépés az aktuális függvényből és eljárásból
  • Include – Egy elemet tesz egy halmazba
  • LongJmp – Ugrás a végrehajtási ponthoz
  • Ord – Sorszámozott típus sorszámát adja
  • Pred – A felsorolt típus előző értékével tér vissza
  • SetJmp – A végrehajtási pont megjelölése ugráshoz
  • SizeOf – Visszatér az adott változó vagy típus méretével
  • Succ – A felsorolt típus következő értékével tér vissza

Néhány függvény/eljárás fejrésze

function SizeOf(X: TAnyType):LongInt;
procedure Assert(Expr: Boolean);
procedure Assert(Expr: Boolean; const Msg: String);
procedure Exit(const X: TAnyType);
procedure Exit;
procedure Break;
procedure Continue;
function Ord(X: TOrdinal):LongInt;
function Pred(X: TOrdinal):TOrdinal;
function Succ(X: TOrdinal ):TOrdinal;

Véletlen számok

A Random() egy egész számot vár paraméterként. Ha például 5-öt írunk, akkor egy egész számot kapunk 0 és 4 között.

Program01.pas
program Program01;
 
BEGIN
	Randomize;
	WriteLn(Random(5));
	ReadLn;
END.

Ha szeretnénk 1 és 5 között egy számot megkapni, egyszerűen adjunk hozzá mindig 1-t. A véletlen szám generálása előtt használjuk a Randomize nevű eljárást, ami biztosítja, hogy minden futtatáskor más számot kapjunk.

Operátorok és precedenciájuk

Operátorok

Az operátorok lehetnek egyoperandusú:

not a
-b

Lehetnek kétoperandusúak:

a + b
a and b
a < b
  • aritmetikai
  • relációs (összehasonlító)
  • logikai
  • bit-
  • sztring-
  • halmaz-
  • egyéb (@, is, as)
Aritmetikai műveletek
-a előjelváltás
+a előjel megerősítés
a + b összeadás
a - b kivonás
a * b szorzás
a / b osztás
a div b egész osztás
a mod b maradékképzés
Logikai műveletek
not a tagadás
a and b ÉS
a or b VAGY
a xor b kizáró VAGY
Bitműveletek
not a tagadás bitenként
a and b ÉS bitenként
a or b VAGY bitenként
a xor b kizáró VAGY bitenként
a shl b biteltolás balra
a shr b biteltolás jobbra
Sztringműveltek
a + b karaktersorozat összefűzése
Halmazműveletek
a + b unió
a * b metszet
a - b különbség
a in b eleme-e, vizsgálat
Relációs műveletek
a = b egyenlő
a <> b nem egyenlő
a < b kisebb mint
a > b nagyobb mint
a <= b kisebb vagy egyenlő
a >= b nagyobb vagy egyenlő

Precedencia

A precedencia a műveletvégzés elsőbbségi sorrendjét jelenti. Ha több operátorunk van, akkor valamilyen szabály alapján el kell dönteni, melyik műveletet hajtjuk végre először.

Művelet Precedencia
@, not, -, + első, legmagasabb
*, /, div, mod, and, shl, shr, as második
+, -, or, xor harmadik
=, <>, <, >, <=, >=, in, is negyedik, legalacsonyabb

Ha több azonos szintű művelet van egy kifejezésben, akkor általában balról jobbra haladva hajtódnak végre.

A kiértékelési sorrend szabályozható zárójelekkel is.

Konverzió

Konverzióhoz a FreePascal sysutils unitját használjuk.

Egész Sztringgé

Program01.pas
program Program01;
uses sysutils;
var
	szam : integer;
	str : string;
BEGIN
 
	szam := 3;
	str := IntToStr(szam);
END.

Valós Sztringgé

Program01.pas
program Program01;
uses sysutils;
var
	szam : Real;
	str : String;
BEGIN
 
	szam := 3.5;
	str := FloatToStr(szam);
END.

Sztring valóssá

str := '3.5';
szam2 := StrToFloat(str);

Sztring egésszé

str := '3';
szam2 := StrToInt(str);

Bevitel

Program01.pas
var
    a : Integer;
BEGIN
    Write('Szam: ');
    ReadLn(a);
END.
Program01.pas
program test1;
var
	nev : String;	
BEGIN
	Write('Név: ');
	ReadLn(nev);
END.

Szelekció

if

Egy ágú, egy utasításos szelekció:

if feltétel then
    utasítás;

Egy ágú, több utasításos szelekciós:

if feltétel then
begin
  utasítás_1;
  utasítás_2;
  ...
  utasítás_n;
end;
Program01.pas
program Program01;
var
	a : Integer;
begin
	Write('Szám: ');
	ReadLn(a);
	if a > 100 then
		WriteLn('Száznál nagyobb számot írtál');
end.

Az if használata or és and logikai operátorokkal:

Program01.pas
program Program01;
var
	a, b : Double;
begin
	Write('Valós szám: ');
	ReadLn(a);
	Write('Másik valós szám: ');
	ReadLn(b);
	if (a > 0) and (b > 0) then
		WriteLn('Mindkét szám Pozitív');
	if (a > 0) or (b > 0) then
		WriteLn('Egyik szám Pozitív');
 
end.

if..else

Két ágú szelekció:

if feltétel then 
  utasítás_1
else
  utasítás_2;

Kát ágú szelekció több utasítással:

if feltétel then
begin
  utasítás_1;
  utasítás_2;
  ...
  utasítás_n;
end
else
begin
  utasítás_50;
  utasítás_51;
  ...
  utasítás_m;
end;
Program01.pas
program Program01;
var
	a : Integer;
begin
	Write('Szám: ');
	ReadLn(a);
	if a > 100 then
		WriteLn('Száznál nagyobb számot írtál')
	else
		WriteLn('Száznál kisebb számot írtál');
end.

if..else..if

Az if..else..if szerkezettel többágú szelekciót valósíthatunk meg.

Program01.pas
program Program01;
var
	a : Integer;
begin
	Write('Szám: ');
	ReadLn(a);
	if a > 0 then
		WriteLn('Pozitív')
	else if a = 0 then
		WriteLn('Nulla')
	else
		WriteLn('Negatív');
end.
Program01.pas
program Program01;
var
	a : Integer;
begin
	Write('Szám: ');
	ReadLn(a);
	if a > 0 then
	begin
		WriteLn('Pozitív');
		WriteLn('Pozitív');
	end
	else if a = 0 then
	begin
		WriteLn('Nulla');
		WriteLn('Nulla');
	end
	else
	begin
		WriteLn('Negatív');
		WriteLn('Negatív');
	end;
end.

case .. of

A case .. of szerkezettel többágú szelekció valósítható meg. A többágú szerkezet természetesen megvalósítható a már fentebb ismertetett if-el is, ez csak egy plusz lehetőség. Néha a case .. of utasítással egyszerűbb szerkezet valósítható meg.

Program01.pas
program Program01;
var
	a : Char;
begin
	Write('Betű: ');
	ReadLn(a);
 
	case a of
		'a' : WriteLn('Ez a');
		'b' : WriteLn('Ez b');
		'c' : WriteLn('Ez c');
		'd' : WriteLn('Ez d');
		'e' : begin
			WriteLn('Ez e');
			WriteLn('Még mindig e');
		      end;
		'f' : WriteLn('Ez f');
	end;
end.

A case használata String típussal:

Program01.pas
program Program01;
var
	gy : String;
begin
	Write('Gyümölcs: ');
	ReadLn(gy);	
	case gy of
		'alma' : WriteLn('Ez alma');
		'körte' : WriteLn('Ez körte');
		'szilva' : WriteLn('Ez szilva');
		'málna' : WriteLn('Ez málna');
		'barack' : WriteLn('Ez barack');
	end;
end.

Iteráció

for

A Pascal nyelv for ciklusutasítása növekményes (számlálós) ciklusok létrehozására használható. A működéshez szükség van egy ciklusváltozóra. A ciklusváltozó legyen például „i”. Értékadással mondjuk meg, hogy a ciklus hányszor forduljon. Például 1-től - 10-ig:

1 to 10

A for utasítás fejrésze a do kulcsszóval fejeződik be. A do uátn lehet egy vagy több utasítást megadni. Ha a több utasítást adunk meg, akkor kötelező a begin-end kulacsszavak használata.

Számok kiíratása 1-től - 10-ig.

for i := 1 to 10 do
    WriteLn('alma');

A ciklusok alatt végrehajtódó utasítások alkotják a ciklus törzsét. A fenti példában WriteLn('alma');

A ciklus törzsébe csak begin és end; között írható több utasítás.

for i := 1 to 10 do
begin
    WriteLn('alma');
    WriteLn('körte');
end;

A begin természetesen írható a do után is:

for i := 1 to 10 do begin
    WriteLn('alma');
    WriteLn('körte');
end;

A teljes program, ebben az esetben így nézhet ki:

p01.pas
var
    i : integer;
begin
    for i := 1 to 10 do begin
        WriteLn('alma');
        WriteLn('körte');
    end;
end.

A ciklusváltozó értékére hivatkozhatok ciklustörzsében. Például kiírathatom annak értékét:

for i := 1 to 10 do
begin
    WriteLn(i);
end;

A fenti program 1-től - 10-ig kiírja a számokat a képernyőre.

Számok kiíratása 10-től - 1-ig.

for i := 10 downto 1 do
begin
    WriteLn(i);
end;

A ciklus törzsében az i változó tartalmával, különböző műveleteket végezhetek. Például megszorozhatom mindig kettővel.

for i := 1 to 20 do
begin
    WriteLn(i * 2);
end;

Így megkapjuk a páros számokat – itt például – 20-ig.

A ciklusok egymásba ágyazhatók. A következő program háromszor hajtja végre a belső ciklust. A belső ciklus pedig mindig ötször írja ki az „a” betűt.

for i := 1 to 3 do
begin
	for j := 1 to 5 do
		Write('a');
	WriteLn();
end;

while

A while, azt jelenti amíg. Azt is mondjuk „amíg típusú” ciklus. Akkor használjuk, ha nem tudjuk hányszor fog fordulni a ciklus. Ha felhasználói beavatkozástól, vagy egyéb külső körülménytől függ a ciklusok száma, akkor a while segít ennek megvalósításában. A while ciklus fejléce így néz ki:

while feltétel do

A feltétel helyére beírunk egy állítást. ha az állítás igaz, a ciklus törzse végrehajtódik. Ha hamis, a vezérlés a ciklus utáni utasításra adódik át.

A while ciklus esetén (a forhoz hasonlóan) egy utasítás esentén nem kötelező a begin-end blokk jelölés. Több utasítás esetén, azonban meg begin és end; közzé írjuk az utasításainkat.

Program01.pas
program Program01;
var
	i : byte;
begin
	i := 0;
	while i<5 do
	begin
		WriteLn('Körte');
		Inc(i);
	end;
end.

Az Inc(i) függvény eggyel növeli az i változó értékét (increment).

repeat .. until

A repeat-until a Pascal hátul tesztelő ciklusa. Alapvetően amíg típusú ciklus. Akkor használjuk, ha egyszer biztosan végre szeretnénk hajtani a ciklus törzsét. A feltételt, vagyis a ciklus fejrészt a ciklus törzs után helyezzük el.

A while ciklussal szemben, ez az utasítás akkor hajtódik végre, ha feltétel igaz.

Program01.pas
program Program01;
var
	i : byte;
begin
	i := 0;
	repeat	
		WriteLn('Körte');
		Inc(i);
	until i>=5;
end.

Tömbök

Több azonos típusú elem tárolására alkalmas változó. Tömb deklarálása:

tomb : array [1..5] of integer;

Egy egész típusokat tárolni képes tömböt deklaráltunk, melynek indexei 1 és 5 között lehetnek.

Tömb kezdő értéke:

tomb : array [1..5] of integer = (3, 6, 2, 1, 10);

A tömb indexhatárainak meg kell egyezni a kezdőértékek számával. A tömb kezdőértékét csak a FreePascal fordító teszi lehetővé. A Turbo Pascalban a tömböknek nem adható kezdőérték!

Tömb mérete:

var
  tomb : array [1..5] of Integer = (3, 5, 8, 4, 6);
  meret : Integer;
begin
    meret := Length(tomb);
end;

Tömb bejárása:

var
  tomb : array [1..5] of Integer = (3, 5, 8, 4, 6);
  i : Integer;
begin
    for i := 1 to 5 do
       WriteLn(tomb[i]);
end;

A FreePascalban tömbök esetén bevezették a for ciklus használatának egy újabb technikáját. A ciklus fejrészében (az for és a do között) egy változót, az „in” kulcsszót és a tömböt adok meg. A for ciklus segítségével ilyen formán bejárhatom a tömböt, elejétől a végéig.

Program01.pas
program Program01;
var
	a : array [1..3] of byte = (2,4,7);
	b : byte;
begin
	for b in a do
		WriteLn(b);
end.

A FreePascal objektumorientált módba kapcsolható a objfpc mód bekapcsolásával:

{$mode objfpc}

Ezzel elérhetővé válik egy TStrings típus, ami valójában egy lista típus. A listák tulajdonképpen speciális tömbök, mert méretük dinamikusan, vagyis automatikusan változik, ha hozzáadunk egy elemet, vagy kiveszünk belőle egy elemet. Az ilyen típusú lista használatára látunk egy rövid példát, a következő programban.

Program01.pas
program Program02;
{$mode objfpc}
uses classes;
var
	st : TStrings;
	s : String;
begin
	st := TStringList.Create;
	try
		st.Add('Első');
		st.Add('Második');
		st.Add('Harmadik');
		for s in st do
			WriteLn(s);
	finally
		st.Free;
	end;
end.

A dinamikus listák bejárására is használhatjuk a for változó in lista do formát, ahogy a programban is látjuk.

Rekord

Több különböző típusú elem tárolására alkalmas változót deklarálhatunk vele.

Rekord deklarálása:

var
    szemely : record
      nev : String;
      tel : String;
      cim : String;
      fiz : LongInt;
    end;

Rekord használata:

begin
    szemely.nev := 'Pék Elemér';
    szemely.tel := 'Szolnok';
    szemely.cim := 'Kék u. 32.';
    szemely.fiz := 380000;
end.

A példában a szemely nevű változó négy értéket képes eltárolni, amelyeknek lehet különböző típusuk. A négy értéket tulajdonságoknak, vagy tagoknak is szoktuk nevezni.

Halmazok

Szintaxisa:

SET OF alaptípus
var halmaz : Set Of 1..10;
...
halmaz := [8, 3, 2, 5, 4];
h1 := [1..5];
h2 := []; {üres halmaz}
h3 := [4, 6, 12..15];
ch := 'r';
h4 := [ch, 'g', 'h'];
Halmazműveletek
* metszet
+ egyesítés
- különbség
Logikai típusú eredményt szolgáltató műveletek
= egyenlőség
<> különbözőség
<=, >= tartalmazás (részhalmaz)
IN elemvizsgálat
type
    szin = (sarga, kek, piros, zold);
    szinek = set of szin;
var
    valamiSzinei : szinek;
p01.pas
var 
	halmaz : set of 1..10;
	num : integer;
BEGIN
	halmaz := [3, 4];
	halmaz := [5]+halmaz;
	for num in halmaz do begin
		WriteLn(num);
	end;	
END.

String kezelés

A Pascal sztringekről

A Pascal karaktersorozatai a memóriában úgy tárolódnak, hogy a karaktersorozatot megelőzi annak hossza.

Ezzel szemben a C nyelvben nem a hosszát tároljuk, helyette a végét jelezzük egy NULL értékkel.

String típus úgy tudunk létrehozni, ha string kulcsszót használom a típus megadásnál:

var
    nev : string;
    varos : string;

Ilyenkor a memóriában egy 255 bájt hosszú string számára foglaltunk helyet. Amikor értéket adunk maximum 255 karaktert írhatunk az aposztrófok közé.

str := 'sokkarakter...';

Ha túllépem a maximális hosszt, akkor a fordító figyelmeztetést ad, a program persze ettől lefordul. Azok a karakterek amelyeknek nem volt hely foglalva azok elvesznek. Kiíratásnál már nem is látjuk őket a képernyőn.

A 255 bájt helyett kisebb helyet is foglalhatok a karaktersorozatok számára, ha szögletes zárójelben a string kulcsszó után megadom a maximális hosszt:

var
  nev : string[20];
  varos: string[50];

A SizeOf() függvénnyel lekérdezhetjük a lefoglalt memóriaterületet. Ha egy karaktersorozatnak lefoglalok öt helyet, a méret eggyel nagyobb lesz:

var
  str : string[5];
...
WriteLn(SizeOf(str));

A plusz egy bájt, a karaktersorozat előtti méret.

System unit

A System unitról

A System unitot nem szükséges a uses utasítással használatba venni, mivel ez a unit alapértelmezésként használva van. Ebben található a Write(), WriteLn() és a ReadLn() utasítás is.

Val

String számmá konvertálása

A Val() függvény szintaktikája:

procedure Val(
    const str: String;
    var szam;
    var kod: Word
);

A fenti szintaktikából látjuk, hogy a Val() függvénynek három paramétere van. Az első paraméter egy bemenő adat, a string, amit átkonvertálunk számmá. A második és harmadik paraméterben egy-egy számot kapunk értékül.

A második paraméterben a magát a számot kapjuk meg. A második paraméter lehet Longint, Real és Byte vagy valamilyen felsorolt típus.

A harmadik paraméterben beírt változóban hibakódot kapjuk meg, ha gond volt a konvertálással. Ha konvertálás hiba nélkül megtörtént, akkor a hibakód 0.

szamStr : String;
szam, kod : integer;
...
szamStr := '48';
Val(szamStr, szam, kod);
WriteLn('Dupla: ', szam * 2);

Str

A szám stringgé konvertálása

procedure Str(
    var X: TNumericType;
    var S: String
);

Pos

Adott string első előfordulási helyét adja visza

function Pos(
    const substr: shortstring;
    const s: shortstring
):SizeInt;

Copy

String adott pozíciójától, adott számú karaktert add vissza

function Copy(
    S: AStringType;
    Index: Integer;
    Count: Integer
):String;

Delete

String adott pozíciójától, adott számú karakter törlése

procedure Delete(
    var s: shortstring;
    index: SizeInt;
    count: SizeInt
);

StrUtils unit

Delchars

Egy adott karakter törlése a string összes előfordulási helyén:

main.pas
uses StrUtils;
var s : String = 'alma:körte:barack:szilva';
begin  
    s := Delchars(s, ':');  
end;

A fenti program törli a „:” karaktereket az s stringből.

Numb2USA

Egy számot tartalmazó stringben USA ezredeselválasztókat tesz:

main.pas
uses StrUtils;
var s : String = '1234567';
begin
    WriteLn(Numb2USA(s));
end;

NPos

Adott string n-dik előfordulását adja vissza

function NPos(
  const C: String;
  S: String;
  N: Integer
):Integer;

ExtractWord

Adott sorszámú szót adja vissza, a megadott stringből, a szóhatároló karaktereket harmadik paraméterként megadva.

type 
    TSysCharSet = set of Char;
var 
    s : String = 'Első:Második:Harmadik:Negyedik';
    dc : TSysCharSet;
begin
    dc := [':'];
    WriteLn(ExtractWord(3, s, dc);
end.

A fenti program a „Harmadik szöveget írja a képernyőre. A dc változó helyett írhattam volna a következő állandót is:

[':']

Értelemszerűen megadható több szóhatároló is:

[':',';']

A fenti esetben a ”:„ kettőspont és a ”;„ pontosvessző karakter is szóhatároló.

A függvény fejléce:

function ExtractWord(
  N: Integer;
  const S: String;
  const WordDelims: TSysCharSet
):String;

Copy2Space

Adott stringből olvasunk az első szóköz karakterig.

function Copy2Space(
  const S: String
):String;

Copy2Symb

Adott stringből olvasunk az első megadott karakterig

function Copy2Symb(
  const S: String;
  Symb: Char
):String;

WordCount

Szavak megszámolása egy stringben. Az elválasztó karaktert meg kell adnunk.

function WordCount(
  const S: String;
  const WordDelims: TSysCharSet
):Integer;

Eljárások

Az eljárások a főprogramtól különálló, önálló programrészek, csinálnak valamit, de nem adnak vissza értéket, a programban mindig a procedure szóval kezdjük.

Általánosan:

procedure fuggvenynev(paraméter1 : tipus; paramteren : tipus);
begin
    utasitasok;
end;

Példa:

procedure osszead(szam1, szam2: real);
begin
    WriteLn(szam1 + szam2);
end;

vagy:

procedure nevjegy();
begin
	WriteLn('Nagy János');
	WriteLn('Szolnok');
	WriteLn('Tel: +36 48 123-4567');
end;

Az eljárásokat a főprogram elé helyezzük el.

program01.pas
procedure nevjegy();
begin
	WriteLn('Nagy János');
end;
 
BEGIN
	nevjegy();	
END.

Ha a főprogramban van egy változó az hova kerül?

program01.pas
var a : byte;
 
procedure nevjegy();
begin
	WriteLn('Nagy János');
end;
 
BEGIN
	nevjegy();
	a := 35;
	WriteLn(a);
END.

Természetesen az eljárásnak lehet lokális saját változója.

program01.pas
var a : byte;
 
procedure nevjegy();
var kor : byte;
begin
	kor := 45;
	WriteLn('Nagy János');
	WriteLn(kor);
end;
 
BEGIN
	nevjegy();
	a := 35;
	WriteLn(a);
END.

Függvények

A függvények a főprogramtól különálló, önálló programrészek. A függvénynek az eljárással ellentétben mindig van egy visszatérési értéke.

function fuggvenynev(paraméter1 : tipus; paramteren : tipus):visszateres_tipusa;
begin
    utasitasok;
 
    fuggvenynev := visszateresietek;
end;

Példa:

function osszead(szam1, szam2: real): real;
begin
    osszead := szam1 + szam2;
end;

Fájlkezelés

System

Assign

Az operációs rendszer állományának összekötése egy pascal változóval

procedure Assign(
  var f: file;
  const Name: String
);

Append

Fájl megnyitása hozzáfűzésre

procedure Append(
  var t: Text
)

Close

Egy fájl bezárása

procedure Close(
  var f: file
);

EOF

A függvény a igazzal tér vissza, ha elértük a fájlvégét

function EOF(
  var f: file
):Boolean;
function EOF(
  var t: Text
):Boolean;

Reset

Fájl megnyitása olvasásra

procedure Reset(
  var f: file;
  l: LongInt
);
procedure Reset(
  var f: file
);
procedure Reset(
  var f: TypedFile
);
procedure Reset(
  var t: Text
);

Rewrite

Állomány megnyitása írásra

procedure Rewrite(
  var f: file;
  l: LongInt
);
procedure Rewrite(
  var f: file
);
procedure Rewrite(
  var f: TypedFile
);
procedure Rewrite(
  var t: Text
);

SysUtils

FileExists

Az állomány létezésének ellenőrzése

function FileExists(
  const FileName: String
):Boolean

DiskFree

A háttértáron található szabadhely

function DiskFree(
  drive: Byte
):Int64;

A függvénynek egy szám paramétere van, amely a kívánt meghajtó száma.

  • 0 az aktuális meghatjó
  • 1 az első floppy meghajtó
  • 2 a második floppy meghajtó
  • 3 az első merevlemez partíció
  • 4-26 az összes több meghajtó és partíció

Fájlkezelés példa

Szöveges fájlok kezelése

Fájlba írás:

var
    f : text;
begin
    Assign(f, 'adat.txt');
    ReWrite(f);
    WriteLn(f, 'alma');
    WriteLn(f, 'körte');
    Close(f);
end.

A példában az adat.txt fájlba írjuk az alma és a körte szavakat.

Olvasás fájlból:

var
    f : text;
    sor : String;
begin
    Assign(f, 'adat.txt');
    Reset(f);
    ReadLn(f, sor);
    WriteLn(sor);
    ReadLn(f, sor);
    WriteLn(sor);
    Close(f);
end.

A példában az adat.txt fájlt megnyitjuk olvasásra, majd a

Saját típus

A type kulcsszó után saját típusokat vehetünk fel. A létrehozott saját típusok a var kulcsszó után hagyományos módon használhatók.

main.pas
type 
    TEgesz = integer;
    TNagyEgesz = LongInt;
    TSzoveg = String;
var
    szam : TEgesz;
    i, j : TEgesz;
    nagyszam : TNagyEgesz;
    nev : TSzoveg;
begin
    nev := 'Pék Elemér';
    i := 1;
    j := 0;
    szam := 2;
    nagyszam := 300000;
end.

A példában egy TEgesz, egy tNagyEgesz és egy TSzoveg nevű típust deklarálunk rendre. A var kulcsszó után ezeket úgy használjuk, mint a normál típusokat.

Rekord típus

type
    Tszemely = record
        nev : String;
        tel : String;
        cim : String;
        fiz : LongInt;
    end;
var
    szemely : Tszemely;
begin
    szemely.nev := 'Nagy Elemér';
    szemely.tel := 'Szolnok';
    szemely.cim := 'Tél u. 3.';
    szemely.fiz := 350000;  
end.

A rekordot nem változónak, hanem típusnak deklaráljuk. Az új típusunk neve Tszemely. Ezek után deklarálhatok egy szemely nevű változót, amelynek Tszemely a típusa. Használata pedig úgy lehetséges, ahogy szimpla rekord használata is.

Tömb típus

type
    Ttomb = array [1..5] of integer;
var
    tomb : Ttomb;
begin
    tomb[1] := 35;
    tomb[2] := 47;
    tomb[3] := 87;
end.

A tömböt először egy saját típusként deklarálom a type kulcsszó után, a típus neve Ttomb. Ezt követően hozok létre egy tomb nevű változót, amelyet a saját tömb típusunkkal deklarálunk. Ezek után a tomb nevű változó ugyanúgy használható, mint a fentebb használtuk a tömböket.

Rekord tömbként, saját típussal

type
    Tszemely = record
        nev : String;
        tel : String;
        cim : String;
        fiz : LongInt;
    end;
    Tszemelyek = array[1..5] of Tszemely;
var
    szemely : Tszemelyek;
begin
    szemely[1].nev := 'Nagy Elemér';
    szemely[1].tel := 'Szolnok';
    szemely[1].cim := 'Tél u. 3.';
    szemely[1].fiz := 350000;  
 
    szemely[2].nev := 'Tér Béla';
    szemely[2].tel := 'Debrecen';
    szemely[2].cim := 'Nyár u. 45.';
    szemely[2].fiz := 450000;  
end.

A fenti példában deklarálunk egy Tszemely nevű rekordtípust. A Tszemelyek nevű tömb típus pedig Tszemely típusú rekordokat tartalmazhat, konkrétan 5-öt. A var részben a szemely változó ezek után egy tömböt deklarál. A tömbben öt személy adatait tudjuk eltárolni. A példában két személy adatait vettem fel.

Dátum

main.pas
uses dos;
var
    year, month, mday, wday : word;
begin  
    GetDate(year, month, mday, wday);
    WriteLn(year, ' ', month,' ',mday, ' ' , wday);
end.
 
 
uses SysUtils;
begin
    WriteLn(DateTimeToStr(Now));
end.
main.pas
uses Dos;
const
    NapStr:array[0..6] of string[3]=('Hétfő','Kedd','Szerda','Csütörtök','Péntek','Szombat','Vasárnap');
    HonapStr:array[1..12] of string[3]=('Jan','Feb','Mar','Ápr','Máj','Jún',
                                      'Júl','Aug','Szept','Okt','Nov','Dec');
var
    Ev,Honap,Nap,HetNapja : word;
begin
    GetDate(Ev,Honap,Nap,HetNapja);
    WriteLn(NapStr[HetNapja],', ',Nap,' ',HonapStr[Honap],' ',Ev,'.');
end.

Hang generálása

Windows XP alatt a különböző hangok generálására a wincrt unit utasításai adnak lehetőséget.

main.pas
uses wincrt;
begin
    Sound(800);
    delay(5);
    nosound;
end.

Könyvtárkezelés

Az aktuális könyvtár kiíratása

main.pas
var
    s : string;
begin
   GetDir(0,s);
   WriteLn(s);
end.

Az aktuális könyvtár kiíratása a SysUtils felhasználásával.

main.pas
uses SysUtils;
begin
    WriteLn(GetCurrentDir);
end.

Operációs rendszer eljárásai, függvényei

  • Chdir – A munkakönyvtár cseréje
  • Getdir – Az aktuális könyvtárral tér vissza
  • Halt – A program futás befejezése
  • Paramcount – A program hívásakor megadott paraméterek száma
  • Paramstr – A program hívásakor megadott paraméterek kinyerés
  • Mkdir – Könyvtár létrehozása
  • Rmdir – Könyvtár „Remove”
  • Runerror – A program megszakítása hibával
procedure getdir(drivenr: Byte;var dir: shortstring);
oktatas/programozas/pascal/pascal_nyelv.txt · Utolsó módosítás: 2019/08/22 09:48 szerkesztette: admin