HTML

Proghelp

Programozási tutorial-ok és feladat kidolgozások főleg Debreceni Egyetem Mérnök Informatikus hallgatóinak számára!

Friss topikok

Linkblog

C gyors talpaló I. lecke

szimih 2011.02.14. 18:04

Végre elkészült az első anyag a gyorstalpalóból. Mivel sokan nem nagyon találkoztatok a C-vel ( tudomásom szerint ) a legalapabbaktól indulunk.

Legeslegelső C programunk:

int main()
{
    return 0;
    }


A C nyelv függvények halmaza. Maga a főprogram is (main()) egy függvény. A függvénynek tetszőleges számú bemenő paramétere lehet, visszatérési értéke viszont csak egy. Bemeneti paraméterei most nincsenek későbbiekben tárgyaljuk.
Esetünkben a main-nak van visszatérési értéke mely tájékoztatja az OS-t hogy rendben lefutott-e ( return 0 ) vagy hiba történt ( return -1; ). Későbbiekben függvényekről és eljárásokról bővebben, most fogadd el hogy egy alap C program így épül fel.


Első C programunk:

#include <stdio.h>

int main()
{
    printf("Hello IK-MI10'!\n");   
   
   return 0;
    }

Futtatás után megjelenik a képernyőn egy kiírás (Hello IK-MI10'!). Alap "függvény" felépítése nem változott.
Megjelent az #include <stdio.h>. C-ben a különböző beépített, gyári függvények csoportosítva vannak úgynevezett 'header' fájlokban, melyeket használatuk előtt meg kell hívnunk (include-álnunk kell).
Most mi az stdio.h-t hívtuk meg ami annyit tesz Standard Input Output függvények találhatóak, ebben található a printf kiíratáshoz használt függvényünk. Ebben a header-ben még számos későbbiekben használatos függvény megtalálható. (pl.: scanf, fopen,...)
(Sokat használt headerek még math.h matematikai függvények, stdlib.h véletlen szám generátor, és sorolhatnám de mindent a maga idejében.)

A printf()-ben a kiírandó szöveget dupla idézőjelek közé kell tennünk. Amint látjuk a \n nem került kiírásra, vajon miért? Válasz igen egyszerű a \n sortörést hajt végre.

\n mintájára használhatóak még az alábbi formázások:
\t tabulátor
\r kocsi vissza
\f soremelés
\v függőleges tabulátor


Második programunk, avagy változó nélkül nincs élet:

#include <stdio.h>

int main()
{
    int a = 5;
   
   printf("a valtozo erteke: %d \n",a);   
   
   return 0;
    }

Na itt már több minden van. C-ben a változót, változó típusa ( lentebb milyenek vannak ) majd utána a változó neve
( ,-vel elválasztva többet is deklarálhatunk egyszerre). További előnye a c-nek, hogy a változónak kezdőértéket is adhatunk a deklarációnál.
Következő sorban kiíratjuk, hogy: 'a valtozo erteke: 5'. 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.

Kiíratáshoz szükséges:

%d decimális egész
%u előjel nélküli decimális egész
%f lebegőpontos
%lf hosszú lebegőpontos
%c karakter
%s sztirng vagy karakter tömb

További paraméterezéshez:
printf(”…%5.2f”,f);
Az f valós változót 5 mezőre írja ki 2 tizedes pontosságga

C típusai:

Adattípus         Értékkészlet  Méret (byte)  Pontosság(jegy)
char                -128..127          1   
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

Harmadik programunk:

int main()
{
    int a = 5;
   
   a+=15;
   
   printf("a valtozo erteke: %d \n",a);   
   
   return 0;
    }

Változóink értékét menetközbe változtatni kell erre a C sokkal rövidebb formákat ( lusta programozó ne gépel feleslegesen ugye ). a+=15 annyit tesz a = a + 15 az a értéke 20 lesz, amit kiíratunk.

Hagyományos forma          Tömör forma
a=a+b                         a+=b
a=a-b                         a-=b
a=a*b                         a*=b
a=a/b                         a/=b   
a=a%b                         a%=b   //maradékos osztás pascalban mod volt
a=a<<b                        a<<=b   // bitek eltolása b hosszan balra
a=a>>b                        a>>=b   // bitek eltolása b hosszan jobbra
a=a&b                         a&=b   // a és b
a=a|b                         a|=b   // a vagy b
a=a^b                         a^=b   // a kizáró vagy b

Amennyiben változónk értékét csak 1-el szeretnék növelni/csökkenteni C erre is kínál megoldást. a++ az a értékét növeli egyel, a-- az a értékét csökkenti 1-el. ++a egyenlő a a++ és --a is a-- viszont kettő között különbség hogy amikor elől van a(z) ++/-- előbb növeljük a változó értékét majd végrehajtjuk a további műveleteket.
Pl.

#include <stdio.h>

int main()
{
    int a = 5, b,c;
   
   b = ++a;
   c = a++;
   
   printf("a valtozo erteke: %d, b valtozo erteke: %d, c valtozo erteke: %d\n",a,b,c);   
   
   return 0;
    }

Eme példából látható a különbség a két növelés között. ( Csökkentésnél is ugyan így működik )

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. & operátor a változónak a címe.

int main()
{
   int a , *p;
   p = &a
   *p = 5
   printf("a valtozo erteke: %d \n",a); 
   return 0;
}

Ebben a példában a p 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.
*p = 5 egyenértékű az a=5 értékadással. Későbbiekben jobban belemászunk a pointerekbe mert hasznos dolog és mert szükségünk is lesz rájuk elég sokszor.

Ne csak kiírni tudjunk kérjünk be változó értékeit!:
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ő:
scanf(formátum, argumentumlista)
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.

int a ;
   char c;
   printf(”Kérek egy egész számot és egy betűt”);
   scanf(”%d%c”,&a,&b)

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. 

int a ;
   char c;
   printf(”Kérek egy egész számot és egy betűt vesszővel elválasztva”);
   scanf(”%d,%c”,&a,&c);

 

 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.

char sz[30];
   scanf(”%s”,sz);

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:

scanf(”%[0-9a-fA-F]”,sz)

A komplementer halmaz megadására is van módunk:

scanf(”%[^0-9]”,sz)

Ezzel a szűréssel csak betűk kerülhetnek a sztringbe.

Példaprogramunk:

#include <stdio.h>

int main()
{
   int a,b;
   
   printf("Kerek két számot vesszővel elválasztva: ");
   scanf("%d,%d",&a,&b);

   printf("Ket bekert szám osszege: %d",a + b);   
   
   return 0;
}

Szólj hozzá!

A bejegyzés trackback címe:

https://proghelp.blog.hu/api/trackback/id/tr332773684

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása