Professional Documents
Culture Documents
FISKOLA
PREZENTCI
A C++ nyelv (146)
Vezettanr: goston Gyrgy
2004/2005
5. szemeszter
192 lap
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A vezettanr:
goston Gyrgy
tel: (1) 436-6556
e-mail: agoston@gdf-ri.hu
A GDF hivatalos honlapja:
www.gdf.hu
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Segdanyagok
Tantrgyi tmutat, tanknyv, prezentci, videofilm (2 kazetta: a
C nyelv s a C++ nyelv), pldaprogramok (a gyakorlatok s a videofilm anyaga) fjlban.
Kvetelmny: egy ktelez zrthelyi.
Jegy megszerzse: vizsgn vlaszthat nehzsg program rsa
(mdostsa) vagy otthon elksztett feladat bemutatsa.
A prezentci felptse:
1. A C nyelv
2. A C++ nyelv
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Bevezets
A C nyelv rvid trtnete
1969: UNIX opercis rendszer, Bell Laboratories
1970-74: Dennis Ritchie megtervezi a C nyelvet, s a UNIX-ot trjk C-re (BCPL 1963, B nyelv 1970).
1978, 1988: Kernighan&Ritchie: The C Programming Language
Azta a C npszer, hordozhat nyelv. Az ANSI C szabvnynak
(1989) minden modern C fordt megfelel, gy a C program
nincs gphez s opercis rendszerhez ktve.
1980-as vek vge: n az n. objektum-orientlt szemllet npszersge, megjelennek a C nyelv OO kiterjesztsei: C++,
Objective C.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Nhny C fejleszti
krnyezet
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A C elnyei
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
jsghirdetsek, 1999.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A C program alapszerkezete
/* C alapprogram */
#include <stdio.h>
int main(void)
{
printf("Hell vilg!\n");
return 0;
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Az alapvet vltoztpusok
(rvid ttekints)
egsz:
int i,j,k;
i=1; j=-5;
lebegpontos:
float f,g;
f=1.234;g=-4e4;
karakter:
char c,d;
c='A'; d='\n';
pointer (mutat):
int *p;
p=&i;
string:
char s[21];
char *t;
t="Szveg";
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Azonostk, vltozdeklarci
Minden vltozt hasznlat eltt deklarlni kell! A deklarci alakja:
tpus nv;
vagy
tpus nv1, nv2, nv3;
Plda: int a,b,c; Kezdrtk is: int a,b,c=0;
A vltoznv bett, szmot s "_"-t tartalmazhat, nem
kezddhet szmmal. Plda: char _hosszu2valtozo;
A kis- s nagybetk klnbznek, pldul:
float mas, MAS, Mas, mAs; /* 4 klnbz vltoz */
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Kifejezsek
Aritmetikai opertorok
Alapmveletek: + - * /
Ritka lehetsg magas
Negci: szint nyelvben! A ki Maradkos oszts: %
lp bitek elvesznek, a
msik oldalrl 0 jn be,
Plda: 11%4 3
azaz 2 hatvnyaival tu Bitenknti eltolsok: >> <<
dunk szorozni, illetve
Pl: 7<<2 28
lekerektve osztani.
35>>1 17
Plda sszetett aritm. kifejezsre: (-a+b)*(a%(c-12))
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Logikai opertorok
rtkk 1 vagy 0 (igaz vagy hamis), elgazsok s ciklusok feltteleiben hasznlatosak.
logikai tagads: !
Pl: !10 !01
egyenlsgvizsglat: == !=
Pl: 26==261 (igaz)
27!=270 (hamis)
relcik: < > <= >=
Pl: 5>8 0 (hamis)
2<=2 1 (igaz)
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
rtkad opertorok
A C-ben az rtkads is opertor, azaz kifejezsen bell
hasznlhat!
Az rtkadsok - mint kifejezsek - ltalban a vltoz j
rtkt adjk vissza. Plda: a=(b+5) kifejezs rtke b+5
lesz, s mellesleg az a vltoz is ennyi lesz.
rtkads: =
Pl: a=5; b=077; c=0xff;
/* dec,okt,hex */
sszetettebb plda:
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
rtkmdosts:
+= -= *= /= %= >>= <<=
Pl. a+=4 ugyanaz, mint a=a+4
c*=2 ugyanaz, mint c=c*2 , csak a kd gyorsabb lesz.
Nvels, cskkents: ++ -Pl. a++ hatsra az a rtke 1-gyel n.
Kt vltozat: a++ illetve ++a. A klnbsg: a mindenkppen
n eggyel, de a++ az a eredeti, ++a pedig az j rtkt jelenti!
A "--" hasonl mdon cskkenti a vltoz rtkt.
Pldul int a=5; utn:
b=a++ a-bl 6 lesz, b-bl 5 (postfixes alak)
b=++a mindkett 6 lesz (prefixes alak)
A C nyelv tmr, 1-1 utastssal egyszerre tbb
dolgot vgezhetnk el!
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Egyb opertorok
* & (lsd majd a mutatknl)
Bitenknti s, vagy, kizr vagy, negls: & | ^ ~
Pl. 6&3 2
6=110
3=011
6|3 7
& 010
6^3 5
| 111
~6 -7
^ 101
2
7
5
~ 11111001 -7
Feltteles opertor:
f ? b : c rtke ha f igaz (<>0), akkor b, klnben c
Plda: a<b ? b : a rtke a s b nagyobbika
Felsorols opertor (vesszopertor): ,
kif1,kif2 hatsra kif1, majd kif2 kirtkeldik, az eredmny
kif2 lesz. Plda: (c=5),(c+1) eredmnye 6.
Plda: int x=6; x=(x=6,x==6); utn x=1 lesz!
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Precedencia
sszetett kifejezseknl a szmolsi sorrendet hatrozza meg,
zrjelezssel fellbrlhat.
Cskken sorrendben az opertorok precedencija:
1. !,++,--,- (negci, 2s komplemens), ~ (bitenknti negci, 1s komplemens), * (pointer), & (cmkpzs)
2. *,/,% (szorzs, oszts, maradkkpzs)
3. +,4. <<,>> (bitlptets)
5. <,<=,>,>=
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
6. ==,!=
7. & (bitenknti s - AND)
8. ^ (bitenknti kizr vagy - XOR)
9. | (bitenknti vagy - OR)
10. && (logikai s)
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Utastsok
Kifejezs utasts
Pl. c+6; is szablyos utasts, br semmi hatsa nincs.
Az rtkads is kifejezs, gy szablyos utasts, pl. a=c+6;
res utasts: ; (gyakran hasznljk ciklusok belsejben)
sszetett utasts (blokk)
Alakja:
A {} zrjelpr hasonl a Pascal
{
BEGIN..END-jhez, de a } eltti
deklarcik;
utols utastst is ;-vel le kell zrutastsok;
ni, a } utn viszont nem kell a ; !
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Feltteles utasts
Alakjai:
if(felttel) utasts;
if(felttel) ut1; else ut2;
Megjegyzsek:
Pascalban TILOS!
A felttel ktelezen zrjelben van.
Az utasts tbbnyire sszetett utasts, ilyenkor nem kell utna a ;
Plda: a s b nvekv sorrendbe rendezse
if(a>b)
A blokk belsejben ideig{
lenes vltozt deklarlunk!
int t;
t=b; b=a; a=t;
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
GYAKORI HIBA!
Az = s ==
mst jelent!
int x=2;
if(x==3) x+=1;
A megolds: els esetben x=4, a msodiknl x=2.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Ciklusok
Mindhrom esetben
kilps, ha a felttel
Alakja: while(felttel) utasts;
HAMIS!
Elltesztel ciklus.
Plda: faktorilis kiszmolsa (f n!):
While-ciklus
{ int f,i,n;
f=1;i=2;n=5;
while(i<=n) f*=i++; }
Do-ciklus
Alakja: do utasts; while(felttel);
Htultesztel ciklus, a ciklusmag legalbb egyszer vgrehajtdik. Ms nyelvek UNTIL ciklusaival ellenttben akkor r vget, ha felttel hamis!
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
For-ciklus
Alakja: for(kezdrtk;felttel;nvels) utasts;
Ugyanaz, mint:
kezdrtk;
while(felttel)
{ utasts;
nvels;
}
Vgtelen ciklusok:
for(;;) utasts;
while(1) utasts;
do utasts; while(1);
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Tpusok
A C szigoran tpusos nyelv: minden vltoz tpust deklarlni
kell.
Ilyenkor kezdrtk is megadhat. Plda: int i,j=1,k=2;
Egsz tpusok
1. signed (eljeles: -32768..32767, Borland C-ben default)
2. unsigned (0..65535), illetve short, int, long
Pl. unsigned long l;
sizeof opertor: az adott tpus mrett adja meg (byte)
sizeof(short)<=sizeof(int)<=sizeof(long)
pl. Turbo C++ : sizeof(int)2, sizeof(long)4
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
NINCS TLCSORDULS-ELLENRZS!
Pl. az int i=32767+1; hatsra i rtke -32768 lesz (feltve,
hogy sizeof(int)=2).
Lebegpontos tpusok
1. float
2. double
3. long double
sizeof(float)<=sizeof(double)<=sizeof(long double)
Automatikus tpuskonverzik
Vegyes tpus kifejezseknl alkalmazza a C fordt.
Pl. 1+5.6 1.0+5.6 6.6
Lnyeg: a "pontatlanabb" konvertldik a "pontosabbra".
Explicit tpuskonverzi: int a; a=sqrt((double)25);
mert a ngyzetgyk fggvny
double tpus szmot vr
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Logikai tpus
A C az egsz tpust hasznlja logikai rtkek trolsra.
0 - hamis, minden ms - igaz.
Pl. if(1) x=5; az x=5 mindig vgrehajtdik
b=(a!=a+1); b rtke 1 lesz
Karakter tpus
Automatikusan egssz konvertldik.
Pl. 'A' ugyanaz, mint 65 (ASCII kd).
char c='0'; int i=c+5; szablyos rtkads
Eljeles s eljel nlkli vltozat:
signed char -128..127
unsigned char 0..255
Az alaprtelmezs fordtnknt vltoz!
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Felsorolsi tpus
Definilsa: enum nv {elem1,elem2,...};
Itt a } utn kell a pontosvessz!
Az "enum nv"-vel egy j tpust hoztunk ltre.
Ilyen tpus vltozk deklarlsa: enum
v1,v2,v3;
A felsorolt szimblumok egszknt kezelhetk:
elem1=0, elem2=1 stb.
Plda:
nv
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
a=kedd; b=a+2;
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Tmbk
Pl. int a[20];
20 elem egsz tmb: a[0],a[1],..,a[19]
A tmb mrete nem lehet vltoz!
Egydimenzis tmbk inicializlsa:
float f[]={1.0,3.14,2.71};
A tmb mrett ilyenkor magtl tudja.
Tbbdimenzis tmb:
char c[4][3][2];
c[0][1][2]='A';
Az elemek trolsa soronknt trtnik. Nincs indexhatr-ellenrzs!
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Struktrk
A struktra ms nyelvek rekordfogalmnak felel meg.
j struktra definilsa:
struct nv
{
tpus1 nv1;
tpus2 nv2;
...
};
Plda:
struct szemely
{
char nev[25];
int kor,labmeret;
};
Ilyen tpus vltozk deklarlsa:
struct szemely en;
en.labmeret=45;
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Uni
Tbbfle tpust kpes trolni. Formailag a struktrhoz hasonl, de a mezk ugyanazon a memriahelyen troldnak!
Plda:
union un
{
int i;
char s[2];
};
union un a;
a.i=0x7978;
Az a.i rtkadssal egytt a.s="xy" lesz!
Az uni a ms nyelvekben ltez varins rekordok ptlsa.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Tpusdefinci
typedef int suly; a suly egsz tpus lesz
suly s1,s2; s1,s2 egsz vltozk
typedef struct
{ char nev[25];
int kor,labmeret;
} szemely;
(A vgre kell az j nv!)
szemely en;
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Mutatk (pointerek)
A mutatk memriacmeket trolnak!
Minden tpushoz tartozik egy mutat tpus, amely az adott tpus vltozk cmeit kpes trolni.
Plda:
int *p;
p egy egsz vltoz cmt tartalmazhatja, "egy
egszre mutat". A p tpusa "int *".
*p a p ltal mutatott rtk (a fenti pldban egy egsz)
&a az a vltoz cme (& cmkpz opertor)
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Plda:
main()
{ char a,b;
char *p;
/* karakterre mutat */
a='a'; p=&a; b=*p+1; }
Vgrehajtsa utn b rtke 'b' lesz.
Plda: vltoz trsa (pointer+explicit tpuskonverzi):
int x=10; *(int*)&x=20;
/* x=20 lesz! */
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
*(a+1) *(a+2)
a[1]
a[2]
a+1
a+2
a+3
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Pointer-aritmetika
A pointerhez hozzadhat egy k egsz, az eredmny
olyan pointer, amely k-val "arrbb" mutat a memriban
(lsd elz bra).
Plda:
int a[5]={10,20,30,40,50};
int *p=a;
p+=4; --p;
Eredmnye: p az a tmb a[3] elemre mutat (*p=40).
Figyelem! Az a mint pointer hasznlhat, de nem mdosthat, pl. ++a hibt eredmnyezne!
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Stringek
String: karaktertmb, 0 rtk bjttal ('\0')lezrva
('\0' != '0').
Pl. char s[]="Szveg"; egy 7 elem tmb lesz,
s[0]='S', s[6]='\0'
Vigyzat! A fenti s-sel s="j szveg"; hibt adna,
mert az s-et mint mutatt akarn trni!
Plda: az albbi program kirja: Hello Hello
#include <stdio.h>
#include <string.h>
int main(void)
{ char s[10]; char *str="Hello";
strcpy(s,str); printf("%s %s\n",s,str);
return 0; }
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Fggvnyek
Ms nyelvekhez hasonlan a fggvnyek paramterezhetk.
A fggvnydefinci ltalnos alakja:
tpus nv(tp1 par1, ...)
{
vltozdeklarcik;
utastsok;
}
tpus: a visszatrsi rtk tpusa
nv: az j fggvny neve
tpi pari: az i. formlis paramter tpusa s neve
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Hvsa:
int main(void)
{
char s[]="Bann";
int l=hossz(s);
}
Ekkor l rtke 5 lesz.
A fggvny rtkt nem ktelez felhasznlni.
Vagy: return nem ad vissza rtket.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Eljrsok
C eljrs: olyan fggvny, amelynek nincs visszatrsi rtke. Ennek kezelsre "res" tpus: void.
void nv(paramterek)
{
...
}
Az eljrsban nincs szksg return utastsra. Ha mgis
hasznljuk, akkor nincs paramtere.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Specilis fggvny a main. rtke int vagy void, egyszer esetben nincs paramtere. Ez a fggvny a fprogram
futtatsakor indul el. Ha lefutott, akkor a program is vget
r. A main rtkt az opercis rendszernek adja vissza.
Deklarci s definci
Deklar: megadja a fv. rtknek s paramtereinek tpust
Fggvny-definci: megadja, hogy a fv. mit csinljon
Az eddigi pldkban mindkett szerepelt. Csak deklarci
is lehetsges, pl: int hossz(char*);
Puszta deklarci utn is mr hvhat a fggvny. A deklarci haszna: modularitsnl.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A paramtertads rszletei
Hvskor a formlis paramterekbe bemsoldnak az aktulis paramterek rtkei, majd a fggvnytrzs - a formlis paramtereket hasznlva - vgrehajtdik. Az aktulis
paramtereket a fggvny nem mdostja (rtk szerinti
tads)!
Plda:
void duplaz(int i)
{
i*=2;
}
Ekkor int a=6; duplaz(a); hatsra a rtke 6 marad!
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
/* a=12 */
(cm szerint ad t)
A tmbvltoz valjban pointer, gy pl. ha a fggvny karaktertmbt vr, akkor a formlis paramter tpusaknt
char *s s char s[] is adhat (a mret nem kell).
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Adatbevitel s kivitel
A szkebb rtelemben vett C nyelv nem tartalmaz ki- s
bemeneti mveleteket. Az n. standard knyvtrakban tallhatk ilyen fggvnyek. A standard knyvtrak hasznlatt kzlnnk kell a C fordtval: a knyvtr fggvnyeit
deklarl fjlt be kell olvasnunk; erre j a #include direktva.
Pldul a standard I/O fggvnyek hasznlathoz az
#include <stdio.h>
sort kell forrsprogramunk elejn elhelyezni.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A printf tulajdonsgai:
Tetszleges argumentumszm fggvny,
az els paramtere string, benne
norml karakterek
%-kal kezdd formtumspecifikcik,
a tovbbi paramterek a kirand adatok, mindegyiknek
megfelel egy formtumspecifikci.
A formtumspecifikcik szma s tpusa meg kell feleljen a tovbbi paramtereknek, a C sz nlkl elfogadja a
hibs megadst is!
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A megadhat formtumok:
%d - eljeles egsz
%i - eljeles egsz
%o - eljeltelen oktlis egsz
%x,X - hexadecimlis egsz
%u - eljeltelen egsz
%c - karakter
%s - string (char *)
%f - double
%e,E - double, exponencilis alakban
%g,G - double, mretfgg alakban
%p - pointer
%% - a "%" karakter
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
4
+4
%f
%e
%10f
%8.3f
3.141593
3.141593e00
3.141593
+3.142
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A tovbbi paramterek a vltozk cmei (mutatk), ahova az adatokat beolvassuk, mindegyiknek megfelel egy
formtumspecifikci.
A formtumspecifikcik szma s tpusa meg kell feleljen a tovbbi paramtereknek, a C sz nlkl elfogadja a
hibs megadst is!
A megadhat formtumok:
%d - eljeles decimlis egsz
%o - eljeltelen oktlis egsz
%x,X - hexadecimlis egsz
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
%u - eljeltelen egsz
%c - karakter
%s - string (char *)
%f,e,g - lebegpontos szm
%p - pointer
[...] [^...] - illeszkedsi halmaz/ellentte (char*)
A % s a bet kz rhat mg h vagy l bet, ha short vagy
long szmot akarunk beolvasni.
A scanf fggvny visszatrsi rtke a sikeresen beolvasott
adatok szma. Ez hibakezelsre felhasznlhat. Ha egy adatot nem tud beolvasni, az stdin-ben marad (fflush!).
Varici: sscanf stringbl olvas be vltozkba
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
while((c=getchar()),c!=EOF)
{
if(c>='a' && c<='z')
c+='A'-'a';
vesszopertor, az utols (2.)
putchar(c);
tag eredmnyt kapja
}
meg a while
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Fjlkezels
Egy httrtron tallhat fjl kezelshez elszr meg kell
nyitni. Egyszerre tbb fjl is kezelhet, ezrt azonostani
kell tudni ket. Ehhez elre definilt a FILE tpus. A fjlokra majd FILE * pointerekkel hivatkozunk.
Fjl megnyitsa
FILE *fopen(char *nev,char *mod);
nev a megnyitand fjl neve, szksg esetn elrsi tvonallal
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Fjl lezrsa
int fclose(FILE *f); hiba esetn EOF-ot ad viszsza
Az eddigi ki- s bemeneti fggvnyek fjlkezel megfeleli:
int fprintf(FILE *f, char *s, ...);
int fscanf(FILE *f, char *s, ...);
int getc(FILE *f);
int putc(int c, FILE *f);
char *fgets(char *s, int n, FILE *f);
int fputs(char *s, FILE *f);
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
ahol:
argc a paramterek szma+1 (azaz rtke legalbb 1)
argv stringek tmbje:
argv[0] a program neve teljes elrsi ttal (mindig ltezik)
argv[1]..argv[argc-1] a program indtsakor a parancssorban kiadott paramterek (elvlaszts a szkzk mentn; vgkn "\0")
argv[argc] egy NULL pointer
env szintn stringek tmbje, benne az n. krnyezeti
vltozk rtkei (comspec, path, prompt stb.).
A main fggvny visszatrsi rtke (pl. return 0;) a
DOS errorlevel vltozjval krdezhet le.
A legrvidebb C program (semmit nem csinl): main() {}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
(Enter)
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *f; int c;
if(argc!=2)
{
fprintf(stderr, "A program egy fjl"
"nevet vr paramterknt!\n\a");
return 1;
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
f=fopen(argv[1],"rt");
if(f==NULL)
{
fprintf(stderr,"A %s fjlt nem sike"
"rlt megnyitni!\n\a",argv[1]);
return 1;
}
while(c=getc(f),c!=EOF) putchar(c);
fclose(f);
return 0;
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Modularits
Egy program tbb fordtsi egysgbl (modulbl) llhat.
Ezek kln-kln lefordthatk, de mg nem futtathatk. A
lefordtott egysgeket ssze kell szerkeszteni ("linkelni"),
gy ll el a futtathat program.
Egy (rsz)program lefordthatsgnak felttelei:
szintaktikailag helyes legyen
valamennyi felhasznlt fggvny deklarlva legyen
(nem kell definilni!)
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Sajt moduljainkhoz is clszer egy n. fejlcfjlt kszteni, amelyik csak a ms modulok ltal hasznlt fggvnyek
deklarciit tartalmazza.
A C programfjlok szoksos kiterjesztse:
".c" a defincikat tartalmaz fjlnl
".h" a fejlcfjlnl
Tbb program sszeszerkesztse
IDE-bl PROJECT-tel: Project - Open Project, forrsfjlok megadsa stb. A vgn ne felejtsk el: Close Project!
parancssorbl: C:\>bcc prog1.c prog2.c
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
makrdefinils:
pl. #define MAX(a,b) ((a)>(b) ? (a) : (b))
Fordts sorn a makrban definilt utastssor forrskd szinten helyettestdik be a forrsprogram adott
helyre.
Plda: a
z=MAX(x,y);
sor kifejtse:
z=((x)>(y) ? (x) : (y));
Mindegyik esetben az #include... egy soros, a \ jel segtsgvel fzhetnk tbb sort egybe.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Biztonsgosabb fjlkezels
A C fjlkezel knyvtri fggvnyei sikertelen vgrehajts esetn - pl. nem ltez fjlt akarunk olvassra megnyitni - a hibt
valamilyen specilis visszatrsi rtkkel vagy paramterrel
jelzi (pl. NULL-pointer). Ha ezt nem kezeljk le, a program hiba
esetn sz nlkl tovbbfut, de persze nem mkdik helyesen.
Ha el akarjuk kerlni, hogy minden egyes fjlkezel mvelet
utn feltteles elgazssal ellenrizzk, hogy volt-e hiba, akkor
hasznos lehet egy olyan modult rni, amelyben minden fjlkezel fggvny gy van megrva, hogy meghvja az eredeti fggvnyt s hiba esetn hibazenettel lell. Ezt a modult hasznlhatjuk aztn a programjainkban a standard fggvnyek helyett.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Dinamikus memriahasznlat
Helyfoglals a heap-ben
void *malloc(meret);
A mret bjtban rtend. Visszatrsi rtke az j lefoglalt blokkra
mutat pointer, vagy NULL, ha nincs elegend hely, vagy a mretnek
nullt adtunk.
Lefoglalt hely felszabadtsa
void free(void *blokknev);
Egyb fggvnyek
allocmem, coreleft, freemem, calloc, realloc,
farmalloc, farfree, far...
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
<stdio.h>
<string.h>
<alloc.h>
<process.h>
int main(void)
{
char *str;
if ((str = (char *) malloc(10)) == NULL)
{ printf("Nincs elg memria!\a\n");
exit(1); }
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
strcpy(str,"Hello");
printf("A szveg: %s\n",str);
free(str);
return 0;
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
break;
case 'd':
d=va_arg(ap,int);
printf("int %d\n",d);
break;
case 'c':
c=va_arg(ap,char);
printf("char %c\n",c);
break; }
va_end(ap); }
A program kirja:
char A
int 1
int 25
string Valami szveg
int 1
int 2
int 3
string Ngy
string t
void main(void)
{ vfg("cdds",'A',1,25,"Valami szveg");
vfg("dddss",1,2,3,"Ngy","t");
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
fflush(stdin);
}
while((scanf("%ld",&szam)!=1)||(szam<1));
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
for(i=2;i<=szam/2;i++)
if(szam%i==0)
{
oszto=i;
break;
}
printf("A(z) %ld%s prm!\n",szam,
(oszto ? " nem" : ""));
if(oszto) printf("Legkisebb osztja: %ld\n",
oszto);
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
/* fv. deklarci */
main()
{
int x,y;
clrscr();
printf("Krek kt szmot vesszvel "
"elvlasztva: ");
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
if(scanf("%d,%d",&x,&y)!=2)
printf("Hiba!\a"); else
printf("lnko(%d,%d)=%d",x,y,Lnko(x,y));
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
printf("%s %s %s\n",szoveg1,szoveg2,
szoveg3);
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
#endif
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
/* az exit-hez kell */
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A C++ NYELV
Bevezets
A C++ nyelv kialakulsa:
Objektumorientlt (OO) programozsi szemllet; OO programozsi nyelvek (Simula-67, Smalltalk).
Az OO nyelvek lassak voltak. A 80-as vekben clul tztk
ki a C nyelv OO bvtst, a hatkonysg megtartsa mellett.
Bjarne Stroustrup a 80-as vek kzepn megalkotta a C++
nyelvet.
(A C nyelv egy msik OO bvtse: Objective C.)
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
j tpusmdost kulcsszavak
Konstans vltoz megadsa: const (ANSI C)
int i=3; i=i+4; // rendben
de
const int i=3; i=i+4; // fordtsi hiba!
Hasonlan const float f, const char *s stb.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Hatskr-opertor: "::"
int n;
void main() {
int n;
n=4; }
A fenti programban egy globlis s egy loklis n egsz vltoz szerepel. Ez szablyos; az n=4 rtkads a loklis nre rvnyes, a loklis vltoz "elfedi" az azonos nev globlist.
s ha mi mgis a globlis n-et akarjuk hasznlni?
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Az iostream knyvtr
Kimenet-bemenet: a C-ben a stdio knyvtr scanf,
printf fggvnycsaldot hasznlhattuk. Emlkeztetknt
az i egsz szm kirsa soremelssel:
printf("%d\n", i);
Htrny: a kirand illetve beolvasand vltozknak megfelel tpusokat neknk kellett a formtumszvegbe %jellel megadni. Ha nem a megfelel szm vagy tpus
formtumot adtuk meg, a program akr el is szllhatott.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Szabadabb vltozdeklarcik
A vltozknak deklarcikor rgtn kezdrtk is adhat (ANSI C):
float r=4.51;
A deklarcik nem csak blokk elejn helyezkedhetnek el:
{
int i;
cin >> i;
int j=i*i;
//!!!
cout << i << " ngyzete " << j << "\n";
}
A megjellt sor C-ben hibt adna, mert a j vltozt a blokk elejn kellene deklarlni, nem a cin... sor utn.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Dinamikus memriakezels
Emlkeztet: tmb mrete nem lehet vltoz.
int a=5;
char t[a];
// hibs!
// helyes
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A new tipus[meret] ugyanezt csinlja, csak meret darab objektumnak foglal helyet a memriban.
Az gy, "kzileg" lefoglalt memriaterleteket kzileg is
kell felszabadtani, amikor mr nincs rjuk szksgnk.
Erre j a delete (tmb esetn a delete[]) opertor.
{
int i;
// i-t hasznljuk
...
} // a blokk vgn i lete vget r, a me// mriaterlete automatikusan felszabadul
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Ugyanez dinamikusan:
{
int *ip;
ip=new int;
...
delete ip;
// *ip-t hasznljuk
// mi magunk szabadtjuk fel
// a memrit
Tmbbel:
{
int *ip; int n=15;
ip=new int[n];
...
delete[] ip; }
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Alaprtelmezett paramterek
A fggvnyek fejben felsorolt paramtereknek konstans
alaprtelmezst adhatunk. Hvskor - ha az alaprtelmezs
megfelel - a paramtert nem kell megadnunk. Pldul:
int novel(int mit, int mennyivel=1)
{
return mit+mennyivel;
}
Hvsa: novel(6,3) 9, novel(6) 7
Ha egy paramternek alaprtelmezst adunk, akkor az szszes utna kvetkezvel is ezt kell tennnk.
Rossz: void fv(int a, int b=1, char c);
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Fggvnytlterhels (overloading)
Pldul
void fv(int a, char b);
void fv(char *s);
Ez C-ben hiba, mert az fv fggvnyt kt klnbz mdon
adtuk meg. C++-ban ez szablyos.
fv(5,'q'); // az els defincit hasznlja
// a fordtprogram
fv("abc"); // a msodikat hasznlja
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Objektumok
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Mi az aut?
A mszaki szakember szempontjbl: egy csom alkatrsz.
A vezet szempontjbl: olyan eszkz, amellyel menni lehet: a gzpedllal gyorsthatunk, a fkkel lassthatunk, a
kormnnyal kormnyozhatunk.
Nagy elnye az autnak, hogy a vezetnek nem kell tisztban lennie az aut mkdsvel.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Mveletek
gzt_ad()
fkez()
balra()
jobbra()
sebessg()
hely_x()
Bels llapot
hely_y()
irny_x()
motor
irny_y()
tengelykapcsol
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Auto a;
while(a.sebesseg()<80) a.gazt_ad();
A fenti rvid programot az is meg tudja rni, aki nem
ismeri az Auto osztly megvalstst.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Osztlyok
A C struktrkhoz hasonl szintaxissal adhatk meg a
C++ osztlyok.
struct rek
{
int a;
float f;
};
rek r;
r.a=3;
// rek tpus
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Ugyangy:
class rec {
int a;
float f;
};
rec p;
// rec tpus
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
class cl
{
int a;
public:
int b;
private:
int c;
};
cl v;
v.a=1; v.b=2; v.c=3;
Csak a kzps rtkads szablyos, a tbbi hibt ad!
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Kovacs.nev="Kovcs Ilona";
Kovacs.kor=43;
Szabo.nev="Szab Jnos";
Szabo.kor=25;
cout << "Kovacs neve: "
<< Kovacs.nev
<< ", kora: " <<
Kovacs.kor << "\n";
cout << "Szabo neve: "
<< Szabo.nev
<< ", kora: " <<
Szabo.kor << "\n"; }
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Metdusok
Az osztlyban nemcsak adatokat, hanem fggvnyeket
(n. metdusokat) is megadhatunk.
class ember {
public:
char *nev;
int kor;
void kiir();
};
void ember::kiir()
{
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Megjegyzsek:
Az osztlydefinciban a fggvnynek csak a fejt adtuk
meg.
A metdus (fggvny) tnyleges megvalstsakor a
neve el rjuk az osztlynevet s egy "::"-ot.
A metdus megvalstsban az osztly vltozira szabadon hivatkozhatunk.
A metdust objektum.metodus(param...) alakban
hvjuk meg.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
if(seb>120) seb=120;
}
void Auto::fekez()
{
seb=seb-10;
if(seb<0) seb=0;
}
float Auto::sebesseg()
{
return seb;
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Konstruktorok
Auto a;
cout << a.sebesseg();
A fenti sor vletlenszer eredmnyt fog kirni, mivel a
sebessg nincs inicializlva.
Az osztlynak adhat egy specilis metdus, az n.
konstruktor; ennek neve megegyezik az osztly nevvel, visszatrsi rtke nincs, s az objektum ltrejttekor automatikusan vgrehajtdik.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Pl.
Auto::Auto(float kezdoseb)
{
seb=kezdoseb;
}
...
Auto a(30);
// egy j "a" aut,
// 30 km/h sebessggel
Megjegyzs: a fggvnytlterhels lehetsge itt is fennll, teht egy osztlyhoz tbb, klnbz
paramterezs konstruktor is tartozhat.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Destruktor
A konstruktor "ellentte", az objektum megsemmislsekor hvdik meg automatikusan. Clja a "rendraks".
A destruktormetdus neve: egy ~ jel utn az osztly neve.
Paramtere nincs.
Pl.
Auto::~Auto()
{
seb=0;
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Auto *ap;
ap=new auto(10);
ap->gaz();
cout << ap->sebesseg();
delete ap;
A -> opertort osztlyra (vagy struktrra) mutat pointereknl hasznljuk. Jelentse: a->b ugyanaz, mint (*a).b
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
rklds
Az OO programnyelvek ereje akkor mutatkozik meg, amikor egy mr megoldott feladathoz hasonlt kell megoldani.
Az OO programozs tmogatja a meglv kd jrafelhasznlst (vagyis hogy ugyanazt a kdot ne kelljen tbbszr
megrnunk).
A "hasonlsg" egy gyakori esete a specializci.
Plda: Kutya osztly
"Definci": A kutynak ngy lba van s ugat.
Valjban ezt gy rtjk, hogy a kutya olyan emls (esetleg ragadoz), amelynek ngy lba van s ugat. Ezrt az
emls ltalnos tulajdonsgait kln nem soroljuk fel.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
brzolsa:
A kutya osztly dobozban nem rjuk ki
kln az emls jellemzit; azok megltt az rkldst
jelz nyl fejezi ki.
Emls
mret
sly
megy()
eszik()
Osztlynv
Adattagok
Metdusok
Kutya
lbszm
hanger
ugat()
harap()
rkls
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A C++ definci:
class Emlos {
public:
Emlos(float mer, float su);
float merete();
float sulya();
void megy();
void eszik();
private:
float meret;
float suly;
};
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Plda:
class A {
public:
void metodus();
protected:
int adat1;
int get_adat2();
private:
int adat2;
};
int get_adat2()
{ return adat2; }
class B : public A {
public:
void met();
};
void B::met()
{
cout << adat1; // szablyos
cout << adat2; // ROSSZ!
cout << get_adat2(); // j
}
A obj;
cout << obj.adat1; // ROSSZ!
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
public
protected
private
osztlyleszrm.
mshol
metdusban metdusban
X
X
X
X
X
X
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Polimorfizmus
Hizlaljunk fel egy emlst legalbb 50 kilra!
void hizlal(Emlos& e)
{
while( e.sulya()<50 )
e.eszik();
}
Emlos eml(1,30);
hizlal(eml);
cout << eml.sulya();
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Szerencsre nem kell minden faj osztlyra kln definilni a fggvnyt. A C++-ban ugyanis egy A& tpus vltozba
nem csak A osztly objektumokat helyettesthetnk be,
hanem tetszleges A-bl szrmaz osztlyt is. Hasonlkppen egy A * pointer mutathat A-bl leszrmaz objektumra is.
Plda:
Emlos *ep;
ep=new Kutya(0.5, 10, 3);
ep->megy();
delete ep;
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Metdusok felldefinilsa
Az rkls sorn nem csak j adat- s metdus-tagokat
vehetnk fel, hanem a meglv metdusokat is felldefinilhatjuk.
void Emlos::eszik()
Pldul:
{ suly += 1; }
class Elefant : public
class Emlos {
Emlos { ...
...
void eszik();
void eszik();
... };
...
void Elefant::eszik()
};
{ suly += 10; }
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
gy mdostva mr a vrakozsunknak megfelelen mkdik a program. klszably: minden olyan metdus deklarcija el rjuk ki a virtual kulcsszt, amelyet vrhatan
a leszrmazott osztlyokban fell fogunk definilni.
Megjegyzs: a C++ a C nyelv OO bvtse. Az eleve objektum-orientltra tervezett "tiszta" OO nyelvekben a virtulissg az alaprtelmezs, gy ezt
nem kell kln kulcsszval jelezni:
void Elefant::eszik()
{
suly += 10;
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Az Emlos:: eltt fejezi ki, hogy nem az ppen most definilt elefntmetdust hvjuk, hanem az sosztly evmetdust. Gyakori, hogy felldefinilskor nem rjuk jra a teljes
metdust, hanem az sosztly metdust meghvjuk, s mg
valamit csinlunk.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Konstruktorok rkldse
class Emlos
{
public:
Emlos(float mer, float su);
...
};
class Kutya : public Emlos
{
public:
Kutya(float mer, float su, float hang);
... };
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A this pointer
A metdusdefincikban hasznlhatjuk a this vltozt, amely mindig az aktulis objektumra mutat. Valjban implicit mdon gyakran felhasznljuk:
adattag=ertek;
ugyanaz, mint
this->adattag=ertek;
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Tbbszrs rklds
rklssel nemcsak egy osztlyt bvthetnk, finomthatunk, hanem tbb osztly tulajdonsgait is egyesthetjk.
class Auto
{
public:
void gazt_ad();
void fekez();
float sebesseg();
protected:
float seb; };
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
class Raktar {
public:
void bepakol(Aru& a);
void kipakol();
int hely();
protected:
...
};
class Teherauto:
public Auto, public Raktar { };
Teherauto ifa; Aru a;
ifa.bepakol(a);
ifa.gazt_ad();
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A hagyomnyos programokban a programoz dnttte el, hogy hol s milyen mdon kr adatokat a felhasznltl. Ennek elnye a nagyobb szabadsg, htrnya viszont, hogy gyakran a program irnytja a
hasznljt, nem pedig fordtva. Msrszt szinte minden program ms megoldst hasznl az adatbevitelre,
gy a felhasznlnak nehezebb a dolga.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Az esemnyvezrelt rendszerekben, mint amilyen a Windows, a rendszer maga megoldja, hogy a felhasznl beavatkozsainak - az esemnyeknek - hatsra a megfelel
programrsz lefusson. A program lelke az esemnyciklus,
amelynek vza gy nzhet ki:
Esemeny e;
while(1) {
e=kovetkezo_esemeny();
dolgozd_fel(e);
}
Mivel ez a ciklus a rendszer rsze, a programjainkban nem
kell kln megrni.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A Windows programozsa
A Windows rendszer programozk szmra nyjt egy
knyvtrat, amely pl. C nyelven is elrhet. Ez azonban elg alacsony szint; egy res ablakot megjelent minimlis Windows program 2-3 kpernyoldal.
Ezrt erre a knyvtrra magasabb szint, knyelmesebb knyvtrakat ptettek. Az egyik ilyen a Borland
OWL-je (Object Window Library), amely C++ nyelven
hasznlhat s ersen objektumorientlt.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Mirt objektumorientlt?
Az ablakoz rendszerek egyik nagy elnye az egysgessg. Minden program hasonlan nz ki s hasonlan kezelhet. Pldul minden programablak mozgathat, tmretezhet. Ez arra emlkeztethet, mintha
lenne egy mozgathat, mretezhet osztly, s a
konkrt programok ezt hasznlnk fel, ezt tltenk
meg tartalommal.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Egy msik hierarchia az ablakok kzt szemmel is lthat: egy ablak jabb ablakokat tartalmazhat. Az ablak
"szlje" a benn lev "gyerekablakoknak".
Pldul a Borland C++ fejleszti krnyezete:
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Hogyan tovbb?
A TApplication osztly nmagban csak egy keret;
kzvetlen felhasznlsval csak a fentihez hasonl
"res"
programok
kszthetk.
Valjban
a
TApplication tele van olyan virtulis metdusokkal,
amelyek nem csinlnak semmit. rtelmes programot
gy rhatunk, ha a TApplication-bl rkltetnk
egy osztlyt, amelyben a megfelel metdusokat felldefiniljuk.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
SajatApp::SajatApp() : TApplication() {}
void SajatApp::InitMainWindow()
{
SetMainWindow(new TFrameWindow(NULL,
"Itt a program neve"));
}
int OwlMain(int argc, char *argv[])
{
SajatApp app;
return app.Run();
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
#include <owl\applicat.h>
#include <owl\framewin.h>
class SajatWin : public TWindow {
public:
SajatWin(TWindow *szulo=NULL);
protected:
void EvLButtonDown(UINT u, TPoint& p);
DECLARE_RESPONSE_TABLE(SajatWin);
};
DEFINE_RESPONSE_TABLE1(SajatWin, TWindow)
EV_WM_LBUTTONDOWN,
END_RESPONSE_TABLE;
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
SajatApp::SajatApp() : TApplication()
{ }
void SajatApp::InitMainWindow()
{
SetMainWindow(new TFrameWindow(NULL,
"Itt a program neve", new SajatWin));
}
int OwlMain(int argc, char *argv[])
{
SajatApp app;
return app.Run();
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
DEFINE_RESPONSE_TABLE1(SajatWin, TWindow)
EV_WM_LBUTTONDOWN,
END_RESPONSE_TABLE;
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
A Resource Workshop
Egy programnak jl elklntheten kt rsze van: egy bels mveletvgz rsz, amelynek felptse nem rdekli a
felhasznlt, s a felhasznli fellet, amelyen keresztl a
program hasznlja megadja a kvnsgait, s ahol az
eredmny megjelenik.
A felhasznli fellet elksztse nagy mrtkben automatizlhat. A Resource Workshop (Erforrs Mhely) segtsgvel szinte megrajzoljuk a felletet, a programszvegben nem kell a megjelentend mezk elhelyezkedsvel
foglalkoznunk; csak egy azonostval hivatkozunk a
Workshopban ltrehozott felletre.
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
void SajatApp::InitMainWindow()
{
SetMainWindow(
new TFrameWindow(
NULL,"Sebessg-tszmt",
new SajatDialog(0, DIALOGUS)));
}
int OwlMain(int argc, char *argv[])
{
SajatApp app;
return app.Run();
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
{
mph=new TEdit(this, MPH_EDIT);
kmh=new TEdit(this, KMH_EDIT);
}
protected:
TEdit *mph,*kmh;
void KmhConv();
void MphConv();
};
DECLARE_RESPONSE_TABLE(SajatDialog);
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
DEFINE_RESPONSE_TABLE1(SajatDialog, TDialog)
EV_COMMAND(KMH_CONV, KmhConv),
EV_COMMAND(MPH_CONV, MphConv),
END_RESPONSE_TABLE;
void SajatDialog::KmhConv()
{
char s[11];
kmh->GetLine(s, 10, 0);
float m=atof(s); sprintf(s, "%f", m/1.609);
mph->Clear(); mph->Insert(s);
}
Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola
void SajatDialog::MphConv()
{
char s[11];
mph->GetLine(s, 10, 0);
float m=atof(s); sprintf(s, "%f", m*1.609);
kmh->Clear(); kmh->Insert(s);
}