Professional Documents
Culture Documents
C Programozas Kozepiskolasoknak PDF
C Programozas Kozepiskolasoknak PDF
hu
C programozs kzpiskolsoknak
http://www.doksi.hu
Tartalomjegyzk
TARTALOMJEGYZK ...................................................................................................... 1
http://www.doksi.hu
2.13.1
File elksztse, lezrsa ..................................................................................... 33
2.13.2
Szveges llomnyok ............................................................................................. 34
2.13.3
Binris llomnyok ............................................................................................... 36
2.14 A SZVEGES KPERNY KEZELSE ................................................................................. 37
2.14.1
Szveges zemmdban gyakran hasznlt fggvnyek:.......................................... 37
2.14.2
Kperny mentse s vissztltse .......................................................................... 39
2.14.3
Nhny karaktert tesztel makr ........................................................................... 40
2.14.4
Karaktert talakt fggvnyek ............................................................................. 41
2.14.5
Nhny konverzis fggvny ................................................................................. 41
2.15 A GRAFIKA PROGRAMOZSA .......................................................................................... 41
2.15.1
Koordinta-rendszer ............................................................................................. 42
2.15.2
Grafika indtsa..................................................................................................... 42
2.15.3
Gyakran hasznlt fggvnyek................................................................................ 43
2.16 MAKRK ........................................................................................................................ 44
2.16.1
Fggvnyszer makrk .......................................................................................... 44
3
FELADATGYJTEMNY ............................................................................................... 47
http://www.doksi.hu
1.1
Az els C program
http://www.doksi.hu
1
2
Eljel nlkli
Eljeles
http://www.doksi.hu
rtkkszlet
-128..127
0..255
-32768..32767
0..65535
-2147483648..2147483647
0..4294967295
3.4e-38..3.8e+38
1.7e-308..1.7e+308
3.4e-4932..3.4e+4932
Mret
(byte)
1
1
2
2
4
4
4
8
10
Pontossg(
jegy)
6
15
19
A printf() fggvnyben a vltozkat csak gy tudjuk kiratni, hogy az idzjelek kztt % jel
utn megadjuk a vltoz tpust, a kirs formtumt majd az idzjelek utn vesszkkel
elvlasztva flsoroljuk a vltozk neveit. A gyakrabban hasznlt karaktereket a kvetkez
tblzatban soroltuk fl.:
%d
%u
%f
%c
%s
%e
decimlis egsz
eljel nlkli decimlis egsz
lebegpontos
karakter
sztirng vagy karakter tmb
dupla vals
float f1;
printf(%5.2f,f1);
Az f vals vltozt 5 mezre rja ki 2 tizedes pontossggal.
int v1,w=10;
printf(%*d,w,v1);
A * jelentse eben az esetben az, hogy a mezszlessget az idzjel utni els vltoz hatrozza
meg. Teht a fenti pldban a v1 egsz vltoz 10 szlessg mezre kerl kirsra.
Ha egy vltoz karakter tpus, akkor rtkt egyszeres idzjelek kztt kell megadnunk.
char betu;
betu=A;
Egsz tpus vltoznak adhatunk 16-os vagy 8-as szmrendszerbeli rtket is.
int okt, hex;
okt = 0567;
hex = 0x2ab4;
hex = 0X2AB4;
Minden vltoz esetn figyeljnk a kezdrtk megadsra. Ha ezt nem tesszk meg, a
vltoznak akkor is lesz kezdrtke, de biztosan nem olyan, amit mi szerettnk volna adni.
http://www.doksi.hu
\n
\t
\r
\f
\v
j sor
tabultor
kocsi vissza
soremels
fggleges tabultor
3.,4.,5.,6. feladat
1.4
Konstansok
http://www.doksi.hu
Itt az opertorokat a tpusuk szerint trgyaljuk, de emltst tesznk a msik kt szempontrl is.
1.5.1 Aritmetikai opertorok
A ngy alapmvelet, a szoksos szimblumokkal, valamint a maradkos oszts % jellel. A
mvelet az oszts maradkt adja vissza, termszetesen csak egsz tpus vltozk hasznlata
esetn alkalmazhat. A msik ngy mvelet mind egsz, mind vals operandusok esetn is
mkdik. Vigyzzunk a kvetkezhz hasonl esetekben.
int a=12,b=5;
float f;
f=a/b;
A programrszlet utn az f rtke a 2.000000 vals rtk lesz. Teht az eredmny tpust az
operandusok tpusa dnttte el.
A mveletek precedencija a matematikban megszokott.
1.5.2 sszehasonlt s logikai opertorok
Felttelekben s ciklusokban gyakran kell sszehasonltani klnbz rtkeket, ennek
elvgzsre a hasonlt opertorokat hasznljuk. Ezek a kvetkezk: <,>,<=,>=,==,!=. Ha
ezekkel kt vltozt vagy kifejezst hasonltunk ssze, akkor az eredmny int tpus lesz, s
rtke 1, ha a relci igaz, illetve 0, ha hamis.
A logikai kifejezsekben gyakran sszetett feltteleket is meg kell fogalmazni, erre szolglnak a
logikai opertorok. Ezek a kvetkezk: ! a tagads mvelete, egyoperandus. && logikai s, ||
logikai vagy mveletek. A mveletek precedencija a tblzatban.
1.5.3 Lptet opertorok
A vltoz rtknek eggyel val nvelsre, vagy cskkentsre szolglnak. Egyoperandus
mveletek. Postfix s prefix alakban is rhatk. ++ eggyel nveli, -- eggyel cskkenti a vltoz
rtkt. Ha egy kifejezsben csak egy vltoz szerepel, akkor mindegy, hogy postfixes, vagy
prefixes alakjt hasznljuk az opertoroknak. (a++ egyenrtk a ++a-val) Ha azonban egy
kifejezs kirtkelsben hasznljuk, akkor mr vatosabban kell bnni a kt alakkal.
int a=4,x,y;
x=++a;
y=a++;
A programrszletben az els rtkads eltt az a rtke 1-gyel n 5 lesz, ezt kapja az x vltoz,
teht annak rtke is 5 lesz, a msodik rtkadsban az y megkapja a pillanatnyi rtkt az tt,
majd az a rtke 1-gyel n, azaz 6 lesz. Az opertorok mind egsz, mind vals opertorokkal
mkdnek.
C-ben nem szoks az a=a+1 rtkads, helyette minden esetben a lptetst hasznljuk.
1.5.4 Bitmveletek
A mveletek operandusai csak char, short, int s long tpus eljel nlkli egszek lehetnek.
A mveletek els csoportja ktoperandus. ~ 1-es komplemens, & bitenknti s, | bitenknti
vagy, ^ bitenknti kizr VAGY. Ezeket a mveleteket leggyakrabban maszkolsra, vagy bitek
trlsre szoktuk hasznlni. A kizr VAGY rdekes tulajdonsga, hogy ha ugyanazt a maszkot
ktszer alkalmazzuk egy rtkre, akkor visszakapjuk az eredeti rtket.
http://www.doksi.hu
A mveletek msik csoportjba a biteltol mveletek tartoznak. << eltols balra, >> eltols
jobbra. A felszabadul pozcikba 0 kerl, a kilp bitek elvesznek. A mveletek kt
operandusak. a<<2 az a vltoz bitjeit 2-vel tolja balra. Nyilvnvalan az n bittel val balra
tols 2n-nel val szorzst, mg az n bittel val jobbra tols 2n-nel val egszosztst eredmnyez.
1.5.5 rtkad opertorok
Az rtkads trtnhet a ms nyelvekben megszokottak szerint.
a=rtk, vagy a=kifejezs formban
Van azonban olyan forma is, mely a hagyomnyos nyelvektl teljesen idegen.
b=2*(a=4)+5
Ebben az esetben az a s a b vltoz is kap rtket. Az rtkads opertor mindig jobbrl balra
rtkeldik ki, teht a kirtkels utn a fenti kifejezsben a rtke 4, b rtke pedig 13 lesz. A
kirtkels ilyen sorrendje miatt van az, hogy a C-ben az sszetett rtkads is mkdik.
a=b=c=0 rtkads utn mindhrom vltoz
rtke 0 lesz.
Van az rtkadsnak C-ben egy tmrebb
formja is. ltalnos alakban a kvetkezkppen
rhat le:
vltoz=vltoz op kifejezs helyett a vltoz
op=kifejezs
Ez a forma ltalban gyorsabb kdot s
ttekinthetbb listt eredmnyez. A C
programokban termszetesen mindkett forma
hasznlhat, de igyekezznk a msodikat
elnyben rszesteni. A mellkelt tblzatban
sszefoglaljuk ezeket a rvidtett rtkadsokat.
Hagyomnyos forma
Tmr forma
a=a+b
a+=b
a=a-b
a-=b
a=a*b
a*=b
a=a/b
a/=b
a=a%b
a%=b
a=a<<b
a<<=b
a=a>>b
a>>=b
a=a&b
a&=b
a=a|b
a|=b
a=a^b
a^=b
http://www.doksi.hu
1.5.8 Tpuskonverzik
A C-ben ktfajta tpuskonverzi ltezik, az implicit (automatikus) s az explicit. Az els a C
nyelvbe rgztett szablyok szerint trtnik a programoz beavatkozsa nlkl, a msodik pedig
a tpuskonverzis opertor segtsgvel. Ennek ltalnos alakja:
(tpusnv) kifejezs
Az implicit konverzival kapcsolatban elmondhatjuk, hogy ltalban a szkebb operandus
informcivesztesg nlkl konvertldik a szlesebb operandus tpusra.
int i,j;
float f,m;
m=i+f;
Ebben az esetben az i float-ra konvertldik.
j=i+f;
Itt viszont vigyznunk kell, mert adatveszts lp fel, az sszeg trtrsze elveszik.
Explicit konverzit kell vgrehajtanunk a kvetkez pldban, ha f-be nemcsak az egsz oszts
hnyadost szeretnnk betenni
int a = 12,b = 5;
float f;
f = (float) a / (float) b;
A kvetkez tblzatban sszefoglaltuk az emltett mveleteket precedencijuk szerint rendezve.
Valamint a kirtkels sorrendjt is megadtuk. A kirtkels sorrendje akkor kerl eltrbe, ha
egy kifejezsben egyenl precedencij opertorok szerepelnek zrjelezs nlkl
Opertor
Kirtkels sorrendje
! ~ - ++ -- & * (tpus)
*/%
+<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= <<= >>= &= |= ^=
Jobbrl balra
Balrl jobbra
Balrl jobbra
Balrl jobbra
Balrl jobbra
Balrl jobbra
Balrl jobbra
Balrl jobbra
Balrl jobbra
Balrl jobbra
Balrl jobbra
Jobbrl balra
Jobbrl balra
7.,8.,9. feladat
10
http://www.doksi.hu
1.6
Adatok beolvassa a billentyzetrl
A formzott adatbeolvasst a scanf fggvny segtsgvel tehetjk meg. A fggvny ltalnos
formja a kvetkez:
scanf(formtum, argumentumlista)
A scanf karaktereket olvas a billentyzetrl, majd a formtum alapjn rtelmezi azokat, ha a
beolvasott karakterek megfelelk, akkor konvertlja ket. Ha az input valamilyen ok miatt nem
felel meg a formtum elrsainak, akkor a scanf befejezi az olvasst, mg akkor is, ha az
argumentumlista szerint tovbbi karaktereket is be kellene olvasnia. A scanf fggvnynek
visszatrsi rtke is van. A sikeresen beolvasott adatok szmt adja vissza. Nzznk nhny
pldt a scanf hasznlatra.
int a ;
char c;
printf(Krek egy egsz szmot s egy bett);
scanf(%d%c,&a,&b)
A pldbl ltszik, hogy az egyszer adatokat cm szerint kell beolvasni. Az argumentumlistban
az &a s az &c a vltozk memriabeli cmre utal. A formtumban ugyanazokat a karaktereket
hasznlhatjuk, mint a printf esetben korbban tettk. Ez a sor egy szmot s egy karaktert olvas
be egyms utn, nem tesz kzjk semmilyen elvlaszt jelet. Nyilvn, ha egy scanf-fel tbb
rtket is akarunk beolvasni, akkor valamilyen hatrolra szksg van.
int a ;
char c;
printf(Krek egy egsz szmot s egy bett vesszvel elvlasztva);
scanf(%d,%c,&a,&b);
Figyeljk meg a vltoztatst. A formtumban egy vesszt tettnk a msodik % jel el. Ilyenkor a
scanf beolvassa a vesszt is, de azt nem trolja. Ilyen mdon brmilyen hatrol karaktereket
elrhatunk beolvasskor.
A scanf segtsgvel sztringeket is olvashatunk be. Ebben az esetben nem hasznljuk az &
opertort.
char sz[30];
scanf(%s,sz);
A scanf egy hasznos lehetsge, hogy az adatok szrst is lehetv teszi. Az elbbi deklarci
szerinti sz vltoz rtke csak szmjegy, vagy hexadecimlis jegy lehet, akkor azt a kvetkez
szrssel valsthatjuk meg:
scanf(%[0-9a-fA-F],sz)
A komplementer halmaz megadsra is van mdunk:
scanf(%[^0-9],sz)
Ezzel a szrssel csak betk kerlhetnek a sztringbe
10. feladat
1.7
Itercik
Mint minden magas szint programozsi nyelvben, a C-ben is vannak olyan utastsok, melyek
egy feltteltl fggen tbbszr is vgrehajtjk ugyanazt az utastst, vagy utasts blokkot. A
kvetkezkben ahol utastst runk helyettesthet utastsblokkal is. Utastsblokk:
{
11
http://www.doksi.hu
utasts1;
utasts2;
utastsn;
}
1.7.1 while ciklus
A while ciklus ltalnos alakja:
while (kifejezs)
Utasts
A ciklusmag utastsai addig hajtdnak vgre, amg a kifejezs rtke nem nulla. (Ez a logikai
igaznak felel meg, teht, ha a kifejezs egy logikai kifejezs, akkor itt a ciklusba lps felttelt
adjuk meg)
Nzznk egy pldt a while ciklusra. Adjuk ssze 1-tl n-ig a termszetes szmokat!
#include<stdio.h>
main()
{
long osszeg=0;
int i=1,n=2000;
printf(Az els %d egsz szm sszege: ,n);
while (i<=n)
{
osszeg+=i;
i++;
}
printf(%ld,osszeg);
}
A printf-ben lthat %ld-ben az l hossz (long) egszre utal.
A while ciklust gyakran szoktuk hasznlni arra, hogy egy bizonyos billenty letsre
vrakozzunk.
while((ch=getch()) !=27);
Az ESC billenty letsre vr
1.7.2 for ciklus
A for ciklust a leggyakrabban akkor hasznljuk, ha elre tudjuk, hogy egy utastst hnyszor
akarunk vgrehajtani. Az utasts ltalnos alakja egyszer formban a kvetkez lehet:
for (kifejezs1; kifejezs2; kifejezs3)
Utasts
A kifejezs1-ben lltjuk be a ciklusvltoz kezd rtkt, a kifejezs kettben a ciklusba val
lps felttelt, ez a leggyakrabban egy logikai kifejezs, a kifejezs3-ban pedig lptetjk a
ciklusvltozt.
Pldaknt rjuk t az elz programot for ciklust hasznlva.
#include<stdio.h>
12
http://www.doksi.hu
main()
{
long osszeg;
int i=1,n=2000;
for (i=1,osszeg=0;i<=n;i++)
osszeg+=i;
printf(Az els %d szm sszege: %ld,n,osszeg);
}
Figyeljk meg a for ciklus fejben a , opertort. Ezt a korbbiakban nem emltettk, szerepe az
hogy egy utastsban tbb kifejezst is elhelyezhetnk. Itt az osszeg=0 rtkads mg a
kifejezs1 rsze. Mivel a ciklus magja sszesen egy utastst tartalmaz, ezrt a fenti for ciklus
lnyegesen rvidebben is lerhat:
for (i=1,osszeg=0;i<=n;osszeg+=i++);
Itt felttlenl kell egy; az utasts vgre, ezzel jelezzk, hogy a for ciklus csak egy res utastst
tartalmaz. Vigyzzunk azonban, ha egy egyb utastsokat tartalmaz for ciklusban erre a helyre
tesznk, meglepdve tapasztalhatjuk, hogy a ciklusmag tbbi utastsa nem fog vgrehajtdni.
1.7.3 do-while ciklus
Ezt a ciklust igen ritkn hasznljuk. Minden programozsi feladat megoldhat az elz kt ciklus
alkalmazsval, van azonban nhny olyan feladat, mely rvidebb kdot eredmnyez, ha a dowhile ciklust hasznljuk. (Pl. a binris keress) A ciklus ltalnos alakja:
do
Utasts
while (kifejezs)
A ciklusba itt is addig lpnk, amg a kifejezs rtke nem 0, logikai kifejezs esetn amg a
kifejezs igaz. Alapveten abban klnbzik az elz kt ciklustl, hogy itt a ciklusmag
utastsa legalbb egyszer vgrehajtdik.
Nzzk a kvetkez pldt a do-while ciklusra. Bekrnk egy egsz szmot s kirjuk a
fordtottjt.
#include<stdio.h>
main()
{
int szam, jegy;
printf(Krek egy egsz szmot:);
scanf(%d,&szam);
printf(\nA fordtottja: );
do
{
jegy = szam % 10;
printf(%d,jegy);
szam /= 10;
} while ( szam != 0);
}
13
http://www.doksi.hu
1.8
Szelekcik
A C nyelvben hrom elgazs tpust hasznlhatunk. Az egyg (if szerkezet), a ktg (if-else
szerkezet) s a tbbg (switch szerkezet)
1.8.1 if utasts
Az utasts ltalnos alakja:
if (kifejezs)
utasts
Itt az utasts csak akkor hajtdik vgre, ha a kifejezs nem nulla. (IGAZ)
Pldaknt krjnk be egy vals rtket, de csak az ]1,10[ intervallumba es rtket fogadjuk el j
rtknek.
#include<stdio.h>
main()
{
float v;
printf(Krek egy vals szmot\n);
printf(1 s 10 kztt: );
scanf(%f,v);
if (v>1 && v< 10)
printf(J rtk!!);
}
14
http://www.doksi.hu
15
http://www.doksi.hu
Figyeljk meg, hogy minden vlaszts utn hasznltuk a break-et. A default utn nem
hasznltuk, de ha a switch elejn van, akkor ott is rdemes odafigyelni r.
14., 15., 16., 17., 18., 20. feladat
1.9
Tmbk
Az eddigiek sorn olyan vltozkat hasznltunk csak, melyek egy rtk trolsra voltak
alkalmasak. Gyakran van azonban szksgnk arra, hogy ugyanazzal a vltoznvvel tbb
rtkre is tudjunk hivatkozni. Ebben az esetben hasznljuk a tmbket. (Egy osztly minden
tanuljhoz hozzrendeljk a magassgt, ilyenkor nyilvn rdemes vltoznvknt az osztly
azonostjt hasznlni, a tanulkra pedig a napl sorszmval)
1.9.1 Egydimenzis tmbk
A deklarci szintaxisa:
Tpus tmbnv[mret]
Konkrt pldk:
int a[10]
char betuk[5]
Hivatkozsok a Pascalban is megszokott mdon trtnhetnek:
betuk[1]=C; a[2]=23;
A C-ben a tmb elemeinek sorszmozsa minden esetben 0-tl indul, azaz a fenti pldkban
vigyzni kell, mert nem hivatkozhatunk a[10]-re, mert az mr a tmb 11. eleme lenne.
A tmbknek mr a ltrehozskor is adhatunk kezdrtket. Ennek szintaxisa a kvetkez lehet:
int a[5]={1,2,3,4,5}
int b[]={2,5,7,8,11,22,33}
Az els esetben megmondtuk a tmb mrett s ennyi darab elemet is soroltunk fel, ha tbb
elemet adtunk volna meg, akkor a fordt hibajelzssel lell, ha kevesebbet, akkor pedig a
vltoz trolsi osztlytl 3 fggen vagy 0, vagy hatrozatlan rtk lesz. A msodik esetben
nem adtuk meg az elemek szmt a szgletes zrjelben, csak felsorolssal, ilyenkor a tmb
pontosan 7 elem lesz.
A tmb mrett akr futsidben is meg tudjuk mondani. Ha egy program tesztelse sorn
vltoztatjuk egy tmb mrett (j elemeket vesznk fel a flsorolsba), akkor rdemes a
defincis rszben a kvetkez sor beszrni:
#DEFINE MERET (sizeof(b)/sizeof(b[0]))
Pldaknt nzzk meg, hogyan lehet egy 10 hosszsg vektor elemeit beolvasni, s sszegezni:
#include <stdio.h>
#define SZAM 10
main()
{
int a[10];
int s=0,i;
Lnyegben a vltoz elrhetsgt szablyozza, kicsit hasonl a Pascal globlis s loklis vltozihoz, a
ksbbiekben mg lesz rla sz.
16
http://www.doksi.hu
strcpy(sz1,sz2)
strcmp(sz1,sz2)
Lers
Plda
Az sz1 sztringhez fzi az sz2 sz1=hello; sz2=world
sztringet
strcat(sz1,sz2);
printf( %s\n,sz1)
sszehasonltja a kt
sztringet, ha egyenlk, akkor
, ha nem egyenlk, akkor
nem 0 rtkkel tr vissza,
klnben igen.
Eredmnye: helloworld
sz2=world
strcat(sz1,sz2);
printf( %s\n,sz1)
Eredmnye: world
sz1=Hello; sz2=HeLlO
n=strcmp(sz1,sz2);
printf(%d\n,n)
Eredmnye: 32
strcmpi(sz1,sz2)
17
http://www.doksi.hu
strchr(sz1,c)
strrchr(sz1,c)
strlwr(sz), strupr(sz)
Eredmnye: HELLO
sz2=Hello;n=2;
strncpy(sz1,sz2,n);sz[2]=\0 5;
printf(%s\n,sz1);
Eredmnye: He
sz1=Hello; sz2=World; n=2;
strncat(sz1,sz2,n);
printf(%s\n,sz1);
strrev(sz)
Megfordtja a sztringet
Eredmnye: HelloWo
sz1=Hello;
printf(%s\n,strrev(sz))
strlen(sz)
Eredmnye:olleH
Egy sztring hosszt adja meg n=strlen(sz);
strncpy(sz1,sz2,n)
strncat(sz1,sz2,n)
18
http://www.doksi.hu
printf(\n%c,s[i];
i++;
}
}
21., 22., 23., 24., 25., 26. feladat
1.9.3 Kett s tbb dimenzis tmbk
A C nyelvben is lehetsgnk van kett vagy tbb dimenzis tmbk hasznlatra. Deklarlni a
kvetkezkppen kell:
tpus nv [mret1] [mret2] ;
Konkrt pldaknt egy vals rtkeket tartalmaz ktdimenzis tmbre:
float f [5][2];
Az els index ebben az esetben a sor index, a msodik pedig az oszlop index. A hivatkozs
ennek megfelelen:
f[1][2]=4.73;
Lehetsg van itt is a kezdrtk megadsra:
int matrix[3][2]={ {1,2}, {3,4}, {5,6}};
Nagyon fontos, hogy az indexek itt is minden esetben 0-tl indulnak!
Egy ktdimenzis tmb tblzatos megjelentse:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define SOR 4
#define OSZLOP 3
main()
{
int a[SOR][OSZLOP];
int i,j;
clrscr();
randomize();
for (i=0;i<SOR;i++)
for (j=0;j<OSZLOP;j++)
a[i][j]=rand()%100;
for (i=0;i<SOR;i++)
{
for (j=0;j<OSZLOP;j++)
printf(%d\t,a[i][j]);
printf(\n);
}
19
http://www.doksi.hu
}
27. feladat
1.10
Felhasznl ltal definilt tpusok
Az elz rszben emltett sszetett adattpust tmbknek neveztk, a tmbk minden eleme
azonos tpus kell hogy legyen. Gyakran szksgnk van azonban olyan egymssal sszetartoz
elemek trolsra is, melyek nem azonos tpusak, mgis egy egyedre jellemzk. Ezket
leggyakrabban adatbzisokban talljuk meg. Gondoljunk itt egy szemly kereszt s
vezetknevre, szletsi idejre, alapfizetsre. Ezek klnbz tpus adatok mgis ugyanarra a
szemlyre vonatkoznak.
1.10.1 Struktrk
Egy ilyen adattpust valstanak meg a struktrk. Ennek deklarcija ltalnos formban:
struct nv {
tpus1 tag1;
tpus2 tag2;
.
}
A bevezetben emltett konkrt pldban lert struktra:
struct szemely {
char vnev[20];
char knev[15];
int szev;
float fizetes;
}
Ha ilyen tpus vltozt akarunk ltrehozni, akkor annak mdja:
struct szemely sz;
Erre a vltozra a nevvel s a struktrn belli tag nevnek megadsval hivatkozhatunk a
.(pont) opertor segtsgvel:
sz.vnev=Kovcs;
A struktrt atypedef-fel egytt is hasznlhatjuk. Ilyenkor a struct utni azonost el is maradhat,
s csak utna kerl a a tpust azonost nv:
typedef struct {
char vnev[20];
char knev[15];
int szev;
float fizetes;
} szemely
Ebben az estben termszetesen a vltoz tpusnak megadsakor is hinyzik a struct.
szemely sz;
1.10.2 Struktrt tartalmaz tmbk
Ha egy struktra tpus vltozt ltrehoztunk, akkor annak segtsgvel csak egyetlen egyed
jellemzit tudjuk trolni. Mit tehetnk, ha tbb egyedrl is ugyanazokat a jellemzket szeretnnk
20
http://www.doksi.hu
raktrozni? Kzenfekv megolds olyan tmbk alkalmazsa, melynek minden egyes eleme az
adott struktra tpus.
Az elz pldnl maradva egy vllalatnak maximlisan 20 dolgozjrl a fenti adatokat
szeretnnk trolni, akkor a
szemely sz[20];
adatszerkezettel dolgozhatunk. Az adatszerkezet egyes elemeire val hivatkozskor a struktra
s a tmbhivatkozsokat vegyesen alkalmazzuk.
sz[2].szev=1961;
28. feladat
1.11
Fggvnyek
Fggvnyeket a kvetkez esetekben szoks rni:
http://www.doksi.hu
int s;
s=*a;
*a=*b;
*b=s;
}
main()
{
int k=2;l=4;
printf(%d,%d,k,l);
csere(&k,&l);
printf(\n%d,%d,k,l);
}
Nzzk meg figyelmesen a listt! Mr rgtn a fggvny fejben szrevehetnk egy vltozst, a
*-ot hasznljuk, ezzel a vltoz memriabeli helyn tallhat rtkre utalunk. A msik vltozs a
fggvnyhvskor figyelhet meg, az C opertort hasznljuk, ezzel jelezzk azt, hogy nem a
vltoz rtkt, hanem e memriabeli cmt adjuk t. Nyilvn a fggvnyben emiatt kell
hasznlnunk a * opertort. Ezek az opertorok a mutatkhoz (pointer) ktdnek, a ksbbiekben
mg lesz rluk sz.
Vegyk szre azt is, hogy a fggvnynek nincs visszatrsi rtke, annak ellenre, hogy az
tadott vltozk rtke megvltozott.
29., 30., 31. feladat
1.11.2 Loklis s globlis vltozk
A loklis vltozkat csak azok a blokkok 6 ltjk, ahol deklarlva lettek, ez all a main sem
kivtel. Ezek a vltozk a veremben troldnak, teht minden fggvnyhvskor trldik az
rtkk.
A globlis vltozkat minden fggvny ltja, rtkket mdosthatja. Ezeket a vltozkat
minden fggvny trzsn kvl kell deklarlni, clszer rgtn a #define utn megtenni ezt.
Ajnlott a globlis vltozkat egy tmbben deklarlni, lehetsg van ugyan arra, hogy kt
fggvny kztt is deklarljunk vltozt, ebben az esetben viszont az elbb lv fggvny nem
ltja az alatta lv vltozt, annak ellenre sem, hogy az fggvnyeken kvl lett ltrehozva.
1.11.3 Automatikus s statikus vltozk
Bevezetsknt tanulmnyozzuk a kvetkez programot:
#include <stdio.h>
#include <conio.h>
void demo()
{
static int sv=0;
auto int av=0;
prtintf("sv= %d, av= %d",sv,av);
6
Nem vletlen a kiemels. Itt valban blokkrl van sz, azaz lehet olyan loklis vltozm is, amit csak egy for
ciklus vgrehajtsi rsze lt, a fggvny tbbi rsze nem. Ez egy jelents eltrs a C s aPascal loklis vltozi
kztt.
22
http://www.doksi.hu
++sv;
++av;
}
main()
{
char c;
int i=0;
clrscr();
while (i<3)
{
demo();
i++;
}
while ((c=getch()) !=13);
}
A program kimenete:
sv=0, av=0;
sv=1; av=0;
sv=2; av=0
A statikus vltozkat csak egyszer hozza ltre a fordt s rtket is csak egyszer kapnak, a
legels fggvnyhvskor. Statikus vltozt loklisan s globlisan is ltrehozhatunk, rtkt a
program futsa sorn vgig megtartja, a klnbsg a kett kztt csak a lthatsgban van. A
loklisan ltrehozott statikus vltoz csak a blokkjn bell lthat. A fenti program egy loklis
statikus vltozt mutatott be.
Az automatikus vltozk minden fggvnyhvskor jra deklarldnak, s mindig flveszik a
megadott kezdrtket. Ha nem rjuk ki ezeket a mdost jelzket, akkor a vltoz automatikus
lesz. Az automatikus vltozk dinamikusan troldnak a veremben.
1.11.4 Register mdost jelz
A register kulcssz azt jelenti a fordt szmra, hogy az adott vltozhoz gyorsan szeretnnk
hozzfrni. Arra utastjuk teht, hogyha mdjban ll, akkor ne a memriban, hanem
regiszterekben trolja. Nyilvn akkor folyamodunk ilyen technikhoz, ha gy gondoljuk,hogy az
adott vltozt gyakran mdostjuk. Regiszterbe char, int s pointer tpust tehetnk az esetek
tbbsgben.
Arra semmi garancia nincs, hogy a fordt tudja teljesteni krsnket, de ha tudja, akkor az
eredmny gyorsabb futs lesz.
void csere(register int *a, register int *b)
{
register int s;
s=*a;
*a=*b;
*b=s;
}
23
http://www.doksi.hu
http://www.doksi.hu
int **p; p egy olyan mutat, mely egy egszre mutat mutatra mutat. Ktszeres indirektsg.
Mutatk esetn a p++ nvels nem eggyel nveli p rtkt, hanem a szomszdos cmre mutat. Azaz, ha amutat
eredetileg egy char tpus vltozra mutatott, akkor a nvels 1, ha egy int tpusra, akkor a nvels 2, ha
valamilyen sszetett struktrra, akkor pedig ennl sokkal tbb.
8
25
http://www.doksi.hu
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main()
{
char c;
unsigned int *p,n,i;
long int osszeg=0;
clrscr();
randomize;
printf("Hny adattal akarsz dolgozni: ");
scanf("%u",&n);
/* Helyfoglals a memriban, p az els helyre mutat */
p=(unsigned int *) calloc(n,sizeof(unsigned int));
if (!p)
{
printf("Nincs elg hely a memriban");
return -1;
}
for (i=0;i<n;i++)
p[i]=random(5000);
/* Tmbs hivatkozs */
for (i=0;i<n;i++)
{
printf("%u,",*(p+i));
/* Pointeres */
osszeg+=*(p+i);
/* hivatkozs */
}
printf("\n%ld",osszeg);
free(p);
26
http://www.doksi.hu
Figyeljk meg a p-nek trtn rtkadst! A calloc fggvny visszatrsi rtke egy tpus nlkli
mutat, ezt egy tpuskonverzival t kellet alaktani a p tpusnak megfelel alakra. 9 Minden
esetben meg kell vizsglni, hogy sikeres volt-e a helyfoglals. Ha nincs elg memria, akkor a
calloc fggvny NULL (nulla) rtkkel tr vissza, ebben az esetben a return 1 hatsra a
program kilp a main() fggvnybl s befejezi futst.
A programban a pointeres s tmbs hivatkozs vegyesen lett hasznlva, mutatva ezzel a kett
teljes egyenrtksgt.
1.12.2 Ktdimenzis tmbk s pointerek
Termszetesen ktdimenzis tmbket is lehet dinamikusan kezelni. Erre hrom klnbz
mdszert mutatunk be. Mindhrom program csupn annyit csinl, hogy egy mtrixot feltlt
vletlen szmokkal, majd tblzatos formban megjelenti. A programok utn rvid
magyarzatok is lesznek.
1.12.2.1 Dinamikus tmb egy vektorban
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main()
{
char c;
int n,m,*p;
int i,j;
clrscr();
randomize();
printf("Sorok szma: ");
scanf("%d",&n);
printf("Oszlopok szma: ");
scanf("%d",&m);
p=(int *) calloc(n*m,sizeof(int));
if (!p)
{
printf("Nincs elg memria!");
return -1;
}
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
p[i*m+j]=random(10);
printf("%3d",*(p+i*m+j));
}
printf("\n");
}
/* Tmbs hivatkozs */
/* Pointeres hivatkozs */
free(p);
9
27
http://www.doksi.hu
http://www.doksi.hu
mtrixok esetben szoksos. Itt a calloc fggvnyben rdekes mdon csak 1 elem szmra kell
helyet foglalni, ami viszont akkora, mint a tljes mtrix.
1.12.2.3 Mutattmb
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define N 5
main()
{
char c;
int *p[N],oszlop[N];
int i,j;
clrscr();
for (i=0;i<N;i++)
{
printf("%d. sor oszlopszma: ",i+1);
scanf("%d",&oszlop[i]);
}
for (i=0;i<N;i++)
{
p[i]=(int *) calloc(oszlop[i],sizeof(int));
if (!p[i])
{
printf("Nincs elg memria!");
return -1;
}
}
for (i=0;i<N;i++)
{
for (j=0;j<oszlop[i];j++)
{
*(p[i]+j)=random(10);
printf("%3d",p[i][j]);
}
printf("\n");
}
for (i=0;i<N;i++)
free(p[i]);
while ((c=getch()) !=13);
}
29
http://www.doksi.hu
Itt a mtrixot egy mutattmbbel valstottuk meg. A klnlegessg az, hogy a sorok eltr
hosszsgak is lehetnek. A mutatknak egyesvel adtunk rtket, azaz a helyfoglals soronknt
trtnt. A felszabadtst szintn ciklus segtsgvel kell vgezni.
33., 34. feladat
1.12.3 Struktrk s mutatk
A korbbiakban mr volt sz a struktrkrl. Pointerekkel hivatkozhatunk a struktrk egyes
elemeire is, mint azt a kvetkez pldban lthatjuk.
struct datum
{ int ev,ho,nap};
struct datum *map;
Az gy ltrehozott mutatnak rtket adhatunk, illetve rtkt lekrdezhetjk.
(*map).ev=2001; (*map).ho=2; (*map).nap=14;
Mivel a C-ben elg gyakori a struktrk s a pointerek hasznlata, a fenti hivatkozsoknak van
egy msik alakja is.
map->ev=2001;map->ho=2;map->14;
A kt hivatkozs egymssal teljesen egyenrtk, de a C programokban s a szakirodalomban a
msodik lnyegesen elterjedtebb.
1.12.4 Dinamikus lista
A lista olyan adtaszerkezet, melynek minden egyes eleme kt jl elklnthet rszbl ll, az
adatrszbl s egy mutatbl, mely a listakvetkez elemre mutat. A lista els elemre a
listafejjel hivatkozhatunk. A lista utols elemnek mutat mezje pedig NULL rtk.
13
12
11
14
15
16
Ha egy listbl egy elemet trlni akarunk, akkor a kvetkezkppen jrhatunk el:
1. megkeressk a trlend elemet
2. a mutatjt bemsoljuk az eltte lv elem mutatjba
19
18
30
17
http://www.doksi.hu
Nzzk ezt elszr egy egyszer programon keresztl. Elszr ltrehozunk egy struktrt, a
struktramutat mezje egy ugyanilyen tpus struktrra hivatkozik, ezt nevezzk nhivatkoz
struktrnak.
#include <stdio.h>
struct lista {
int value;
struct lista *next;
};
main()
{
struct lista n1, n2, n3, n4;
struct lista *lista_pointer = &n1;
n1.value = 100;
n1.next = &n2;
n2.value = 200;
n2.next = &n3;
n3.value = 300;
n3.next = &n4;
n4.value = 400;
n4.next = 0;
while( lista_pointer != 0 ) {
printf("%d\n", lista_pointer->value);
lista_pointer = lista_pointer->next;
}
}
Ez mg gy egyltaln nem dinamikus, csak a lista hasznlatt figyelhetjk meg rajta. Vegyk
szre, hogy az a sok rtkads a listzs eltt, ciklikus folyamat, nyilvn nem rdemes ilyen
sokszor lerni.
n1.next = n2.next;
n2_3.next = n2.next;
n2.next = &n2_3;
Mi trtnik a listval a fenti rtkadsok hatsra?
A kvetkez program mr egy dinamikus lista megvalstsra mutat pldt.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct data
{
int value;
struct data *nxt;
};
struct data *head=NULL, *prev, *akt, *next;
void list()
31
http://www.doksi.hu
{
akt=head;
while (akt!=NULL)
{
printf("%5d",akt->value);
akt=akt->nxt;
}
}
main()
{
char c;
int i=0,sv;
clrscr();
randomize();
printf("Kvetkez szm ");
scanf("%d",&sv);
while (sv>0)
{
akt=(struct data *) malloc(sizeof(struct data));
if (!akt)
{
printf("Nincs elg memria!");
return -1;
}
akt->value=sv;
akt->nxt=NULL;
if (i==0)
head=prev=akt;
else
{
prev->nxt=akt;
prev=akt;
}
printf("Kvetkez szm ");
scanf("%d",&sv);
i++;
}
printf("\n");
list();
while ((c=getch()) !=13);
}
A fprogramban lv while ciklussal pozitv szmokat olvasunk be, s ezeket fzzk fl egy
dinamikus listba. Ltszik, hogy a listban mindig csak a kvetkez elem szmra foglalunk
32
http://www.doksi.hu
helyet a malloc fggvnnyel. A lista feltltse utn meghvott list() fggvny a flvett elemeket
listzza ki.
35. feladat
1.13
File kezels
A C nyelvben az adatllomnyokat tartalmuk alapjn kt csoportra oszthatjuk, szveges s
binris llomnyokra. A szveges llomnyok olvashat informcit tartalmaznak. Sorokbl
plnek fel, minden sor vgt a CR/LF karakterpr zrja. A binris llomnyok byte-okbl
felpl adtahalmazt jelentenek. A szveges llomny minden esetben fldolgozhat, mint
binris llomny, de ez fordtva mr nem igaz.
Szveges llomnyokban is lehet szmokat trolni. Ebben az esetben a szmok, mint karakterek
fogan troldni. Ha pldul egy ngy jegy szmot szveges llomnyban trolunk, akkor ngy
byte-nyi helyet foglal el, ha azonban egy binris llomnyba tesszk le, akkor csak 2 byte kell.
(Termszetesen csak akkor, ha int tpus volt)
1.13.1 File elksztse, lezrsa
A file kezelshez tartoz fggvnyek az stdio.h deklarcis llomnyban vannak lerva. Minden
file-hoz hozz kell rendelni egy FILE tpus muatatt, mely a memriban a file jellemzire
mutat 10. Ennek formja:
FILE *fp;
Ez utn kvetkezhet a file megnyitsa:
fp=fopen(A:\SZOVEG\NEV.TXTnv,md);
Az fp mutat rtke NULL, ha az llomny megnyitsa sikertelen volt. A fizikai file nvben
teljes elrsi tvonalat is megadhatunk, ebben az esetben azonban gyelni kell a \ jel
hasznlatra:
A:\SZOVEG\NEV.TXT helyett A:\\SZOVEG\\NEV.TXT 11
A md paramter azt jelenti, hogy milyen mveleteket akarunk vgezni az llomnnyal.
Md
Lers
r (+)
w (+)
a (+)
Mindegyik md, jellemz kiegszthet egy + paramterrel, ez miden esetben azt jelenti, hogy az
llomnyt olvashatjuk s rhatjuk is. A md sztringben szoktuk mg megadni, hogy milyen
llomnnyal dolgozunk. t szveges, b binris llomnyt jelent.
Nzznk egy konkrt pldt, melyben egy szveges llomnyt megnyitunk rsra s olvassra:
FILE *fp;
10
11
Logikai file nv
A string konstansokban a \ jel egy formz karaktert vezet be.
33
http://www.doksi.hu
fp=fopen(A:\\SZOVEG\\NEV.TXT,r+t);
if (fp==NULL)
{
printf(Sikertelen file nyits!);
return 1;
}
A file nyitst gyakra szoktk az if-en bellre helyezni. Ekkor a szintaktikja a kvetkez:
if (!(fp=fopen(A:\\SZOVEG\\NEV.TXT,r+t)))
{
printf(Sikertelen file nyits!);
return 1;
}
Ha a file-on elvgeztk a megfelel mveleteket, akkor le kell zrni. Ezt az fclose(fp)
fggvnyhvs valstja meg. Amennyiben egy fileban rsi mveleteket is vgeztnk lezrs
eltt clszer az fflush(fp) fggvnyhvs, ez az tmeneti pufferek tartalmt kirja az
llomnyba, ha mg nem trtnt volna meg.
1.13.2 Szveges llomnyok
Szveges llomnyokkal kapcsolatban leggyakrabban alkalmazott fggvnyeket az albbi
tblzatban foglaljuk ssze. Minden esetben a
FILE *fp;
char ch,string[]=Kirand szveg;
char sz[20];
defincikat hasznljuk
Fggvny
Lers
ch=fgetc(fp)
fputc(ch,fp)
fgets(sz,strlen(string)+1,fp)
fputs(string,fp)
fscanf(fp,konv,&valt)
fprintf(fp,konv,valt
34
http://www.doksi.hu
if (!(fp=fopen("A:\\Fileok\\p.txt","wt")))
{
fprintf(stderr,"Nem sikerlt megnyitni az llomnyt");
return -1;
}
for (i=0;i<10;i++)
fprintf(fp,"%4d",i);
fflush(fp);
fclose(fp);
if (!(fp=fopen("A:\\Fileok\\p.txt","rt")))
{
fprintf(stderr,"Nem sikerlt megnyitni az llomnyt");
return -1;
}
i=0;
while (!feof(fp))
{
fscanf(fp,"%d",&i);
printf("%d",i);
}
fclose(fp);
while ((c=getch()) !=13);
}
A pldban egsz rtkeket runk ki egy szveges llomnyba, majd visszaolvassuk azokat. A
visszaolvassnl a file vge jellsre az feof(fp) fggvnyt hasznljuk. Ez a file vgre rve
vesz fl NULL rtket.
A msik plda egy llomny nevt kri be, majd karakterenknt kilistzza a kpernyre.
#include <stdio.h>
#include <conio.h>
main()
{
char nev[25];
FILE *fp;
char c;
clrscr();
printf("llomny neve: ");
scanf("%24s", nev);
clrscr();
fp = fopen ( nev, "rt");
if( fp == NULL )
printf("Nem lehet megnyitni a(z) %s llomnyt\n", nev);
else {
35
http://www.doksi.hu
/* A 4. elemre ll */
fseek(bf,0*sizeof(int),SEEK_CUR);
counter=fread(&sv,sizeof(int),1,bf);
printf("%4d",sv);
/* A rkvetkezre ll */
fclose(bf);
while ((c=getch()) !=13);
}
Nzzk elszr az fwrite fggvnyt. A fggvny els paramtere a kirand vltoz neve,
msodik paramtere az adott struktrhoz tartalmaz blokkmret, harmadik paramter a kirand
elemek darabszma, negyedik pedig az llomny mutatja.
36
http://www.doksi.hu
12
37
Lers
sor trlse az aktulis kurzor
pozcitl
a kperny adott pontjba
mozgatja a kurzort
ablak definilsa
szveg szne
httr szne
http://www.doksi.hu
Ha a kpernyn egy ablakot hozunk ltre, akkor onnantl kezdve minden koordintt az
ablakhoz kpesti relatv rtkekkel kell megadnunk. Ha azt akarjuk, hogy az ablak szne ms
legyen, mint a krnyezet, akkor a httrszn belltsa utn trlnnk kell a kpernyt.
Az aktv ablakra vonatkoz informcikat is lekrdezhetjk. Ehhez a rendszer egy a conio.h-ban
definilt struktrt bocst rendelkezsnkre
struct text_info {
unsigned char winleft;
/* az ablak bal fels sarka x koord
*/
unsigned char wintop;
/* az ablak bal fels sarka y koord
*/
unsigned char winright;
/* az ablak jobb als sarka x koord
*/
unsigned char winbottom;
/* az abla jobb als sarka y koord
*/
unsigned char attribute; /* a szveg attribtuma szn+httr egytt */
unsigned char normattr;
/* norml attribtum
*/
unsigned char currmode;
/* aktulis md:
*/
unsigned char screenheight; /* a kperny magassga
*/
unsigned char screenwidth; /* a kperny szlessge
*/
unsigned char curx;
/* a kurzor aktulis pozcija x koord */
unsigned char cury;
/* a kurzor aktulis pozcija y koord */
};
Attl, hogy a struktrban karakterekknt vannak ltrehozva az egyes tagok nyugodtan
vgezhetnk velk matematikai mveleteket, de az is lehetsges, hogy egy egsz tpus
vltozhoz rendeljk hozz a lekrdezett rtkeket Ha ezt a struktrt hasznlatba szeretnnk
venni, akkor szksg van a
struct text_info info;
gettextinfo(&info);
defincikra is. Ezutn mr minden tovbbi nlkl hasznlhat a
x=info.screenwidth;
tpus hivatkozs.
Nzznk egy plda programot a kperny kezelsre. Az albbi program az aktulis szveges
kperny kzepre rajzol egy 40x20-as ablakot. Ebbe 5 menpontot r ki, s kzlk beolvas
egyet. A program futsnak csak akkor van vge, ha tnyleg ltez pontot olvastunk be.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define SZ 20
#define M 10
char menu_pontok[5][15]={"Els pont","Msodik pont","Harmadik pont","Negyedik
pont","V G E"};
char cim[]=" M E N P O N T O K ";
char ala[]="-----------------------";
char val[]="Krem vlasszon: ";
main()
38
http://www.doksi.hu
{
char c;
int xj,yj,xb,yb;
int i;
char valasz;
struct text_info info;
gettextinfo(&info);
textbackground(BLACK);
clrscr();
xb=info.screenwidth/2-SZ;
yb=info.screenheight/2-M;
xj=xb+2*SZ;
yj=yb+2*M;
window(xb,yb,xj,yj);
textbackground(YELLOW);
textcolor(BLUE);
clrscr();
gotoxy(20-strlen(cim)/2,2);
cprintf(cim);
gotoxy(20-strlen(cim)/2,3);
cputs(ala);
for (i=0;i<5;i++)
{
gotoxy(12,2*i+6);
cprintf("%2d. %s",i+1,menu_pontok[i]);
}
do
{
gotoxy(12,2*M-3);
cprintf(val);
valasz=getche();
clreol();
}
while(!isdigit(valasz) || valasz>'5' || valasz<'1' );
while ((c=getch()) !=13);
}
Tanulmnyozzuk t figyelmesen a programot! Vegyk szre, hogy szveg kirsra a cputs
ugyanolyan alkalmas, minta cprintf! A valasz beolvassakor tallunk egy olyan fggvnyt, mely
az eddigiekben mg nem szerepelt, isdgit(valasz), visszatrsi rtke nem nulla, ha a valasz
rtke szmjegy.
1.14.2 Kperny mentse s visszatltse
Egy jl hasznlhat lehetsge a szveges kpernykezel fggvnyeknek az ablak teljes
egsznek, vagy egy rszletnek elmentse, majd visszatltse a memriba. A kvetkez
program erre muata egy pldt:
#include <conio.h>
39
http://www.doksi.hu
char puffer[4096];
int main(void)
{
int i;
clrscr();
for (i = 0; i <= 20; i++)
cprintf("Sorszma %d\r\n", i);
gettext(1, 1, 80, 25, puffer);
gotoxy(1, 25);
cprintf("Kpernytrls gombnyomsra...");
getch();
clrscr();
gotoxy(1, 25);
cprintf("Az elz tartalom visszatltse...");
getch();
puttext(1, 1, 80, 25, puffer);
gotoxy(1, 25);
cprintf("Program vge...");
getch();
}
Ehhez a gettext s a puttext fggvnyeket hasznljuk. Egy billenty lenyomsra vrakozik a
getch() fggvny. Figyeljk meg a puffer mrett! Ha a 80x25=2000 byte-bl indulunk ki, akkor
gy tnik, mintha ktszer akkora terletet foglaltunk volna le, ez azonban nincs gy, mert
nemcsak azt kell tudnunk, hogy mi jelenik meg a kperny egy adott pontjn, hanem azt is, hogy
milyen szn httren s milyen karaktersznnel. Ezrt minden egyes hely trolshoz 2 byte-ra
van szksg. 1 byte a tartalom, 1 byte az attribtum.
Az attribtum byte flptse:
Villogs
Httrszn 0-7
Karakterszn 0-15
iscntrl
Lers
Makr
bet (A-Z,a-z) vagy
isxdigit
szmjegy (0-9)
isprint
bet (A-Z,a-z)
als byte-ja 0 s 127 kz esik islower
vezrlkarakter
isspace
isdigit
szmjegy (0-9)
isalnum
isalpha
isascii
isupper
Lers
hexadecimlis szmjegy (09,A-F,a-f)
nyomtathat karakter
kisbet
szkz, CR, LF, tab (vizsz.,
fgg.) lapdobs
nagybet
A meghvsbl nem ltszik, hogy makrrl vagy pedig fggvnyrl van sz. A ksbbiek sorn mg szt ejtnk a
makrkrl is. Egyelre elg annyi, hoy ezek nem fggvnyek, hanem makrk.
13
40
http://www.doksi.hu
Lers
ASCII karekterr alakt
Az angol kis betket nagy betkk alaktja
Az angol nagybetket kis betkk alaktja
Lers
Sztringet konvertl t lebegpontos rtkk,
sikertelen esetn 0-val tr vissza
float f;
char *str = "12345.67";
f = atof(str);
int n;
char *str = "12345.67";
n = atoi(str);
long l;
char *lstr = "98765432";
l = atol(lstr);
char *string = "87654321", *endptr;
unsigned long lnumber;
lnumber = strtoul(string, &endptr, 10);
char *string = "87654321", *endptr;
long lnumber;
lnumber = strtol(string, &endptr, 10);
int number = 12345;
char string[25];
itoa(number, string, 10);
char string[25];
long value = 123456789L;
ltoa(value,string,10);
unsigned long lnumber = 3123456789L;
char string[25];
ultoa(lnumber,string,10);
szmm,
41
http://www.doksi.hu
rajzolsa) Ha a grafikus fggvnyeket hasznlni akarjuk, akkor be kell emelni graphics.h header
file-t. Grafika programozsnl gyakran hasznljuk a matematikai fggvnyeket is, ezrt
ltalban az elejn hozztesszk a programhoz a math.h llomnyt is.
1.15.1 Koordinta-rendszer
Mieltt hozzfognnk a grafika programozshoz meg kell ismernnk a rendszer ltal
alkalmazott grafikus koordinta-rendszert.
(0,0)
(getmaxx(),0)
(0,getmaxy())
(getmaxx(),getmaxy())
90
180
270
nem az az olimpiai t karika megrajzolsa. Persze, ha mi magunk runk egy ilyen fggvnyt, akkor arra a
tovbbiakban, mint egy grafikus primitvre lehet hivatkozni.
42
http://www.doksi.hu
main()
{
int Gd, Gm, Hiba;
Gd=DETECT;
initgraph(&Gd,&Gm,"c:\\progra~1\\bc\\bgi");
Hiba=graphresult();
if (Hiba)
{
cprintf("Grafikus hiba: %s",grapherrormsg(Hiba));
exit(1);
}
rectangle(100,100,60,40);
getch();
closegraph();
}
DETECT segtsgvel fldertjk az aktulis monitor jellemzit, majd inicializljuk a grafikt,
az idzjelek kztt a BGI file-ok helyt 15 kell megadnunk a programnak, ezen llomnyok
segtik a kperny grafikus zemmdban val kezelst. A graphresult() fggvny jelzi, ha
valami miatt nem sikerlt az ttrs grafikus mdra. Ha minden rendben volt kvetkezhetnek a
grafikai fggvnyhvsok, (itt ezt a rectangle() fggvny jelzi), ha vgeztnk, akkor pedig a
closegraph(); fggvnnyel lezrjuk a grafikt.
1.15.3 Gyakran hasznlt fggvnyek
Az albbiakban egy tblzatban soroljuk fl a leggyakrabban hasznlt grafikus fggvnyeket, a
teljessg ignye nlkl. (A rendszerben kzel 80 grafikus fggvny van)
Fggvny
setcolor(c)
setbkcolor(c)
setlinestyle(ls,pt,th)
setfillstyle(pt,c)
moverel(dx,dy)
moveto(x,y)
x=getx();y=gety()
putpixel(x,y,c)
line(x1,y1,x2,y2)
linerel(dx,dy)
lineto(x,y)
15
Lers
A rajzols sznt lltja be c 0-15 kztti rtk, vagy szn konstans
A httr sznt lltja be, c ua., mint elbb
ls rtke a vonalstlusra utal:
SOLID_LINE, DOTTED_LINE, CENTER_LINE, DASHED_LINE,
USERBIT_LINE ebben az esetben kerl rtelmezsre a pt ez egy 16
bites minta, ezt ismtli a vonalon
th a vonalvastagsg, NORM_WIDTH, THICK_WIDTH
A kitltsi mintt adja meg pt-ben, c-ben pedig a sznt.
EMPTY_FILL, SOLID_FILL, LINE_FILL, LTSLASH_FILL,
SLASH_FILL, BKSLASH_FILL, LTBBKSLASH_FILL?
HATCH_FILL, XHATCH_FILL,INTERLEAVE_FILL,
WIDE_DOT_FILL, CLOSE_DOT_FILL, USER_FILL
A garfikus kurzort a dx,dy koordintit dx-szel, dy-nal vltoztatja
A grafikus kurzort az (x,y) pontba mozgatja
A grafikus kurzor koordinti
c sznnel rajzol egy kppontot
A kt pontot egyenessel kti ssze
A dx,dy-nal vltoztatott pontba hz egyenest az aktulis pontbl
Az (x,y) pontba hz egyenest az aktulis pontbl
43
http://www.doksi.hu
drawpoly(n,poly[])
rectangle(x1,y1,x2,y2)
arc(x,y,ksz,vsz,r)
circle(x,y,r)
ellipse(x,y,ksz,vsz,rx,ry)
bar(x1,y1,x2,y2)
bar3d(x1,y1,x2,y2,m,t)
pieslice(x,y,ksz,vsz,r)
floodfill(x,y)
cleardevice()
outtext(text)
ottextxy(x,y,text)
settextstyle(f,d,s)
17
44
http://www.doksi.hu
45
http://www.doksi.hu
kiir(1);kiir(2);kiir(3);kiir(4);
szoveg(Ezt rd ki);
szam(i,5d);
getch();
}
A kiir() makr brmilyen olyan vltoznak kirja az rtket, melynek a neve x-szel kezddik. A
nv tovbbi rszt paramterknt kell tadni.
A szoveg() makr egyszeren kirja az tadott szveget. Figyeljk meg, hogy hvskor nem kell
a szveget idzjelek kztenni, azt a mveletet a vltoz neve el kitett # vgzi el.
A szam() makr egy vltoz nevt s rtkt rja ki olyan formtumban, amilyet a msodik
paramtere elr.
47. feladat
46
http://www.doksi.hu
Feladatgyjtemny
1. feladat
Az els C programrl lertakat vesd ssze a Pascalban tanultakkal
2. feladat
Mi lesz a kvetkez programok outputja:
#include <stdio.h>
main()
{
printf( Els sor \n);
printf( Msodik sor \n);
}
#include <stdio.h>
main()
{
printf(Els sor);
printf(Msodik \n sor \n);
}
#include <stdio.h>
main()
{
printf("Hello...\n..oh my\n...when do i stop?\n");
}
3. feladat
Mi lesz a kvetkez programok outputja:
#include <stdio.h>
main()
{
int sum, v;
sum = 10;
v = 15;
printf("%d\t%d\n", sum, v);
}
#include <stdio.h>
main()
{
47
http://www.doksi.hu
4. feladat.
Mirt hibsak a kvetkez vltoznevek?
value$sum
exit flag
3lotsofmoney
char
5. feladat
Nzznk egy pldt az sszes alaptpus vltozra. Mi lesz a kvetkez program outputja?
#include < stdio.h >
main()
{
int sum;
float money;
char betu;
double dupla;
sum = 10;
money = 2.21;
betu = 'A';
pi = 2.01E6;
printf("sum = %d\n", sum );
printf("money = %f\n", money );
printf("bet = %c\n", betu );
printf("dupla = %e\n", dupla );
}
6. feladat
rj egy olyan programot, mely egy vals, egy egsz s egy karakter tpus vltozt hoz ltre,
kezdrtket nem tartalmaz egyik sem. rasd ki az rtkket!
7. feladat
A kvetkez matematikai kifejezseket rd t C kifejezsekk:
48
http://www.doksi.hu
x=
3 y + 7(2a 1)
y ( y 1)
3y +1
2y + 3
a=
5x 1
3 + 4( x 3)
7x
8. feladat
Add meg azt a logikai kifejezst, mely akkor igaz, ha
9. feladat
int x , y ;
x ^= y;
y ^= x;
x ^=y;
Mi lesz a vltozk rtke a kirtkelsek utn?
10. feladat
rj programot, mely a billentyzetrl beolvas kt egsz szmot, majd eldnti, hogy a nagyobb
osztja-e a kisebbnek. Ha igen kirja, ha nem akkor kirja a hnyadost s az osztsi maradkot. A
feladat megoldsa sorn ne hasznlj elgazst! (Gondolj a feltteles rtkadsra!)
11. feladat
rj programot mely kirja az els 20 egsz szmot s ngyzetket. A feladatot oldd meg
mindhrom tanult ciklus segtsgvel!
12. feladat
13. feladat
14. feladat
49
http://www.doksi.hu
15. feladat
rd t az albbi programsorokat switch szerkezetre!
if( betu == 'X' )
s = 0;
else if ( betu == 'Z' )
jelzo = 1;
else if( betu == 'A' )
s = 1;
else
printf("Ismeretlen bet -->%c\n", betu );
16. feladat
rj programot, mely bekr hrom egsz szmot s eldnti, hogy szerkeszthet-e a szmokbl,
mint szakaszhosszakbl hromszg. Ha igen, akkor azt is eldnti, hogy derkszg-e!
17. feladat
rj programot, mely bekr hrom vals szmot. Ezeket sorrendben egy msodfok egyenlet a,b,c
egytthatiknt rtelmezi. Add is meg az egyenlet megoldsait. A kirsok a kvetkezk kzl
kerljenek ki: Nincs gyke, Egy gyke van x=ee.tt, Kt gyke van x1=ee.tt, x2=ee.tt. Itt a tt azt
jelenti, hogy a gykket kt tizedes pontossggal rassuk ki.
18. feladat
rd be a kvetkez programot s magyarzd meg a mkdst!
#include <stdio.h>
main()
{
int szam,s=0;
printf(Krek egy szmot 1 s 10 kztt : );
scanf(%d, &szam);
switch (szam)
{
default: printf(Hibs megads: %d\n, szam); break;
case 10: s+=10;
case 9: s+=9;
case 8: s+=8;
case 7: s+=7;
case 6: s+=6;
case 5: s+=5;
case 4: s+=4;
case 3: s+=3;
50
http://www.doksi.hu
case 2: s+=2;
case 1: s+=1; printf(Az s rtke: %d\n, s);break;
}
}
19. feladat
Krj be billentyzetrl egy pontszmot, majd mondd meg, hogy ehhez hnyas rdemjegy
tartozik! Maximlis pontszm 100, 91-100 jeles(5), 81-90 j(4), 66-80 kzepes (3), 50-65
elgsges(2), 50 alatt elgtelen(1)!
20. feladat
rjunk programot, mely beolvassa egy tanul jegyeit, majd kiszmtja az tlagot. A jegyeket
tmbben trolja. A beolvassnl csak a j osztlyzatokat fogadja el. (gondolj a scanf-nl
megadhat ellenrzsi lehetsgre) A tantrgyak szma 10. Az tlag kiszmtsa utn adjuk meg
azt is, hogy az egyes osztlyzatok hnyszor fordultak el!
21. feladat
rjunk programot, mely feltlt egy 100 elem vektort 1 s 1000 kz es egsz szmokkal, majd
a kvetkez feladatokat ltja el:
22. feladat
Dobjunk hrom dobkockval 100 000-szer. Minden egyes dobsnl adjuk ssze a hrom
szmot, majd rjuk ki, hogy melyik sszeg hnyszor fordult el!
23. feladat
Modellezzk az ts s a hatos lott hzst!
24. feladat
Adjuk meg egy 100 elem 1-100 kztti szmokat sorrendben tartalmaz vektor egy
permutcijt!
51
http://www.doksi.hu
25. feladat
Krjnk be egy szveget s egy karaktert a billentyzetrl, majd adjuk meg, hogy az adott
karakter hnyszor fordul el a szvegben!
26. feladat
Krjnk be egy szveget a billentyzetrl s dntsk el, hogy palindroma-e!
27. feladat
Hny olyan eleme van a mtrixnak, melyek az tlagnl kisebbek, illetve nagyobbak?
28. feladat
29. feladat
rjunk fggvnyt, mely paramterknt egy karaktert s egy egsz rtket kap, s ennyi darabot r
ki egyms utn az tadott karakterbl!
30. feladat
rjunk fggvnyt mely paramterknt egy vals(a) s egy pozitv(n) egsz szmot kap.
Visszatrsi rtke pedig: an
31. feladat
rjunk fggvnyt, mely hrom tadott egsz szmot nagysg szerint sorba rendez, a vltozs a
visszaadott rtkekben ltszik!
32. feladat
Mit fognak kirni a kvetkez programrszletek printf fggvnyei?
main()
{
char c = 'Q';
52
http://www.doksi.hu
33. feladat
Az adatok mindig csak annyi helyet foglaljanak el a memriban, amennyire ppen szksg van.
Legalbb 10 sorozaton vgezzk el a fenti hrom feladatot. Az eredmnyeket trolni nem kell,
jelentsk meg azokat tblzatszeren!
34. feladat
Egy telephelyen gymlcst vsrolnak fel. Minden Eladt a sorszmval azonostanak. Egy
elad egy hnap folyamn tbbszr is leadott gymlcst, de a klnbz eladk nem
ugyanannyiszor. Egy vektorban trolva vannak a havi leadsok szmai. A telephelyen sszesen
10 eladt tartanak nyilvn. rjunk programot, mely beolvassa a eladnknt s alkalmanknt a
53
http://www.doksi.hu
35. feladat
rjunk programot, mely egy dinamikus listba emberek adatait viszi fl. Nv, szletsi v,
lakcm. Majd valstsuk meg menbl a kvetkez funkcikat:
teljes lista
36. feladat
rjunk programot, amely megszmolja, hogy egy adott szveg hny szbl ll. Vigyzzunk arra,
hogy a szkzk szma+1 nem felttlenl a szavak szmt adja vissza, elfordulhat egy
szvegen bell tbb szkz is. A szveget egy llomnybl vegyk! Lehet ez pldul egy
programllomny is.
37. feladat
Ksztsnk a 35. feladathoz hasonl programot, az adatokat viszont ebben az estben nem
dinamikus listba, hanem egy binris llomnyba kell flvinnnk!
38. feladat
Ksztsnk programot, mely bekri egy llomny nevt, ha ltezik ilyen llomny, akkor azt
karakterenknt vgigolvassa s minden karakter nagybets alakjt kirja egy msik llomnyba,
melynek a nevt az elsbl gy kapjuk, hogy egy n bett hozzrunk. A kirs utn a nagybets
llomnyt jelentse is meg a kpernyn!
39. feladat
40. feladat
54
http://www.doksi.hu
41. feladat
rjunk fggvnyt mely grafikus mdban kirajzolja az olimpiai tkarikt. A fggvnyt a krk
sugarval s a fels sor kzps karikjnak kzppontjval lehessen meghvni!
42. feladat
rjunk programot, mely kirajzol egy sakktblt a kpernyre. Legyen md arra, hogy a kitlts
mintjt vltozatjuk!
43. feladat
rjunk programot, mely vektorban trolt szmokat megjelenti kr s oszlop diagramos formban
is. Krdiagram esetn a mennyisgek sszege fele meg 360 foknak. A szomszdos krcikkeknl
alkalmazzunk eltr kitltst! Oszlopdiagram esetn a legnagyobb mennyisg tltse ki
fgglegesen a kperny kt harmad rszt, termszetesen a tbbi mennyisg ehhez kpest
arnyos magassg legyen!
44. feladat
rjunk egy olyan programot, mely maximum tdfok polinomokat tud brzolni. Az tdfok
polinomok ltalnos alakja: a 5 x 5 + a 4 x 4 + a 3 x 3 + a 2 x 2 + a1 x + a 0 . A programban a
megfelel egytthatkat krjk be, illetve a a vltoz intervallumnak als s fels hatrt.
Vigyzzunk az brzolskor, hogy az adott intervallumon minden fggvnyrtk frjen el a
kpernyn!
45. feladat
Ksztsnk egy cltblt!
46. feladat
47. feladat
rjunk makrkat a kvetkez funkcikra:
55
http://www.doksi.hu
56