„Programozás C nyelven” változatai közötti eltérés

Tartalom törölve Tartalom hozzáadva
Nincs szerkesztési összefoglaló
rendes szakaszok, egyéb formai javítások az →‎Iterációk: előttig
1. sor:
== Az első C program ==
<br />
 
Tekintsük a következő egyszerű C nyelven írt programot:
<source lang="c">
<br />
 
#include <stdio.h>
 
main()
{
printf(" Első C programom \n”n");
}
<br /source>
 
A program kimenete az idézőjelek között szereplő felirat, a kurzor pedig a következő soron áll.<br />
A program kimenete az idézőjelek között szereplő felirat, a kurzor pedig a következő soron áll.
 
Nézzünk néhány megjegyzést a fenti programmal kapcsolatban:<br />
1. # A C programozási nyelv különbséget tesz a kis és a nagy betűk között. Minden C parancsnak kis betűsnek kell lennie<br />.
# A C program belépési pontját a <source lang="c" inline="1">main()</source> függvényhívás azonosítja. Egyelőre a függvényt argumentumok nélkül hívtuk meg, a későbbiekben ennek részletezésére még kitérünk.
2. A C program belépési pontját a <br />
# A <code>{</code> és <code>}</code> a kezdő és a végpontját jelölik a végrehajtási résznek.
main()<br />
# <source lang="c" inline="1">#include <stdio.h></source> nélkül nem működne a printf() függvény.
függvényhívás azonosítja. Egyelőre a függvényt argumentumok nélkül hívtuk meg, a későbbiekben ennek részletezésére még kitérünk.<br />
# A printf()-ben a kiírandó szöveget dupla idézőjelek közé kell tennünk. Vegyük észre azt is, hogy a \n karakter nem került kiírásra. Tehát a printf() külön tartalmazza a kiírandó szöveget és a kiírást befolyásoló változókat. Ami a dupla idézőjelek között megjelenik változtatás nélkül kiírásra kerül, kivétel ez alól a \ és % karaktereket követő jel, vagy a jelsorozat. A \n változó a fordító számára azt jelenti, hogy a következő karakter kiírása előtt új sort kell kezdenie.
3. A { és } a kezdő és a végpontját jelölik a végrehajtási résznek.<br />
# A parancsokat a ; zárja le.
4. #include <stdio.h> nélkül nem működne a printf() függvény.<br />
5. A printf()-ben a kiírandó szöveget dupla idézőjelek közé kell tennünk. Vegyük észre azt is, hogy a \n karakter nem került kiírásra. Tehát a printf() külön tartalmazza a kiírandó szöveget és a kiírást befolyásoló változókat. Ami a dupla idézőjelek között megjelenik változtatás nélkül kiírásra kerül, kivétel ez alól a \ és % karaktereket követő jel, vagy a jelsorozat. A \n változó a fordító számára azt jelenti, hogy a következő karakter kiírása előtt új sort kell kezdenie<br />
6. A parancsokat a ; zárja le.<br />
1., 2. feladat<br />
<br />
'''2.2 Megjegyzések'''<br />
A megjegyzéseket a programszöveg magyarázatainak beírására szoktuk használni. Hibakereséskor is jó hasznát vehetjük azonban, ha a program egy részének végrehajtását szeretnénk kihagyni, akkor azt megjegyzés blokkba zárhatjuk.<br />
/* ez most egy egysoros megjegyzés */<br />
/* ez most<br />
több soros<br />
megjegyzés */<br />
<br />
'''2.3 A változókról'''<br />
A C típusos programnyelv. Ez azt jelenti, hogy mielőtt egy változót használni szeretnénk deklarálnunk kell azt. Figyeljünk arra, hogy a a fordítóprogram a változó nevekben is különbséget tesz a kis és a nagy betűk között.
A névre a következő megkötések érvényesek:<br />
• csak betűket, számjegyeket és aláhúzás karaktert tartalmazhat<br />
• betűvel kell kezdődnie<br />
• hossza legfeljebb 32 karakter (implementáció függő)<br />
A változó deklaráció szabálya C-ben a következő:<br />
Típus nev1,nev2,…;<br />
Például:<br />
int s;<br />
float f,k;<br />
<br />
Egy változót kezdőértékkel is elláthatunk.<br />
int s=10;<br />
Nézzük a következő C programot:<br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
int sum;<br />
<br />
sum = 500 + 15;<br />
printf("500 és 15 összege %d\n", sum);<br />
}<br />
A programban létrehoztunk egy egész típusú változót, majd egy összeget rendeltünk hozzá. Figyeljük meg a változó kiíratását! Az idézőjelek között most találkozunk először a % jellel. Mögötte kell megadnunk, hogy erre a helyre milyen típusú változó kerül kiírásra. A d betű az egész típusra utal. Az idézőjel után következik a változó neve. Ennek értéke kerül majd beírásra a szövegbe.<br />
Az adatoknak a C-ben négy alaptípusa van: egész (int), karakter (char), valós (float, double), <br />
Az alaptípusokat elláthatjuk módosító jelzőkkel is, ekkor az értékkészlet módosul.<br />
Pl.<br />
int a<br />
unsigned int b<br />
Az első esetben az a értéke –32768 és 32767 között lehet, míg a második esetben a b értéke 0 és 65535 közötti szám lehet. A signed módosító jelző is használható, de alapértelmezés szerint minden egész változó ilyen lesz.<br />
<br />
A következő táblázatban felsoroltunk néhány típust, értékkészletükkel együtt.<br />
 
== Megjegyzések ==
Adattípus Értékkészlet Méret (byte) Pontosság(jegy)<br />
A megjegyzéseket a programszöveg magyarázatainak beírására szoktuk használni. Hibakereséskor is jó hasznát vehetjük azonban, ha a program egy részének végrehajtását szeretnénk kihagyni, akkor azt megjegyzés blokkba zárhatjuk.
char -128..127 1 <br />
<source lang="c">
unsigned char 0..255 1 <br />
/* ez most egy egysoros megjegyzés */
int -32768..32767 2 <br />
/* ez most
unsigned int 0..65535 2 <br />
több soros
long int -2147483648..2147483647 4 <br />
megjegyzés */
unsigned long int 0..4294967295 4 <br />
</source>
float 3.4e-38..3.8e+38 4 6<br />
 
double 1.7e-308..1.7e+308 8 15<br />
== A változókról ==
long double 3.4e-4932..3.4e+4932 10 19<br />
A C típusos programnyelv. Ez azt jelenti, hogy mielőtt egy változót használni szeretnénk, deklarálnunk kell azt. Figyeljünk arra, hogy a a fordítóprogram a változónevekben is különbséget tesz a kis és a nagy betűk között. A névre a következő megkötések érvényesek:
<br />
* csak betűket, számjegyeket és aláhúzás karaktert tartalmazhat
<br />
* betűvel kell kezdődnie
A printf() függvényben a változókat csak úgy tudjuk kiíratni, hogy az idézőjelek között % jel után megadjuk a változó típusát, a kiírás formátumát majd az idézőjelek után vesszőkkel elválasztva fölsoroljuk a változók neveit. A gyakrabban használt karaktereket a következő táblázatban soroltuk föl.:<br />
* hossza legfeljebb 32 karakter (implementációfüggő)
<br />
A változódeklaráció szabálya C-ben a következő:
%d decimális egész <br />
<pre>Típus nev1,nev2,…;</pre>
%u előjel nélküli decimális egész<br />
Például:
%f lebegőpontos<br />
<source lang="c">
%c karakter<br />
int s;
%s sztirng vagy karakter tömb<br />
float f,k;
%e dupla valós<br />
</source>
Lehetőség van arra is, hogy meghatározzuk a változó értéke által elfoglalt mező szélességét. Nézük a következő példákat<br />
Egy változót kezdőértékkel is elláthatunk.
int v1;<br />
<source lang="c">
printf(”…%5d”,v1);<br />
int s=10;
A v1 egész változó 5 karakter helyen jelenik meg.<br />
<br /source>
Nézzük a következő C programot:
float f1;<br />
<source lang="c">
printf(”…%5.2f”,f1);<br />
#include <stdio.h>
Az f valós változót 5 mezőre írja ki 2 tizedes pontossággal.<br />
 
<br />
main()
int v1,w=10;<br />
{
printf(”…%*d”,w,v1);<br />
int sum;
A * jelentése eben az esetben az, hogy a mezőszélességet az idézőjel utáni első változó határozza meg. Tehát a fenti példában a v1 egész változó 10 szélességű mezőre kerül kiírásra.<br />
 
Ha egy változó karakter típusú, akkor értékét egyszeres idézőjelek között kell megadnunk.<br />
sum = 500 + 15;
char betu;<br />
printf("500 és 15 összege %d\n", sum);
betu=’A’;<br />
}
<br />
</source>
Egész típusú változónak adhatunk 16-os vagy 8-as számrendszerbeli értéket is.<br />
A programban létrehoztunk egy egész típusú változót, majd egy összeget rendeltünk hozzá. Figyeljük meg a változó kiíratását! Az idézőjelek között most találkozunk először a % jellel. Mögötte kell megadnunk, hogy erre a helyre milyen típusú változó kerül kiírásra. A d betű az egész típusra utal. Az idézőjel után következik a változó neve. Ennek értéke kerül majd beírásra a szövegbe.
int okt, hex;<br />
 
okt = 0567;<br />
Az adatoknak a C-ben négy alaptípusa van: egész (int), karakter (char), valós (float, double).
hex = 0x2ab4;<br />
 
hex = 0X2AB4;<br />
Az alaptípusokat elláthatjuk módosító jelzőkkel is, ekkor az értékkészlet módosul.
Minden változó esetén figyeljünk a kezdőérték megadására. Ha ezt nem tesszük meg, a változónak akkor is lesz kezdőértéke, de biztosan nem olyan, amit mi szerettünk volna adni.<br />
Pl.
<br />
<source lang="c">
'''2.3.1 Felhasználói típus''' <br />
int a;
Ha egy típus neve túl hosszú és gyakran használnunk kell a program során, akkor érdemes egy szinonímával hivatkozni rá: Ennek a módja:<br />
unsigned int b;
</source>
Az első esetben az a értéke –32768 és 32767 között lehet, míg a második esetben a b értéke 0 és 65535 közötti szám lehet. A signed módosító jelző is használható, de alapértelmezés szerint minden egész változó ilyen lesz.
 
A következő táblázatban felsoroltunk néhány típust, értékkészletükkel együtt.
 
{| class="wikitable"
! Adattípus !! Értékkészlet !! Méret (byte) !! Pontosság (tizedesjegy)
|-
| char || -128..127 || 1 || rowspan="6" | (egész)
|-
| unsigned char || 0..255 || 1
|-
| int || -32768..32767 || 2
|-
| unsigned int || 0..65535 || 2
|-
| long int || -2147483648..2147483647 || 4
|-
| unsigned long int || 0..4294967295 || 4
|-
| float || 3.4e-38..3.8e+38 || 4 || 6
|-
| double || 1.7e-308..1.7e+308 || 8 || 15
|-
| long double || 3.4e-4932..3.4e+4932 || 10 || 19
|}
 
A printf() függvényben a változókat csak úgy tudjuk kiíratni, hogy az idézőjelek között % jel után megadjuk a változó típusát, a kiírás formátumát majd az idézőjelek után vesszőkkel elválasztva fölsoroljuk a változók neveit. A gyakrabban használt karaktereket a következő táblázatban soroltuk föl:
{| class="wikitable"
| %d || decimális egész
|-
| %u || előjel nélküli decimális egész
|-
| %f || lebegőpontos
|-
| %c || karakter
|-
| %s || sztirng vagy karaktertömb
|-
| %e || dupla valós
|}
 
Lehetőség van arra is, hogy meghatározzuk a változó értéke által elfoglalt mező szélességét. Nézzük a következő példákat:
<source lang="c">
int v1;
printf("…%5d", v1);
</source>
A v1 egész változó 5 karakter helyen jelenik meg.
 
<source lang="c">
float f1;
printf("…%5.2f", f1);
</source>
Az f valós változót 5 mezőre írja ki 2 tizedes pontossággal.
 
<source lang="c">
int v1, w = 10;
printf("…%*d", w, v1);
</source>
A * jelentése eben az esetben az, hogy a mezőszélességet az idézőjel utáni első változó határozza meg. Tehát a fenti példában a v1 egész változó 10 szélességű mezőre kerül kiírásra.
 
Ha egy változó karakter típusú, akkor értékét egyszeres idézőjelek között kell megadnunk.
<source lang="c">
char betu;
betu='A';
</source>
 
Egész típusú változónak adhatunk 16-os vagy 8-as számrendszerbeli értéket is.
<source lang="c">
int okt, hex;
okt = 0567;
hex = 0x2ab4;
hex = 0X2AB4;
</source>
 
Minden változó esetén figyeljünk a kezdőérték megadására. Ha ezt nem tesszük meg, a változónak akkor is lesz kezdőértéke, de biztosan nem olyan, amit mi szerettünk volna adni.
 
=== Felhasználói típus ===
Ha egy típus neve túl hosszú és gyakran használnunk kell a program során, akkor érdemes egy szinonimával hivatkozni rá: Ennek a módja:<br />
\n új sor<br />
\t tabulátor<br />
123 ⟶ 159 sor:
<br />
<br />
3.,4.,5.,6. feladat<br />
<br />
'''2.4 Konstansok'''<br />
<br />
A konstansok megadásának két módját ismertetjük az alábbiakban.<br />
<br />
<br />
''2.4.1 A const kulcsszó hazsnálatával''<br />
const int a=30;<br />
Ebben az esetben vigyázni kell arra, hogy a konstanst inicializáljuk is. Hiba jelzést ad a következő deklaráció:<br />
const int a;<br />
a=30;<br />
Az így létrehozott konstansok értéke közvetlenül nem változtatható meg. A konstansok, azonban a memórában tárolódnak, így értékük közvetetten mutatók használatával módosítható.<br />
<br />
''2.4.2 Az előfordítónak szóló helyettesítéssel''<br />
Az előfordítónak különböző definíciókat, leírásokat adhatunk, erről a későbbikeben még részletesen lesz szó. Most egyetlen példát nézzünk a konstansok megadására<br />
<br />
#define ADO_KULCS 0.25<br />
Az így megadott konstansok a program listájának elején szerepelnek a #include beillesztések után. Szintaktikailag a # a sor első karaktere kell hogy legyen, az ilyen sorokat nem zárhatjuk pontosvesszővel, és minden sorban csak egy #define állhat. Mivel ezek a leírások az előfordítónak szólnak, ezért minden olyan helyen, ahol a programlistában az ADO_KULCS azonosító szerepel, az előfordító 0.25 értéket fog beírni. Ezért az így létrehozott konstansok értéke még indirekt módon sem változtatható.<br />
<br />
'''2.5 Operátorok'''<br />
A programok írása során gyakran van szükségünk kifejezések felépítésére, váltózónak történő értékadásra, számolási műveletekre, függvényhívásokra. A C nyelvben ezek a kifejezések oparandusok, függvényhívások és operátorok kombinációjából épülnek fel.<br />
Az operátorokat többféle szempont szerint lehet csoportosítani.<br />
• Az operandusok száma szerint. (egy, kettő, három operandus)<br />
• Az operátor típusa szerint (aritmetikai, logikai, léptető, bitművelet, értékadó, feltételes)<br />
• Az operátor helye szerint (prefix, postfix)<br />
Itt az operátorokat a típusuk szerint tárgyaljuk, de említést teszünk a másik két szempontról is.<br />
 
== Konstansok ==
''2.5.1 Aritmetikai operátorok''<br />
A konstansok megadásának két módját ismertetjük az alábbiakban.
A négy alapművelet, a szokásos szimbólumokkal, valamint a maradékos osztás % jellel. A művelet az osztás maradékát adja vissza, természetesen csak egész típusú változók használata esetén alkalmazható. A másik négy művelet mind egész, mind valós operandusok esetén is működik. Vigyázzunk a következőhöz hasonló esetekben.<br />
int a=12,b=5;<br />
float f;<br />
f=a/b;<br />
A programrészlet után az f értéke a 2.000000 valós érték lesz. Tehát az eredmény típusát az operandusok típusa döntötte el.<br />
A műveletek precedenciája a matematikában megszokott.<br />
 
=== A const kulcsszó használatával ===
''2.5.2 Összehasonlító és logikai operátorok''<br />
<syntaxhighlight lang="c">
Feltételekben és ciklusokban gyakran kell összehasonlítani különböző értékeket, ennek elvégzésére a hasonlító operátorokat használjuk. Ezek a következők: <,>,<=,>=,==,!=. Ha ezekkel két változót vagy kifejezést hasonlítunk össze, akkor az eredmény int típusú lesz, és értéke 1, ha a reláció igaz, illetve 0, ha hamis.<br />
const int a = 30;
A logikai kfejezésekben gyakran összetett feltételeket is meg kell fogalmazni, erre szolgálnak a logikai operátorok. Ezek a következők: ! a tagadás művelete, egyoperandusú. && logikai és, || logikai vagy műveletek. A műveletek precedenciája a táblázatban.<br />
</syntaxhighlight>
<br />
Ebben az esetben vigyázni kell arra, hogy a konstanst inicializáljuk is. Hibajelzést ad a következő deklaráció:
''2.5.3 Léptető operátorok''<br />
<syntaxhighlight lang="c">
A változó értékének eggyel való növelésére, vagy csökkentésére szolgálnak. Egyoperandusú műveletek. Postfix és prefix alakban is írhatók. ++ eggyel növeli, -- eggyel csökkenti a változó értékét. Ha egy kifejezésben csak egy változó szerepel, akkor mindegy, hogy postfixes, vagy prefixes alakját használjuk az operátoroknak. (a++ egyenértékű a ++a-val) Ha azonban egy kifejezés kiértékelésében használjuk, akkor már óvatosabban kell bánni a két alakkal.<br />
const int a=4,x,y;<br />
a = 30;
x=++a;<br />
</syntaxhighlight>
y=a++;<br />
Az így létrehozott konstansok értéke közvetlenül nem változtatható meg. A konstanso, azonban a memóriában tárolódnak, így értékük közvetetten mutatók használatával módosítható.
A programrészletben az első értékadás előtt az a értéke 1-gyel nő 5 lesz, ezt kapja az x változó, tehát annak értéke is 5 lesz, a második értékadásban az y megkapja a pillanatnyi értékét az ötöt, majd az a értéke 1-gyel nő, azaz 6 lesz. Az operátorok mind egész, mind valós operátorokkal működnek.<br />
 
C-ben nem szokás az a=a+1 értékadás, helyette minden esetben a léptetést használjuk.<br />
=== Az előfordítónak szóló helyettesítéssel ===
<br />
Az előfordítónak különböző definíciókat, leírásokat adhatunk, erről a későbbiekben még részletesen lesz szó. Most egyetlen példát nézzünk a konstansok megadására.
''2.5.4 Bitműveletek''<br />
<syntaxhighlight lang="c">
A műveletek operandusai csak char, short, int és long típusú előjel nélküli egészek lehetnek.<br />
#define ADO_KULCS 0.25
A műveletek első csoportja két operandusú. ~ 1-es komplemens, & bitenkénti és, | bitenkénti vagy, ^ bitenkénti kizáró VAGY. Ezeket a műveleteket leggyakrabban maszkolásra, vagy bitek törlésére szoktuk használni. A kizáró VAGY érdekes tulajdonsága, hogy ha ugyanazt a maszkot kétszer alkalmazzuk egy értékre, akkor visszakapjuk az eredeti értéket.<br />
</syntaxhighlight>
A műveletek másik csoportjába a biteltoló műveletek tartoznak. << eltolás balra, >> eltolás jobbra. A felszabaduló pozíciókba 0 kerül, a kilépő bitek elvesznek. A műveletek két operandusúak. a<<2 az a változó bitjeit 2-vel tolja balra. Nyilvánvalóan az n bittel való balra tolás 2n-nel való szorzást, míg az n bittel való jobbra tolás 2n-nel való egészosztást eredményez.<br />
Az így megadott konstansok a program listájának elején szerepelnek az #include beillesztések után. Szintaktikailag a # a sor első karaktere kell hogy legyen, az ilyen sorokat nem zárhatjuk pontosvesszővel, és minden sorban csak egy #define állhat. Mivel ezek a leírások az előfordítónak szólnak, ezért minden olyan helyen, ahol a programlistában az ADO_KULCS azonosító szerepel, az előfordító 0.25 értéket fog beírni. Ezért az így létrehozott konstansok értéke még indirekt módon sem változtatható.
<br />
 
''2.5.5 Értékadó operátorok''<br />
== Operátorok ==
Az értékadás történhet a más nyelvekben megszokottak szerint.<br />
A programok írása során gyakran van szükségünk kifejezések felépítésére, váltózónak történő értékadásra, számolási műveletekre, függvényhívásokra. A C nyelvben ezek a kifejezések oparandusok, függvényhívások és operátorok kombinációjából épülnek fel.
a=érték, vagy a=kifejezés formában<br />
 
Van azonban olyan forma is, mely a hagyományos nyelvektől teljesen idegen.<br />
Az operátorokat többféle szempont szerint lehet csoportosítani.
b=2*(a=4)+5<br />
* Az operandusok száma szerint (egy, kettő, három operandus)
Ebben az esetben az a és a b változó is kap értéket. Az értékadás operátor mindig jobbról balra értékelődik ki, tehát a kiértékelés után a fenti kifejezésben a értéke 4, b értéke pedig 13 lesz. A kiértékeklés ilyen sorrendje miatt van az, hogy a C-ben az összetett értékadás is működik.<br />
* Az operátor típusa szerint (aritmetikai, logikai, léptető, bitművelet, értékadó, feltételes)
Hagyományos forma Tömör forma<br />
* Az operátor helye szerint (prefix, postfix)
a=a+b a+=b <br />
Itt az operátorokat a típusuk szerint tárgyaljuk, de említést teszünk a másik két szempontról is.
a=a-b a-=b <br />
 
a=a*b a*=b <br />
=== Aritmetikai operátorok ===
a=a/b a/=b <br />
A négy alapművelet, a szokásos szimbólumokkal, valamint a maradékos osztás % jellel. A művelet az osztás maradékát adja vissza, természetesen csak egész típusú változók használata esetén alkalmazható. A másik négy művelet mind egész, mind valós operandusok esetén is működik. Vigyázzunk a következőhöz hasonló esetekben.
a=a%b a%=b <br />
<syntaxhighlight lang="c">
a=a<<b a<<=b <br />
int a=12, b=5;
a=a>>b a>>=b <br />
float f;
a=a&b a&=b <br />
f = a/b;
a=a|b a|=b <br />
</syntaxhighlight>
a=a^b a^=b <br />
A programrészlet után az f értéke a 2.000000 valós érték lesz. Tehát az eredmény típusát az operandusok típusa döntötte el.
a=b=c=0 értékadás után mindhárom változó értéke 0 lesz. <br />
 
Van az értékadásnak C-ben egy tömörebb formája is. Általános alakban a következőképpen írható le:<br />
A műveletek sorrendje a matematikában megszokott.
változó=változó op kifejezés helyett a változó op=kifejezés<br />
 
Ez a forma általában gyorsabb kódot és áttekinthetőbb listát eredményez. A C programokban természetesen mindkettő forma használható, de igyekezzünk a másodikat előnyben részesíteni. A mellékelt táblázatban összefoglaljuk ezeket a rövidített értékadásokat.<br />
=== Összehasonlító és logikai operátorok ===
<br />
Feltételekben és ciklusokban gyakran kell összehasonlítani különböző értékeket, ennek elvégzésére a hasonlító operátorokat használjuk. Ezek a következők: <code><, >, <=, >=, ==, !=</code>. Ha ezekkel két változót vagy kifejezést hasonlítunk össze, akkor az eredmény int típusú lesz, és értéke 1, ha a reláció igaz, illetve 0, ha hamis.
''2.5.6 Feltételes operátor''<br />
 
A C-ben ez az egyetlen operátor, melynek három operandusa van. Általános alakja a következő:<br />
A logikai kifejezésekben gyakran összetett feltételeket is meg kell fogalmazni, erre szolgálnak a logikai operátorok. Ezek a következők: <code>!</code> a tagadás művelete, egyoperandusú. <code>&&</code> logikai és, <code>||</code> logikai vagy műveletek. A műveletek precedenciája a táblázatban.
kifejezés1 ? kifejezés2 : kifejezés3<br />
 
Itt először a kifejezés1 értékelődik ki, ha ennek értéke nem 0, azaz IGAZ, akkor a kifejezés2 adja a feltételes kifejezés értékét, különben pedig a kifejezés3. A feltételes kifejezés típusa mindig a kifejezés2 és kifejezés3 típus közül a nagyobb pontosságú típusával egyezik meg.<br />
=== Léptető operátorok ===
A következő példában c értéke a és b közül a kisebbel lesz egyenlő.<br />
A változó értékének eggyel való növelésére, vagy csökkentésére szolgálnak. Egyoperandusú műveletek. Postfix és prefix alakban is írhatók. <code>++</code> eggyel növeli, <code>--</code> eggyel csökkenti a változó értékét. Ha egy kifejezésben csak egy változó szerepel, akkor mindegy, hogy postfixes, vagy prefixes alakját használjuk az operátoroknak. (<code>a++</code> egyenértékű a <code>++a</code>-val) Ha azonban egy kifejezés kiértékelésében használjuk, akkor már óvatosabban kell bánni a két alakkal.
c = a < b ? a : b<br />
<syntaxhighlight lang="c">
<br />
int a=4, x, y;
''2.5.7 Pointer operátorok''<br />
x=++a;
A mutatókról az eddigiek során még nem volt szó, de a teljesség kedvéért megemlítünk két egyoperandusú műveletet, mely a mutatókhoz (pointerek) kötődik. & a címe operátor.<br />
y=a++;
int a , *ptr;<br />
</syntaxhighlight>
ptr = &a<br />
A programrészletben az első értékadás előtt az a értéke 1-gyel nő, 5 lesz, ezt kapja az x változó, tehát annak értéke is 5 lesz, a második értékadásban az y megkapja a pillanatnyi értékét az ötöt, majd az a értéke 1-gyel nő, azaz 6 lesz. Az operátorok mind egész, mind valós operátorokkal működnek.
Ebben a példában a ptr egy egész típusú változóra mutat, értékadásnál pedig az a változó memóriabeli címét kapja meg. Ha erre a címre új értéket akarunk írni, akkor a * (indirekt hivatkozás) operátort kell használnunk.<br />
 
*ptr = 5 egyenértékű az a=5 értékadással. <br />
C-ben nem szokás az <code>a=a+1</code> értékadás, helyette minden esetben a léptetést használjuk.
<br />
 
''2.5.8 Típuskonverziók''<br />
=== Bitműveletek ===
A C-ben kétfajta típuskonverzió létezik, az implicit (automatikus) és az explicit. Az első a C nyelvbe rögzített szabályok szerint történik a programozó beavatkozása nélkül, a második pedig a típuskonverziós operátor segítségével. Ennek általános alakja:<br />
A műveletek operandusai csak char, short, int és long típusú előjel nélküli egészek lehetnek.
(típusnév) kifejezés<br />
 
Az implicit konverzióval kapcsolatban elmondhatjuk, hogy általában a szűkebb operandus információvszteség nélkül konvertálódik a szélesebb operandus típusára.<br />
A műveletek első csoportja két operandusú. <code>~</code> 1-es komplemens, <code>&</code> bitenkénti és, <code>|</code> bitenkénti vagy, <code>^</code> bitenkénti kizáró VAGY. Ezeket a műveleteket leggyakrabban maszkolásra, vagy bitek törlésére szoktuk használni. A kizáró VAGY érdekes tulajdonsága, hogy ha ugyanazt a maszkot kétszer alkalmazzuk egy értékre, akkor visszakapjuk az eredeti értéket.
int i,j;<br />
 
float f,m;<br />
A műveletek másik csoportjába a biteltoló műveletek tartoznak. <code><<</code> eltolás balra, <code>>></code> eltolás jobbra. A felszabaduló pozíciókba 0 kerül, a kilépő bitek elvesznek. A műveletek két operandusúak. <code>a<<2</code> az a változó bitjeit 2-vel tolja balra. Nyilvánvalóan az n bittel való balra tolás 2n-nel való szorzást, míg az n bittel való jobbra tolás 2n-nel való egészosztást eredményez.
m=i+f;<br />
 
Ebben az esetben az i float-ra konvertálódik.<br />
=== Értékadó operátorok ===
j=i+f;<br />
Az értékadás történhet a más nyelvekben megszokottak szerint.
Itt viszont vigyáznunk kell, mert adatvesztés lép fel, az összeg törtrésze elveszik.<br />
 
Explicit konverziót kell végrehajtanunk a következő példában, ha f-be nemcsak az egész osztás hányadosát szeretnénk betenni<br />
<code>a=érték</code> vagy <code>a=kifejezés</code> formában
int a = 12,b = 5;<br />
 
float f;<br />
Van azonban olyan forma is, mely a hagyományos nyelvektől teljesen idegen.
f = (float) a / (float) b;<br />
<syntaxhighlight lang="c">
<br />
b=2*(a=4)+5;
A következő táblázatban összefoglaltuk az említett műveleteket precedenciájuk szerint rendezve. Valamint a kiértékelés sorrendjét is megadtuk. A kiértékelés sorrendje akkor kerül előtérbe, ha egy kifejezésben egyenlő precedenciájú operátorok szerepelnek zárójelezés nélkül<br />
</syntaxhighlight>
<br />
Ebben az esetben az a és a b változó is kap értéket. Az értékadás operátor mindig jobbról balra értékelődik ki, tehát a kiértékelés után a fenti kifejezésben a értéke 4, b értéke pedig 13 lesz. A kiértékelés ilyen sorrendje miatt van az, hogy a C-ben az összetett értékadás is működik.
Operátor Kiértékelés sorrendje<br />
 
! ~ - ++ -- & * (típus) Jobbról balra<br />
<code>a=b=c=0</code> értékadás után mindhárom változó értéke 0 lesz.
* / % Balról jobbra<br />
 
+ - Balról jobbra<br />
Van az értékadásnak C-ben egy tömörebb formája is. Általános alakban a következőképpen írható le:
<< >> Balról jobbra<br />
 
< <= > >= Balról jobbra<br />
változó=változó op kifejezés helyett a változó op=kifejezés
== != Balról jobbra<br />
 
& Balról jobbra<br />
Ez a forma általában gyorsabb kódot és áttekinthetőbb listát eredményez. A C programokban természetesen mindkettő forma használható, de igyekezzünk a másodikat előnyben részesíteni. A mellékelt táblázatban összefoglaljuk ezeket a rövidített értékadásokat.
^ Balról jobbra<br />
{| class="wikitable"
| Balról jobbra<br />
!Hagyományos forma
&& Balról jobbra<br />
!Tömör forma
|| Balról jobbra<br />
|-
?: Jobbról balra<br />
| <pre>a = a + b</pre>
= += -= *= /= %= <<= >>= &= |= ^= Jobbról balra<br />
| <brpre>a += b</pre>
|-
7.,8.,9. feladat<br />
| <pre>a = a - b</pre>
<br />
| <pre>a -= b</pre>
'''2.6 Adatok beolvasása a billentyűzetről'''<br />
|-
<br />
| <pre>a = a * b</pre>
A formázott adatbeolvasást a scanf függvény segítségével tehetjük meg. A függvény általános formája a következő:<br />
| <pre>a *= b</pre>
scanf(formátum, argumentumlista)<br />
|-
A scanf karaktereket olvas a billentyűzetről, majd a formátum alapján értelmezi azokat, ha a beolvasott karakterek megfelelők, akkor konvertálja őket. Ha az input valamilyen ok miatt nem felel meg a formátum előírásainak, akkor a scanf befejezi az olvasást, még akkor is, ha az argumentumlista szerint további karaktereket is be kellene olvasnia. A scanf függvénynek visszatérési értéke is van. A sikeresen beolvasott adatok számát adja vissza. Nézzünk néhny példát a scanf használatára.<br />
int| <pre>a ;<br= a / b</pre>
| <pre>a /= b</pre>
char c;<br />
|-
printf(”Kérek egy egész számot és egy betűt”);<br />
| <pre>a = a % b</pre>
scanf(”%d%c”,&a,&b)<br />
| <pre>a %= b</pre>
A példából látszik, hogy az egyszerű adatokat cím szerint kell beolvasni. Az argumentumlistában az &a és az &c a változók memóriabeli címére utal. A formátumban ugyanazokat a karaktereket használhatjuk, mint a printf esetében korábban tettük. Ez a sor egy számot és egy karaktert olvas be egymás után, nem tesz közéjük semmilyen elválasztó jelet. Nyilván, ha egy scanf-fel több értéket is akarunk beolvasni, akkor valamilyen határolóra szükség van.<br />
|-
int a ;<br />
char| c;<br /pre>
a=a<
printf(”Kérek egy egész számot és egy betűt vesszővel elválasztva”);<br />
a=a>>b
scanf(”%d,%c”,&a,&b);<br />
</pre>
Figyeljük meg a változtatást. A formátumban egy vesszőt tettünk a második % jel elé. Ilyenkor a scanf beolvassa a vesszőt is, de azt nem tárolja. Ilyen módon bármilyen határoló karaktereket előírhatunk beolvasáskor.<br />
| <pre>a >>= b</pre>
A scanf segítségével sztringeket is olvashatunk be. Ebben az esetben nem használjuk az & operátort.<br />
|-
char sz[30];<br />
| <pre>a = a & b</pre>
scanf(”%s”,sz);<br />
| <pre>a &= b</pre>
A scanf egy hasznos lehetősége, hogy az adatok szűrését is lehetővé teszi. Az előbbi deklaráció szerinti sz változó értéke csak számjegy, vagy hexadecimális jegy lehet, akkor azt a következő szűréssel valósíthatjuk meg:<br />
|-
scanf(”%[0-9a-fA-F]”,sz)<br />
| <pre>a = a | b</pre>
A komplementer halmaz megadására is van módunk:<br />
| <pre>a |= b</pre>
scanf(”%[^0-9]”,sz)<br />
|-
Ezzel a szűréssel csak betűk kerülhetnek a sztringbe<br />
| <pre>a = a ^ b</pre>
10. feladat<br />
| <brpre>a ^= b</pre>
|}
'''2.7 Iterációk'''<br />
 
<br />
=== Feltételes operátor ===
Mint minden magas szintű programozási nyelvben a C-ben is vannak olyan utasítások, melyek egy feltételtől függően többször is végrhajtják ugyanazt az utasítást, vagy utasítás blokkot. A következőkben ahol utasítást írunk helyettesíthető utasításblokkal is. Utasításblokk:<br />
A C-ben ez az egyetlen operátor, melynek három operandusa van. Általános alakja a következő:
<pre>kifejezés1 ? kifejezés2 : kifejezés3</pre>
Itt először a kifejezés1 értékelődik ki, ha ennek értéke nem 0, azaz IGAZ, akkor a kifejezés2 adja a feltételes kifejezés értékét, különben pedig a kifejezés3. A feltételes kifejezés típusa mindig a kifejezés2 és kifejezés3 típus közül a nagyobb pontosságú típusával egyezik meg.
 
A következő példában c értéke a és b közül a kisebbel lesz egyenlő.
<syntaxhighlight lang="c">
c = a < b ? a : b;
</syntaxhighlight>
 
 
=== Pointer operátorok ===
A mutatókról az eddigiek során még nem volt szó, de a teljesség kedvéért megemlítünk két egyoperandusú műveletet, mely a mutatókhoz (pointerek) kötődik. <code>&</code> a címe operátor.
<syntaxhighlight lang="c">
int a, *ptr;
ptr = &a;
</syntaxhighlight>
Ebben a példában a ptr egy egész típusú változóra mutat, értékadásnál pedig az a változó memóriabeli címét kapja meg. Ha erre a címre új értéket akarunk írni, akkor a * (indirekt hivatkozás) operátort kell használnunk.
 
<code>*ptr = 5</code> egyenértékű az <code>a=5</code> értékadással.
 
=== Típuskonverziók ===
A C-ben kétfajta típuskonverzió létezik, az implicit (automatikus) és az explicit. Az első a C nyelvbe rögzített szabályok szerint történik a programozó beavatkozása nélkül, a második pedig a típuskonverziós operátor segítségével. Ennek általános alakja:
<pre>(típusnév) kifejezés</pre>
Az implicit konverzióval kapcsolatban elmondhatjuk, hogy általában a szűkebb operandus információveszteség nélkül konvertálódik a szélesebb operandus típusára.
<syntaxhighlight lang="c">
int i, j;
float f, m;
m = i + f;
</syntaxhighlight>
Ebben az esetben az i float-ra konvertálódik.
<syntaxhighlight lang="c">
j = i + f;
</syntaxhighlight>
Itt viszont vigyáznunk kell, mert adatvesztés lép fel, az összeg törtrésze elveszik.
 
Explicit konverziót kell végrehajtanunk a következő példában, ha f-be nem csak az egész osztás hányadosát szeretnénk betenni.
<syntaxhighlight lang="c">
int a = 12, b = 5;
float f;
f = (float) a / (float) b;
</syntaxhighlight>
A következő táblázatban összefoglaltuk az említett műveleteket precedenciájuk szerint rendezve. Valamint a kiértékelés sorrendjét is megadtuk. A kiértékelés sorrendje akkor kerül előtérbe, ha egy kifejezésben egyenlő precedenciájú operátorok szerepelnek zárójelezés nélkül.
{| class="wikitable"
!Operátor
!Kiértékelés sorrendje
|-
|! ~ - ++ -- & * (típus)
|Jobbról balra
|-
|/ &
|Balról jobbra
|-
| + -
|Balról jobbra
|-
|<< >>
|Balról jobbra
|-
|< <= > >=
|Balról jobbra
|-
|== !=
|Balról jobbra
|-
|&
|Balról jobbra
|-
|^
|Balról jobbra
|-
|<nowiki>|</nowiki>
|Balról jobbra
|-
|&&
|Balról jobbra
|-
|<nowiki>||</nowiki>
|Balról jobbra
|-
|?:
|Balról jobbra
|-
|= += -= *= /= %=
<<= >>= &= |= ^=
|Jobbról balra
|}
 
== Adatok beolvasása a billentyűzetről ==
A formázott adatbeolvasást a scanf függvény segítségével tehetjük meg. A függvény általános formája a következő:
<pre>scanf(formátum, argumentumlista)</pre>
A scanf karaktereket olvas a billentyűzetről, majd a formátum alapján értelmezi azokat, ha a beolvasott karakterek megfelelők, akkor konvertálja őket. Ha az input valamilyen ok miatt nem felel meg a formátum előírásainak, akkor a scanf befejezi az olvasást, még akkor is, ha az argumentumlista szerint további karaktereket is be kellene olvasnia. A scanf függvénynek visszatérési értéke is van. A sikeresen beolvasott adatok számát adja vissza. Nézzünk néhány példát a scanf használatára.
<syntaxhighlight lang="c">
int a;
char c;
printf("Kérek egy egész számot és egy betűt");
scanf("%d%c", &a, &b);
</syntaxhighlight>
A példából látszik, hogy az egyszerű adatokat cím szerint kell beolvasni. Az argumentumlistában az &a és az &c a változók memóriabeli címére utal. A formátumban ugyanazokat a karaktereket használhatjuk, mint a printf esetében korábban tettük. Ez a sor egy számot és egy karaktert olvas be egymás után, nem tesz közéjük semmilyen elválasztó jelet. Nyilván, ha egy scanf-fel több értéket is akarunk beolvasni, akkor valamilyen határolóra szükség van.
<syntaxhighlight lang="c">
int a;
char c;
printf("Kérek egy egész számot és egy betűt vesszővel elválasztva");
scanf("%d,%c", &a, &b);
</syntaxhighlight>
Figyeljük meg a változtatást. A formátumban egy vesszőt tettünk a második % jel elé. Ilyenkor a scanf beolvassa a vesszőt is, de azt nem tárolja. Ilyen módon bármilyen határoló karaktereket előírhatunk beolvasáskor.
A scanf segítségével sztringeket is olvashatunk be. Ebben az esetben nem használjuk az & operátort.
<syntaxhighlight lang="c">
char sz[30];
scanf("%s", sz);
</syntaxhighlight>
A scanf egy hasznos lehetősége, hogy az adatok szűrését is lehetővé teszi. Az előbbi deklaráció szerinti sz változó értéke csak számjegy, vagy hexadecimális jegy lehet, akkor azt a következő szűréssel valósíthatjuk meg:
<syntaxhighlight lang="c">
scanf("%[0-9a-fA-F]", sz);
</syntaxhighlight>
A komplementer halmaz megadására is van módunk:
<syntaxhighlight lang="c">
scanf("%[^0-9]", sz);
</syntaxhighlight>
Ezzel a szűréssel csak betűk kerülhetnek a sztringbe.
 
== Iterációk ==
Mint minden magas szintű programozási nyelvben, a C-ben is vannak olyan utasítások, melyek egy feltételtől függően többször is végrehajtják ugyanazt az utasítást, vagy utasítás blokkot. A következőkben ahol utasítást írunk helyettesíthető utasításblokkal is. Utasításblokk:<br />
{<br />
utasítás1;<br />
354 ⟶ 481 sor:
}<br />
<br />
11., 12., 13. feladat<br />
 
<br />
== Szelekciók ==
<br />
'''2.8 Szelekciók'''<br />
A C nyelvben három elágazás típust használhatunk. Az egyágú (if szerkezet), a kétágú (if-else szerkezet) és a többágú (switch szerkezet)<br />
<br />
428 ⟶ 554 sor:
}<br />
Figyeljük meg, hogy minden választás után használtuk a break-et. A default után nem használtuk, de ha a switch elején van, akkor ott is érdemes odafigyelni rá.<br />
14., 15., 16., 17., 18., 20. feladat<br />
 
<br />
== Tömbök ==
<br />
'''2.9 Tömbök'''<br />
Az eddigiek során olyan változókat használtunk csak, melyek egy érték tárolására voltak alakalmasak. Gyakran van azonban szükségünk arra, hogy ugyanazzal a változónévvel több értékre is tudjunk hivatkozni. Ebben az esetben haszáljuk a tömböket. (Egy osztály minden tanulójához hozzárendeljük a magasságát, ilyenkor nyilván érdemes változónévként az osztály azonosítóját használni, a tanulókra pedig a napló sorszámával)<br />
<br />
571 ⟶ 696 sor:
}<br />
}<br />
27. feladat<br />
 
<br />
'''2.10 == Felhasználó által definiált típusok'''<br />==
Az előző részben említett összetett adattípust tömböknek neveztük, a tömbök minden eleme azonos típusú kell hogy legyen. Gyakran szükségünk van azonban olyan egymással összetartozó elemek tárolására is, melyek nem azonos típusúak, mégis egy egyedre jellemzők. Ezket leggyakrabban adatbázisokban találjuk meg. Gondoljunk itt egy személy kereszt és vezetéknevére, születési idejére, alapfizetésére. Ezek különböző típusú adatok mégis ugyanarra a személyre vonatkoznak.<br />
<br />
611 ⟶ 736 sor:
adatszerkezettel dolgozhatunk. Az adatszerkezet egyes elemeire való hivatkozáskor a struktúra és a tömb hivatkozásokat vegyesen alkalmazzuk.<br />
sz[2].szev=1961;<br />
28. feladat<br />
 
<br />
'''2.11 == Függvények'''<br />==
Függvényeket a következő esetekben szokás írni:<br />
* Ha ugyanazt a tevékenységsorozatot többször is el kell végeznünk ugyanolyan típusú, de más-más értéket fölvevő változókkal.<br />
* Ha a programunkat struktúráltan, jól olvashatóan szeretnénk megírni. Ez nagyon afontosfontos a későbbi módosíthatóság miatt.<br />
* Természetesen az első kettő eset együtt is fennállhat.<br />
A függvény defníció általános alakja:<br />
visszatérési_érték_típus fvnév (típus1 vált1,típus2 vált2,……)<br />
740 ⟶ 865 sor:
<br />
}<br />
A programot vizsgálva adóthat az az ötletünk, hogy a tömb méretét fölösleges volt átadni a függvénynek, azonban ez sajnos nem igaz. A függvény fejében lévő int a[0] ugyanis csak annyit közöl a fordítóval, hogy egy egészeket tartalmazó vektor fog jönni paraméterként.<br />
 
<br />
'''2.12 == Mutatók (Pointerek)'''<br />==
A C programozási nyelvben van egy különös adat típusadattípus: a mutató. Ez egy változónak a memóriabeli címét veheti föl értékül. Definiálás során a mutató típusú változó neve előtt a * jelet kell használnunk. (Ezt nevezik inderektség operátornak is) Egy mutató értéket az & (címe) operátorral kaphat. A pointer által mutatott címet szintén a * operátorral kaphatjuk vissza. Nézzünk erre egy konkrét példát:<br />
int a=3,b, *p; /* a pegy egész típusú változóra mutató pointer */<br />
p=&a; /* p az a címét veszi föl értékként */<br />
1 091 ⟶ 1 216 sor:
}<br />
A főprogramban lévő while ciklussal pozitív számokat olvasunk be, és ezeket fűzzük föl egy dinamikus listába. Látszik, hogy a listában mindig csak a következő elem számára foglalunk helyet a malloc függvénnyel. A lista feltöltése után meghívott list() függvény a fölvett elemeket listázza ki.<br />
35. feladat<br />
 
<br />
== Fájlkezelés ==
'''2.13 File kezelés'''<br />
A C nyelvben azaaz datállományokatadatállományokat tartalmuk alapján két csoportra oszthatjuk, szöveges és bináris állományokra. A szöveges állományok olvasható információt tartalmaznak. Sorokból épülnek fel, minden sor végét a CR/LF karakterpár zárja.A bináris állományok byte-okból felépülő adtahalmazt jelentenek. A szöveges állomány minden esetben földolgozható, mint bináris állomány, de ez fordítva már nem igaz.<br />
Szöveges állományokban is lehet számokat tárolni. Ebben az esetben a számok, mint karakterek fogan tárolódni. Ha például egy négy jegyű számot szöveges állományban tárolunk, akkor négy byte-nyi helyet foglal el, ha azonban egy bináris állományba tesszük le, akkor csak 2 byte kell. (Természetesen csak akkor, ha int típusú volt)<br />
<br />
1 128 ⟶ 1 253 sor:
Ha a file-on elvégeztük a megfelelő műveleteket akkor le kell zárni. Ezt az fclose(fp) függvényhívás valósítja meg. Amennyiben egy filban írási műveletekt is végeztünk lezárás előtt célszerű az fflush(fp) függvényhívás, ez az átmeneti pufferek tartalmát kiírja az állományba, ha még nem történt volna meg.<br />
<br />
""2.13.2 Szöveges állományok''<br />''
Szöveges állományokkal kapcsolatban leggyakrabban alkalmazott függvényeket az alábbi táblázatban foglajuk össze. Minden esetben a<br />
FILE *fp;<br />
1 253 ⟶ 1 378 sor:
Az fread függvény hasonlóképpen paraméterezhető. Eltérés abban van hogy beolvasáskor nyilván a változó címét kell megadni a függvénynek, a másik három paraméter ugyanaz. Természetesen mindkét függvénynek van visszatérési értéke is. Mindkettőnél a sikeresen kiírt illetve beolvasott blokkok számát adja vissza. Ez az érték használható a sikertelen beolvasás illetve kiírás figyelésére. Ha a fenti programban a counter változó értéke nem egyenlő eggyel, akkor az azt jelenti, hogy nem sikerült beolvasni adatot az állományból. Ezeknek a változóknak a megadása nem kötelező, mint a fenti programból is látszik az fwrite függvényt enélkül hívtuk meg.<br />
A progarmban van még egy újdonság, az állományban való pozícionálás. Erre az fseek függvényt használjuk. Paraméterezése: első paraméter a file mutató, második a blokkméret és egy egész szám szorzata (ennyiedik elemre fogunk állni), harmadik pedig azt mutatja meg, hogy mihez viszonytjuk a pozícionálást. SEEK_CUR esetén a pillanatnyi pozícióhoz, SEEK_SET esetén pedig a file elejéhez. Vigyázzunk azonban ennek az alakalmazásával, a sorszámozás most is a nulladik elemtől kezdődik, ennek a SEEK_SET esetén lehet jelentősége. A pillanatnyi pozícióval pedig az a helyzet, hogy amikor egy adat beolvasása megtörtént, akkor a file mutató rögtön eggyel tovább lép, tehát, ha a szomszédos elemre akarunk lépni, akkor természetesen a fseek-ben 0-t kell adnunk a második paraméter helyén .<br />
36., 37., 38. feladat<br />
 
<br />
'''2.14 == A szöveges képernyő kezelése'''<br />==
A Turbo C a képernyőt grafikus és szöveges üzemmódban működtethető. Mindkét üzemmódban nagyon sok függvényt segít változatosabbá tenni a képernyőt ebben a fejezetben a szöveges üzemmód függvényeiről lesz szó.<br />
Ha ezeket a függvényeket ahsználni szeretnénk, akkor a program elején a következő header file-okra lesz szükségünk:<br />
1 432 ⟶ 1 557 sor:
ultoa(lnumber,string,10); Előjel nélküli hosszú egészet alakít sztringgé<br />
<br />
39., 40. feladat<br />
 
<br />
'''2.15 == A grafika programozása'''<br />==
A grafikus függvénycsomagban jól használható függvénxekfüggvények csoportja áll rendelkezésünkre ahhoz, hogy egyszerűbb pixel grafikuspixelgrafikus ábrákat készítsünk. Valójában minden alakzat, amit a képernyőn megjelenítünk, a putpixel függvényre támaszkodik, de a rajzolás megkönnyítése érdekében sok grafikus primitív áll rendelkezésünkre. (egyenes, kör téglalap, ellipszis, ív stb rajzolása) Ha a grafikus függvényeket használni akarjuk, akkor be kell emelni graphics.h header file-t. Grafika programozásánál gyakran használjuk a matematikai függvényeket is, ezért általában az elején hozzátesszük a programhoz a math.h állományt is.<br />
<br />
''2.15.1 Koordináta-rendszer''<br />
1 521 ⟶ 1 646 sor:
s a karakter méretét jelenti, ha 1 akkor 8x8 pixel, 2 esetén 16x16 pixel…<br />
<br />
41., 42., 43., 44., 45., 46. feladat<br />
 
<br />
'''2.16 == Makrók'''<br />==
A makrók a függvény kódjába beépített szövegeket jelentenek a C nyelv esetében. Makrók segítségével egyszerű, gyakran alkalmazott műveleteket oldhatunk meg függvények megírása nélkül. C nyelvi makrókat a #define direktíva után adhatunk meg. Ezt a direktívát használtuk már korábban kostansok létrehozására.<br />
Az így létrehozott konstansok futásidőben már nem változtahatók . A fordítónak az az első dolga, hogy a forrásnyelvi állományt átadja az előfeldolgozónak. Az előfeldolgozó feladata, hogy a #define után talált szövegeket behelyettesítse a forrásprogram azon részébe, ahol hivatkozás történt rájuk. Az előfeldolgozónak lehet, hogy többszö is végig kell menni a listán, mivel a makrók minden további nélkül egymásba ágyazhatók<br />
1 584 ⟶ 1 709 sor:
A kiir() makró bármilyen olyan változónak kiírja az értéket, melynek a neve x-szel kezdődik. A név további részét paraméterként kell átadni.<br />
A szoveg() makró egyszerűen kiírja az átadott szöveget. Figyeljük meg, hogy híváskor nem kell a szöveget idézőjelek közétenni, azt a műveletet a változó neve elé kitett # végzi el.<br />
A szam() makró egy változó nevét és értékét írja ki olyan formátumban, aamilyet a második paramétere előír.<br />
 
<br />
[[Kategória:Programozási nyelvek|C]]