Struktúrák - bevezető

Struktúrák

Szintaxis:

    struct TipusNev
    {
        tipus1 nev1;
        tipus2 nev2;
        ...
    } opcionálisan globális változók nevei;


    int main()
    {
        //...
        TipusNev x;
        x.nev1 = ....;
        cout << x.nev2 << endl;
        //...
    }

Az adattagokat a “.” operátorral tudjuk elérni.

Példa: pontok a síkban

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <cmath>
using namespace std;

struct Pont
{
    double x;
    double y;
};

double tavolsag(Pont a, Pont b)
{
    double dx = a.x - b.x;
    double dy = a.y - b.y;

    return sqrt(dx*dx + dy*dy);
}

void kiir(Pont p)
{
   cout << "(" << p.x << "," << p.y << ")" << endl;
}

int main()
{
    Pont p1, p2;

    // cin >> p1.x;
    p1.x = 3;
    p1.y = 2;

    p2.x = 4;
    p2.y = 4;

    kiir(p1);
    kiir(p2);

    cout << tavolsag(p1, p2) << endl;

    return 0;
}

Struktúrák inicializálása

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cmath>
using namespace std;

struct Pont
{
    double x;
    double y;
};

int main()
{
    Pont a {1,2}; // ekkor: a.x == 1, a.y == 2
    // az adattagok (mezők, attribútumok) deklarálásának
    // sorrendjében adjuk meg az értékeket

    return 0;
}

Példa: alkalmazottak nyilvántartása

Beolvasunk alkalmazottakat (vezetéknév, keresznév, születési év, kereset formában, az adattagokat szóközök választják el egymástól). Tároljuk őket és írjuk ki az 5000 lejnél többet keresők születési éveit!

Példa bemenet:

    2
    Setőfi Pándor 1823 10000
    Edy Andre 1877 2000
    Ristiano Chronaldo 1985 99999

Megoldás:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <fstream>
using namespace std;

struct Alkalmazott
{
    char vezeteknev[30];
    char keresztnev[30];
    int szul_ev;
    int fizetes;
};

int main()
{
    ifstream fin("input.txt");

    int n;
    fin >> n;

    Alkalmazott emberek[100];

    for (int i = 0; i < n; i++)
    {
        fin >> emberek[i].vezeteknev
            >> emberek[i].keresztnev
            >> emberek[i].szul_ev
            >> emberek[i].fizetes;
    }

    for (int i = 0; i < n; i++) {
        if (emberek[i].fizetes > 5000)
            cout << emberek[i].szul_ev << endl;
    } 

    return 0;
}

Megjegyzések:

Feladat: műveletek racionális számokkal

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <fstream>
using namespace std;


struct Racionalis
{
    int szamlalo;
    int nevezo;
};

void kiir(Racionalis r)
{
    cout << r.szamlalo << " / " << r.nevezo << endl;
}

int lnko(int a, int b)
{
    if (a < 0) a = -a;
    if (b < 0) b = -b;

    while (b != 0) {
        int temp = a;
        a = b;
        b = temp % b;
    }

    return a;
}


void egyszerusit(Racionalis &x)
{
    int d = lnko(x.szamlalo, x.nevezo);
    x.szamlalo /= d;
    x.nevezo /= d;

    if (x.nevezo < 0) {
        x.szamlalo = -x.szamlalo;
        x.nevezo = -x.nevezo;
    }
}

Racionalis szoroz(Racionalis a, Racionalis b)
{
    Racionalis eredmeny;

    eredmeny.szamlalo = a.szamlalo * b.szamlalo;
    eredmeny.nevezo = a.nevezo * b.nevezo;

    egyszerusit(eredmeny);
    return eredmeny;
}

Racionalis osszead(Racionalis a, Racionalis b)
{
    Racionalis eredmeny;
    eredmeny.szamlalo = a.szamlalo*b.nevezo + b.szamlalo*a.nevezo;
    eredmeny.nevezo = a.nevezo*b.nevezo;
    egyszerusit(eredmeny);
    return eredmeny;
}


Racionalis kivon(Racionalis a, Racionalis b)
{
    Racionalis eredmeny;
    eredmeny.szamlalo = a.szamlalo*b.nevezo - b.szamlalo*a.nevezo;
    eredmeny.nevezo = a.nevezo*b.nevezo;
    egyszerusit(eredmeny);
    return eredmeny;
}


Racionalis oszt(Racionalis a, Racionalis b)
{
    Racionalis eredmeny;
    eredmeny.szamlalo = a.szamlalo*b.nevezo;
    eredmeny.nevezo = a.nevezo*b.szamlalo;
    egyszerusit(eredmeny);



    return eredmeny;
}

int main()
{
    Racionalis r1 { 1, 2 }, r2 {1,3};

    kiir(oszt(r1, r2));

    return 0;
}

Feladat: műveletek komplex számokkal

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <fstream>
using namespace std;

struct Komplex
{
    double re;
    double im;
};

// HF: kiírás, beolvasás, összeg, különbség
// szorzat, hányados, modulusz

Komplex konjugalt(Komplex c)
{
    Komplex eredmeny;
    eredmeny.re = c.re;
    eredmeny.im = -c.im;
    return eredmeny;
}

Komplex szorzat(Komplex c1, Komplex c2)
{
    Komplex eredmeny;

    eredmeny.re = c1.re * c2.re - c1.im * c2.im;
    eredmeny.im = c1.re * c2.im + c2.re * c1.im;

    return eredmeny;
}


Komplex hanyados(Komplex c1, Komplex c2)
{
    Komplex szamlalo = szorzat(c1, konjugalt(c2));
    double nevezo = c2.re*c2.re + c2.im*c2.im;


    Komplex eredmeny;

    eredmeny.re = szamlalo.re / nevezo;
    eredmeny.im = szamlalo.im / nevezo;

    return eredmeny;
}

double modulusz(Komplex c)
{
    return sqrt(c.re*c.re + c.im*c.im);
}


int main()
{
    Komplex c1 {3, 4};
    Komplex c2 {3,-2};

    Komplex c3 = szorzat(c1,c2);

    Komplex uj = hanyados(c3, c1);

    cout << uj.re << " + "
         << uj.im << "i" << endl;

    cout << modulusz(c1) << endl;

    return 0;
}