Informatika2-2012/Eloadas01

A MathWikiből
(Változatok közti eltérés)
(A C program formázása)
 
(2 szerkesztő 8 közbeeső változata nincs mutatva)
24. sor: 24. sor:
  
 
A forrás egyszerű szövegfájl .c kiterjesztéssel, mely bármely szövegszerkesztővel szerkeszthető (pl gedit, kate, emacs, vi,...). Például a [http://www.math.bme.hu/~wettl/okt/info2/2012/hello.c hello.c] program kódja a következő:
 
A forrás egyszerű szövegfájl .c kiterjesztéssel, mely bármely szövegszerkesztővel szerkeszthető (pl gedit, kate, emacs, vi,...). Például a [http://www.math.bme.hu/~wettl/okt/info2/2012/hello.c hello.c] program kódja a következő:
<code lang="c">
+
<c>
#include <stdio.h>
+
#include <stdio.h>
int main(void)
+
int main(void) {
{
+
    printf("Hello, World!\n");
    printf("Hello, World!\n");
+
    return 0;
    return 0;
+
}
}
+
</c>
</code>
+
 
Ez kiírja, hogy ,,Hello, World!". Miután elmentettük a programot, fordítsuk le, majd futtassuk:
 
Ez kiírja, hogy ,,Hello, World!". Miután elmentettük a programot, fordítsuk le, majd futtassuk:
 
  $ gcc -W -Wall -o hello hello.c
 
  $ gcc -W -Wall -o hello hello.c
41. sor: 40. sor:
 
A fordítás lépései külön-külön is elvégezhetők:
 
A fordítás lépései külön-külön is elvégezhetők:
  
  gcc -E hello.c >hello.ee    (csak az előfeldolgozó fut le -> standard outputra ír)
+
  gcc -E hello.c >hello.ee    (csak az előfeldolgozó fut le           -> standard outputra ír)
  gcc -S hello.c              (fordít, de az assembler nem   -> hello.s -- assembly kód)
+
  gcc -S hello.c              (fordít, de az assembler nem             -> hello.s -- assembly kód)
  gcc -c hello.c              (fordít, de nem szerkeszt     -> hello.o -- object file)
+
  gcc -c hello.c              (fordít, de nem szerkeszt (nem linkel)  -> hello.o -- object file)
  gcc hello.c                (előfeldolgoz+fordít+szerkeszt -> a.out -- futtatható állomány)
+
  gcc hello.c                (előfeldolgoz+fordít+szerkeszt (linkel)  -> a.out -- futtatható állomány)
  
 
Néhány a megadható számtalan opció közül csak tájékoztatásképp:
 
Néhány a megadható számtalan opció közül csak tájékoztatásképp:
51. sor: 50. sor:
  
 
* ''gcc'': a fordítóprogram neve. A ''GNU C Compiler'' és egyben a ''GNU Compiler Collection'' rövidítése. (Mi az a GNU?)
 
* ''gcc'': a fordítóprogram neve. A ''GNU C Compiler'' és egyben a ''GNU Compiler Collection'' rövidítése. (Mi az a GNU?)
* ''-Wall'': a legfontosabb figyelmeztető üzeneteket (warning) bekapcsolja
+
* ''-W'': a legfontosabb figyelmeztető üzeneteket (warning) bekapcsolja
* ''-W'': még néhány fontos figyelmeztető üzenetet bekapcsol
+
* ''-Wall'': még néhány fontos figyelmeztető üzenetet bekapcsol
 
* ''-s'': a fölösleges részeket (pl. nyomkövetési információk és szimbólumok) eltávolítja kimenetből. Nélküle nagyobb lenne a kimenet.
 
* ''-s'': a fölösleges részeket (pl. nyomkövetési információk és szimbólumok) eltávolítja kimenetből. Nélküle nagyobb lenne a kimenet.
 
* ''-O2'': bekapcsolja a második szintű optimalizálást. (A harmadik szintű esetén már lassabban fordul, és túl nagy lehet a kód. Az első szintű esetén  lassabb lesz a futó program, és esetleg túl nagy is. Vannak egyéb szintek is, például alapból a nulladik szint érvényes. Nem nulla, hanem nagy O betű van a kapcsolóban.)
 
* ''-O2'': bekapcsolja a második szintű optimalizálást. (A harmadik szintű esetén már lassabban fordul, és túl nagy lehet a kód. Az első szintű esetén  lassabb lesz a futó program, és esetleg túl nagy is. Vannak egyéb szintek is, például alapból a nulladik szint érvényes. Nem nulla, hanem nagy O betű van a kapcsolóban.)
58. sor: 57. sor:
 
* ''-o <program>'': a kimeneti futtatható fájl nevét adja meg
 
* ''-o <program>'': a kimeneti futtatható fájl nevét adja meg
 
* ''<program>''.c: bemeneti forrásfájl nevét adja meg
 
* ''<program>''.c: bemeneti forrásfájl nevét adja meg
 
  
 
=== Egy C program elemei ===
 
=== Egy C program elemei ===
65. sor: 63. sor:
  
 
A hello.c programunk kódja meglepően hosszú. Mit jelentenek a sorai? Az
 
A hello.c programunk kódja meglepően hosszú. Mit jelentenek a sorai? Az
 
+
<c>
 
  int main(void)
 
  int main(void)
 
+
</c>
 
vagy
 
vagy
 
+
<c>
 
  int main()
 
  int main()
 
+
</c>
 
vagy  
 
vagy  
 
+
<c>
 
  main()
 
  main()
 
+
</c>
 
sor minden C programban kötelező, minden programban van egy main nevű függvény, és ennek meghívásával indul a program végrehajtása. Ha 0 a visszatérési értéke, akkor a program normálisan lefutott -- ez jelzés a külvilágnak. Ezt jelzi a return 0; parancs. Az
 
sor minden C programban kötelező, minden programban van egy main nevű függvény, és ennek meghívásával indul a program végrehajtása. Ha 0 a visszatérési értéke, akkor a program normálisan lefutott -- ez jelzés a külvilágnak. Ezt jelzi a return 0; parancs. Az
#include <stdio.h>
+
<c>
 +
#include <stdio.h>
 +
</c>
 
sorral azt jelezzük, hogy a ,,standard input-output" függvények valamelyikét használni szeretnénk (itt pl. printf, azaz formázott kiírás).
 
sorral azt jelezzük, hogy a ,,standard input-output" függvények valamelyikét használni szeretnénk (itt pl. printf, azaz formázott kiírás).
  
83. sor: 83. sor:
  
 
A következő programban aritmetikai számítást is végzünk:
 
A következő programban aritmetikai számítást is végzünk:
<code lang="c">
+
<c>
#include <stdio.h>
+
#include <stdio.h>
int main(void)
+
int main(void) {
{
+
    int n;
    int n;
+
    n = 5;
    n = 5;
+
    printf("az eredmeny: %d\n", 3*n + 1);
    printf("az eredmeny: %d\n", 3*n + 1);
+
    return 0;
    return 0;
+
}
}
+
</c>
</code>
+
 
+
 
Itt változót deklarálunk, azaz megadtuk típusát (lehet pl. int, float, double, char, void,....), majd értéket adunk neki. Ez egy sorban is elvégezhető:
 
Itt változót deklarálunk, azaz megadtuk típusát (lehet pl. int, float, double, char, void,....), majd értéket adunk neki. Ez egy sorban is elvégezhető:
  int n = 5;
+
<c>
 +
    int n = 5;
 +
</c>
 
A kiírásban az idézőjelbe tett szöveg mellett a kiírandó kifejezés értékének formátumát is megadjuk: %d az egész számok kiírását jelenti.
 
A kiírásban az idézőjelbe tett szöveg mellett a kiírandó kifejezés értékének formátumát is megadjuk: %d az egész számok kiírását jelenti.
 
Következzen a standard bemenet egyszerű használata, olvassunk be az 'a' és 'b' nevű változóba egy-egy egész számot, és ezzel számoljunk (kód: [http://www.math.bme.hu/~wettl/okt/info2/2012/muveletek.c muveletek.c]). A műveletek: összeadás (+), kivonás (-), szorzás (*), egész osztás (/), maradékképzés (%), bitenkénti és (&), bitenkénti vagy (|), logikai és (&&), logikai vagy (||), ahol 0 a hamis, minden más igaz.
 
Következzen a standard bemenet egyszerű használata, olvassunk be az 'a' és 'b' nevű változóba egy-egy egész számot, és ezzel számoljunk (kód: [http://www.math.bme.hu/~wettl/okt/info2/2012/muveletek.c muveletek.c]). A műveletek: összeadás (+), kivonás (-), szorzás (*), egész osztás (/), maradékképzés (%), bitenkénti és (&), bitenkénti vagy (|), logikai és (&&), logikai vagy (||), ahol 0 a hamis, minden más igaz.
<code lang="c">
+
<c>
#include <stdio.h>
+
#include <stdio.h>
 
   
 
   
int main(void)
+
int main(void) {
{
+
    int a,b;
    int a,b;
+
 
   
 
   
    printf("kerek egy pozitiv szamot: ");
+
    printf("kerek egy pozitiv szamot: ");
    scanf("%d", &a);
+
    scanf("%d", &a);
    printf("kerek meg egy pozitiv szamot: ");
+
    printf("kerek meg egy pozitiv szamot: ");
    scanf("%d", &b);
+
    scanf("%d", &b);
 
   
 
   
    printf("a ket szam osszege: %d\n", a+b);
+
    printf("a ket szam osszege: %d\n", a+b);
    printf("a ket szam kulonbsege: %d\n", a-b);
+
    printf("a ket szam kulonbsege: %d\n", a-b);
    printf("a ket szam szorzata: %d\n", a*b);
+
    printf("a ket szam szorzata: %d\n", a*b);
    printf("a ket szam egesz hanyadosa: %d\n", a/b);
+
    printf("a ket szam egesz hanyadosa: %d\n", a/b);
    printf("az osztasi maradek: %d\n", a%b);
+
    printf("az osztasi maradek: %d\n", a%b);
    printf("a ket szam lebegopontos hanyadosa:%f\n", (float)a/b);
+
    printf("a ket szam lebegopontos hanyadosa:%f\n", (float)a/b);
    printf("bitenkenti ES %d\n" ,a&b);
+
    printf("bitenkenti ES %d\n" ,a&b);
    printf("bitenkenti VAGY %d\n", a|b);
+
    printf("bitenkenti VAGY %d\n", a|b);
    printf("logikai ES %d\n" ,a&&b);
+
    printf("logikai ES %d\n" ,a&&b);
    printf("logikai VAGY %d\n", a||b);
+
    printf("logikai VAGY %d\n", a||b);
 
   
 
   
    return 0;
+
    return 0;
}
+
}
</code>
+
</c>
 
A beolvasásnál nem 'a', hanem '&a' szerepel, ami az 'a' változó fizikai címét jelenti, erre később visszatérünk.
 
A beolvasásnál nem 'a', hanem '&a' szerepel, ami az 'a' változó fizikai címét jelenti, erre később visszatérünk.
  
129. sor: 128. sor:
  
 
És akkor következzen egy program, amiről nem is tudjuk, hogy véges időben leáll-e minden bemenetre, a Collatz-probléma [http://www.math.bme.hu/~wettl/okt/info2/2012/collatz.c collatz.c]:
 
És akkor következzen egy program, amiről nem is tudjuk, hogy véges időben leáll-e minden bemenetre, a Collatz-probléma [http://www.math.bme.hu/~wettl/okt/info2/2012/collatz.c collatz.c]:
<code lang="c">
+
<c>
#include <stdio.h>
+
#include <stdio.h>
int main(void)
+
int main(void) {
{
+
    int x;
    int x;
+
    printf("legyen x = ");
    printf("legyen x = ");
+
    scanf("%d", &x);
    scanf("%d", &x);
+
    while (x>1)  
    while (x>1)  
+
    {
    {
+
        if (x % 2)
        if (x % 2)
+
            x = 3*x + 1;
            x = 3*x + 1;
+
        else
        else
+
            x /= 2;
            x /= 2;
+
        printf("%d ", x);
        printf("%d ", x);
+
    }
    }
+
    printf("\n");
    printf("\n");
+
    return 0;
    return 0;
+
}
}
+
</c>
</code>
+
 
+
 
Ebben szerepel egy elöl tesztelős while ciklus és egy elágazás!
 
Ebben szerepel egy elöl tesztelős while ciklus és egy elágazás!
  
 
Felsoroljuk a C vezérlőstruktúráit, hogy mindjárt egyszerűbb programokat írhassunk:
 
Felsoroljuk a C vezérlőstruktúráit, hogy mindjárt egyszerűbb programokat írhassunk:
 
* if és if-else:
 
* if és if-else:
if (feltétel)  
+
<c>
{
+
if (feltétel) {
    ...
+
    ...
}
+
}
 +
</c>
 
vagy
 
vagy
if (feltétel)  
+
<c>
{
+
if (feltétel) {
    ...
+
    ...
}  
+
}
else  
+
else {
{
+
    ...
    ...
+
}
}
+
</c>
 +
vagy több feltétel esetén (itt is elhagyható az utolsó "else" ág)
 +
<c>
 +
if (feltétel1) {
 +
    ...
 +
}  
 +
else if (feltétel2) {
 +
    ...
 +
}
 +
...
 +
else if (feltételN) {
 +
    ...
 +
}
 +
else {
 +
    ...
 +
}
 +
</c>
 
* while-ciklusok:
 
* while-ciklusok:
 
** hátultesztelős
 
** hátultesztelős
do
+
<c>
{
+
do {
    ...
+
    ...
} while (feltétel);
+
} while (feltétel);
 +
</c>
 
** elöltesztelős
 
** elöltesztelős
while (feltétel)  
+
<c>
{
+
while (feltétel) {
    ...
+
    ...
}
+
}
 +
</c>
 
* for-ciklus:
 
* for-ciklus:
for (inicializálás; feltétel; végén)
+
<c>
{
+
for (inicializálás; feltétel; végén) {
    ...
+
    ...
}
+
}
 +
</c>
 
A for ciklus az ''inicializálás''-ban megadott parancsokat végrehajtja, majd minden ciklus elején ellenőrzi a ''feltétel''-t, és kilép, ha az hamis, végül minden ciklus végén végrehajtja a ''végén'' utasításait. Például
 
A for ciklus az ''inicializálás''-ban megadott parancsokat végrehajtja, majd minden ciklus elején ellenőrzi a ''feltétel''-t, és kilép, ha az hamis, végül minden ciklus végén végrehajtja a ''végén'' utasításait. Például
int i;
+
<c>
for (i=1; i<6; i++)
+
int i;
{
+
for (i=1; i<6; i++) {
    printf("%d ", i^2);
+
    printf("%d ", i^2);
}
+
}
 +
</c>
 
kiírja 1-től 5-ig a számok négyzeteit.
 
kiírja 1-től 5-ig a számok négyzeteit.
  
199. sor: 217. sor:
  
 
További segítséget jelentenek a megjegyzések, ezeket /* és */ közé kell zárni, egy szokásos alkalmazásuk:
 
További segítséget jelentenek a megjegyzések, ezeket /* és */ közé kell zárni, egy szokásos alkalmazásuk:
 +
<c>
 
  /* megjegyzés
 
  /* megjegyzés
 
   * megjegyzés
 
   * megjegyzés
 
   * megjegyzés
 
   * megjegyzés
 
   */
 
   */
 +
</c>
 
Egy másik elterjedt szabvány szerint // után írva adhatjuk meg a megjegyzést, mely a sor végéig tart.
 
Egy másik elterjedt szabvány szerint // után írva adhatjuk meg a megjegyzést, mely a sor végéig tart.
  
209. sor: 229. sor:
  
 
A kódban van némi lazaságra lehetőség, pl. nem kiírni main típusát, mert az úgyis kötelezően int, vagy nem visszaadni a 0 értéket, de ezekkel legyünk óvatosak.
 
A kódban van némi lazaságra lehetőség, pl. nem kiírni main típusát, mert az úgyis kötelezően int, vagy nem visszaadni a 0 értéket, de ezekkel legyünk óvatosak.
<code lang="c">
+
<c>
#include <stdio.h>
+
#include <stdio.h>
main()
+
main() {
{
+
    printf("Hello, World!\n");
    printf("Hello, World!\n");
+
}
}
+
</c>
</code>
+
 
A behúzás sem része a szintaktikának, a kód folyamatosan is írható, vagy más logika szerint tördelhető, de ezt sose tegyük:
 
A behúzás sem része a szintaktikának, a kód folyamatosan is írható, vagy más logika szerint tördelhető, de ezt sose tegyük:
<code lang="c">
+
<c>
#include <stdio.h>
+
#include <stdio.h>
int main(){printf("Hello, World!\n");return(0);}
+
int main(){printf("Hello, World!\n");return(0);}
</code>
+
</c>
 
+
 
Egy szándékosan elrettentő példa [http://www.math.bme.hu/~wettl/okt/info2/2012/mistery.c mistery.c]
 
Egy szándékosan elrettentő példa [http://www.math.bme.hu/~wettl/okt/info2/2012/mistery.c mistery.c]
<code lang="c">
+
<c>
#include <stdio.h>
+
#include <stdio.h>
 
   
 
   
main(t,_,a)
+
main(t,_,a)
char *a;
+
char *a;
{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
+
{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a
+
main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a
)&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_,
+
)&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_,
t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\
+
t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\
,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\
+
,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\
+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\
+
+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\
l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\
+
l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\
n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
+
n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\
+
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\
#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
+
#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\
+
:t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\
+1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc \
+
+1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc \
i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
+
i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
</code>
+
</c>
 
+
 
+
=== Algoritmus átalakítása strukturált programmá ===
+
 
+
Számítsuk ki 2 négyzetgyökét a 4 alapművelet segítségével, valamely iterációval.
+

A lap jelenlegi, 2012. február 8., 19:17-kori változata

Tartalomjegyzék

A C nyelv alapjai

A C nyelv tulajdonságai

A C általános célú magas szintű nyelv (valójában a magasszintű és az alacsonyszintű nyelvek között helyezkedik el), melyet a Unix operációs rendszerhez Dennis Ritchie fejlesztett ki. 1989-ban szabványosítva lett: ANSI C (American National Standards Institute).

  • Strukturált nyelv
  • Szabványos könyvtári függvények
  • Hordozható (a C kód számtalan gépen lefordítható és futtatható)
  • Hatékony programok írására alkalmas (a magas szintű nyelvek közül a leghatékonyabbak egyike)
  • Egyszerű nyelv, tömör szintaktika
  • Előfeldolgozó (makroprocesszor)

A nyelv gyengéi: könnyű nehezen olvasható kódot írni, nehéz a hibák megtalálása, nincs automatikus memóriakezelés, tömbből kiírás veszélye,...


Matematikusként miért tanulunk C-t?

  • A C nyelv több programnyelv alapja (C++, C#, Java,...)
  • Más programnyelven írt kódok hatékonnyá tehetők, ha a legtöbb gépidőt használó függvényeket C-ben újra írjuk. Kritikusan sok gépidőt igénylő algoritmusoknál segíthet.


Egy C program futtatása

A forrás egyszerű szövegfájl .c kiterjesztéssel, mely bármely szövegszerkesztővel szerkeszthető (pl gedit, kate, emacs, vi,...). Például a hello.c program kódja a következő:

#include <stdio.h>
int main(void) {
    printf("Hello, World!\n");
    return 0;
}

Ez kiírja, hogy ,,Hello, World!". Miután elmentettük a programot, fordítsuk le, majd futtassuk:

$ gcc -W -Wall -o hello hello.c
$ hello
Hello, World!
$ 

Elhagyható a -o kapcsoló, ekkor egy a.out nevű fájl lesz a futtatható program, a -W és a -Wall több figyelmeztető hibaüzeneteket ír ki, ami segíthet a hibák megtalálásában.

A fordítás lépései külön-külön is elvégezhetők:

gcc -E hello.c >hello.ee    (csak az előfeldolgozó fut le            -> standard outputra ír)
gcc -S hello.c              (fordít, de az assembler nem             -> hello.s -- assembly kód)
gcc -c hello.c              (fordít, de nem szerkeszt (nem linkel)   -> hello.o -- object file)
gcc hello.c                 (előfeldolgoz+fordít+szerkeszt (linkel)  -> a.out -- futtatható állomány)

Néhány a megadható számtalan opció közül csak tájékoztatásképp:

$ gcc -W -Wall -s -O2 -lm -o <program> <program>.c
  • gcc: a fordítóprogram neve. A GNU C Compiler és egyben a GNU Compiler Collection rövidítése. (Mi az a GNU?)
  • -W: a legfontosabb figyelmeztető üzeneteket (warning) bekapcsolja
  • -Wall: még néhány fontos figyelmeztető üzenetet bekapcsol
  • -s: a fölösleges részeket (pl. nyomkövetési információk és szimbólumok) eltávolítja kimenetből. Nélküle nagyobb lenne a kimenet.
  • -O2: bekapcsolja a második szintű optimalizálást. (A harmadik szintű esetén már lassabban fordul, és túl nagy lehet a kód. Az első szintű esetén lassabb lesz a futó program, és esetleg túl nagy is. Vannak egyéb szintek is, például alapból a nulladik szint érvényes. Nem nulla, hanem nagy O betű van a kapcsolóban.)
  • -lm: a matematikai függvényeket (pl. sqrt és cos) tartalmazó matematikai függvénykönyvtárat teszi elérhetőve. Emellett a forráskódban szerepelnie kell még az #include <math.h>-nak is a matematikai függvényekhez. Nem egyes, hanem kis l betű van a kapcsolóban.
  • -o <program>: a kimeneti futtatható fájl nevét adja meg
  • <program>.c: bemeneti forrásfájl nevét adja meg

Egy C program elemei

Függvények

A hello.c programunk kódja meglepően hosszú. Mit jelentenek a sorai? Az

 int main(void)

vagy

 int main()

vagy

 main()

sor minden C programban kötelező, minden programban van egy main nevű függvény, és ennek meghívásával indul a program végrehajtása. Ha 0 a visszatérési értéke, akkor a program normálisan lefutott -- ez jelzés a külvilágnak. Ezt jelzi a return 0; parancs. Az

#include <stdio.h>

sorral azt jelezzük, hogy a ,,standard input-output" függvények valamelyikét használni szeretnénk (itt pl. printf, azaz formázott kiírás).

Változók és típusaik

A következő programban aritmetikai számítást is végzünk:

#include <stdio.h>
int main(void) {
    int n;
    n = 5;
    printf("az eredmeny: %d\n", 3*n + 1);
    return 0;
}

Itt változót deklarálunk, azaz megadtuk típusát (lehet pl. int, float, double, char, void,....), majd értéket adunk neki. Ez egy sorban is elvégezhető:

    int n = 5;

A kiírásban az idézőjelbe tett szöveg mellett a kiírandó kifejezés értékének formátumát is megadjuk: %d az egész számok kiírását jelenti. Következzen a standard bemenet egyszerű használata, olvassunk be az 'a' és 'b' nevű változóba egy-egy egész számot, és ezzel számoljunk (kód: muveletek.c). A műveletek: összeadás (+), kivonás (-), szorzás (*), egész osztás (/), maradékképzés (%), bitenkénti és (&), bitenkénti vagy (|), logikai és (&&), logikai vagy (||), ahol 0 a hamis, minden más igaz.

#include <stdio.h>
 
int main(void) {
    int a,b;
 
    printf("kerek egy pozitiv szamot: ");
    scanf("%d", &a);
    printf("kerek meg egy pozitiv szamot: ");
    scanf("%d", &b);
 
    printf("a ket szam osszege: %d\n", a+b);
    printf("a ket szam kulonbsege: %d\n", a-b);
    printf("a ket szam szorzata: %d\n", a*b);
    printf("a ket szam egesz hanyadosa: %d\n", a/b);
    printf("az osztasi maradek: %d\n", a%b);
    printf("a ket szam lebegopontos hanyadosa:%f\n", (float)a/b);
    printf("bitenkenti ES %d\n" ,a&b);
    printf("bitenkenti VAGY %d\n", a|b);
    printf("logikai ES %d\n" ,a&&b);
    printf("logikai VAGY %d\n", a||b);
 
    return 0;
}

A beolvasásnál nem 'a', hanem '&a' szerepel, ami az 'a' változó fizikai címét jelenti, erre később visszatérünk.

Vezérlő struktúrák

És akkor következzen egy program, amiről nem is tudjuk, hogy véges időben leáll-e minden bemenetre, a Collatz-probléma collatz.c:

#include <stdio.h>
int main(void) {
    int x;
    printf("legyen x = ");
    scanf("%d", &x);
    while (x>1) 
    {
        if (x % 2)
            x = 3*x + 1;
        else
            x /= 2;
        printf("%d ", x);
    }
    printf("\n");
    return 0;
}

Ebben szerepel egy elöl tesztelős while ciklus és egy elágazás!

Felsoroljuk a C vezérlőstruktúráit, hogy mindjárt egyszerűbb programokat írhassunk:

  • if és if-else:
if (feltétel) {
    ...
}

vagy

if (feltétel) {
    ...
} 
else {
    ...
}

vagy több feltétel esetén (itt is elhagyható az utolsó "else" ág)

if (feltétel1) {
    ...
} 
else if (feltétel2) {
    ...
}
...
else if (feltételN) {
    ...
}
else {
    ...
}
  • while-ciklusok:
    • hátultesztelős
do {
    ...
} while (feltétel);
    • elöltesztelős
while (feltétel) {
    ...
}
  • for-ciklus:
for (inicializálás; feltétel; végén) {
    ...
}

A for ciklus az inicializálás-ban megadott parancsokat végrehajtja, majd minden ciklus elején ellenőrzi a feltétel-t, és kilép, ha az hamis, végül minden ciklus végén végrehajtja a végén utasításait. Például

int i;
for (i=1; i<6; i++) {
    printf("%d ", i^2);
}

kiírja 1-től 5-ig a számok négyzeteit.

A C program formázása

A sor elején levő szóközök számára vonatkozó beljebb kezdési szabály (sokféle változata lehetséges, itt csak a tárgy keretében használatosat értelmezzük):

  • Beljebb kezdésre csak szóközöket használjunk, tabulátort nem.
  • A nyitó és a záró kapcsost is írjuk külön sorba, és azonos oszlopban legyenek. (Ha esetleg a nyitó kapcsos a sor végére kerülne, a záró kapcsos elé pontosan annyi szóköz kerüljön, ahány szóköz volt a hozzá tartozó nyitó kapcsos zárójelet tartalmazó sor elején.)
  • Minden egyéb sor elején pontosan négyszer (esetleg pontosan kétszer) annyi szóköz van, ahány (bezáratlan) kapcsos zárójelen belül van az adott sor.

További segítséget jelentenek a megjegyzések, ezeket /* és */ közé kell zárni, egy szokásos alkalmazásuk:

 /* megjegyzés
  * megjegyzés
  * megjegyzés
  */

Egy másik elterjedt szabvány szerint // után írva adhatjuk meg a megjegyzést, mely a sor végéig tart.

A C programok olvashatóvá tétele sokat segít a kód későbbi megértésében, erre vonatkozó tanácsokat érdemes betartani. Egy ilyen leírás pl. itt található: http://www.gidnetwork.com/b-38.html Érdemes lesz később is visszatérni rá, és követni.

A kódban van némi lazaságra lehetőség, pl. nem kiírni main típusát, mert az úgyis kötelezően int, vagy nem visszaadni a 0 értéket, de ezekkel legyünk óvatosak.

#include <stdio.h>
main() {
    printf("Hello, World!\n");
}

A behúzás sem része a szintaktikának, a kód folyamatosan is írható, vagy más logika szerint tördelhető, de ezt sose tegyük:

#include <stdio.h>
int main(){printf("Hello, World!\n");return(0);}

Egy szándékosan elrettentő példa mistery.c

#include <stdio.h>
 
main(t,_,a)
char *a;
{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a
)&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_,
t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\
,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\
+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\
l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\
n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\
#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\
+1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc \
i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
Személyes eszközök