Download - c Programozas Kozepiskolasoknak
-
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
3 FELADATGYJTEMNY ............................................................................................... 47
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.
Adattpus rtkkszletMret(byte)
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:
3.,4.,5.,6. feladat
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
#define ADO_KULCS 0.25
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
7.,8.,9. feladat
p://www.doksi.hu
-
8/13/2019 c Programozas Kozepiskolasoknak
11/56
11
1.6 Adatok beolvassa a billentyzetrl
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
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. 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
11., 12., 13. feladat
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(){
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 );}
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
}
27. feladat
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;
28. feladat
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.
29., 30., 31. feladat
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;
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
-
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.
33., 34. feladat
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
{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 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.
35. feladat
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();
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); /* 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
36., 37., 38. feladat.
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 menu_pontok[5][15]={"Els pont","Msodik pont","Harmadik pont","Negyedikpont","V G E"};
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
39., 40. feladat
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.
47. feladat
p://www.doksi.hu
-
8/13/2019 c Programozas Kozepiskolasoknak
47/56
47
2 Feladatgyjtemny1. feladat
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");
}
3. feladat
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);
}
4. feladat.
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 );
}
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:
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
8. feladatAdd 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 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!)
11. feladat
rj programot mely kirja az els 20 egsz szmot s ngyzetket. A feladatot oldd megmindhrom tanult ciklus segtsgvel!
12. feladat
rj programot, mely kirja a 1-tl 10-ig a szorztblt tblzatos formban! A feladatmegoldshoz tetszleges ciklust hasznlhatsz.
13. feladat
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.
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!
p://www.doksi.hu
-
8/13/2019 c Programozas Kozepiskolasoknak
50/56
50
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,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.
18. feladat
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)!
20. feladat
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!
21. feladat
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!
23. feladat
Modellezzk az ts s a hatos lott hzst!
24. feladat
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
25. feladat
Krjnk be egy szveget s egy karaktert a billentyzetrl, majd adjuk meg, hogy az adottkarakter hnyszor fordul el a szvegben!
26. feladat
Krjnk be egy szveget abillentyzetrl s dntsk el, hogy palindroma-e!
27. feladat
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?
28. feladat
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
29. feladat
rjunk fggvnyt, mely paramterknt egy karaktert s egy egsz rtket kap, s ennyi darabot rki egyms utn az tadott karakterbl!
30. feladat
rjunk fggvnyt mely paramterknt egy vals(a) s egy pozitv(n) egsz szmot kap.
Visszatrsi rtke pedig: a
n
31. feladat
rjunk fggvnyt, mely hrom tadott egsz szmot nagysg szerint sorba rendez, a vltozs avisszaadott rtkekben ltszik!
32. feladat
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 );}
33. feladat
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!
34. feladat
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?
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 egyszvegen 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 nemdinamikus listba, hanem egy binris llomnyba kell flvinnnk!
38. feladat
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!
39. feladat
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.
40. feladat
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.
41. feladat
rjunk fggvnyt mely grafikus mdban kirajzolja az olimpiai tkarikt. A fggvnyt a krksugarval 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 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!
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 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