You are on page 1of 56

http://www.doksi.

hu

C programozs kzpiskolsoknak

http://www.doksi.hu

Tartalomjegyzk

TARTALOMJEGYZK ...................................................................................................... 1

C PROGRAMOZS KZPISKOLSOKNAK ............................................................. 1


2.1
AZ ELS C PROGRAM ....................................................................................................... 4
2.2
MEGJEGYZSEK................................................................................................................ 4
2.3
A VLTOZKRL .............................................................................................................. 4
2.3.1
Felhasznli tpus ................................................................................................... 7
2.4
KONSTANSOK ................................................................................................................... 7
2.4.1
A const kulcssz hazsnlatval ............................................................................... 7
2.4.2
Az elfordtnak szl helyettestssel .................................................................... 7
2.5
OPERTOROK ................................................................................................................... 7
2.5.1
Aritmetikai opertorok ............................................................................................ 8
2.5.2
sszehasonlt s logikai opertorok ..................................................................... 8
2.5.3
Lptet opertorok .................................................................................................. 8
2.5.4
Bitmveletek ............................................................................................................ 8
2.5.5
rtkad opertorok ............................................................................................... 9
2.5.6
Feltteles opertor .................................................................................................. 9
2.5.7
Pointer opertorok .................................................................................................. 9
2.5.8
Tpuskonverzik ..................................................................................................... 10
2.6
ADATOK BEOLVASSA A BILLENTYZETRL ................................................................. 11
2.7
ITERCIK...................................................................................................................... 11
2.7.1
while ciklus ............................................................................................................ 12
2.7.2
for ciklus ................................................................................................................ 12
2.7.3
do-while ciklus....................................................................................................... 13
2.8
SZELEKCIK ................................................................................................................... 14
2.8.1
if utasts ............................................................................................................... 14
2.8.2
if-else szerkezet ...................................................................................................... 14
2.8.3
switch utasts ....................................................................................................... 15
2.9
TMBK ......................................................................................................................... 16
2.9.1
Egydimenzis tmbk ............................................................................................ 16
2.9.2
Sztringek ................................................................................................................ 17
2.9.3
Kett s tbb dimenzis tmbk ............................................................................ 19
2.10 FELHASZNL LTAL DEFINILT TPUSOK ..................................................................... 20
2.10.1
Struktrk .............................................................................................................. 20
2.10.2
Struktrt tartalmaz tmbk................................................................................ 20
2.11 FGGVNYEK ................................................................................................................. 21
2.11.1
Paramtertads ................................................................................................... 21
2.11.2
Loklis s globlis vltozk................................................................................... 22
2.11.3
Automatikus s statikus vltozk ........................................................................... 22
2.11.4 Register mdost jelz ......................................................................................... 23
2.11.5
Vektor tadsa fggvnynek.................................................................................. 24
2.12 MUTATK (POINTEREK) ................................................................................................. 24
2.12.1
Vektorok s mutatk .............................................................................................. 25
2.12.2
Ktdimenzis tmbk s pointerek ........................................................................ 27
2.12.2.1
Dinamikus tmb egy vektorban .................................................................... 27
2.12.2.2
Konstansban megadott tmbmret, dinamikus helyfoglalssal .................... 28
2.12.2.3
Mutattmb ................................................................................................... 29
2.12.3
Struktrk s mutatk ............................................................................................ 30
2.12.4
Dinamikus lista...................................................................................................... 30
2.13 FILE KEZELS ................................................................................................................. 33
2

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

FGGELK ..................................................... HIBA! A KNYVJELZ NEM LTEZIK.

http://www.doksi.hu

1.1

Az els C program

Tekintsk a kvetkez egyszer C nyelven rt programot:


#include <stdio.h>
main()
{
printf( Els C programom \n);
}
A program kimenete az idzjelek kztt szerepl felirat, a kurzor pedig a kvetkez soron ll.
Nzznk nhny megjegyzst a fenti programmal kapcsolatban:
1. A C programozsi nyelv klnbsget tesz a kis s a nagy betk kztt. Minden C
parancsnak kis betsnek kell lennie
2. A C program belpsi pontjt a
main()
fggvnyhvs azonostja. Egyelre a fggvnyt argumentumok nlkl hvtuk meg, a
ksbbiekben ennek rszletezsre mg kitrnk.
3. A { s } a kezd s a vgpontjt jellik a vgrehajtsi rsznek.
4. #include <stdio.h> nlkl nem mkdne a printf() fggvny.
5. A printf()-ben a kirand szveget dupla idzjelek kz kell tennnk. Vegyk szre azt
is, hogy a \n karakter nem kerlt kirsra. Teht a printf() kln tartalmazza a kirand
szveget s a kirst befolysol vltozkat. Ami a dupla idzjelek kztt megjelenik
vltoztats nlkl kirsra kerl, kivtel ez all a \ s % karaktereket kvet jel, vagy a
jelsorozat. A \n vltoz a fordt szmra azt jelenti, hogy a kvetkez karakter kirsa
eltt j sort kell kezdenie
6. A parancsokat a ; zrja le.
1., 2. feladat
1.2
Megjegyzsek
A megjegyzseket a programszveg magyarzatainak bersra szoktuk hasznlni.
Hibakeresskor is j hasznt vehetjk azonban, ha a program egy rsznek vgrehajtst
szeretnnk kihagyni, akkor azt megjegyzs blokkba zrhatjuk.
/* ez most egy egysoros megjegyzs */
/* ez most
tbb soros
megjegyzs */
1.3
A vltozkrl
A C tpusos programnyelv. Ez azt jelenti, hogy mieltt egy vltozt hasznlni szeretnnk
deklarlnunk, kell azt. Figyeljnk arra, hogy a a fordtprogram a vltoz nevekben is
klnbsget tesz a kis s a nagy betk kztt.
4

http://www.doksi.hu

A nvre a kvetkez megktsek rvnyesek:

csak betket, szmjegyeket s alhzs karaktert tartalmazhat

betvel kell kezddnie

hossza legfeljebb 32 karakter (implementci fgg)

A vltoz deklarci szablya C-ben a kvetkez:


Tpus nev1,nev2,;
Pldul:
int s;
float f,k;
Egy vltozt kezdrtkkel is ellthatunk.
int s=10;
Nzzk a kvetkez C programot:
#include <stdio.h>
main()
{
int sum;
sum = 500 + 15;
printf("500 s 15 sszege %d\n", sum);
}
A programban ltrehoztunk egy egsz tpus vltozt, majd egy sszeget rendeltnk hozz.
Figyeljk meg a vltoz kiratst! Az idzjelek kztt most tallkozunk elszr a % jellel.
Mgtte kell megadnunk, hogy erre a helyre milyen tpus vltoz kerl kirsra. A d bet az
egsz tpusra utal. Az idzjel utn kvetkezik a vltoz neve. Ennek rtke kerl majd bersra
a szvegbe.
Az adatoknak a C-ben ngy alaptpusa van: egsz (int), karakter (char), vals (float, double),
Az alaptpusokat ellthatjuk mdost jelzkkel is, ekkor az rtkkszlet mdosul.
Pl.
int a
unsigned 1 int b
Az els esetben az a rtke 32768 s 32767 kztt lehet, mg a msodik esetben a b rtke 0 s
65535 kztti szm lehet. A signed 2 mdost jelz is hasznlhat, de alaprtelmezs szerint
minden egsz vltoz ilyen lesz.

1
2

Eljel nlkli
Eljeles

http://www.doksi.hu

A kvetkez tblzatban felsoroltunk nhny tpust, rtkkszletkkel egytt.


Adattpus
char
unsigned char
int
unsigned int
long int
unsigned long int
float
double
long double

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

Lehetsg van arra is, hogy meghatrozzuk a


vltoz rtke ltal elfoglalt mez szlessgt.
Nzk a kvetkez pldkat
int v1;
printf(%5d,v1);
A v1 egsz vltoz 5 karakter helyen jelenik meg.

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

1.3.1 Felhasznli tpus


Ha egy tpus neve tl hossz s gyakran hasznlnunk kell a program sorn, akkor rdemes egy
szinonimval hivatkozni r: Ennek a mdja:
typedef tpus tpusnv
Egy konkrt pldn keresztl
typedef unsigned long int egesz;
egesz n;
Nhny tovbbi formzsi lehetsg a printf()-ben:

\n
\t
\r
\f
\v

j sor
tabultor
kocsi vissza
soremels
fggleges tabultor

3.,4.,5.,6. feladat

1.4

Konstansok

A konstansok megadsnak kt mdjt ismertetjk az albbiakban.

1.4.1 A const kulcssz hasznlatval


const int a=30;
Ebben az esetben vigyzni kell arra, hogy a konstanst inicializljuk is. Hibajelzst ad a
kvetkez deklarci:
const int a;
a=30;
Az gy ltrehozott konstansok rtke kzvetlenl nem vltoztathat meg. A konstansok, azonban
a memrban troldnak, gy rtkk kzvetetten mutatk hasznlatval mdosthat
1.4.2 Az elfordtnak szl helyettestssel
Az elfordtnak klnbz defincikat, lersokat adhatunk, errl a ksbbikeben mg
rszletesen lesz sz. Most egyetlen pldt nzznk a konstansok megadsra
#define ADO_KULCS 0.25
Az gy megadott konstansok a program listjnak elejn szerepelnek a #include beillesztsek
utn. Szintaktikailag a # a sor els karaktere kell hogy legyen, az ilyen sorokat nem zrhatjuk
pontosvesszvel, s minden sorban csak egy #define llhat. Mivel ezek a lersok az
elfordtnak szlnak, ezrt minden olyan helyen, ahol a programlistban az ADO_KULCS
azonost szerepel, az elfordt 0.25 rtket fog berni. Ezrt az gy ltrehozott konstansok
rtke mg indirekt mdon sem vltoztathat.
1.5
Opertorok
A programok rsa sorn gyakran van szksgnk kifejezsek felptsre, vltznak trtn
rtkadsra, szmolsi mveletekre, fggvnyhvsokra. A C nyelvben ezek a kifejezsek
oparandusok, fggvnyhvsok s opertorok kombincijbl plnek fel.
Az opertorokat tbbfle szempont szerint lehet csoportostani.

Az operandusok szma szerint. (egy, kett, hrom operandus)


7

http://www.doksi.hu

Az opertor tpusa szerint (aritmetikai, logikai, lptet, bitmvelet, rtkad, feltteles)

Az opertor helye szerint (prefix, postfix)

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

1.5.6 Feltteles opertor


A C-ben ez az egyetlen opertor, melynek hrom operandusa van. ltalnos alakja a kvetkez:
kifejezs1 ? kifejezs2 : kifejezs3
Itt elszr a kifejezs1 rtkeldik ki, ha ennek rtke nem 0, azaz IGAZ, akkor a kifejezs2 adja
a feltteles kifejezs rtkt, klnben pedig a kifejezs3. A feltteles kifejezs tpusa mindig a
kifejezs2 s kifejezs3 tpus kzl a nagyobb pontossg tpusval egyezik meg.
A kvetkez pldban c rtke a s b kzl a kisebbel lesz egyenl.
c=a<b?a:b
1.5.7 Pointer opertorok
A mutatkrl az eddigiek sorn mg nem volt sz, de a teljessg kedvrt megemltnk kt
egyoperandus mveletet, mely a mutatkhoz (pointerek) ktdik. & a cme opertor.
int a , *ptr;
ptr = &a
Ebben a pldban a ptr egy egsz tpus vltozra mutat, rtkadsnl pedig az a vltoz
memriabeli cmt kapja meg. Ha erre a cmre j rtket akarunk rni, akkor a * (indirekt
hivatkozs) opertort kell hasznlnunk.
*ptr = 5 egyenrtk az a=5 rtkadssal.
9

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

11., 12., 13. feladat

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!!);
}

1.8.2 if-else szerkezet


Az utasts ltalnos alakja:
if (kifejezs)
utasts1
else
utasts2
Ha a kifejezs rtke nem nulla (IGAZ), akkor az utasts1 hajtdik vgre, ha pedig nulla
(HAMIS) az utasts2.
Az elz pldnl maradva, ha az rtk rossz, akkor rassuk ezt ki az else gon!
else
printf(Az rtk rossz);
Ezt a kt sort az elz programban az res sor helyre kell beszrni. Vigyzzunk azonban, ebben
az esetben a J rtk sornak vgn nem llhat; ugyanis ekkor egy else kulcsszval tallkozna a
fordt, amivel viszont nem kezddhet parancs.

14

http://www.doksi.hu

1.8.3 switch utasts


Az utasts tbb irny elgazst tesz lehetv, de csak abban az esetben, ha egy egsz kifejezs
rtkt tbb konstanssal kell sszehasonltani. ltalnos alakja:
switch (kifejezs)
{
case konstans1:
utasts1;
case konstans2:
utasts2;
.
default:
utasts;
}
A switch utastssal nagyon tgondoltan kell bnni. ltalnos esetben, ha az egyik case-nl
tallunk egy belpsi pontot, akkor az utna kvetkez case cimkk utn ll utastsok is vgre
fognak hajtdni. Hacsak nem pontosan ez a szndkunk, akkor minden utastst break-kel kell
zrni, melynek hatsra a vezrls a switch utni els utastsra kerl. ltalban a default
eseteket is break-kel szoktuk zrni, mert ez nem felttlenl az egyes esetek vgn ll, brhol
elhelyezhet a szerkezetben. Ha ugyanazt az utastst akarjuk vgrehajtani tbb konstans rtk
esetn is, akkor a konstansokat egymstl:-tal elvlaszva soroljuk fel.
Nzznk egy rvid pldaprogramot a switch illusztrlsra:
#include <stdio.h>
main()
{
int menu, n1, n2, t;
printf("rjon be kt szmot: ");
scanf("%d %d", &n1, &n2 );
printf("\n Vlasszon\n");
printf("1=sszeads\n");
printf("2=Kivons\n");
scanf("%d", &menu );
switch( menu ) {
case 1: t = n1 + n2; break;
case 2: t = n1 - n2; break;
default: printf("Nem j vlaszts\n");
}
if( menu == 1 )
printf("%d + %d = %d\n", n1, n2, t );
else if( menu == 2 )
printf("%d - %d = %d\n", n1, n2, t );
}

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

for (i=0; i<SZAM;i++)


{
prinf(a[%d]=,i);
scanf(%d,&a[i]);
s+=a[i];
}
printf(\n Az sszeg: %d,s);
}
1.9.2 Sztringek
A C-ben nincs kln sztring tpus, ezrt az egy dimenzis tmbket gyakran hasznljuk
sztringek definilsra. Tulajdonkppen a sztring egy egydimenzis karaktertmb lesz. A sztring
vgt egy \0 karakter fogja jelezni, ezrt ha egy 10 hosszsg sztringet szeretnnk kezelni,
akkor azt felttlenl 11 hosszsgra kell ltrehoznunk.
char sztring[11];
char sz[]={C-,n,y,e,l,v,\0);
rtkads helyett clszerbb s biztonsgosabb a kvetkez megadsi md:
char sz[]=C-nyelv;
Ebben az esetben ugyanis a sztring vgt jelz \0 karaktert a fordt teszi ki a sztring vgre.
A kvetkez tblzatban nhny sztingkezel fggvnyt sorolunk fl.
Nv
strcat(sz1,sz2)

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)

Az sz1 stringbe msolja az


sz2 sztringet

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)

Ugyanaz, mint az elz, csak Az elz adatokkal


a kis s a nagy betk kztt
nem tesz klnbsget.
Eredmnye: 0

17

http://www.doksi.hu

strchr(sz1,c)

Megnzi, hogy az sz1


stringben elszr hol fordul
el a c karakter

char c=e, sz1[]=Hello, *ch;


ch=strchr(sz1,c);
printf(%d\n, ch-sz1);
Eredmnye: 1 4

strrchr(sz1,c)
strlwr(sz), strupr(sz)

Ugyanaz, mint az elz, csak


jobbrl indul
A sztringet kis, illetve nagy
sz=hello
bets formtumv alaktja
printf(%s\n,strupr(sz));

Az sz1 sztringbe msol sz2bl n db karaktert;

Eredmnye: HELLO
sz2=Hello;n=2;
strncpy(sz1,sz2,n);sz[2]=\0 5;
printf(%s\n,sz1);

Az sz1 szringhez fz n db-ot


az sz2-bl

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)

Ha ezeket a sztring kezel fggvnyeket hasznlni akarjuk,akkor mindenkppen szksg van a


#include <string.h> beszrsra.
Nzznk egy pldaprogramot arra, hogyan lehet egy sztringet karakterenknt vgigolvasni
anlkl, hogy tudnnk a hosszt:
#include <stdio.h>
main()
{
int sz[]=C programozsi nyelv;
int i=0;
while (s[i])
{
Figyeljk meg, hogy az eredmny 1, ugyanis a sorszmozs most is 0-val kezddik. A vltoz deklarcikat is
figyeljk meg!
5
Figyeljnk fl r, hogy a sztring vgre neknk kell kitennnk a vgt jelz karaktert, klnben nem fog helyesen
mkdni!
4

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:

Ha ugyanazt a tevkenysgsorozatot tbbszr is el kell vgeznnk ugyanolyan tpus, de


ms-ms rtket flvev vltozkkal.

Ha a programunkat struktrltan, jl olvashatan szeretnnk megrni. Ez nagyon fontos a


ksbbi mdosthatsg miatt.

Termszetesen az els kett eset egytt is fennllhat.

A fggvny defnci ltalnos alakja:


visszatrsi_rtk_tpus fvnv (tpus1 vlt1,tpus2 vlt2,)
{
a fggvny teste
return v1;
}
Konkrt plda egy egyszer fggvnyre:
int osszeg(int a, int b)
{
int s=a+b;
return s;
}
Ha egy fggvnynek nincs visszatrsi rtke, akkor a void kulcsszt hasznljuk:
void fnev(tpus1 vlt1,)
1.11.1 Paramtertads
A paramtertads a Pascal-hoz hasonlan itt is trtnhet cm szerint s rtk szerint. Az elve
szintn ugyanaz. Az rtk szerinti paramtertadsra az imnti fggvny lehet egy plda.
Cmszerinti paramtertadsnl azonban mr sokkal jobban oda kell figyelni, mint a Pascalban.
Pldaknt rjunk egy fggvnyt, mely a paramterben megadott vltozkat flcserli.
#include <stdio.h>
#include <conio.h>
void csere(int *a,int *b)
{
21

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

1.11.5 Vektor tadsa fggvnynek


A kvetkez plda bemutatja, hogy egy vektort hogyan adhatunk t paramterknt egy
fggvnynek. A fggvny az tadott vektor legnagyobb elemvel tr vissza.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int maximum(int a[], int n)
{
int i;
int max=a[0];
for (i=1;i<n;i++)
if (max<a[i]) max=a[i];
return max;
}
main()
{
char c;
int b[]={12,5,6,3,9,11,13,21,10,1,34};
clrscr();
printf("\n a b[] maximuma: %d",maximum(b,sizeof(b)/sizeof(b[0])));
while ((c=getch()) !=13);
}
A programot vizsglva addhat az az tletnk, hogy a tmb mrett flsleges volt tadni a
fggvnynek, azonban ez sajnos nem igaz. A fggvny fejben lv int a[0] ugyanis csak annyit
kzl a fordtval, hogy egy egszeket tartalmaz vektor fog jnni paramterknt.
1.12 Mutatk (Pointerek)
A C programozsi nyelvben van egy klns adat tpus: a mutat. Ez egy vltoznak a
memriabeli cmt veheti fl rtkl. Definils sorn a mutat tpus vltoz neve eltt a * jelet
kell hasznlnunk. (Ezt nevezik indirektsg opertornak is) Egy mutat rtket az & (cme)
opertorral kaphat. A pointer ltal mutatott cmet szintn a * opertorral kaphatjuk vissza.
Nzznk erre egy konkrt pldt:
int a=3,b, *p; /* a pegy egsz tpus vltozra mutat pointer */
p=&a;
/* p az a cmt veszi fl rtkknt */
b=*p; /* b megkapja a p ltal mutatott cmen lv rtket, ebben az esetben 3 lesz */
A kvetkez programban mi fog megjelenni a kt kirs utn?
#include <stdio.h>
main()
{
char c;
24

http://www.doksi.hu

int a=10,b=15, *p;


clrscr();
p=&a;
*p+=a+b;
printf("%d",a);
p=&b;
*p+=a+b;
printf("%d",b);
while ((c=getch()) !=13);
}
A mutatknak nem ez a bvszkeds adja a jelentsgt. Segtsgkkel dinamikusan kezelhetjk
a memrit, mindig csak annyit hasznlva, amennyire az adatoknak ppen szksge van.
32. feladat
1.12.1 Vektorok s mutatk
A C programozsi nyelvben igen szoros kapcsolat van a a vektorok s az egyszeres indirektsg 7
mutatk kztt. Ez a vektorok trolsi mdjbl ered. A vektorok a memriban sorfolytonosan
helyezkednek el. Ha egy pointert a vektor els elemre irnytunk, akkor a pointer aritmetika
szablyai szerint ehhez 1-et hozzadva a vektor msodik elemt fogjuk megkapni. 8
int *p,a[10];
p=&a[0];
Ekkor a *p hivatkozs a vektor els elemt fogja jelenteni. Teljesen egyenrtk a kvetkez kt
hivatkozs:
*p=5; a[0]=5;
Mivel a kapcsolat ilyen szoros a vektor s a vektor els elemre mutat pointer kztt, ezrt a
vektoros s a pointeres hivatkozsok felcserlhetk. a fenti deklarcik szerint a vektor i-edik
elemre val hivatkozsok:
a[i], p[i], *(a+i), *(p+i)
Az els kett tmbs, a msodik kett pedig pointer tpus hivatkozs. Jl jegyezzk meg teht,
hogy az a tmbnv s a p mutat is az elemek sorozatnak els elemt jelenti.
Pascal programokban, ha szksgnk volt egy vektorra, akkor azt mr vltoz deklarciban
ltre kellet hoznunk s a mrett is be kellett lltanunk. Ha a vektor elemszma elrheti a 100-at
is, de az esetek 99%-ban neknk csak 10 elemre van szksgnk, nem tehettnk mst, mint
hogy 100 hosszsgra hoztuk ltre a vektort, ezzel jelents memria terletet lefoglaltunk. A C
nyelv programokban nagyon egyszeren ltrehozhatunk dinamikus helyfoglals vektorokat.
Ezeknl futsi idben dl el, hogy milyen hosszsgak lesznek, ha a tovbbi feldolgozshoz
nincs szksg rjuk, akkor az ltaluk lefoglalt memria felszabadthat.
Nzznk erre egy pldaprogramot. A program megkrdezi, hogy hny elem vektorral kvnunk
dolgozni, majd helyet foglal a memriban az elemeknek, vletlen szmokkal feltlti a vektort,
kirja az elemeket s sszegket, majd a vgn felszabadtja a lefoglalt memria terletet.
7

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);

/* Felszabadtja lefoglalt memrit */

while ((c=getch()) !=13);


}
Magyarzatok a fenti programhoz: Ha a memriakezel fggvnyeket akarjuk hasznlni, akkor
szksgnk van az stdlib.h beemelsre. A helyfoglalst a memriban a calloc, vagy a malloc
fggvnyek hvsval vgezhetjk el. A calloc fggvnynl meg kell mondanunk, hogy hny
elem szmra szeretnnk helyet foglalni, s hogy egy elemnek mekkora a mrete, ebben a
sorrendben. A fggvny a lefoglalt memriaterletet rgtn feltlti nullval. A malloc
fggvnnyel pedig azt kell kzlni, hogy mekkora memriaterletet szeretnnk lefoglalni (byteban).
Ha mr nincs szksgnk a lefoglalt terletre, akkor ezt a free fggvnnyel flszabadthatjuk.

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

Ilyen tpuskonverzival tallkoztunk mr korbban. Nzzk meg a tpuskonverzik cm fejezetet!

27

http://www.doksi.hu

while ((c=getch()) !=13);


}
A memriafoglals ebben a programban valban futsi idben trtnik. Ha kzelebbrl is
szemgyre vesszk a listt lthat, hogy itt a mtrixot valjban egy vektorban troljuk. Az
aktulis pozcit pedig a
hely=aktulis_sor*oszlopszm+aktulis_oszlop
formulval hatroztuk meg. Figyeljnk fl itt is a kt fajtahivatkozsra!
1.12.2.2 Konstansban megadott tmbmret, dinamikus helyfoglalssal
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define N 6
#define M 5
typedef int matrix[N][M];
main()
{
char c;
matrix *p;
int i,j;
clrscr();
p=(matrix *) calloc(1,sizeof(matrix));
if (!p)
{
printf("Nincs elg memria!");
return -1;
}
for (i=0;i<N;i++)
{
for (j=0;j<M;j++)
{
(*p)[i][j]=random(10);
printf("%3d",(*p)[i][j]);
}
printf("\n");
}
free(p);
while ((c=getch()) !=13);
}
Ebben az esetben futsi idben nincs mr lehetsgnk a tmb mreteinek vltoztatsra, de a
helyfoglals itt is csak futsi idben trtnik meg. A hivatkozs majdnem teljesen olyan, mint a
28

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

A fenti brn a szrke az adatrsz a fekete pedig a mutat rsz.


A lista szerkezetnek sok elny van egy vektorhoz kpest. Egy listban tnyleg mindig csak annyi
elem van, amennyire ppen szksgnk van. A szerkezet mdostsa is nagyon egyszer. Ha egy
j adatot akarunk felvenni, akkor
1. megkeressk az j elem helyt
2. az aktulis adat mutatjt tmsoljuk az j elem mutatjba
3. az aktulis elem mutatjt az j elemre irnytjuk

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 (+)

Ltez file megnyitsa olvassra. File mutat a file


elejre ll.

w (+)

j file megnyitsa rsra. Ltez file esetn annak


tartalma elvsz. . File mutat a file elejre ll.

a (+)

File megnyitsa hozzrsra. Nyits utn a file


mutatja file vgre ll. Ha a file nem ltezik, akkor az
fopen ltrehozza

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)

Beolvas egy karaktert a file-bl

fputc(ch,fp)

Kir egy karaktert a file-ba

fgets(sz,strlen(string)+1,fp)

Az sz vltozba beolvas egy sztringet

fputs(string,fp)

A string vltoz tartalmt kirja a file-ba

fscanf(fp,konv,&valt)

Hasonl a scanf-hez, eltrs az els paramterben

fprintf(fp,konv,valt

Hasonl a printf-hez, eltrs az els paramterben

Az albbiakban kt egyszer programot mutatunk be a szveges llomnyok kezelsre:


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main()
{
char c;
FILE *fp;
int i;
clrscr();

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

while( (c = fgetc(fp)) != EOF )


putchar (c);
fclose (fp);
}
}
1.13.3 Binris llomnyok
A binris llomnyokat byte-onknt vagy blokkonknt kezelhetjk. A byte-onknti kezelshez
jl hasznlhat az elz rszben lert fgetc s fputc fggvnypros. A blokkonknti kezelst
pedig az fread s az fwrite fggvnyekkel vgezhetjk el.
Hasznlatukat a kvetkez pldban figyelhetjk meg.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main()
{
char c;
FILE *bf;
int i[10]={1,2,3,4,5,6,7,8,9,10},counter,sv;
clrscr();
if (!(bf=fopen("A:\\fileok\\adat.dat","w+b")))
{
printf("Sikertelen file nyits");
return -1;
}
fwrite(i,sizeof(int),10,bf);
rewind(bf);
counter=fread(&sv,sizeof(int),1,bf);
printf("%4d",sv);
fseek(bf,3*sizeof(int),SEEK_SET);
counter=fread(&sv,sizeof(int),1,bf);
printf("%4d",sv);

/* 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

Az fread fggvny hasonlkppen paramterezhet. Eltrs abban van, hogy beolvasskor


nyilvn a vltoz cmt kell megadni a fggvnynek, a msik hrom paramter ugyanaz.
Termszetesen mindkt fggvnynek van visszatrsi rtke is. Mindkettnl a sikeresen kirt
illetve beolvasott blokkok szmt adja vissza. Ez az rtk hasznlhat a sikertelen beolvass
illetve kirs figyelsre. Ha a fenti programban a counter vltoz rtke nem egyenl eggyel,
akkor az azt jelenti, hogy nem sikerlt beolvasni adatot az llomnybl. Ezeknek a vltozknak a
megadsa nem ktelez, mint a fenti programbl is ltszik az fwrite fggvnyt enlkl hvtuk
meg.
A programban van mg egy jdonsg, az llomnyban val pozcionls. Erre az fseek
fggvnyt hasznljuk. Paramterezse: els paramter a file mutat, msodik a blokkmret s
egy egsz szm szorzata (ennyiedik elemre fogunk llni), harmadik pedig azt mutatja meg, hogy
mihez viszonytjuk a pozcionlst. SEEK_CUR esetn a pillanatnyi pozcihoz, SEEK_SET
esetn pedig a file elejhez. Vigyzzunk azonban ennek az alkalmazsval, a sorszmozs most
is a nulladik elemtl kezddik, ennek a SEEK_SET esetn lehet jelentsge. A pillanatnyi
pozcival pedig az a helyzet, hogy amikor egy adat beolvassa megtrtnt, akkor a file mutat
rgtn eggyel tovbb lp, teht, ha a szomszdos elemre akarunk lpni, akkor termszetesen a
fseek-ben 0-t kell adnunk a msodik paramter helyn 12.
36., 37., 38. feladat
1.14
A szveges kperny kezelse
A Turbo C a kpernyt grafikus s szveges zemmdban mkdtethet. Mindkt zemmdban
nagyon sok fggvnyt segt vltozatosabb tenni a kpernyt ebben a fejezetben a szveges
zemmd fggvnyeirl lesz sz.
Ha ezeket a fggvnyeket hasznlni szeretnnk, akkor a program elejn a kvetkez header fileokra lesz szksgnk:
#include <conio.h>
#include <string.h>
#include <ctype.h>
Valjbana kpernyt kezel fggvnyek az elsben vannak deklarlva, de kpernyn
sztringekkel s karakterekkel dolgozunk, ezrt szinte mindig szksgnk van a msik kettre is.
A sztring kezel fggvnyekrl korbban mr volt sz ezt mg ebben a fejezetben kiegsztjk
nhny konverzis fggvnnyel s a gyakrabban hasznt karakterkezel fggvnyeket is
flsoroljuk.
1.14.1 Szveges zemmdban gyakran hasznlt fggvnyek:
Nv
Lers
Nv
Formzott
kivitel,
hasonl
a
cprintf()
clreol()
printf-hez
egy
string
kivitele
a gotoxy()
cputs()
kpernyre
putch()
window()
egy karakter kivitele
egy karakter beolvassa a
getche()
billentyzetrl s kirsa a textcolor()
kpernyre
clrscr()
textbackground
kperny trlse

12

Ilyet nyilvn nem fogunk csinlni, mert automatikus a tovbblps

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

1.14.3 Nhny karaktert tesztel makr


Minden makr 13 argumentumban char tpus vltoz szerepel s mindegyik visszatrsi rtke
int.
Makr

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

elvlaszt karakter, az sszes


nyomtathat karakter a betk,
szmok s szkz nlkl.
jelentse: a makr visszatrsi rtke nem nulla, ha c rtke
isgraph

nyomtathat karakter, de nem


ispunct
szkz

1.14.4 Karaktert talakt fggvnyek


Fggvny
toascii
toupper
tolower

Lers
ASCII karekterr alakt
Az angol kis betket nagy betkk alaktja
Az angol nagybetket kis betkk alaktja

1.14.5 Nhny konverzis fggvny


Fggvny pldval

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);

Sztringet konvertl t egsz


sikertelen esetn 0-val tr vissza

szmm,

Sztringet konvertl t hossz egsz szmm,


sikertelen esetn 0-val tr vissza
Sztringet egssz alakt, az utols szm a
szmrendszer alapszma (2-36), endptr a
hibra mutat
Az elzhz hasonl, csak a visszatrsi
rtk tpusa ms
Egsz szmot sztringg konvertl, utols
jegy az alapszm
Hossz egszet alakt sztringg
Eljel nlkli hossz egszet alakt sztringg

39., 40. feladat


1.15
A grafika programozsa
A grafikus fggvnycsomagban jl hasznlhat fggvnyek csoportja ll rendelkezsnkre
ahhoz, hogy egyszerbb pixel grafikus brkat ksztsnk. Valjban minden alakzat, amit a
kpernyn megjelentnk a putpixel fggvnyre tmaszkodik, de a rajzols megknnytse
rdekben sok grafikus primitv 14 ll rendelkezsnkre. (egyenes, kr tglalap, ellipszis, v stb
Olyan fggvny, mely egy megfelel paramterezssel az adott alakzatot megrajzolja. Ha egy rendszerben sok
grafikus primitv van, akkor az megknnyti a grafika programozst. Grafikus primitv pldul egy kr rajzolsa, de
14

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)

VGA monitorok esetn:


getmaxxx()=639
getmaxy=479

(0,getmaxy())

(getmaxx(),getmaxy())

A matematikban alakalmazott koordintarendszer ettl egy kicsit eltr. Szmunkra az lenne a


termszetes, ha az orig a kperny kzppontjban lenne, s az y rtkek alulrl flfel
nvekednek. Ha ezt a koordintarendszert szeretnnk hasznlni, akkor szksg van egy
koordinta tarnszformcira.
void trafoxy(int *x,int *y)
{
*x+=getmaxx() / 2;
*y=getmaxy() / 2 - *y;
}
Teht ha a matematikai koordintkkal akarunk dolgozni,
akkor szmolskor azokat hasznljuk, majd brzolskor a
fenti fggvnnyel ttranszformljuk azokat kperny
koordintkk. A fggvny hvsnak mdja:
trafoxy(&x,&y);
Ha egy grafikus fggvny szgekkel dolgozik, akkor azt
fokokban kell megadni, a matematikban megszokott
krljrs szerint.

90

180

270

1.15.2 Grafika indtsa


Mieltt grafikai fggvnyeket hasznlnnk, el kell ksztennk a kpernyt. Ennek mdjt
mutatjuk meg az albbiakban.
#include <conio.h>
#include <stdlib.h>
#include <graphics.h>

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

Ne feledkezznk el az tvonal megadsakor a \ helyett \\ hasznlatrl!

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)

Egy poligont rajzol, ha zrt akkor cscspontjainak szma n-1,


klnben n, a poly[] vektorban kell flsorolni a cscsok koordintit,
x1,y1,x2,y2,sorrendben,
zrt
sokszg
esetn
az
els
koordintknak egyeznik kell az utolskkal.
Tglalap x1,y1 bal fels, x2,y2 jobb als cscs koordinti
Krv, kzppontja x,y, sugara r, az vhosszat ksz-t vsz-ig fokokban.
Kr az elz paramterezssel.
Egy ellipszist, vagy annak egy vt rajzolja, rx szlessgnek, ry
magassgnak fele.
Kitlttt tglalap.
Hasb 45 fokos axonometriban m a mlysg, ha t!=0, akkor a
fedlap is festett.
Mint az arc, csak ez kitlttt krcikk lesz
Kitlt egy ezrt terletet, melynek x,y bels pontja.
Trli a grafikus kpernyt.
Szveget r a kpernyre az aktulis kurzorpozcitl
A szveget az x,y koordintj ponttl kezdi.
A szveg stlust llthatjuk be vele. f a karakter stlusa
DEFAULT_FONT, TRPLEX_FONT, SMALL_FONT,
SANS_SERIF_FONT, GOTHIC_FONT
d=0 esetn balrl jobbra, 1 esetn fellrl lefel r
s a karakter mrett jelenti, ha 1 akkor 8x8 pixel, 2 esetn 16x16
pixel

41., 42., 43., 44., 45., 46. feladat


1.16
Makrk
A makrk a fggvny kdjba beptett szvegeket jelentenek a C nyelv esetben. Makrk
segtsgvel egyszer, gyakran alkalmazott mveleteket oldhatunk meg fggvnyek megrsa
nlkl. C nyelvi makrkat a #define direktva 16 utn adhatunk meg. Ezt a direktvt hasznltuk
mr korbban konstansok ltrehozsra.
Az gy ltrehozott konstansok futsidben mr nem vltoztathatk 17. A fordtnak az az els
dolga, hogy a forrsnyelvi llomnyt tadja, az elfeldolgozznak. Az elfeldolgozz feladata,
hogy a #define utn tallt szvegeket behelyettestse a forrsprogram azon rszbe, ahol
hivatkozs trtnt rjuk. Az elfeldolgozknak lehet, hogy tbbszr is vgig kell menni a listn,
mivel a makrk minden tovbbi nlkl egymsba gyazhatk
1.16.1 Fggvnyszer makrk
A definci ltalnos alakja:
#define azonost(paramterek) helyettest szveg
A makr hvsa:
azonost(argumentumok);
Nznk meg konkrtan nhny fggvnyszer makrt!
#include <stdio.h>
#include <conio.h>
16

A fordtnak szl utasts.


A const kulcsszval definiltakrl ez nem mondhat el, ezekkel csak annyit kell tenni, hogy egy rjuk irnytunk
egy pointert s ennek az rtkt mdostjuk.

17

44

http://www.doksi.hu

#define min(a,b) ( (a)>(b)?(b):(a))


#define abs(x) ( (x)<0?(-(x)):(x))
#define HA_KICSI(x) (((x)>='a') && ((x)<='z'))
#define NAGY(x) (HA_KICSI(x)?(x)-'a'+'A':(x))
main()
{
char c='f';
int a=10, b=20;
int k=-3;
clrscr();
printf("|%d|=%d\n",k,abs(k));
printf("%d,%d kzl %d a kisebb\n",a,b,min(a,b));
printf("%c",NAGY(c));
getch();
}
Els ltsra fltnhet, hogy a makr definciban ltszlag flsleges helyeken hasznlunk
zrjelezst. Mi rtelme van annak pldul, hogy az abs makrban a utn az x-et zrjelbe
tesszk? Induljunk ki abbl, hogy az elfeldolgozk csak egyszer szveghelyettestst vgez.
Azaz, ha a makrt meghvjuk az a rtkkel, akkor az x helybe a-t fog rni. Mi a helyzet, ha a
makrt az a+1 rtkkel hvjuk meg? ha zrjelben van az x, akkor nincs gond (a+1) kerl
behelyettestsre, ha azonban elhagyjuk a zrjelet, akkor a a+1 szveg rdik be, amirl
knnyen lthat, hogy nem egyezik meg az a+1 ellentettjvel. Teht fggvnyszer makrk rsa
esetn nagyon fontos a zrjelezs. Inkbb legyen flsleges zrjel, mint hibs mkds.
Egy msfajta alkalmazsa a fggvnyszer makrknak, mikor az ltaluk tadott rtk
tokenizldik 18, vagy pedig az tadott rtk szvegknt kerl behelyettestsre. Ezekre az
esetekre mutat pldt az albbi program.
#include <conio.h>
#include <stdio.h>
#define kiir(a) printf("%d\n",(x##a))
#define szoveg(x) printf("\n"#x"\n")
#define szam(x,f) printf("\n"#x"=%"#f"\n",x)
main()
{
int x1=2,x2=3,x3=4,x4=13;
int i=13;
clrscr();
Kt szintaktikai egysgbl egyet ksztnk. Egy vltoznvhez hozzvesznk mg nhny karaktert, ezzel a
vltoz nevt mdostjuk.
18

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

int v1, v2, sum;


v1 = 35;
v2 = 18;
sum = v1 + v2;
printf("%d s %d sszege %d\n", v1, v2, sum);
}

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

x 10-nl nagyobb 2-vel s 3-mal nem oszthat szm


y 5 s 5 kz es szm

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

rj programot, mely kirja a 1-tl 10-ig a szorztblt tblzatos formban! A feladat


megoldshoz tetszleges ciklust hasznlhatsz.

13. feladat

rj programot, mely 0-tl 90 fokig 5 fokonknt kirja a szgek szinuszt s cosinuszt. A


megjelents tblzatos formban trtnjen.
Szg szinusz -coszinusz
sorrendben. A megfelel matematikai fggvnyek a sin(f), cos(f). A fggvnyek hasznlathoz a
program fejlcben szksg lesz a
#include <math.h>
llomny beillesztsre is.

14. feladat

rd be a switch-nl tallhat pldaprogramot. Vizsgld meg, hogy mi trtnik abban az esetben,


ha a break elmarad! rd t a kir rszt is switch-esre!

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:

kiszmtja az elemek sszegt, tlagt

kivlasztja a legnagyobbat s a legkisebbet

kirja az elemeket eredeti sorrendben, majd rendezi s gy is megjelenti azokat

Vletlenszmok kezelshez a kvetkezket kell tudni.


#include <stdlib.h>
randomize();
x=rnd() % n
Az utbbi egy vletlenszmot ad a [0,n-1] intervallumban. (A % itt a maradkos osztst jelenti).
Ha nem hvjuk meg a randomize() fggvnyt, akkor a Pascal-hoz hasonlan itt is mindig
ugyanazokat a vletlen szmokat fogjuk eredmnyl kapni.

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

Tltsnk fl egy 6 sorbl s 10 oszlopbl ll mtrixot 200-nl nem nagyobb vletlen


szmokkal. Majd vgezzk el a kvetkez feladatokat:

Vlasszuk ki minden sorbl a legnagyobb elemet, majd adjuk meg a maximumok


tlagt!

Szmoljuk ki az sszes elem tlagt!

Hny olyan eleme van a mtrixnak, melyek az tlagnl kisebbek, illetve nagyobbak?

28. feladat

rjunk programot egy a jegyzetben megadott struktra alkalmazsval. A program vletlenszer


nevekkel tltse fel mind a vezetk, mind a keresztneveket. A szletsi idk 1950 s 1970 kz
es vletlenszmok legyenek, a fizetsek pedig essenek 50 000 s 100 000 Ft kz. A feltltsek
utn a kvetkez feladatokat vgezzk el:

Adjuk meg az 1960 s1965 kztt szletetteket!

Szmtsuk ki az tlagfizetst s az tlagletkort

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

char *char_pointer = &c;


printf("%c %c\n", c, *char_pointer);
c = '/';
printf("%c %c\n", c, *char_pointer);
*char_pointer = '(';
printf("%c %c\n", c, *char_pointer);
}
main()
{
int i1, i2, *p1, *p2;
i1 = 5;
p1 = &i1;
i2 = *p1 / 2 + 10;
p2 = p1;
printf("i1 = %d, i2 = %d, *p1 = %d, *p2 = %d\n", i1, i2, *p1, *p2);
}
main()
{
int count = 10, *temp, sum = 0;
temp = &count;
*temp = 20;
temp = &sum;
*temp = count;
printf("count = %d, *temp = %d, sum = %d\n", count, *temp, sum );
}

33. feladat

rjunk programot, amely vletlenhosszsg sorozatokat kezel. A sorozat hossza 50 s 200


kztt vltozhat. minden sorozat esetn vgezze el a kvetkez feladatokat:

Feltlti a sorozatot vletlenszer fej/rs rtkekkel (F/I, vagy 0/1)

Meghatrozza a fejek s rsok szmt, arnyukat.

Meghatrozza a leghosszabb fej illetve rs sorozat hosszt, s ezek arnyait a teljes


sorozathoz.

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

leadott gymlcsmennyisgeket (Lehetnek ezek vletlenszmok is 500-100 kztt), majd adjunk


vlaszt a kvetkez krdsekre:

Ki adta le a hnapban sszesen a legtbb s a legkevesebb gymlcst?

Ki adta le egyszerre a legtbb gymlcst?

Mennyi gymlcst adtak le egyenknt az egyes eladk?

35. feladat

rjunk programot, mely egy dinamikus listba emberek adatait viszi fl. Nv, szletsi v,
lakcm. Majd valstsuk meg menbl a kvetkez funkcikat:

egy adat flvitele a listba

egy adat trlse a listbl

keress nv alapjn (egyedi jellemz)

keress szletsi v alapjn (tbb egyforma is lehet, mindet adja meg)

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

Ksztsnk ablakoz technikt hasznl programot, a kpernytartalmat elment fggvnyek


segtsgvel! Ablakoz technikt figyelhetnk meg pldul a karakteres kpernyn az NC
program hasznlatakor. Ez azt jelenti, hogy ha egy menbl kivlasztunk egy pontot, akkor a
pontosts rdekben egy almen jelenik meg, mely eltakarja az alatta lv tartalmat, ha ez az
ablak eltnik, akkor vissza kell tlteni azt a rszt, ami alatta volt.

40. feladat

54

http://www.doksi.hu

Ksztsnk rajzol programot. A szveges kpernyn a kurzort a kurzormozgat nyilakkal


lehessen mozgatni, legyen benne egy penup(u) s egy pendown(d) funkci. A nyilak kdja: fel
72, jobbra 77, balra 75, le 80. Vigyzzunk ezeknek a beolvassval, ugyanis ezek a billentyk
ketts kddal rendelkeznek, teht a lenyomskor kt rtk kerl a billenytzetpufferbe, az els
kd minden esetben 0, a msodik pedig az imnt felsorolt. Az ilyen billentyket gy szoktuk
fldolgozni, hogy ha az els karakter 0, akkor olvasunk mg egyet a pufferbl. Ezeket az
olvassokat a getch() fggvnnyel tehetjk meg.

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

Ksztsnk programot, mely a kvetkez paramteres egyenlettel megadott grbt brzolja:


x=a*sin(n*), y=b*cos(m*)
A paramter rtke a [0,k] intervallumon vltozzon. Az sszefggsben szerepl vltozk
kzl a,b vals a tbbi egsz tpus. Lehetleg kis egszekkel dolgozzunk.

47. feladat
rjunk makrkat a kvetkez funkcikra:
55

http://www.doksi.hu

Kt szm kzl adja vissza a nagyobbat.

Ha egy karakter nagybet, akkor adja vissza a kisbets megfeleljt.

Adja vissza egy szm ngyzett.

56

You might also like