User Tools

Site Tools


tanszek:oktatas:szamitastechnika:strukturak

This is an old revision of the document!


Struktúrák

Mi az a struktúra?

A struktúra (structure) egy felhasználó által definiált adattípus, amely különböző típusú változókat (adatokat) képes egy név alatt összefogni. Ez hasonló az osztályhoz más nyelvekben, csak egyszerűbb, mert nincs benne metódus.

Célja: összetett adatok (pl. hallgató, autó, pont, dátum stb.) logikai egységbe foglalása.

Struktúra definiálása

A struktúra típust a struct kulcsszóval hozzuk létre:

struct Szemely {
    char nev[50];
    int eletkor;
    float magassag;
};

Ezután létrehozhatunk belőle változókat:

struct Szemely ember1, ember2;

VAGY egyből definiálhatjuk és példányosíthatjuk:

struct Szemely {
    char nev[50];
    int eletkor;
    float magassag;
} ember1, ember2;

Típusnév (typedef)

A typedef segítségével egyszerűbb nevet adhatunk a struktúrának:

typedef struct {
    char nev[50];
    int eletkor;
    float magassag;
} Szemely;

Szemely ember1, ember2;
//Így már nem kell mindenhol struct kulcsszót írni.

Struktúratagok elérése

A tagokat a pont (.) operátorral érjük el:

strcpy(ember1.nev, "Kovacs Bela");
ember1.eletkor = 25;
ember1.magassag = 1.82;

Ha mutatóval dolgozunk, akkor a nyíl (→) operátort használjuk:

Szemely *ptr = &ember1;
printf("%s %d %.2f", ptr->nev, ptr->eletkor, ptr->magassag);

Struktúrák átadása függvényeknek

Érték szerint:

void kiir(Szemely s) {
    printf("%s (%d ev)\n", s.nev, s.eletkor);
}

Mutatóval (hatékonyabb):

void kiir(const Szemely *s) {
    printf("%s (%d ev)\n", s->nev, s->eletkor);
}

Beágyazott struktúrák

Egy struktúra tartalmazhat másik struktúrát is:

typedef struct {
    int ev, honap, nap;
} Datum;

typedef struct {
    char nev[50];
    Datum szuletes;
} Hallgato;

Struktúra adatainak bekérése és kiírása:

#include <stdio.h>

typedef struct{
    char nev[30];
    int kor;
    double magassag;
}EMBER;

int main()
{
    EMBER e;
    int osszeg = 0;
    double atlag = 0;
    double max = 0;
    
    for(int i = 0; i < 3; i++){
        printf("Adja meg az ember nevét: ");
        fgets(e.nev, sizeof(e.nev), stdin);
        printf("Adja meg a korát: ");
        scanf("%d", &e.kor);
        printf("Magassága: ");
        scanf("%lf", &e.magassag);
        osszeg += e.kor;
        if(max < e.magassag){
            max = e.magassag;
        }
    }
    atlag = (double)osszeg / 3;
    printf("\n\nA korok átlaga: %lf", atlag);
    printf("\nLegnagyobb magassag: %lf", max);
}


#include <stdio.h>
#include <string.h>

struct DIAK{
    int id; 
    char nev[50];
    double atlag;
};

int main()
{
   struct DIAK d1;
   d1.id = 1;
   strcpy(d1.nev, "Asd Feri");
   d1.atlag = 4.8;
   
   //d1 = {0,"sdg asg", 5.0};
   
   struct DIAK diakok[2] = {
       {2, "Jkl Éva", 4.4}, 
       {3, "Qwerty Béla", 3.6}
   };
   
   printf("ID: %d\n", d1.id);
   printf("Név: %s\n", d1.nev);
   printf("Átlag: %lf\n\n", d1.atlag);
   
   for(int i = 0; i < 2; i++){
        printf("ID: %d\n", diakok[i].id);
        printf("Név: %s\n", diakok[i].nev);
        printf("Átlag: %lf\n", diakok[i].atlag);
   }
   
}

Gyakorlás

1. Készíts egy struktúrát, ami egy pontot (x, y) tárol, és írja ki a koordinátáit!

#include <stdio.h>

struct Pont {
    int x;
    int y;
};

int main() {
    struct Pont p = {3, 7};
    printf("A pont koordinátai: (%d, %d)\n", p.x, p.y);
    return 0;
}

2.Kérj be 3 személy nevét és életkorát, majd írd ki őket!

#include <stdio.h>

typedef struct {
    char nev[50];
    int eletkor;
} Szemely;

int main() {
    Szemely emberek[3];
    for (int i = 0; i < 3; i++) {
        printf("%d. szemely neve: ", i+1);
        scanf(" %[^\n]", emberek[i].nev);
        printf("%d. szemely eletkora: ", i+1);
        scanf("%d", &emberek[i].eletkor);
    }

    printf("\n--- Adatok ---\n");
    for (int i = 0; i < 3; i++) {
        printf("%s (%d ev)\n", emberek[i].nev, emberek[i].eletkor);
    }
    return 0;
}

3. Írj függvényt, ami egy személy adatait kiírja!

#include <stdio.h>

typedef struct {
    char nev[50];
    int kor;
} Szemely;

void kiir(const Szemely *s) {
    printf("%s - %d ev\n", s->nev, s->kor);
}

int main() {
    Szemely ember = {"Kiss Anna", 22};
    kiir(&ember);
    return 0;
}

4. Készíts struktúrát, ahol egy hallgató neve és születési dátuma van eltárolva!

#include <stdio.h>

typedef struct {
    int ev, honap, nap;
} Datum;

typedef struct {
    char nev[50];
    Datum szuletes;
} Hallgato;

int main() {
    Hallgato h = {"Nagy Peter", {2002, 4, 15}};
    printf("%s szuletett: %d.%02d.%02d\n",
           h.nev, h.szuletes.ev, h.szuletes.honap, h.szuletes.nap);
    return 0;
}

5. Adj meg 3 személyt, és írd ki, ki a legidősebb!

#include <stdio.h>
#include <string.h>

typedef struct {
    char nev[50];
    int kor;
} Szemely;

int main() {
    Szemely emberek[3] = {
        {"Kovacs Bela", 34},
        {"Kiss Anna", 28},
        {"Toth Eva", 41}
    };

    int maxIndex = 0;
    for (int i = 1; i < 3; i++) {
        if (emberek[i].kor > emberek[maxIndex].kor)
            maxIndex = i;
    }

    printf("A legidosebb: %s (%d ev)\n",
           emberek[maxIndex].nev, emberek[maxIndex].kor);
    return 0;
}

6. Készíts programot, ami 5 diák 3 tantárgyból kapott jegyeit tárolja és minden diáknak kiszámolja az átlagát!

#include <stdio.h>

#define N 5
#define M 3

typedef struct {
    char nev[30];
    int jegyek[M];
    float atlag;
} Diak;

int main() {
    Diak diakok[N] = {
        {"Anna", {4, 5, 5}},
        {"Bela", {3, 4, 4}},
        {"Csilla", {5, 5, 5}},
        {"David", {2, 3, 4}},
        {"Erika", {4, 4, 3}}
    };

    for (int i = 0; i < N; i++) {
        int osszeg = 0;
        for (int j = 0; j < M; j++)
            osszeg += diakok[i].jegyek[j];
        diakok[i].atlag = (float)osszeg / M;
    }

    printf("--- Diakok atlaga ---\n");
    for (int i = 0; i < N; i++) {
        printf("%s: %.2f\n", diakok[i].nev, diakok[i].atlag);
    }

    return 0;
}

7. Definiálj egy Matrix struktúrát, amely tárol egy 3×3-as mátrixot, és készíts függvényt, ami a mátrix transzponáltját számolja ki!

#include <stdio.h>

#define SIZE 3

typedef struct {
    int adat[SIZE][SIZE];
} Matrix;

Matrix transzponalt(Matrix m) {
    Matrix t;
    for (int i = 0; i < SIZE; i++)
        for (int j = 0; j < SIZE; j++)
            t.adat[i][j] = m.adat[j][i];
    return t;
}

void kiir(Matrix m) {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++)
            printf("%d ", m.adat[i][j]);
        printf("\n");
    }
}

int main() {
    Matrix A = {{{1,2,3}, {4,5,6}, {7,8,9}}};
    printf("Eredeti mátrix:\n");
    kiir(A);
    printf("\nTranszponált:\n");
    Matrix T = transzponalt(A);
    kiir(T);
    return 0;
}

8. Tárolj 5 darab 2D pontot egy struktúra tömbben, és határozd meg, melyik két pont van egymástól legmesszebb!

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

#define N 5

typedef struct {
    float x, y;
} Pont;

float tav(Pont a, Pont b) {
    return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}

int main() {
    Pont pontok[N] = {
        {0, 0}, {3, 4}, {5, 1}, {2, 8}, {9, 9}
    };

    float maxTav = 0;
    int p1 = 0, p2 = 1;

    for (int i = 0; i < N; i++) {
        for (int j = i + 1; j < N; j++) {
            float d = tav(pontok[i], pontok[j]);
            if (d > maxTav) {
                maxTav = d;
                p1 = i;
                p2 = j;
            }
        }
    }

    printf("Legnagyobb tavolsag: %.2f a (%g,%g) es (%g,%g) kozott.\n",
           maxTav, pontok[p1].x, pontok[p1].y, pontok[p2].x, pontok[p2].y);

    return 0;
}

tanszek/oktatas/szamitastechnika/strukturak.1761725940.txt.gz · Last modified: 2025/10/29 08:19 by szabom