Programozás alapjai gyakorlat 2014-2015/1

3. gyakorlat


    C alapok

GCC Windows-ra: Code::Blocks , Cygwin

ASCII kódtábla

C könyvtár-referencia

Gyakorlaton bemutatott könyv itt és egy újabb kiadás itt


    Első lépések

Kommentek:

//  Ez egy egysoros komment, ami itt van az nem fog látszani a programban
/*
    Ez egy többsoros komment, ez sem fog látszani a programban
*/

Main - fő függvény

/*
    MAIN függvény, ez a függvény fog lefutni először
*/
int main(){
	return 0;    // a main függvény visszatérési értéke: Op. rendszer felé: Nincs hiba
	/* return 1;    // a main függvény visszatérési értéke: Op. rendszer felé: Valami hiba történt */
}

Input - Output használata

/*
    A ki- és bevitel használatához szükségünk van az alábbi sorra.
*/
#include <stdio.h>  
/*
    Ezek után használhatjuk a scanf és printf I/O függvényeket
    Az input-output használatához meg kell mondani a fordítónak, hogy szeretnénk használni az ezzel kapcsolatos függvényeket.
*/

Matematikai könyvtár

/*
    Matematikai könvvtár: ha szeretnénk a beépített matematikai függvényeket, konstansokat használni. pl.: négyzetre emelés, négyzetgyök, pí,...
*/
#include <math.h>

Fordítás és futtatás

Fordítás és futtatás Linux alatt (terminalban):
    $ gcc -o prog progalap.c	// fordítás
    $ ./prog			// futtatás
	
Object fájl készítése:
    $ gcc -c -o progalap.o progalap.c
    $ gcc -o progalap progalap.o
	
Warning-ok kiíratása fordítás után:
    $ gcc -Wall -o hello helloworld.c


    Szekvenciák

    Minden utasítást pontosvessző (";") zár.

    Ha nem teszünk pontos vesszőt, akkor kifejezésről beszélünk.

    Kifejezés - egy (önmagában még nem végrehajtható) elemi művelet. pl.: 3 + 5

    Utasítások sorozatát szekvenciának nevezzük.

Példa:

main() {
    3 + 5	// kifejezés
    3 + 5;	// utasítás
}

Feladat: Csinálj utasítást a következő értékekből/értékeketet kiszámító kifejezésekből:

- Egy év napjainak száma.
- Mikor született az, aki most 18 éves?
- Átlagban hány órát kell hetente otthon a progalap gyakorlásával tölteni a szorgalmi időszakban, ha egy kredit (a teljes félév során elvégzett) 30 munkaórát jelent, a félév 20 hétből áll, és ebbe a kreditszámba az órai munka is beleszámít? 


    Változók használata

Változók deklarációja - Deklaráció: elemek létrehozása

void main(){

    // void - Ez egy adatot tárolni képtelen típus, többek között eljárásokhoz használatos
    int egesz;  // Egy egyszavas (esetünkben 32 bites - 4 bájtos) előjeles egész szám
                // Műveletek: +, -, *, /, %, ahol a / az egészosztás egészrésze, a % az egészosztás maradéka
    char karakter;  // Egy egybájtos, előjeles, vagy előjeltelen egész szám. Jól használható szöveges karakterek tárolására is, ascii-kód segítségével.
    float valos1;   // Egy egyszavas lebegőpontos szám
                    // Műveletek: +, -, *, /
    double valos2;  // Annyiban különbözik a float-tól, hogy 8 bájtos
    // Logikai és szöveges típus külön nincs, azokat máshogy kell megvalósítani. (Későbbi gyakorlaton)
}

Változók definiálása - Definíció: a tényleges értékadás

void main(){

    int egesz = 2014;
    char karakter = 'A'; // Karakterek megadásakor (és mint később látjuk, szövegekben is) használhatunk escape-szekvenciákat, pl.: \" - idézőjel, \' - aposztróf, \t - tabulátor, \n - soremelés (új sor), \r - kocsi-vissza
    float valos1 = 3.14;
    double valos2 = 3.1415916;
}

Feladat: fordítsuk le az alábbit -Wall kapcsolóval! Milyen hibákat kapunk? Javítsuk őket!

#include <stdio.h> 

main() {
    printf("Hello Világ!\n");
}

Feladat: Futtassuk le az alábbi parancsokat a fenti, javított "Hello World" programon! Mi lett az eredmény és miért? Hogyan tudnánk felcserélni a 2. és 3. parancs eredményét?

$ ./hello ; ./hello
$ ./hello && ./hello
$ ./hello || ./hello


    Blokkok

Blokknak nevezünk két kapcsos zárójel - { } - közé zárt programrészt.

Egy blokkon belül minden változónév csak egyszer használható, egy blokkon belül létrehozott változók csak az adott blokkban használhatók.

void main(){

    int szam1;
    {
        int szam2 = 2;
    }
    {
        int szam3 = 3;
        //int szam4 = szam1 + szam2 + szam3;  // itt hiba lesz mivel a szam2 nincs deklarálva ebben a blokkban
    }
}
						


    Globális és Lokális változók

Globális változó: blokkon kívül deklarált, mindenhol látszik.

Lokális változó: valamilyen blokkon (függvényen) belül deklarált, csak az adott blokkon belül látszik.

#include <stdio.h>

int global = 0;

int LG(int alpha) {
    int local = 0;
    local += alpha; // local = local + alpha; rövidítése
    global += alpha;

    return local;
}

void main() {
    printf("Lokalis valtozo: %d, Globális változó: %d\n", LG(2), global);
    printf("Lokalis valtozo: %d, Globális változó: %d\n", LG(2), global);
    printf("Lokalis valtozo: %d, Globális változó: %d\n", LG(2), global);
}
						

Feladat: Próbáljuk ki, fordul-e a fenti program, ha a main függvényben megpróbáljuk felhasználni a local változót!

Feladat: Mi történik, ha a global-t csak a fuggveny után deklaráljuk?


Függvényekben és beágyazott blokkokban létrehozhatunk ugyanolyan nevű változót, mint amilyen valamilyen felsőbb szinten már deklarálva van. Ez el fogja rejteni a felsőbb szintű példányt:

#include <stdio.h>

int a = -1;

void fgv() {
    printf("%d\n", a);
}

void main() {
    int a = 0; // ez elrejti a globális a változót
    {
        int a = 1; // ez elrejti az eggyel feljebb lévő a változót
        {
            int a = 2; // ez elrejti az eggyel feljebb lévő a változót
            printf("%d\n", a); // 2
        }
        printf("%d\n", a); // 1
    }
    printf("%d\n", a); // 0

    fgv(); // -1
}

Feladat: Próbáld meg futtatás nélkül megtalálni a hibá(ka)t, majd javítsd (őket)!

int main() {

    int elso;
    elso = 3;
    {
        int masodik;
        elso    = 6
        masodik = 5;
    }
    {
        int harmadik;
        elso    = 9
        masodik = 10;
        harmadik = 8;
    }
    masodik = 15;
    harmadik = 16;
    return 0;
}


    Input/Output alapok

Kiíratás képernyőre:

#include <stdio.h>						

void main(){

    /* Változók deklarálása és definiálása */
    int egesz = 2014;
    char karakter = 'A';
    float valos1 = 3.14;
    double valos2 = 3.1415916;
	
    /* Kiíratás képernyõre */
    printf("Egyszerű szöveg\n");
    printf("Integer érték: %d\n", egesz);
    printf("Karakter: %c\n", karakter);
    printf("Float érték: %f\n", valos1);
    printf("Double érték: %lf\n", valos2);
    printf("%s\n", "Szöveg, mint \"string\"\n");
}
						

Adatok bekérése:

#include <stdio.h>						

void main(){

    int egesz;
    float valos1;
    double valos2;

    /* Adatok bekérése */	
    printf("Adj meg egy egész számot:\n");
    scanf("%d", &egesz);
    printf("Adj meg két valós számot (Üss Enter-t a két szám bevitele között):\n");
    scanf("%f", &valos1);
    scanf("%lf", &valos2);
    printf("\n\n");
}
						

Egy kis érdekesség:

#include <stdio.h>
		
void main(){
    
    // Egész egészként és karakterként
    printf("%d\n",65);
    printf("%c\n\n",65);
    // Valós valósként és egészként
    printf("%f\n",65.5555);
    printf("%d\n\n",65.5555);
    // Karakter karakterként és egészként
    printf("%c\n",'A');
    printf("%d\n",'A');
}
						

Több adat beolvasása egyszerre:

#include <stdio.h>
						
void main(){

    int st, rd;
    char nd, th;

    printf("Beolvasás (egész karakter egész karakter): ");
    scanf("%d%c%d%c", &st, &nd, &rd, &th);
    printf("first = %d; second = '%c'; third = %d; fourth = '%c';\n", st, nd, rd, th);
}
						

Feladat: Írj egy programot amely bekéri a neved, majd a bekérés után kiírja azt a képernyőre! Ezután bekéri a születési dátumod és kiszámítja a korodat, és ezt is kiírja a képernyőre!

Feladat: Alakítsd át a fenti programot úgy, hogy bekérje a vezetékneved, majd a születési dátumod, majd a keresztneved és végül a korodat! A bekért adatokat "logikus sorrendben" írasd ki a képernyőre!



    Függvények

Deklaráció:

típus név( formális_paraméterek );

Definíció:

típus név( formális_paraméterek ) {
    törzs
}

Példa függvények használatára:

#include <stdio.h>
#include <math.h>				

void main(){

    // A main függvény allján lévő függvények hívása
    nullParamVoid();
    nullParamInt();
    printf("%d\n\n", negyzetKerulet(5));
    printf("%d\n\n", teglalapTerulet(3,4));
}

void nullParamVoid(){
    printf("Ez egy paraméter nélküli függvény, amelynek nincs visszatérési értéke.\n\n");
}

int nullParamInt(){
    printf("Ez egy paraméter nélküli függvény, amelynek 1 a visszatérési értéke.\n\n");
    return 1;
}

// Egy egyparaméteres fgv, ami kiszámítja egy négyzet kerületét az oldalhosszból
int negyzetKerulet(int a){
    int kerulet;
    kerulet = 4*a;
    return kerulet;
}

// Egy többparaméteres fgv, ami kiszámítja egy téglalap területét a két oldalhosszból
int teglalapTerulet(int a, int b){
    float terulet;
    terulet = sqrt((a*a)+(b*b));
    return terulet;
}

Feladat: Írj egy függvényt, ami összead két egész értéket, és visszatér az eredménnyel! Írj egy programot is, ami felhasználja ezt!




    Házi feladat

A házi feladatot megoldani nem kötelező és bemutatni sem kell, viszont a következő gyakorlaton visszakérhető (kikérdezés, táblához hívás, stb. formájában)! Ha a hallgató megoldása ötletes, szép kivitelezésű, plusz pont adható. Amennyiben viszont nem tudja megoldani gyakorlaton a házi feladatban szereplő példákat vagy nem tud válaszolni az azzal kapcsolatban feltett kérdésekre, mínusz pont adható. Plusz és mínusz pontból is egyaránt maximum 10 pontot gyűjthet össze egy-egy hallgató.

Házi feladat letöltése .

További gyakorló feladatok letöltése . Programok a gyakorló példákhoz: kifejezes.c .

Még több gyakorló feladat letöltése . Programok a gyakorló példákhoz: globals.c , muvint.c , muvreal.c .

Elgondolkodtató feladatok letöltése .

Még több feladat található a PUB-ban ( /n/pub/ProgramozasAlapjai/Gyakorlat/gyak03 ).




    Jövő héten 1. miniZH! (2014.09.22.)

Téma:

  Linux alapok: 1. és 2. gyakorlat anyaga.

  Gyakorlásra:

    A honlapomon az 1. és 2. gyakorlathoz tartozó anyag, magyarázatokkal, példákkal.

    A gyakorlatok végén lévő házi feladat és gyakorló feladatok megoldása.

    A honlapom mellet további feladatok találhatóak a PUB-ban. (/n/pub/ProgramozasAlapjai/Gyakorlat/ - erős átfedés van az "itt" és "ott" található feladatok között).

Egyéb infó:

  A gyakorlat 8:10-kor kezdődik és a ZH-t 8:15-kor kezdhetitek írni. Előreláthatóan 30 percetek lesz a feladatok megoldására és beadására (tehát 8:45-ig). A feladatokat a bíró rendszeren keresztül fogjátok megkapni és beadni is, de értékelni (javítani) én fogom. Aki késik, az is csak a fenti időintervallum alatt írhatja a ZH-t (a bíró rendszer nyit, majd automatikusan zár is). Hiányozni csak igazolással lehet, de a ZH akkor sem pótolható!


     Vissza a lap tetejére.