start     Articole     Despre mine     Contact     Cursul ABCprog    

Cum grupezi variabilele in structuri C

programare in C cu structDespre variabile am tot vorbit. Stii deja ca ele sunt niste entitati ce au un tip si stocheaza in ele o valoare (de acel tip) intr-o locatie de memorie caracterizata de o adresa si de o dimensiune (ce se “masoara” in numar de octeti si depinde de tipul variabilei; practic, daca tipul e T, aceasta dimensiune se obtine cu sizeof(T)).

Si ai vazut si cum te pot ajuta vectorii sa lucrezi generic cu un numar mare de variabile de acelasi tip.

Ce te faci, insa, daca ai vrea sa grupezi (ca intr-un vector) valori de tipuri diferite?

“Vector” de valori de tipuri diferite?

Adica, de exemplu, poate ai vrea sa lucrezi intr-un mod compact cu diferite date (gen: sex, nume, varsta, inaltime) despre niste oameni.

Bineinteles ca poti construi cate o astfel de variabila pentru fiecare om din programul tau, dar limbajul C iti permite o solutie mult mai eleganta si mai practica — structura (sau “inregistrarea”). Tipul de date struct, mai precis.

De fapt, struct nu e un tip de date ca cele pe care le-ai invatat pana acum (cum ar fi int, float si char), ci e un tip format din compunerea mai multor tipuri de date.

Cum se defineste o “struct” in C

La modul generic, o structura (sau o “inregistrare”) se defineste in C astfel:

struct NumeStructura {
    tip1 var1;
    tip2 var2;
    …
};

Variabilele definite in structura (var1, var2, …) se numesc membrii (sau elementele) structurii.

Iar o variabila de acest tip de structura se va defini asa:

struct NumeStructura numeVar;

Structura astfel creata se poate si initializa la definire, astfel:

struct NumeStructura numeVar = {valoare1, valoare2, …};

Daca ti se pare cam greoi sa “cari” dupa tine in fiecare noua definire de structura cuvantul-cheie struct, iti poti defini un tip de date nou cu typedef:

typedef struct NumeStructura {…} NumeTipNou;

In acest caz, specificarea lui NumeStructura e optionala (cu exceptia situatiei in care in ineriorul structurii ai vrea sa incluzi o variabila de tip pointer catre o structura de acelasi tip (lucru util in implementarea listelor inlantuite si a arborilor)).

Exemplu de folosire struct in C

OK, cam multa “generalitate” pana aici, asa ca hai sa vedem concret cum ma poate ajuta o structura din limbajul C sa stochez date despre oameni:

#include <stdio.h>

typedef struct {
    char sex;
    char *nume;
    int varsta;
    float inaltime;
} Om;

void main() {
    Om andrei = {'M', "Andrei Programescu", 21, 1.79};
    // Constanta asta de tip sir de caractere o vede
    //  compilatorul si ii aloca (static) spatiu in memorie,
    //  iar in campul varsta ii pune adresa din memorie.
    // Se pot initializa doar anumiti membri ai structurii:
    Om teo = {.sex='M', .nume="Teofil Sisharpu"};
    // Iar ceilalti membri pot fi initializati ulterior:
    teo.varsta = 32;
    teo.inaltime = 1.82;
    Om ioana = {'F', "Ioana Codescu", 23, 1.67};
    // O structura se poate copia cu totul peste alta:
    Om anda = ioana;
    anda.nume = "Anda Javescu";
    anda.inaltime = 1.70;
    // Pot defini si pointeri catre structuri:
    Om *om = &anda;
    // Si pot accesa elementele structurii astfel:
    (*om).varsta -= 3; // scad 3 din varsta Andei
    // Dar pot accesa campurile si mai simplu asa:
    om->inaltime = 1.68;
    // Dovada ca s-au facut modificarile:
    printf("Anda are %d ani si %1.2fm inaltime.\n", anda.varsta, anda.inaltime);
}

Nu mai explic ce am zis in comentarii; doar te invit sa le citesti…

Asa cum ai vazut, pot defini pointeri catre structuri si pot opera cu structurile prin intermediul acestor pointeri.

Vectori de structuri?

De asemenea, pot defini si vectori de structuri:

...
Om oameni[10];

oameni[0].sex = 'F';
oameni[0].nume = "Georgiana Juniorescu";
oameni[0].varsta = 25;
oameni[0].inaltime = 1.60;

oameni[1].sex = 'M';
oameni[1].nume = "Geani Stagiaru";
oameni[1].varsta = 19;
oameni[1].inaltime = 1.85;
...

Cred ca deja incepi sa vezi cum structurile impreuna cu vectorii te pot ajuta sa construiesti adevarate “baze de date” in programele tale.

Gandeste-te ca vectorul oameni construit anterior este, de fapt, o modalitate de a reprezenta intr-un program C urmatorul tabel:

Fiecare linie din tabel e o structura, iar fiecare coloana e un membru (sau “element”, sau “camp”) al structurii.

Inchei acest articol fara o concluzie. As vrea doar sa iei foarte in serios tipul de data struct, caci el sta la baza construirii claselor din programarea orientata pe obiecte (fara de care limbaje ca Java si C# practic nu ar exista).

 

Alatura-te celor peste 8000 de oameni din armata noastra de creiere cu muschi si vei primi testul care iti va spune daca ai sau nu minte de programator.

In plus, vei fi mereu la curent cu tot ce pun la cale.

(Vei primi automat un email in care ti se va solicita acordul de prelucrare a datelor cu caracter personal.)

 

Cu drag,

Florin Bîrleanu





Loading Facebook Comments ...