Typy a štruktúry alebo "urob si svoj typ".

Doteraz sme sa stretli s niekoľkými dátovými typmi. Boli to typy int, float a char, smerníky na ne a polia. Existuje ešte niekoľko ďaľších základných typov a o niektorých z nich si možno v budúcnosti niečo povieme. Dnes sa však budeme zaoberať tým, ako si vytvoriť typy nové.

Nový typ sa definuje pomocou slova typedef. Robí sa tak obvykle mimo procedúr, najlepšie v hlavičkovom súbore, ale to ešte neviete čo je. Predstavte si, že chcem definovať typ retazec ako pole 100 charov. Spraví sa to nasledovne:

    typedef char retazec[100];

    main()
    {
        retazec a,b;
    
        strncpy(a, "Ja som strasna ropucha.\n", 99);
        strncpy(b, "A ja som ihlicnaty lekvar.\n", 99);
        printf("%s%s", a , b );
    }
Za slovom typedef nasleduje deklarácia rovnaká ako deklarácia premennej (v tomto prípade poľa charov dĺžky 100), akurát že použité meno retazec nie je meno premennej, ale meno nového typu. V procedúre main sme si vyrobili dve premenné typu retazec. Obe sú plnohodnotné polia typu char a mohli by sme kľudne spraviť napríklad priradenie b[25] = 'k'; v našej ukážke však polia používame ako reťazce.

Takže nový typ by sme si už urobiť vedeli. Zatiaľ nám to ale môže slúžiť len na to, že si niektoré známe typy premenujeme. Predstavte si ale, že by sme potrebovali spraviť úplne nový typ. Napríklad premennú, do ktorej by sme vedeli uložiť meno, priezvisko, vek, váhu a výšku človeka. Takéto premenné sa vytvárajú pomocou príkazu struct. Vyzerá to napríklad takto:

    struct clovek
    {
        char meno[20];
        char priezvisko[40];
        int vek;
        float vaha;
        float vyska;
    } jano;


    main()
    {
        strncpy(jano.meno,"Fero",19);
        strncpy(jano.priezvisko,"Horny",39);
        jano.vek = 13;
        jano.vaha = 51.7;
        jano.vyska = 162.5;
        printf("%s %s Vek:%d Vaha:%f Vyska:%f\n",
            jano.meno, jano.priezvisko, jano.vek, 
            jano.vaha, jano.vyska);
    }
Ono sa to dá pekne spojiť aj s príkazom typedef, takže si môžete zadefinovať typ bod, ktorý bude obsahovať súradnice nasledovným spôsobom:
    typedef struct bod
    {
        int x; int y;
    } BOD;
a potom si urobiť pole bodov takto:
    main()
    {
        BOD bodiky[3] = {{1 , 1},
                         {3 , 3},
                         {7 , 5}};
        
        bodiky[0].x = 30;
        bodiky[0].y = 20;
        printf("Bod 0 ma suradnice [%d,%d]\n",
            bodiky[0].x, bodiky[0].y);
    }
Ako ste si mohli všimnúť, k jednotlivým položkám štruktúry sa pristupuje s pomocou bodky (napríklad jano.vaha alebo bodiky[0].y). Celé pole môžem naplniť (ale len pri deklarácii) spôsobom, ktorý je vidieť vyššie.

V prípade, že poznáme smerník na nejakú štruktúru, môžeme k jednotlivým položkám pristupovať cez tento smerník. V takom prípade sa nepoužíva bodka ale šipka -> zložená zo znakov "mínus" a "väčšíe". Keďže premenná bodiky je smerník, ktorý ukazuje na prvú položku poľa, môžeme predošlý program napísať trochu iným spôsobom:

    main()
    {
        BOD bodiky[3] = {{1 , 1},
                         {3 , 3},
                         {7 , 5}};
        
        bodiky -> x = 30;
        bodiky -> y = 20;
        printf("Bod 0 ma suradnice [%d,%d]\n",
            bodiky[0].x, bodiky -> y);
    }
Keďže sa pri volaní funkcií častejšie ako parameter používa smerník na štruktúru, než celá štruktúra, je tento druhý spôsob používaný relatívne často.



Úloha č.1 Vyskúšajte obe varianty (aj prístup cez bodky, aj prístup cez šipky) príkladu s poľom bodov. Ako by ste cez šipky pristupovali k druhému prvku poľa?

Úloha č.2 Vyrobte si dátový typ AUTO, ktorý bude obsahovať typ, poznávaciu značku a počet najazdených kilometrov. Vytvorte pole troch áut, naplňte ho hneď pri deklarácii a vypíšte údaje o druhom z nich.

Úloha č.3 Vytvorte štruktúru struct pokus, ktorá v sebe bude obsahovať jedno celé číslo a jednu položku typu struct pokus. Čo vám na to povie kompilátor? Čo vám povie, ak bude štruktúra struct pokus v sebe obsahovať jedno celé číslo a jednu položku typu smerník na struct pokus?

Úloha č.4 Vyrobte si typ OVOCIE, ktorý bude obsahovať názov a cenu za kilo. Vytvorte si päťprvkové pole typu OVOCIE, napíšte program, ktorý z klávesnice doňho načíta údaje a potom cenník vypíše na obrazovku.

Anino Belan 2003-10-26