Curs C++ | Sectiunea 14 – Structuri

 

Inainte de a spune orice despre structuri, sa vorbim putin despre un nou tip de date si anume, string. Vom povesti doar putin cat sa intelegem despre ce este vorba, vom detalia ulterior intr-o sectiune separata.

💡 Variabilele de tip string pot stoca siruri de caractere (destul de evident 🙂 ). Asta ar fi diferenta fundamentala fata de tipul char invatat pana acum, unde puteam stoca un singur caracter.

Asignarea valorilor se face ca si pana acum:

#include <string>

string cat_name = "Garfield";

❗ Pentru a putea folosi un string, trebuie sa includeti libraria #include <string>.

Vom reveni mult mai in detaliu despre aceste siruri de caractere, pentru moment insa este suficient asa ca vom continua cu structurile.

 

Structuri

💡 O structura este un nou tip de date al carei elemente pot fi de tipuri diferite. Poate contine orice numar de elemente de orice tip. Fiecare element este denumit camp(field). Fiecare camp este identifica dupa nume, nu dupa index (ca in cazul vectorilor). Bineinteles, numele trebuie sa fie unic si nu poate fi duplicat in interiorul structurii.

struct LIBRARY{
string book_name;
bool status;
int id;
};

Sa analizam putin exemplul:

  • declararea unei structuri incepe mereu prin keyword-ul struct
  • urmeaza numele structurii (LIBRARY in cazul nostru)
  • prin deschiderea acoladei marcam inceperea definirii campurilor
  • structura din exemplu are 3 campuri (un string, un bool si un int)
  • declararea se termina cu inchiderea acoladei

❗ Atentie, declararea de mai sus si declararea unei structuri in general nu creaza o variabila, doar descrie structura ce urmeaza a fi folosita in program. Pentru a declara o variabile de acest tip avem urmatoarele variante:

struct LIBRARY lib;
LIBRARY lib2;

Setam doua variabile de tip struct LIBRARY (este suficient sa scriem si doar LIBRARY) numite lib si lib2. Stim ca o astfel de structura contine 3 campuri deci se pune problema accesarii acestora.

💡 Cum C++ ne pune la dispozitie operatorul de indexare [ ] pentru siruri, ne ofera si asa numitul operator de selectie (selection operator) special pentru structuri, fiind reprezentat prin caracterul punct.” .

Este un operator binar astfel ca argumentul din stanga trebuie sa identifice o structura iar cel din dreapta trebuie sa fie numele unui camp din structura. Expresia ce contine acest operator uneori poarta numele si de selector.

//Asignare
lib.book_name = "1984";
lib.id = 10;

//Citire
int id = lib.id;

 

Siruri de structuri

💡 Din punct de vedere virtual, orice tip de date poate fi folosit ca si camp al unei structuri: scalari (incluzand pointeri), siruri si aproape toate structurile. Spunem aproape pentru ca o structura nu poate fi un camp propriu ei.

Asa cum am spus, putem avea un vector cu orice tip de date asa ca o structura nu este cu nimic diferita in acest caz.

struct LIBRARY lib[100];

Accesarea campului dorit necesita doua operatii consecutive:

  • primul pas consta in folosirea operatorului de indexare al sirului [ ] pentru a accesa structura dorita
  • al doilea pas presupunse folosirea operatorului de selectie pentru a selecta campul dorit
lib[0].book_name = "Metro 2033";
lib[0].status = true;
lib[0].id = 1;

 

Declararea unei structuri

Vom lua o structura mai simpla pentru a prezenta urmatoarele afirmatii. Avem 3 campuri de tip int, cu un nume reprezentativ pentru rolul pe care il au.

struct CALENDAR{
int year;
int month;
int day;
};

Este la fel de valabila si urmatoarea declarare, cele doua variante fiind echivalente.

struct CALENDAR{ 
int year, month, day;
};

❗ Aceste declarari nu creaza nicio variabila, doar anunta compilatorul despre noul nostru tip de date. Exista totusi un mod de a declara o structura si a declara si variabilele in acelasi timp.

struct CALENDAR{ 
int year, month, day;
} Holidays, Meetings[100];

CALENDAR shifts;

Putem sa si omitem numele structurii. In acest caz insa, nu vom mai putea determina tipul acelei variabile si acest lucru poate deveni problematic (ex: folosirea operatorului sizeof).

struct { 
int year, month, day;
} date;

💡 Mai mult, o structura poate fi in interiorul altei structuri. Sa presupunem ca vrem sa extindem structura noastra LIBRARY. Vom adauga un nou camp de tip CALENDAR. Acest lucru va insemna ca vom fi nevoiti sa folosim doi operatori de selectie consecutivi pentru a accesa campurile din a doua structura.

struct LIBRARY{
string book_name;
bool status;
int id;
DATE rent_date;
} Nemira;

Nemira.rent_date.year = 2022;
Nemira.rent_date.moth = 10;
Nemira.rent_date.day = 10;

 

Tips and tricks

🤖 Este permis ca numele unei structuri sa fie identic cu numele unui camp din interior acesteia. Nu este recomandat insa deoarece poate duce la erori de citire si scriere.

struct STRUCT {
int STRUCT;
}
my_struct;
my_struct.STRUCT = 0;

🤖 Doua structuri pot contine acelasi camp cu acelasi tip si nume, deoarece fac parte din structuri diferite. Spre exemplu:

struct {
int id;
}
str1;

struct {
int id;
}
str2;

str1.id = 1;
str2.id = str1.id;

🤖 Structurile pot fi initializate in momentul declararii. Procedeul este cel invatat la siruri si vectori, folosind acolade iar in interior punand valorile corespunzatoare. Trebuie sa fim atenti ca valorile din lista sa fie de tipurile corespunzatoare din structura

Bineinteles, daca initiatorul contine mai putine elemente, compilatorul va presupune ca restul vor avea valoarea zero.

struct CALENDAR calendar_2022 = { 2022, 10, 20 };

//Echivlaent cu a scrie
calendar_2022.year = 2022;
calendar_2022.month = 10;
calendar_2022.day = 20;

 

Aici se termina si aceasa sectiune 🙂 . Pentru mai multe intrebari, puteti folosi informatiile de aici.

➡ Sectiunea anterioara:Curs C++ | Sectiunea 13 – Siruri de siruri

➡ Sectiunea urmatoare:Curs C++ | Sectiunea 15 – Pointeri

You may also like...