Consolidare: Tipul de date struct

Informatică, clasa a 11-a

I. Definirea Structurilor și Declararea Variabilelor

1. Scrie definiția a două structuri (Autor și Carte) astfel încât, dacă declarăm Carte b;, expresia b.autor.nume să fie validă.

Indiciu: Structura Carte trebuie să conțină un membru de tipul structurii Autor.

Rezolvare:
struct Autor {
    char nume[50];
};

struct Carte {
    char titlu[50];
    Autor autor; // Membru de tip structură (imbricare)
};
// Acum putem scrie: b.autor.nume
2. Având definită structura de mai jos, cum declarăm o variabilă myBook de acest tip?
Context: struct Carte { char titlu[50]; int nr_pagini; };
Rezolvare: În C++, sintaxa este NumeStructura numeVariabila;.
3. Scrie definiția unei structuri Punct care are două coordonate reale, x și y.
Rezolvare:
struct Punct {
    float x;
    float y;
};
4. Structuri imbricate: Având structura Data deja definită, scrie structura Elev care are un nume (char[30]) și data nașterii de tip Data.
Context: struct Data { int zi, luna, an; };
Rezolvare:
struct Elev {
    char nume[31];
    Data data_nasterii; // Membru de tip structură
};
5. Ce va afișa operatorul sizeof(Punct) pentru structura de mai jos, considerând că un float are 4 octeți?
Context: struct Punct { float x; float y; };
Rezolvare: 4 octeți (x) + 4 octeți (y) = 8 octeți.

II. Accesarea Membrilor și Logică

6. Avem variabila e de tip Elev. Cum accesăm membrul nume al acesteia?
Context: struct Elev { char nume[30]; int clasa; }; Elev e;
Rezolvare: Operatorul de selecție directă (punctul .) se folosește pentru variabile statice.
7. Completare cod: Verifică dacă marca mașinii m este "AUDI".
Context: struct Masina { char marca[20]; int an; }; Masina m;
if ( ______________ (m.marca, "AUDI") == 0 )
Rezolvare: Pentru compararea șirurilor de caractere în C/C++ se folosește funcția strcmp.
8. Scrie o instrucțiune if completă care verifică dacă vârsta câinelui rex este strict mai mare de 10.
Context: struct Caine { char rasa[20]; int varsta; }; Caine rex;
Rezolvare: if (rex.varsta > 10) { ... }
9. Structuri imbricate. Avem variabila r de tip Dreptunghi. Cum accesăm coordonata x a punctului stânga-sus?
Context: struct Punct { int x, y; }; struct Dreptunghi { Punct stanga_sus; Punct dreapta_jos; }; Dreptunghi r;
Rezolvare: Se parcurge ierarhia: variabila dreptunghi -> punctul din interior -> coordonata punctului.
10. Dacă avem două variabile A și B, instrucțiunea A = B; este validă?
Context: struct Punct { int x, y; }; Punct A, B;
Rezolvare: DA. Atribuirea este permisă între structuri de același tip și realizează o copie bit cu bit.

III. Vectori de structuri și Probleme Practice

11. Declară un vector numit biblioteca care poate conține 100 de elemente de tip Carte.
Context: struct Carte { char titlu[50]; int pagini; };
Rezolvare: Carte biblioteca[100];
12. Scrie o instrucțiune care scumpește medicamentul aspirina cu 10% (înmulțește prețul cu 1.1).
Context: struct Medicament { char nume[20]; float pret; }; Medicament aspirina;
Rezolvare: aspirina.pret = aspirina.pret * 1.1;
13. Putem compara două structuri direct folosind if (A == B)?
Context: struct Produs { int id; float pret; }; Produs A, B;
Rezolvare: NU. Operatorul == nu este definit implicit pentru structuri. Trebuie să comparăm membru cu membru.
14. Definește o structură Imprimanta cu model (sir) și un camp color de tip boolean (true/false).
Rezolvare:
struct Imprimanta {
    char model[50];
    bool color;
};
15. Cum atribuim șirul "Popescu" membrului nume al variabilei elev1?
Context: struct Elev { char nume[30]; }; Elev elev1;
Rezolvare: Vectorii de caractere (șirurile C-style) nu suportă atribuire directă cu = după declarare. Se folosește strcpy.

IV. Pointeri, Inițializări și Aplicații

16. Dacă p este un pointer către o structură, cum accesăm membrul nota?
Context: struct Elev { int nota; }; Elev e; Elev *p = &e;
Rezolvare: Operatorul săgeată -> este folosit pentru a accesa membrii unei structuri printr-un pointer.
17. Cum inițializăm o variabilă Punct p cu coordonatele 10 și 20 la declarare?
Context: struct Punct { int x, y; };
Rezolvare: Punct p = {10, 20};
18. Definește o structură pentru un NumarComplex (parte reală, parte imaginară).
Rezolvare:
struct NumarComplex {
    float re;
    float im;
};
19. Dacă transmitem o structură unei funcții prin valoare (ex: void f(Elev e)), modificările făcute asupra lui e în funcție se păstrează la întoarcere?
Context: struct Elev { int nota; }; void maresteNota(Elev e) { e.nota = 10; }
Rezolvare: NU. Se lucrează pe o copie locală. Pentru a păstra modificările, trebuie transmisă prin referință sau pointer.
20. Provocare de final: Creați o structură Telefon care conține un producător (char) și o structură imbricată Specificatii (ram int, stocare int).
Rezolvare:
struct Specificatii {
    int ram;
    int stocare;
};

struct Telefon {
    char producator[30];
    Specificatii specs;
};