# c programozas kozepiskolasoknak

Author: lajosmol

Post on 04-Jun-2018

224 views

Category:

## Documents

Embed Size (px)

TRANSCRIPT

• 8/13/2019 c Programozas Kozepiskolasoknak

1/56

1

C programozs kzpiskolsoknak

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

2/56

2

1 Tartalomjegyzk1 TARTALOMJEGYZK ...................................................................................................... 1

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

2.1 AZ ELS CPROGRAM ....................................................................................................... 4

2.2 MEGJEGYZSEK ................................................................................................................ 42.3 AVLTOZKRL .............................................................................................................. 42.3.1 Felhasznli tpus ................................................................................................... 7

2.4 KONSTANSOK ................................................................................................................... 72.4.1 A const kulcssz hazsnlatval ............................................................................... 72.4.2 Az elfordtnak szl helyettestssel .................................................................... 7

2.5 OPERTOROK ................................................................................................................... 72.5.1 Aritmetikai opertorok ............................................................................................ 82.5.2 sszehasonlt s logikai opertorok ..................................................................... 82.5.3 Lptet opertorok .................................................................................................. 82.5.4 Bitmveletek ............................................................................................................ 8

2.5.5 rtkad opertorok ............................................................................................... 92.5.6 Feltteles opertor .................................................................................................. 92.5.7 Pointer opertorok .................................................................................................. 92.5.8 Tpuskonverzik ..................................................................................................... 10

2.6 ADATOK BEOLVASSA A BILLENTYZETRL ................................................................. 112.7 ITERCIK ...................................................................................................................... 11

2.7.1 while ciklus ............................................................................................................ 122.7.2 for ciklus ................................................................................................................ 122.7.3 do-while ciklus ....................................................................................................... 13

2.8 SZELEKCIK ................................................................................................................... 142.8.1 if utasts ............................................................................................................... 142.8.2 if-else szerkezet ...................................................................................................... 142.8.3 switch utasts ....................................................................................................... 15

2.9 TMBK ......................................................................................................................... 162.9.1 Egydimenzis tmbk ............................................................................................ 162.9.2 Sztringek ................................................................................................................ 172.9.3 Kett s tbb dimenzis tmbk ............................................................................ 19

2.10 FELHASZNL LTAL DEFINILT TPUSOK ..................................................................... 202.10.1 Struktrk .............................................................................................................. 202.10.2 Struktrt tartalmaz tmbk ................................................................................ 20

2.11 FGGVNYEK ................................................................................................................. 212.11.1 Paramtertads ................................................................................................... 212.11.2 Loklis s globlis vltozk ................................................................................... 222.11.3 Automatikus s statikus vltozk ........................................................................... 222.11.4 Register mdost jelz ......................................................................................... 232.11.5 Vektor tadsa fggvnynek .................................................................................. 24

2.12 MUTATK (POINTEREK)................................................................................................. 242.12.1 Vektorok s mutatk .............................................................................................. 252.12.2 Ktdimenzis tmbk s pointerek ........................................................................ 27

2.12.2.1 Dinamikus tmb egy vektorban .................................................................... 272.12.2.2 Konstansban megadott tmbmret, dinamikus helyfoglalssal .................... 282.12.2.3 Mutattmb ................................................................................................... 29

2.12.3 Struktrk s mutatk ............................................................................................ 302.12.4 Dinamikus lista ...................................................................................................... 302.13 FILE KEZELS ................................................................................................................. 33

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

3/56

3

2.13.1 File elksztse, lezrsa ..................................................................................... 332.13.2 Szveges llomnyok ............................................................................................. 342.13.3 Binris llomnyok ............................................................................................... 36

2.14 ASZVEGES KPERNY KEZELSE ................................................................................. 372.14.1 Szveges zemmdban gyakran hasznlt fggvnyek: .......................................... 372.14.2 Kperny mentse s vissztltse .......................................................................... 39

2.14.3 Nhny karaktert tesztel makr ........................................................................... 402.14.4 Karaktert talakt fggvnyek ............................................................................. 412.14.5 Nhny konverzis fggvny ................................................................................. 41

2.15 AGRAFIKA PROGRAMOZSA .......................................................................................... 412.15.1 Koordinta-rendszer ............................................................................................. 422.15.2 Grafika indtsa ..................................................................................................... 422.15.3 Gyakran hasznlt fggvnyek ................................................................................ 43

2.16 MAKRK ........................................................................................................................ 442.16.1 Fggvnyszer makrk .......................................................................................... 44

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

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

4/56

4

1.1 Az els C program

Tekintsk a kvetkez egyszer C nyelven rt programot:

#include

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

fggvnyhvs azonostja. Egyelre a fggvnyt argumentumok nlkl hvtuk meg, aksbbiekben ennek rszletezsre mg kitrnk.

3. A { s } a kezd s a vgpontjt jellik a vgrehajtsi rsznek.4. #include 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 kirandszveget s a kirst befolysol vltozkat. Ami a dupla idzjelek kztt megjelenikvltoztats 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 kirsaeltt 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 vgrehajtstszeretnnk kihagyni, akkor azt megjegyzs blokkba zrhatjuk.

/* ez most egy egysoros megjegyzs *//* ez most

tbb sorosmegjegyzs */

1.3 A vltozkrl

A C tpusos programnyelv. Ez azt jelenti, hogy mieltt egy vltozt hasznlni szeretnnkdeklarlnunk, kell azt. Figyeljnk arra, hogy a a fordtprogram a vltoz nevekben isklnbsget tesz a kis s a nagy betk kztt.

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

5/56

5

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

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 azegsz tpusra utal. Az idzjel utn kvetkezik a vltoz neve. Ennek rtke kerl majd bersraa 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 aunsigned1

Az els esetben az a rtke32768 s 32767 kztt lehet, mg a msodik esetben a b rtke 0 s65535 kztti szm lehet. A signed

int b

2

1Eljel nlkli

mdost jelz is hasznlhat, de alaprtelmezs szerintminden egsz vltoz ilyen lesz.

2Eljeles

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

6/56

6

A kvetkez tblzatban felsoroltunk nhny tpust, rtkkszletkkel egytt.

Pontossg(jegy)

char -128..127 1unsigned char 0..255 1

int -32768..32767 2unsigned int 0..65535 2long int -2147483648..2147483647 4unsigned long int 0..4294967295 4float 3.4e-38..3.8e+38 4 6double 1.7e-308..1.7e+308 8 15long double 3.4e-4932..3.4e+4932 10 19

A printf() fggvnyben a vltozkat csak gy tudjuk kiratni, hogy az idzjelek kztt % jelutn megadjuk a vltoz tpust, a kirs formtumt majd az idzjelek utn vesszkkelelvlasztva flsoroljuk a vltozk neveit. A gyakrabban hasznlt karaktereket a kvetkeztblzatban soroltuk fl.:

Lehetsg van arra is, hogy meghatrozzuk avltoz 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 hatrozzameg. 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, avltoznak akkor is lesz kezdrtke, de biztosan nem olyan, amit mi szerettnk volna adni.

%d decimlis egsz

%u eljel nlkli decimlis egsz

%f lebegpontos

%c karakter

%s sztirng vagy karakter tmb

%e dupla vals

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

7/56

7

1.3.1 Felhasznli tpusHa egy tpus neve tl hossz s gyakran hasznlnunk kell a program sorn, akkor rdemes egyszinonimval hivatkozni r: Ennek a mdja:

typedef tpus tpusnvEgy konkrt pldn keresztl

typedef unsigned long int egesz;egesz n;

Nhny tovbbi formzsi lehetsg a printf()-ben:

1.4

Konstansok

A konstansok megadsnak kt mdjt ismertetjk az albbiakban.

1.4.1 A const kulcssz hasznlatvalconst int a=30;

Ebben az esetben vigyzni kell arra, hogy a konstanst inicializljuk is. Hibajelzst ad akvetkez deklarci:

const int a;

a=30;Az gy ltrehozott konstansok rtke kzvetlenl nem vltoztathat meg. A konstansok, azonbana memrban troldnak, gy rtkk kzvetetten mutatk hasznlatval mdosthat

1.4.2 Az elfordtnak szl helyettestsselAz elfordtnak klnbz defincikat, lersokat adhatunk, errl a ksbbikeben mgrszletesen lesz sz. Most egyetlen pldt nzznk a konstansok megadsra

Az gy megadott konstansok a program listjnak elejn szerepelnek a #include beillesztsekutn. Szintaktikailag a # a sor els karaktere kell hogy legyen, az ilyen sorokat nem zrhatjukpontosvesszvel, s minden sorban csak egy #define llhat. Mivel ezek a lersok azelfordtnak szlnak, ezrt minden olyan helyen, ahol a programlistban az ADO_KULCSazonost szerepel, az elfordt 0.25 rtket fog berni. Ezrt az gy ltrehozott konstansokrtke mg indirekt mdon sem vltoztathat.

1.5 Opertorok

A programok rsa sorn gyakran van szksgnk kifejezsek felptsre, vltznak trtnrtkadsra, szmolsi mveletekre, fggvnyhvsokra. A C nyelvben ezek a kifejezsekoparandusok, fggvnyhvsok s opertorok kombincijbl plnek fel.

Az opertorokat tbbfle szempont szerint lehet csoportostani.

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

\n j sor

\t tabultor\r kocsi vissza\f soremels\v fggleges tabultor

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

8/56

8

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 opertorokA ngy alapmvelet, a szoksos szimblumokkal, valamint a maradkos oszts % jellel. Amvelet az oszts maradkt adja vissza, termszetesen csak egsz tpus vltozk hasznlataesetn alkalmazhat. A msik ngy mvelet mind egsz, mind vals operandusok esetn ismkdik. 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 azoperandusok tpusa dnttte el.

A mveletek precedencija a matematikban megszokott.1.5.2 sszehasonlt s logikai opertorokFelttelekben s ciklusokban gyakran kell sszehasonltani klnbz rtkeket, ennekelvgzsre a hasonlt opertorokat hasznljuk. Ezek a kvetkezk: ,=,==,!=. Haezekkel kt vltozt vagy kifejezst hasonltunk ssze, akkor az eredmny int tpus lesz, srtke 1, ha a relci igaz, illetve 0, ha hamis.

A logikai kifejezsekben gyakran sszetett feltteleket is meg kell fogalmazni, erre szolglnak alogikai opertorok. Ezek a kvetkezk: !a tagads mvelete, egyoperandus. &&logikai s, ||logikai vagy mveletek. A mveletek precedencija a tblzatban.

1.5.3 Lptet opertorokA vltoz rtknek eggyel val nvelsre, vagy cskkentsre szolglnak. Egyoperandusmveletek. Postfix s prefix alakban is rhatk. ++ eggyel nveli, -- eggyel cskkenti a vltozrtkt. Ha egy kifejezsben csak egy vltoz szerepel, akkor mindegy, hogy postfixes, vagy

prefixes alakjt hasznljuk az opertoroknak. (a++ egyenrtk a ++a-val) Ha azonban egykifejezs 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 opertorokkalmkdnek.

C-ben nem szoks az a=a+1 rtkads, helyette minden esetben a lptetst hasznljuk.

1.5.4 BitmveletekA mveletek operandusai csak char, short, ints longtpus eljel nlkli egszek lehetnek.

A mveletek els csoportja ktoperandus. ~ 1-es komplemens, & bitenknti s, | bitenkntivagy, ^ bitenknti kizr VAGY. Ezeket a mveleteket leggyakrabban maszkolsra, vagy bitek

trlsre szoktuk hasznlni. A kizr VAGY rdekes tulajdonsga, hogy ha ugyanazt a maszkotktszer alkalmazzuk egy rtkre, akkor visszakapjuk az eredeti rtket.

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

9/56

9

A mveletek msik csoportjba a biteltol mveletek tartoznak. > eltolsjobbra. A felszabadul pozcikba 0 kerl, a kilp bitek elvesznek. A mveletek ktoperandusak. a

• 8/13/2019 c Programozas Kozepiskolasoknak

10/56

10

1.5.8 TpuskonverzikA C-ben ktfajta tpuskonverzi ltezik, az implicit (automatikus) s az explicit. Az els a Cnyelvbe rgztett szablyok szerint trtnik a programoz beavatkozsa nlkl, a msodik pediga tpuskonverzis opertor segtsgvel. Ennek ltalnos alakja:

(tpusnv) kifejezs

Az implicit konverzival kapcsolatban elmondhatjuk, hogy ltalban a szkebb operandusinformcivesztesg 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 betenniint 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, haegy 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

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

11/56

11

A formzott adatbeolvasst a scanf fggvny segtsgvel tehetjk meg. A fggvny ltalnosformja 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 nemfelel meg a formtum elrsainak, akkor a scanf befejezi az olvasst, mg akkor is, ha azargumentumlista szerint tovbbi karaktereket is be kellene olvasnia. A scanf fggvnynekvisszatrsi 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 karakterekethasznlhatjuk, 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 tbbrtket 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 karaktereketelrhatunk 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 deklarciszerinti sz vltoz rtke csak szmjegy, vagy hexadecimlis jegy lehet, akkor azt a kvetkezszrssel 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

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. Akvetkezkben ahol utastst runk helyettesthet utastsblokkal is. Utastsblokk:

{

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

12/56

12

utasts1;utasts2;utastsn;

}

1.7.1 while ciklusA while ciklus ltalnos alakja:

while (kifejezs)Utasts

A ciklusmag utastsai addig hajtdnak vgre, amg a kifejezs rtke nem nulla. (Ez a logikaiigaznak felel meg, teht, ha a kifejezs egy logikai kifejezs, akkor itt a ciklusba lps feltteltadjuk meg)

Nzznk egy pldt a while ciklusra. Adjuk ssze 1-tl n-ig a termszetes szmokat!

#include

main(){

long osszeg=0;int i=1,n=2000;

printf(Az els %d egsz szm sszege: ,n);while (i

• 8/13/2019 c Programozas Kozepiskolasoknak

13/56

13

main(){

long osszeg;int i=1,n=2000;

for (i=1,osszeg=0;i

• 8/13/2019 c Programozas Kozepiskolasoknak

14/56

14

1.8 Szelekcik

A C nyelvben hrom elgazs tpust hasznlhatunk. Az egyg (if szerkezet), a ktg (if-elseszerkezet) s a tbbg (switch szerkezet)

1.8.1 if utastsAz 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 jrtknek.

#include

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 szerkezetAz utasts ltalnos alakja:

if (kifejezs)utasts1

elseutasts2

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!

elseprintf(Az rtk rossz);

Ezt a kt sort az elz programban az res sor helyre kell beszrni. Vigyzzunk azonban, ebbenaz esetben a J rtk sornak vgn nem llhat; ugyanis ekkor egy else kulcsszval tallkozna afordt, amivel viszont nem kezddhet parancs.

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

15/56

15

1.8.3 switch utastsAz utasts tbb irny elgazst tesz lehetv, de csak abban az esetben, ha egy egsz kifejezsrtkt 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 vgrefognak hajtdni.Hacsak nem pontosan ez a szndkunk, akkor minden utastst break-kel kellzrni, melynek hatsra a vezrls a switch utni els utastsra kerl. ltalban a defaulteseteket is break-kel szoktuk zrni, mert ez nem felttlenl az egyes esetek vgn ll, brholelhelyezhet a szerkezetben. Ha ugyanazt az utastst akarjuk vgrehajtani tbb konstans rtkesetn is, akkor a konstansokat egymstl:-tal elvlaszva soroljuk fel.

Nzznk egy rvid pldaprogramot a switch illusztrlsra:

#include

main(){

printf("rjon be kt szmot: ");scanf("%d %d", &n1, &n2 );

scanf("%d", &menu );switch( menu ) {case 1: t = n1 + n2; break;case 2: t = n1 - n2; break;default: printf("Nem j vlaszts\n");

printf("%d + %d = %d\n", n1, n2, t );else if( menu == 2 )

printf("%d - %d = %d\n", n1, n2, t );}

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

16/56

16

Figyeljk meg, hogy minden vlaszts utn hasznltuk a break-et. A default utn nemhasznltuk, de ha a switch elejn van, akkor ott is rdemes odafigyelni r.

14., 15., 16., 17., 18., 20. feladat

1.9

TmbkAz eddigiek sorn olyan vltozkat hasznltunk csak, melyek egy rtk trolsra voltakalkalmasak. Gyakran van azonban szksgnk arra, hogy ugyanazzal a vltoznvvel tbbrtkre is tudjunk hivatkozni. Ebben az esetben hasznljuk a tmbket. (Egy osztly mindentanuljhoz hozzrendeljk a magassgt, ilyenkor nyilvn rdemes vltoznvknt az osztlyazonostjt hasznlni, a tanulkra pedig a napl sorszmval)

1.9.1 Egydimenzis tmbkA 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 pldkbanvigyzni 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 tbbelemet adtunk volna meg, akkor a fordt hibajelzssel lell, ha kevesebbet, akkor pedig avltoz trolsi osztlytl3

A tmb mrett akr futsidben is meg tudjuk mondani. Ha egy program tesztelse sornvltoztatjuk egy tmb mrett (j elemeket vesznk fel a flsorolsba), akkor rdemes adefincis rszben a kvetkez sor beszrni:

fggen vagy 0, vagy hatrozatlan rtk lesz. A msodik esetbennem adtuk meg az elemek szmt a szgletes zrjelben, csak felsorolssal, ilyenkor a tmb

pontosan 7 elem lesz.

#DEFINE MERET (sizeof(b)/sizeof(b[0]))Pldaknt nzzk meg, hogyan lehet egy 10 hosszsg vektor elemeit beolvasni, s sszegezni:

#include #define SZAM 10

main(){

int a[10];int s=0,i;

3 Lnyegben a vltoz elrhetsgt szablyozza, kicsit hasonl a Pascal globlis s loklis vltozihoz, aksbbiekben mg lesz rla sz.

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

17/56

17

for (i=0; i

• 8/13/2019 c Programozas Kozepiskolasoknak

18/56

18

strchr(sz1,c) Megnzi, hogy az sz1stringben elszr hol fordulel a c karakter

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

printf(%d\n, ch-sz1);

Eredmnye: 14

strrchr(sz1,c) Ugyanaz, mint az elz, csakjobbrl indul

strlwr(sz), strupr(sz) A sztringet kis, illetve nagybets formtumv alaktja

sz=helloprintf(%s\n,strupr(sz));

Eredmnye: HELLO

strncpy(sz1,sz2,n) Az sz1 sztringbe msol sz2-bl n db karaktert;

sz2=Hello;n=2;strncpy(sz1,sz2,n);sz[2]=\05

printf(%s\n,sz1);;

Eredmnye: He

strncat(sz1,sz2,n) Az sz1 szringhez fz n db-otaz sz2-bl

sz1=Hello; sz2=World; n=2;strncat(sz1,sz2,n);

printf(%s\n,sz1);

Eredmnye: HelloWo

strrev(sz) Megfordtja a sztringet sz1=Hello;printf(%s\n,strrev(sz))

Eredmnye:olleH

strlen(sz) Egy sztring hosszt adja meg n=strlen(sz);

Ha ezeket a sztring kezel fggvnyeket hasznlni akarjuk,akkor mindenkppen szksg van a#include beszrsra.

Nzznk egy pldaprogramot arra, hogyan lehet egy sztringet karakterenknt vgigolvasnianlkl, hogy tudnnk a hosszt:

#include

main(){

int sz[]=C programozsi nyelv;int i=0;while (s[i]){

4Figyeljk meg, hogy az eredmny 1, ugyanis a sorszmozs most is 0-val kezddik. A vltoz deklarcikat isfigyeljk meg!5Figyeljnk fl r, hogy a sztring vgre neknk kell kitennnk a vgt jelz karaktert, klnben nem fog helyesenmkdni!

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

19/56

19

printf(\n%c,s[i];i++;

}}

21., 22., 23., 24., 25., 26. feladat

1.9.3 Kett s tbb dimenzis tmbkA C nyelvben is lehetsgnk van kett vagy tbb dimenzis tmbk hasznlatra. Deklarlni akvetkezkppen 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 #include

#include

#define SOR 4#define OSZLOP 3

main(){

int a[SOR][OSZLOP];int i,j;

clrscr();randomize();for (i=0;i

• 8/13/2019 c Programozas Kozepiskolasoknak

20/56

20

}

1.10 Felhasznl ltal definilt tpusok

Az elz rszben emltett sszetett adattpust tmbknek neveztk, a tmbk minden elemeazonos tpus kell hogy legyen. Gyakran szksgnk van azonban olyan egymssal sszetartozelemek trolsra is, melyek nem azonos tpusak, mgis egy egyedre jellemzk. Ezketleggyakrabban adatbzisokban talljuk meg. Gondoljunk itt egy szemly kereszt svezetknevre, szletsi idejre, alapfizetsre. Ezek klnbz tpus adatok mgis ugyanarra aszemlyre vonatkoznak.

1.10.1 StruktrkEgy ilyen adattpust valstanak meg a struktrk. Ennek deklarcija ltalnos formban:

struct nv {

tpus1 tag1;tpus2 tag2;.}

A bevezetben emltett konkrtpldban 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 tmbkHa egy struktra tpus vltozt ltrehoztunk, akkor annak segtsgvel csak egyetlen egyed

jellemzit tudjuk trolni. Mit tehetnk, ha tbb egyedrl is ugyanazokat a jellemzket szeretnnk

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

21/56

21

raktrozni? Kzenfekv megolds olyan tmbk alkalmazsa, melynek minden egyes eleme azadott struktra tpus.

Az elz pldnl maradva egy vllalatnak maximlisan 20 dolgozjrl a fenti adatokatszeretnnk trolni, akkor a

szemely sz[20];

adatszerkezettel dolgozhatunk. Az adatszerkezet egyes elemeire val hivatkozskor a struktras a tmbhivatkozsokat vegyesen alkalmazzuk.

sz[2].szev=1961;

1.11 Fggvnyek

Fggvnyeket a kvetkez esetekben szoks rni:

Ha ugyanazt a tevkenysgsorozatot tbbszr is el kell vgeznnk ugyanolyan tpus, dems-ms rtket flvev vltozkkal.

Ha a programunkat struktrltan, jl olvashatan szeretnnk megrni. Ez nagyon fontos aksbbi 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 ParamtertadsA paramtertads a Pascal-hoz hasonlan itt is trtnhet cm szerint s rtk szerint. Az elveszintn 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 #include

void csere(int *a,int *b){

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

22/56

22

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 afggvnyhvskor figyelhet meg, az C opertort hasznljuk, ezzel jelezzk azt, hogy nem avltoz rtkt, hanem e memriabeli cmt adjuk t. Nyilvn a fggvnyben emiatt kellhasznlnunk a * opertort. Ezek az opertorok a mutatkhoz (pointer) ktdnek, a ksbbiekbenmg lesz rluk sz.

Vegyk szre azt is, hogy a fggvnynek nincs visszatrsi rtke, annak ellenre, hogy aztadott vltozk rtke megvltozott.

1.11.2 Loklis s globlis vltozkA loklis vltozkat csak azok a blokkok6

A globlis vltozkat minden fggvny ltja, rtkket mdosthatja. Ezeket a vltozkatminden fggvny trzsn kvl kell deklarlni, clszer rgtn a #define utn megtenni ezt.Ajnlott a globlis vltozkat egy tmbben deklarlni, lehetsg van ugyan arra, hogy ktfggvny kztt is deklarljunk vltozt, ebben az esetben viszont az elbb lv fggvny nemltja az alatta lv vltozt, annak ellenre sem, hogy az fggvnyeken kvl lett ltrehozva.

ltjk, ahol deklarlva lettek, ez all a main semkivtel. Ezek a vltozk a veremben troldnak, teht minden fggvnyhvskor trldik azrtkk.

1.11.3 Automatikus s statikus vltozkBevezetsknt tanulmnyozzuk a kvetkez programot:#include #include

void demo(){

static int sv=0;auto int av=0;

prtintf("sv= %d, av= %d",sv,av);

6Nem vletlen a kiemels. Itt valban blokkrl van sz, azaz lehet olyan loklis vltozm is, amit csak egy forciklus vgrehajtsi rsze lt, a fggvny tbbi rsze nem. Ez egy jelents eltrs a C s aPascal loklis vltozikztt.

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

23/56

23

++sv;++av;

}

main(){

char c;int i=0;

clrscr();while (i

• 8/13/2019 c Programozas Kozepiskolasoknak

24/56

24

1.11.5 Vektor tadsa fggvnynekA kvetkez plda bemutatja, hogy egy vektort hogyan adhatunk t paramterknt egyfggvnynek. A fggvny az tadott vektor legnagyobb elemvel tr vissza.

#include #include

#include int maximum(int a[], int n){

int i;int max=a[0];

for (i=1;i

• 8/13/2019 c Programozas Kozepiskolasoknak

25/56

25

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 ajelentsgt. Segtsgkkel dinamikusan kezelhetjka memrit, mindig csak annyit hasznlva, amennyire az adatoknak ppen szksge van.

32. feladat1.12.1 Vektorok s mutatkA C programozsi nyelvben igen szoros kapcsolat van a a vektorok s az egyszeres indirektsg7mutatk kztt. Ez a vektorok trolsi mdjbl ered. A vektorok a memriban sorfolytonosanhelyezkednek el. Ha egy pointert a vektor els elemre irnytunk, akkor a pointer aritmetikaszablyai 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 avektoros s a pointeres hivatkozsok felcserlhetk. a fenti deklarcik szerint a vektor i-edikelemre 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-atis, de az esetek 99%-ban neknk csak 10 elemre van szksgnk, nem tehettnk mst, minthogy 100 hosszsgra hoztuk ltre a vektort, ezzel jelents memria terletet lefoglaltunk. A Cnyelv programokban nagyon egyszeren ltrehozhatunk dinamikus helyfoglals vektorokat.Ezeknl futsi idben dl el, hogy milyen hosszsgak lesznek, ha a tovbbi feldolgozshoznincs szksg rjuk, akkor az ltaluk lefoglalt memria felszabadthat.

Nzznk erre egy pldaprogramot. A program megkrdezi, hogy hny elem vektorral kvnunkdolgozni, 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

i nt * *p

; p egy olyan mutat, mely egy egszre mutat mutatra mutat. Ktszeres indirektsg.8Mutatk esetn a p++nvels nem eggyel nveli p rtkt, hanem a szomszdos cmre mutat. Azaz, ha amutateredetileg egy char tpus vltozra mutatott, akkor a nvels 1, ha egy int tpusra, akkor a nvels 2, havalamilyen sszetett struktrra, akkor pedig ennl sokkal tbb.

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

26/56

26

#include #include #include

main(){

char c;

unsigned int *p,n,i;long int osszeg=0;

clrscr();randomize;

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

• 8/13/2019 c Programozas Kozepiskolasoknak

27/56

27

Figyeljk meg a p-nek trtn rtkadst! A calloc fggvny visszatrsi rtke egy tpus nlklimutat, ezt egy tpuskonverzival t kellet alaktani a p tpusnak megfelel alakra.9

A programban a pointeres s tmbs hivatkozs vegyesen lett hasznlva, mutatva ezzel a kettteljes egyenrtksgt.

Mindenesetben meg kell vizsglni, hogy sikeres volt-e a helyfoglals. Ha nincs elg memria, akkor acalloc fggvny NULL (nulla) rtkkel tr vissza, ebben az esetben a return 1 hatsra a

program kilp a main() fggvnybl s befejezi futst.

1.12.2 Ktdimenzis tmbk s pointerekTermszetesen ktdimenzis tmbket is lehet dinamikusan kezelni. Erre hrom klnbzmdszert mutatunk be. Mindhrom program csupn annyit csinl, hogy egy mtrixot feltltvletlen szmokkal, majd tblzatos formban megjelenti. A programok utn rvidmagyarzatok is lesznek.

1.12.2.1Dinamikus tmb egy vektorban#include

#include #include

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

• 8/13/2019 c Programozas Kozepiskolasoknak

28/56

28

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

}A memriafoglals ebben a programban valban futsi idben trtnik. Ha kzelebbrl isszemgyre vesszk a listt lthat, hogy itt a mtrixot valjban egy vektorban troljuk. Az

aktulis pozcit pedig ahely=aktulis_sor*oszlopszm+aktulis_oszlop

formulval hatroztuk meg. Figyeljnk fl itt is a kt fajtahivatkozsra!

1.12.2.2Konstansban megadott tmbmret, dinamikus helyfoglalssal#include #include #include

#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

• 8/13/2019 c Programozas Kozepiskolasoknak

29/56

29

mtrixok esetben szoksos. Itt a calloc fggvnyben rdekes mdon csak 1 elem szmra kellhelyet foglalni, ami viszont akkora, mint a tljes mtrix.

1.12.2.3Mutattmb#include #include

#include

#define N 5

main(){

char c;

int *p[N],oszlop[N];int i,j;

clrscr();

for (i=0;i

• 8/13/2019 c Programozas Kozepiskolasoknak

30/56

30

Itt a mtrixot egy mutattmbbel valstottuk meg. A klnlegessg az, hogy a sorok eltrhosszsgak is lehetnek. A mutatknak egyesvel adtunk rtket, azaz a helyfoglals soronknttrtnt. A felszabadtst szintn ciklus segtsgvel kell vgezni.

1.12.3 Struktrk s mutatkA korbbiakban mr volt sz a struktrkrl. Pointerekkel hivatkozhatunk a struktrk egyeselemeire 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 amsodik lnyegesen elterjedtebb.

1.12.4 Dinamikus listaA lista olyan adtaszerkezet, melynek minden egyes eleme kt jl elklnthet rszbl ll, azadatrszbl s egy mutatbl, mely a listakvetkez elemre mutat. A lista els elemre alistafejjel hivatkozhatunk. A lista utols elemnek mutat mezje pedig NULL rtk.

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 annyielem van, amennyire ppen szksgnk van. A szerkezet mdostsa is nagyon egyszer. Ha egyj adatot akarunk felvenni, akkor

1. megkeressk az j elem helyt2. az aktulis adat mutatjt tmsoljuk az j elem mutatjba3. az aktulis elem mutatjt az j elemre irnytjuk

Ha egy listbl egy elemet trlni akarunk, akkor a kvetkezkppen jrhatunk el:

1. megkeressk a trlend elemet2.

a mutatjt bemsoljuk az eltte lv elem mutatjba

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

31/56

31

Nzzk ezt elszr egy egyszer programon keresztl. Elszr ltrehozunk egy struktrt, astruktramutat mezje egy ugyanilyen tpus struktrra hivatkozik, ezt nevezzk nhivatkozstruktrnak.

#include 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. Vegykszre, hogy az a sok rtkads a listzs eltt, ciklikus folyamat, nyilvn nem rdemes ilyensokszor 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 #include #include

struct data{

int value;struct data *nxt;

};

struct data *head=NULL, *prev, *akt, *next;

void list()

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

32/56

32

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

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 egydinamikus listba. Ltszik, hogy a listban mindig csak a kvetkez elem szmra foglalunk

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

33/56

33

helyet a malloc fggvnnyel. A lista feltltse utn meghvott list() fggvny a flvett elemeketlistzza ki.

1.13 File kezels

A C nyelvben az adatllomnyokat tartalmuk alapjn kt csoportra oszthatjuk, szveges sbinris llomnyokra. A szveges llomnyok olvashat informcit tartalmaznak. Sorokblplnek fel, minden sor vgt a CR/LF karakterpr zrja. A binris llomnyok byte-okblfelpl 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 karakterekfogan 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, lezrsaA file kezelshez tartoz fggvnyek az stdio.h deklarcis llomnyban vannak lerva. Mindenfile-hoz hozz kell rendelni egy FILE tpus muatatt, mely a memriban a file jellemziremutat10

FILE *fp;

. Ennek formja:

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 nvbenteljes elrsi tvonalat is megadhatunk, ebben az esetben azonban gyelni kell a \ jelhasznlatra:

A:\SZOVEG\NEV.TXT helyett A:\\SZOVEG\\NEV.TXT11

A md paramter azt jelenti, hogy milyen mveleteket akarunk vgezni az llomnnyal.

Md Lers

r (+)Ltez file megnyitsa olvassra. File mutat a fileelejre ll.

w (+)j file megnyitsa rsra. Ltez file esetn annaktartalma elvsz. . File mutat a file elejre ll.

a (+)File megnyitsa hozzrsra. Nyits utn a filemutatja file vgre ll. Ha a file nem ltezik, akkor azfopen ltrehozza

Mindegyik md,jellemz kiegszthet egy + paramterrel, ez miden esetben azt jelenti, hogy azllomnyt olvashatjuk s rhatjuk is. A md sztringben szoktuk mg megadni, hogy milyenllomnnyal dolgozunk. t szveges, b binris llomnyt jelent.

Nzznk egy konkrt pldt, melyben egy szveges llomnyt megnyitunk rsra s olvassra:

FILE *fp;

10Logikai file nv11A string konstansokban a \ jel egy formz karaktert vezet be.

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

34/56

34

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 azllomnyba, ha mg nem trtnt volna meg.

1.13.2 Szveges llomnyokSzveges llomnyokkal kapcsolatban leggyakrabban alkalmazott fggvnyeket az albbitblzatban 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 #include #include

main(){

char c;FILE *fp;

int i;

clrscr();

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

35/56

35

if (!(fp=fopen("A:\\Fileok\\p.txt","wt"))){

fprintf(stderr,"Nem sikerlt megnyitni az llomnyt");return -1;

}

for (i=0;i

• 8/13/2019 c Programozas Kozepiskolasoknak

36/56

36

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

fclose (fp);}

}

1.13.3 Binris llomnyokA binris llomnyokat byte-onknt vagy blokkonknt kezelhetjk. A byte-onknti kezelshezjl hasznlhat az elz rszben lert fgetc s fputc fggvnypros. A blokkonknti kezelstpedig az fread s az fwrite fggvnyekkel vgezhetjk el.

Hasznlatukat a kvetkez pldban figyelhetjk meg.

#include #include #include

main()

{char c;FILE *bf;int i[10]={1,2,3,4,5,6,7,8,9,10},counter,sv;

clrscr();

printf("Sikertelen file nyits");return -1;

}

fwrite(i,sizeof(int),10,bf);

printf("%4d",sv);

fseek(bf,3*sizeof(int),SEEK_SET); /* A 4. elemre ll */counter=fread(&sv,sizeof(int),1,bf);

printf("%4d",sv);

fseek(bf,0*sizeof(int),SEEK_CUR); /* A rkvetkezre ll */counter=fread(&sv,sizeof(int),1,bf);

printf("%4d",sv);

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 kirandelemek darabszma, negyedik pedig az llomny mutatja.

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

37/56

37

Az fread fggvny hasonlkppen paramterezhet. Eltrs abban van, hogy beolvasskornyilvn a vltoz cmt kell megadni a fggvnynek, a msik hrom paramter ugyanaz.Termszetesen mindkt fggvnynek van visszatrsi rtke is. Mindkettnl a sikeresen kirtilletve beolvasott blokkok szmt adja vissza. Ez az rtk hasznlhat a sikertelen beolvassilletve 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 hvtukmeg.

A programban van mg egy jdonsg, az llomnyban val pozcionls. Erre az fseekfggvnyt hasznljuk. Paramterezse: els paramter a file mutat, msodik a blokkmret segy egsz szm szorzata (ennyiedik elemre fogunk llni), harmadik pedig azt mutatja meg, hogymihez viszonytjuk a pozcionlst. SEEK_CUR esetn a pillanatnyi pozcihoz, SEEK_SETesetn pedig a file elejhez. Vigyzzunk azonban ennek az alkalmazsval, a sorszmozs mostis 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 mutatrgtn eggyel tovbb lp, teht, ha a szomszdos elemre akarunk lpni, akkor termszetesen a

fseek-ben 0-t kell adnunk a msodik paramter helyn

12

1.14 A szveges kperny kezelse

A Turbo C a kpernyt grafikus s szveges zemmdban mkdtethet. Mindkt zemmdbannagyon sok fggvnyt segt vltozatosabb tenni a kpernyt ebben a fejezetben a szvegeszemmd fggvnyeirl lesz sz.

Ha ezeket a fggvnyeket hasznlni szeretnnk, akkor a program elejn a kvetkez header file-okra lesz szksgnk:

#include #include #include Valjbana kpernyt kezel fggvnyek az elsben vannak deklarlva, de kpernynsztringekkel s karakterekkel dolgozunk, ezrt szinte mindig szksgnk van a msik kettreis.A sztring kezel fggvnyekrl korbban mr volt sz ezt mg ebben a fejezetben kiegsztjknhny konverzis fggvnnyel s a gyakrabban hasznt karakterkezel fggvnyeket isflsoroljuk.

1.14.1 Szveges zemmdban gyakran hasznlt fggvnyek:Nv Lers Nv Lers

cprintf() Formzott kivitel, hasonl aprintf-hez

clreol() sor trlse az aktulis kurzorpozcitl

cputs() egy string kivitele akpernyre

gotoxy() a kperny adott pontjbamozgatja a kurzort

putch() egy karakter kivitele window() ablak definilsa

getche()egy karakter beolvassa a

billentyzetrl s kirsa akpernyre

textcolor() szveg szne

clrscr() kperny trlse textbackground httr szne

12Ilyet nyilvn nem fogunk csinlni, mert automatikus a tovbblps

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

38/56

38

Ha a kpernyn egy ablakot hozunk ltre, akkor onnantl kezdve minden koordintt azablakhoz kpesti relatv rtkekkel kell megadnunk. Ha azt akarjuk, hogy az ablak szne mslegyen, 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-bandefinilt 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 kpernyszlessge */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 nyugodtanvgezhetnk velk matematikai mveleteket, de az is lehetsges, hogy egy egsz tpusvltozhoz rendeljk hozz a lekrdezett rtkeket Ha ezt a struktrt hasznlatba szeretnnkvenni, 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 szvegeskperny kzepre rajzol egy 40x20-as ablakot. Ebbe 5 menpontot r ki, s kzlk beolvasegyet. A program futsnak csak akkor van vge, ha tnyleg ltez pontot olvastunk be.

#include #include #include #include #include

#define SZ 20#define M 10

char cim[]=" M E N P O N T O K ";char ala[]="-----------------------";

char val[]="Krem vlasszon: ";main()

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

39/56

39

{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' || valasz

• 8/13/2019 c Programozas Kozepiskolasoknak

40/56

40

char puffer[4096];

int main(void){

int i;

clrscr();for (i = 0; i

• 8/13/2019 c Programozas Kozepiskolasoknak

41/56

41

isgraph nyomtathat karakter, de nemszkz ispunct

elvlaszt karakter, az sszesnyomtathat karakter a betk,szmok s szkz nlkl.

jelentse: a makr visszatrsi rtke nem nulla, ha c rtke

1.14.4 Karaktert talakt fggvnyekFggvny Lers

toascii ASCII karekterr alakttoupper Az angol kis betket nagy betkk alaktjatolower Az angol nagybetket kis betkk alaktja

1.14.5 Nhny konverzis fggvnyFggvny pldval Lers

float f;char *str = "12345.67";f = atof(str);

Sztringet konvertl t lebegpontos rtkk,sikertelen esetn 0-val tr vissza

int n;char *str = "12345.67";n = atoi(str);

Sztringet konvertl t egsz szmm,sikertelen esetn 0-val tr vissza

long l;char *lstr = "98765432";l = atol(lstr);

Sztringet konvertl t hossz egsz szmm,sikertelen esetn 0-val tr vissza

char *string = "87654321", *endptr;unsigned long lnumber;

lnumber = strtoul(string, &endptr, 10);

Sztringet egssz alakt, az utols szm aszmrendszer alapszma (2-36), endptr a

hibra mutatchar *string = "87654321", *endptr;long lnumber;lnumber = strtol(string, &endptr, 10);

Az elzhz hasonl, csak a visszatrsirtk tpusa ms

int number = 12345;char string[25];itoa(number, string, 10);

Egsz szmot sztringg konvertl, utolsjegy az alapszm

char string[25];long value = 123456789L;ltoa(value,string,10);

Hossz egszet alakt sztringg

unsigned long lnumber = 3123456789L;char string[25];ultoa(lnumber,string,10);

Eljel nlkli hossz egszet alakt sztringg

1.15 A grafika programozsa

A grafikus fggvnycsomagban jl hasznlhat fggvnyek csoportja ll rendelkezsnkreahhoz, hogy egyszerbb pixel grafikus brkat ksztsnk. Valjban minden alakzat, amit akpernyn megjelentnk a putpixel fggvnyre tmaszkodik, de a rajzols megknnytserdekben sok grafikus primitv14

14Olyan fggvny, mely egy megfelel paramterezssel az adott alakzatot megrajzolja. Ha egy rendszerben sokgrafikus primitv van, akkor az megknnyti a grafika programozst. Grafikus primitv pldul egy kr rajzolsa, de

ll rendelkezsnkre. (egyenes, kr tglalap, ellipszis, v stb

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

42/56

42

rajzolsa) Ha a grafikus fggvnyeket hasznlni akarjuk, akkor be kell emelni graphics.h headerfile-t. Grafika programozsnl gyakran hasznljuk a matematikai fggvnyeket is, ezrtltalban az elejn hozztesszk a programhoz a math.h llomnyt is.

1.15.1 Koordinta-rendszerMieltt hozzfognnk a grafika programozshoz meg kell ismernnk a rendszer ltal

alkalmazott grafikus koordinta-rendszert.

A matematikban alakalmazott koordintarendszer ettl egy kicsit eltr. Szmunkra az lenne atermszetes, ha az orig a kperny kzppontjban lenne, s az y rtkek alulrl flfelnvekednek. Ha ezt a koordintarendszert szeretnnk hasznlni, akkor szksg van egykoordinta 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 afenti fggvnnyel ttranszformljuk azokat kpernykoordintkk. A fggvny hvsnak mdja:

trafoxy(&x,&y);

Ha egy grafikus fggvny szgekkel dolgozik, akkor aztfokokban kell megadni, a matematikban megszokottkrljrs szerint.

1.15.2 Grafika indtsaMieltt grafikai fggvnyeket hasznlnnk, el kell ksztennk a kpernyt. Ennek mdjtmutatjuk meg az albbiakban.

#include #include #include

nem az az olimpiai t karika megrajzolsa. Persze, ha mi magunk runk egy ilyen fggvnyt, akkor arra atovbbiakban, mint egy grafikus primitvre lehet hivatkozni.

( 0, 0)

( 0, getmaxy( ) ) ( get maxx( ) , get maxy( ) )

( get maxx( ) , 0)x

yVGA moni t orok eset n:

get maxxx( ) =639get maxy=479

0

90

180

270

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

43/56

43

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 helyt15

1.15.3 Gyakran hasznlt fggvnyek

kell megadnunk a programnak, ezen llomnyoksegtik a kperny grafikus zemmdban val kezelst. A graphresult() fggvny jelzi, havalami miatt nem sikerlt az ttrs grafikus mdra. Ha minden rendben volt kvetkezhetnek agrafikai fggvnyhvsok, (itt ezt a rectangle() fggvny jelzi), ha vgeztnk, akkor pedig aclosegraph(); fggvnnyel lezrjuk a grafikt.

Az albbiakban egy tblzatban soroljuk fl a leggyakrabban hasznlt grafikus fggvnyeket, ateljessg ignye nlkl. (A rendszerben kzel 80 grafikus fggvny van)

Fggvny Lerssetcolor(c) A rajzols sznt lltja be c 0-15 kztti rtk, vagy szn konstanssetbkcolor(c) A httr sznt lltja be, c ua., mint elbb

setlinestyle(ls,pt,th)

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 vonalonth a vonalvastagsg, NORM_WIDTH, THICK_WIDTH

setfillstyle(pt,c)

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

moverel(dx,dy) A garfikus kurzort a dx,dy koordintit dx-szel, dy-nal vltoztatjamoveto(x,y) A grafikus kurzort az (x,y) pontba mozgatjax=getx();y=gety() A grafikus kurzor koordinti

putpixel(x,y,c) c sznnel rajzol egy kppontotline(x1,y1,x2,y2) A kt pontot egyenessel kti sszelinerel(dx,dy) A dx,dy-nal vltoztatott pontba hz egyenest az aktulis pontbllineto(x,y) Az (x,y) pontba hz egyenest az aktulis pontbl

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

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

44/56

44

drawpoly(n,poly[])

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 elskoordintknak egyeznik kell az utolskkal.

rectangle(x1,y1,x2,y2) Tglalap x1,y1 bal fels, x2,y2 jobb als cscs koordintiarc(x,y,ksz,vsz,r) Krv, kzppontja x,y, sugara r, az vhosszat ksz-t vsz-ig fokokban.

circle(x,y,r) Kr az elz paramterezssel.ellipse(x,y,ksz,vsz,rx,ry)

Egy ellipszist, vagy annak egy vt rajzolja, rx szlessgnek, rymagassgnak fele.

bar(x1,y1,x2,y2) Kitlttt tglalap.

bar3d(x1,y1,x2,y2,m,t)Hasb 45 fokos axonometriban m a mlysg, ha t!=0, akkor afedlap is festett.

pieslice(x,y,ksz,vsz,r) Mint az arc, csak ez kitlttt krcikk leszfloodfill(x,y) Kitlt egy ezrt terletet, melynek x,y bels pontja.cleardevice() Trli a grafikus kpernyt.outtext(text) Szveget r a kpernyre az aktulis kurzorpozcitl

ottextxy(x,y,text) A szveget az x,y koordintj ponttl kezdi.

settextstyle(f,d,s)

A szveg stlust llthatjuk be vele. f a karakter stlusaDEFAULT_FONT, TRPLEX_FONT, SMALL_FONT,SANS_SERIF_FONT, GOTHIC_FONTd=0 esetn balrl jobbra, 1 esetn fellrl lefel rs 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. Makrksegtsgvel egyszer, gyakran alkalmazott mveleteket oldhatunk meg fggvnyek megrsanlkl. C nyelvi makrkat a #define direktva16

Az gy ltrehozott konstansok futsidben mr nem vltoztathatk

utn adhatunk meg. Ezt a direktvt hasznltukmr korbban konstansok ltrehozsra.

17

1.16.1 Fggvnyszer makrk

. A fordtnak az az elsdolga, hogy a forrsnyelvi llomnyt tadja, az elfeldolgozznak. Az elfeldolgozzfeladata,hogy a #define utn tallt szvegeket behelyettestse a forrsprogram azon rszbe, aholhivatkozs trtnt rjuk. Az elfeldolgozknaklehet, hogy tbbszr is vgig kell menni a listn,mivel a makrk minden tovbbi nlkl egymsba gyazhatk

A definci ltalnos alakja:

#define azonost(paramterek) helyettest szvegA makr hvsa:

azonost(argumentumok);Nznk meg konkrtan nhny fggvnyszer makrt!

#include #include

16A fordtnak szl utasts.17A const kulcsszval definiltakrl ez nem mondhat el, ezekkel csak annyit kell tenni, hogy egy rjuk irnytunkegy pointert s ennek az rtkt mdostjuk.

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

45/56

45

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

#define abs(x) ( (x)='a') && ((x)

• 8/13/2019 c Programozas Kozepiskolasoknak

46/56

46

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. Anv tovbbi rszt paramterknt kell tadni.

A szoveg() makr egyszeren kirja az tadott szveget. Figyeljk meg, hogy hvskor nem kella 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 msodikparamtere elr.

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

47/56

47

Az els Cprogramrl lertakat vesd ssze a Pascalban tanultakkal

2. feladatMi lesz a kvetkez programok outputja:

#include

main(){printf( Els sor \n);printf( Msodik sor \n);

}

#include

main(){printf(Els sor);printf(Msodik \n sor \n);

}

#include

main(){printf("Hello...\n..oh my\n...when do i stop?\n");

}

Mi lesz a kvetkez programok outputja:

#include

main(){

int sum, v;

sum = 10;v = 15;

printf("%d\t%d\n", sum, v);}

#include

main(){

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

48/56

48

int v1, v2, sum;

v1 = 35;v2 = 18;sum = v1 + v2;

printf("%d s %d sszege %d\n", v1, v2, sum);

}

Mirt hibsak a kvetkez vltoznevek?

value\$sumexit flag3lotsofmoneychar

5. feladatNzznk 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 );

}

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!

A kvetkez matematikai kifejezseket rd t C kifejezsekk:

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

49/56

49

)1(

)12(73

+

=

yy

ayx

)3(43

15

32

137

+

+

+

=

x

x

y

yx

a

x 10-nl nagyobb 2-vel s 3-mal nem oszthat szm y 5 s 5 kz es szm

int x , y ;x ^= y;y ^= x;x ^=y;

Mi lesz a vltozk rtke a kirtkelsek utn?

rj programot, mely a billentyzetrl beolvas kt egsz szmot, majd eldnti, hogy a nagyobbosztja-e a kisebbnek. Ha igen kirja, ha nem akkor kirja a hnyadost s az osztsi maradkot. Afeladat megoldsa sorn ne hasznlj elgazst! (Gondolj a feltteles rtkadsra!)

rj programot mely kirja az els 20 egsz szmot s ngyzetket. A feladatot oldd megmindhrom tanult ciklus segtsgvel!

rj programot, mely kirja a 1-tl 10-ig a szorztblt tblzatos formban! A feladatmegoldshoz tetszleges ciklust hasznlhatsz.

rj programot, mely 0-tl 90 fokig 5 fokonknt kirja a szgek szinuszt s cosinuszt. Amegjelents tblzatos formban trtnjen.

Szg szinusz -coszinuszsorrendben. A megfelel matematikai fggvnyek a sin(f), cos(f). A fggvnyek hasznlathoz a

program fejlcben szksg lesz a

#include llomny beillesztsre is.

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!

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

50/56

50

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

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!

rj programot, mely bekr hrom vals szmot. Ezeket sorrendben egy msodfok egyenlet a,b,cegytthatiknt rtelmezi. Add is meg az egyenlet megoldsait. A kirsok a kvetkezk kzlkerljenek 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.

rd be a kvetkez programot s magyarzd meg a mkdst!

#include

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;

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

51/56

51

case 2: s+=2;case 1: s+=1; printf(Az s rtke: %d\n, s);break;

}}

19. feladatKrj be billentyzetrl egy pontszmot, majd mondd meg, hogy ehhez hnyas rdemjegytartozik! Maximlis pontszm 100, 91-100 jeles(5), 81-90 j(4), 66-80 kzepes (3), 50-65elgsges(2), 50 alatt elgtelen(1)!

rjunk programot, mely beolvassa egy tanul jegyeit, majd kiszmtja az tlagot. A jegyekettmbben trolja. A beolvassnl csak a j osztlyzatokat fogadja el. (gondolj a scanf-nlmegadhat ellenrzsi lehetsgre) A tantrgyak szma 10. Az tlag kiszmtsa utn adjuk meg

azt is, hogy az egyes osztlyzatok hnyszor fordultak el!

rjunk programot, mely feltlt egy 100 elem vektort 1 s 1000 kz es egsz szmokkal, majda 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 randomize();x=rnd() % nAz 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 mindigugyanazokat a vletlen szmokat fogjuk eredmnyl kapni.

22. feladatDobjunk hrom dobkockval 100 000-szer. Minden egyes dobsnl adjuk ssze a hromszmot, majd rjuk ki, hogy melyik sszeg hnyszor fordult el!

Modellezzk az ts s a hatos lott hzst!

Adjuk meg egy 100 elem 1-100 kztti szmokat sorrendben tartalmaz vektor egypermutcijt!

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

52/56

52

Krjnk be egy szveget s egy karaktert a billentyzetrl, majd adjuk meg, hogy az adottkarakter hnyszor fordul el a szvegben!

Krjnk be egy szveget abillentyzetrl s dntsk el, hogy palindroma-e!

Tltsnk fl egy 6 sorbl s 10 oszlopbl ll mtrixot 200-nl nem nagyobb vletlenszmokkal. Majd vgezzk el a kvetkez feladatokat:

Vlasszuk ki minden sorbl a legnagyobb elemet, majd adjuk meg a maximumoktlagt!

Szmoljuk ki az sszes elem tlagt! Hny olyan eleme van a mtrixnak, melyek az tlagnl kisebbek, illetve nagyobbak?

rjunk programot egy a jegyzetben megadott struktra alkalmazsval. A program vletlenszernevekkel tltse fel mind a vezetk, mind a keresztneveket. A szletsi idk 1950 s 1970 kzes vletlenszmok legyenek, a fizetsek pedig essenek 50 000 s 100 000 Ft kz. A feltltsekutn a kvetkez feladatokat vgezzk el:

Adjuk meg az 1960 s1965 kztt szletetteket! Szmtsuk ki az tlagfizetst s az tlagletkort

rjunk fggvnyt, mely paramterknt egy karaktert s egy egsz rtket kap, s ennyi darabot rki egyms utn az tadott karakterbl!

rjunk fggvnyt mely paramterknt egy vals(a) s egy pozitv(n) egsz szmot kap.

Visszatrsi rtke pedig: a

n

rjunk fggvnyt, mely hrom tadott egsz szmot nagysg szerint sorba rendez, a vltozs avisszaadott rtkekben ltszik!

Mit fognak kirni a kvetkez programrszletek printf fggvnyei?

main(){

char c = 'Q';

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

53/56

53

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 = *temp = count;

printf("count = %d, *temp = %d, sum = %d\n", count, *temp, sum );}

rjunk programot, amely vletlenhosszsg sorozatokat kezel. A sorozat hossza 50 s 200kztt 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 teljessorozathoz.

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!

Egy telephelyen gymlcst vsrolnak fel. Minden Eladt a sorszmval azonostanak. Egyelad egy hnap folyamn tbbszr is leadott gymlcst, de a klnbz eladk nem

ugyanannyiszor. Egy vektorban trolva vannak a havi leadsok szmai. A telephelyen sszesen10 eladt tartanak nyilvn. rjunk programot, mely beolvassa a eladnknt s alkalmanknt a

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

54/56

54

leadott gymlcsmennyisgeket (Lehetnek ezek vletlenszmok is 500-100 kztt), majd adjunkvlaszt 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?

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

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 egyszvegen bell tbb szkz is. A szveget egy llomnybl vegyk! Lehet ez pldul egy

programllomny is.

Ksztsnk a 35. feladathoz hasonl programot, az adatokat viszont ebben az estben nemdinamikus listba, hanem egy binris llomnyba kell flvinnnk!

Ksztsnk programot, mely bekri egy llomny nevt, ha ltezik ilyen llomny, akkor aztkarakterenknt 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!

Ksztsnk ablakoz technikt hasznl programot, a kpernytartalmat elment fggvnyeksegtsgvel! Ablakoz technikt figyelhetnk meg pldul a karakteres kpernyn az NC

program hasznlatakor. Ez azt jelenti, hogy ha egy menblkivlasztunk egy pontot, akkor apontosts rdekben egy almen jelenik meg, mely eltakarja az alatta lv tartalmat, ha ez azablak eltnik, akkor vissza kell tlteni azt a rszt, ami alatta volt.

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

55/56

55

Ksztsnk rajzol programot. A szveges kpernyn a kurzort a kurzormozgat nyilakkallehessen mozgatni, legyen benne egy penup(u) s egy pendown(d) funkci. A nyilak kdja: fel72, jobbra 77, balra 75, le 80. Vigyzzunk ezeknek a beolvassval, ugyanis ezek a billentykketts kddal rendelkeznek, teht a lenyomskor kt rtk kerl a billenytzetpufferbe, az elskd minden esetben 0, a msodik pedig az imnt felsorolt. Az ilyen billentyket gy szoktukfldolgozni, hogy ha az els karakter 0, akkor olvasunk mg egyet a pufferbl. Ezeket az

olvassokat a getch() fggvnnyel tehetjk meg.

rjunk fggvnyt mely grafikus mdban kirajzolja az olimpiai tkarikt. A fggvnyt a krksugarval s a fels sor kzps karikjnak kzppontjval lehessen meghvni!

rjunk programot, mely kirajzol egy sakktblt a kpernyre. Legyen md arra, hogy a kitlts

mintjt vltozatjuk!

rjunk programot, mely vektorban trolt szmokat megjelenti kr s oszlop diagramos formbanis. Krdiagram esetn a mennyisgek sszege fele meg 360 foknak. A szomszdos krcikkeknlalkalmazzunk eltr kitltst! Oszlopdiagram esetn a legnagyobb mennyisg tltse kifgglegesen a kperny kt harmad rszt, termszetesen a tbbi mennyisg ehhez kpestarnyos magassg legyen!

44. feladatrjunk egy olyan programot, mely maximum tdfok polinomokat tud brzolni. Az tdfok

polinomok ltalnos alakja: 01

2

2

3

3

4

4

5

5 axaxaxaxaxa +++++ . 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 akpernyn!

Ksztsnk egy cltblt!

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 vltozkkzl a,b vals a tbbi egsz tpus. Lehetleg kis egszekkel dolgozzunk.

47. feladatrjunk makrkat a kvetkez funkcikra:

p://www.doksi.hu

• 8/13/2019 c Programozas Kozepiskolasoknak

56/56

Kt szm kzl adja vissza a nagyobbat. Ha egy karakter nagybet, akkor adja vissza a kisbets megfeleljt. Adja vissza egy szm ngyzett.

p://www.doksi.hu