MyCodeSchool
Exerciții cu structuri în C++
mycodeschool.ro

Exerciții Structuri C++

Învață structurile în C++ prin exerciții practice și interactive

Teoria - Structuri în C++

15+ Exerciții
5 Nivele
100% Practic

Ce sunt structurile?

Structurile în C++ sunt tipuri de date definite de utilizator care permit gruparea mai multor variabile de tipuri diferite sub un singur nume. Sunt perfecte pentru organizarea datelor related și crearea de sisteme simple de gestionare.

struct Student { int id; // ID-ul studentului char nume[100]; // Numele studentului int varsta; // Vârsta studentului // Funcție membru pentru afișare void afisare() { cout << "ID: " << id << endl; cout << "Nume: " << nume << endl; cout << "Varsta: " << varsta << endl; } };

Avantajele structurilor:

  • Organizarea logică a datelor
  • Reutilizarea codului
  • Funcții membre pentru operații specifice
  • Încapsularea datelor relacionate
  • Cod mai curat și mai ușor de întreținut

Funcții membre în structuri

Funcțiile membre permit definirea operațiilor specifice pentru structură direct în interiorul acesteia. Acestea pot accesa direct membrii structurii și fac codul mai organizat.

struct Biblioteca { Carte carti[100]; int nr_carti = 0; // Funcție pentru adăugarea unei cărți void adaugaCarte(Carte carte) { if (nr_carti < 100) { carti[nr_carti] = carte; nr_carti++; } } // Funcție pentru afișarea tuturor cărților void afiseazaCarti() { for (int i = 0; i < nr_carti; i++) { carti[i].afisare(); } } };

Analiza Codului Original

Structurile definite în codul tău:

  • Student - stochează datele unui student (id, nume, email, vârstă)
  • Carte - stochează informații despre o carte (id, nume, dată, student_id)
  • Biblioteca - gestionează colecția de cărți (array, funcții CRUD)
  • Scoala - coordonează întregul sistem (meniu, input/output)

Probleme identificate în cod:

  • int email în Student - ar trebui să fie char email[100]
  • Lipsa validării inputului utilizatorului
  • Nu există opțiunea de ieșire din program (loop infinit)
  • Cazul 3 din meniu nu este implementat
  • Numele greșit "bibioteca" în loc de "biblioteca"
// Versiunea corectată a structurii Student struct Student { int id; char first_name[100]; char last_name[100]; char email[100]; // Corectat: email ca string int age; void afisare() { cout << "Id: " << id << endl; cout << "First name: " << first_name << endl; cout << "Last name: " << last_name << endl; cout << "Email: " << email << endl; cout << "Age: " << age << endl; } };

Funcționalități bine implementate:

  • Adăugarea de cărți pentru un student
  • Afișarea cărților unui student specific
  • Căutarea unei cărți după ID
  • Ștergerea unei cărți din bibliotecă
  • Structura meniului interactiv

Exerciții Ușoare - Nivel Începător

UȘOR

Cinema - Gestionare Bilete

Creează un sistem simplu pentru un cinema cu filme și bilete.

Structuri necesare:

  • Film: id, nume, durata, gen
  • Bilet: id, film_id, loc, pret, nume_client
  • Cinema: array-uri pentru filme și bilete

Funcționalități:

  • Adăugare film nou
  • Rezervare bilet pentru un film
  • Afișare toate filmele disponibile
  • Căutare bilete după numele clientului
UȘOR

Restaurant - Meniu și Comenzi

Sistem pentru gestionarea meniului și comenzilor unui restaurant.

Structuri necesare:

  • Produs: id, nume, pret, categorie
  • Comanda: id, produs_id, cantitate, nume_client, masa
  • Restaurant: array-uri pentru produse și comenzi

Funcționalități:

  • Adăugare produs în meniu
  • Plasare comandă pentru o masă
  • Afișare meniu după categorii
  • Calculare total comandă
UȘOR

Parcare - Gestionare Locuri

Sistem simplu pentru gestionarea unei parcări auto.

Structuri necesare:

  • Masina: numar, marca, model, culoare
  • LocParcare: numar, ocupat, masina (dacă ocupat)
  • Parcare: array cu locurile de parcare

Funcționalități:

  • Parcare mașină pe primul loc liber
  • Scoatere mașină din parcare
  • Afișare starea parcării
  • Căutare mașină după număr
UȘOR

Farmacie - Evidența Medicamentelor

Sistem pentru gestionarea stocului unei farmacii.

Structuri necesare:

  • Medicament: id, nume, pret, stoc, data_expirare
  • Vanzare: id, medicament_id, cantitate, total
  • Farmacie: array-uri pentru medicamente și vânzări

Funcționalități:

  • Adăugare medicament în stoc
  • Vânzare medicament
  • Verificare stoc disponibil
  • Afișare medicamente pe punctul să expire
UȘOR

Librărie - Cărți și Vânzări

Sistem pentru o librărie cu evidența cărților și vânzărilor.

Structuri necesare:

  • Carte: id, titlu, autor, pret, stoc
  • Client: id, nume, email, telefon
  • Vanzare: id, carte_id, client_id, data
  • Librarie: array-uri pentru toate entitățile

Funcționalități:

  • Adăugare carte nouă
  • Înregistrare client nou
  • Vânzare carte la client
  • Căutare cărți după autor
UȘOR

Școală - Clase și Note

Sistem pentru gestionarea notelor elevilor dintr-o clasă.

Structuri necesare:

  • Elev: id, nume, prenume, clasa
  • Nota: id, elev_id, materie, valoare, data
  • Scoala: array-uri pentru elevi și note

Funcționalități:

  • Adăugare elev nou
  • Adăugare notă pentru un elev
  • Calculare medie elev la o materie
  • Afișare toate notele unui elev

Sfaturi pentru exercițiile ușoare:

  • Începe cu structurile simple și adaugă câmpurile necesare
  • Implementează funcția de afișare pentru fiecare structură
  • Folosește array-uri pentru colecții (maxim 100 elemente)
  • Adaugă un meniu simplu cu 3-4 opțiuni
  • Nu uita să validezi inputul utilizatorului

Exerciții Avansate

MEDIU

Magazin Online Complex

Sistem complet pentru un magazin online cu clienți, produse, comenzi și categorii.

Structuri necesare:

  • Produs: id, nume, pret, stoc, categorie_id
  • Client: id, nume, email, telefon, adresa
  • Comanda: id, client_id, produse[], total, status
  • Categorie: id, nume, descriere
  • Magazin: toate array-urile și funcțiile
MEDIU

Evidența Angajaților

Sistem HR pentru gestionarea angajaților, departamentelor și salariilor.

Funcționalități avansate:

  • Calculare salariu mediu pe departament
  • Promovare angajat
  • Istoric modificări salariu
  • Rapoarte statistice
AVANSAT

Sistem Hoteliere

Platform completă pentru rezervări hoteliere cu camere, oaspeți, servicii suplimentare.

Funcționalități complexe:

  • Rezervări cu date de check-in/out
  • Calculare preț cu servicii extra
  • Istoric rezervări
  • Statistici ocupare

Soluții Complete

Soluția: Cinema - Gestionare Bilete

#include<iostream> #include<string.h> using namespace std; struct Film { int id; char nume[100]; int durata; // în minute char gen[50]; void afisare() { cout << "ID: " << id << " | Film: " << nume << " | Durata: " << durata << " min | Gen: " << gen << endl; } }; struct Bilet { int id; int film_id; int loc; float pret; char nume_client[100]; void afisare() { cout << "Bilet ID: " << id << " | Film ID: " << film_id << " | Loc: " << loc << " | Client: " << nume_client << " | Pret: " << pret << " lei" << endl; } }; struct Cinema { Film filme[50]; Bilet bilete[200]; int nr_filme = 0; int nr_bilete = 0; void adaugaFilm(Film f) { if (nr_filme < 50) { filme[nr_filme] = f; nr_filme++; cout << "Film adaugat cu succes!" << endl; } } void afiseazaFilme() { cout << "=== FILME DISPONIBILE ===" << endl; for (int i = 0; i < nr_filme; i++) { filme[i].afisare(); } } bool rezervaBilet(int film_id, int loc, const char* nume_client, float pret) { // Verifică dacă locul este disponibil for (int i = 0; i < nr_bilete; i++) { if (bilete[i].film_id == film_id && bilete[i].loc == loc) { cout << "Locul " << loc << " este deja ocupat!" << endl; return false; } } // Rezervă biletul Bilet b; b.id = nr_bilete + 1; b.film_id = film_id; b.loc = loc; b.pret = pret; strcpy(b.nume_client, nume_client); bilete[nr_bilete] = b; nr_bilete++; cout << "Bilet rezervat cu succes!" << endl; return true; } void cautaBileteClient(const char* nume) { cout << "=== BILETE PENTRU " << nume << " ===" << endl; bool gasit = false; for (int i = 0; i < nr_bilete; i++) { if (strcmp(bilete[i].nume_client, nume) == 0) { bilete[i].afisare(); gasit = true; } } if (!gasit) { cout << "Nu s-au gasit bilete pentru acest client." << endl; } } void meniu() { cout << "\n=== CINEMA MANAGEMENT ===" << endl; cout << "1. Adauga film" << endl; cout << "2. Afiseaza filme" << endl; cout << "3. Rezerva bilet" << endl; cout << "4. Cauta bilete client" << endl; cout << "5. Iesire" << endl; cout << "Alegerea: "; } };

Soluția: Restaurant - Meniu și Comenzi

#include<iostream> #include<string.h> using namespace std; struct Produs { int id; char nume[100]; float pret; char categorie[50]; // "Aperitiv", "Fel principal", "Desert", "Bautura" void afisare() { cout << "ID: " << id << " | " << nume << " | " << pret << " lei | Categorie: " << categorie << endl; } }; struct Comanda { int id; int produs_id; int cantitate; char nume_client[100]; int masa; float total; void afisare() { cout << "Comanda ID: " << id << " | Masa: " << masa << " | Client: " << nume_client << " | Total: " << total << " lei" << endl; } }; struct Restaurant { Produs meniu[100]; Comanda comenzi[300]; int nr_produse = 0; int nr_comenzi = 0; void adaugaProdus(Produs p) { if (nr_produse < 100) { meniu[nr_produse] = p; nr_produse++; cout << "Produs adaugat in meniu!" << endl; } } void afiseazaMeniu() { cout << "\n=== MENIUL RESTAURANTULUI ===" << endl; for (int i = 0; i < nr_produse; i++) { meniu[i].afisare(); } } void afiseazaMeniuCategorie(const char* categorie) { cout << "\n=== " << categorie << " ===" << endl; for (int i = 0; i < nr_produse; i++) { if (strcmp(meniu[i].categorie, categorie) == 0) { meniu[i].afisare(); } } } float plasareCcomanda(int produs_id, int cantitate, const char* nume_client, int masa) { // Caută produsul for (int i = 0; i < nr_produse; i++) { if (meniu[i].id == produs_id) { Comanda c; c.id = nr_comenzi + 1; c.produs_id = produs_id; c.cantitate = cantitate; strcpy(c.nume_client, nume_client); c.masa = masa; c.total = meniu[i].pret * cantitate; comenzi[nr_comenzi] = c; nr_comenzi++; cout << "Comanda plasata! Total: " << c.total << " lei" << endl; return c.total; } } cout << "Produsul nu a fost gasit!" << endl; return 0; } void afiseazaComenziMasa(int masa) { cout << "\n=== COMENZI MASA " << masa << " ===" << endl; float total_masa = 0; for (int i = 0; i < nr_comenzi; i++) { if (comenzi[i].masa == masa) { comenzi[i].afisare(); total_masa += comenzi[i].total; } } cout << "TOTAL MASA: " << total_masa << " lei" << endl; } };

Codul Original Complet Corectat

#include<iostream> #include<string.h> using namespace std; struct Student { int id; char first_name[100]; char last_name[100]; char email[100]; // CORECTAT: email ca string int age; void afisare() { cout << "Id: " << id << endl; cout << "First name: " << first_name << endl; cout << "Last name: " << last_name << endl; cout << "Email: " << email << endl; cout << "Age: " << age << endl; } // ADAUGAT: funcție pentru inițializarea studentului void initializeaza(int _id, const char* fname, const char* lname, const char* _email, int _age) { id = _id; strcpy(first_name, fname); strcpy(last_name, lname); strcpy(email, _email); age = _age; } }; struct Carte { int id; int student_id; char book_name[100]; char created_date[100]; void afisare() { cout << "Id: " << id << endl; cout << "Student id: " << student_id << endl; cout << "Book name: " << book_name << endl; cout << "Created date: " << created_date << endl; // CORECTAT: mesajul } }; struct Biblioteca { Carte carti[100]; int nr_carti = 0; void adaugaCarte(Carte carte) { if (nr_carti < 100) { // ADAUGAT: verificare limită carti[nr_carti] = carte; nr_carti++; } else { cout << "Biblioteca este plina!" << endl; } } void afiseazaCarti() { cout << "\n=== TOATE CARTILE ===" << endl; for (int i = 0; i < nr_carti; i++) { carti[i].afisare(); cout << "-------------------" << endl; } } void afiseazaCartiStudent(int id) { cout << "\n=== CARTILE STUDENTULUI " << id << " ===" << endl; bool gasit = false; // ADAUGAT: verificare dacă s-au găsit cărți for (int i = 0; i < nr_carti; i++) { if (carti[i].student_id == id) { carti[i].afisare(); cout << "-------------------" << endl; gasit = true; } } if (!gasit) { cout << "Nu exista carti pentru acest student." << endl; } } int pozCarte(int id) { for (int i = 0; i < nr_carti; i++) { if (carti[i].id == id) { return i; } } return -1; } void stergereCarte(int id) { int poz = pozCarte(id); if (poz != -1) { // ADAUGAT: verificare dacă cartea există for (int i = poz; i < nr_carti - 1; i++) { carti[i] = carti[i + 1]; } nr_carti--; cout << "Cartea a fost stearsa cu succes!" << endl; } else { cout << "Cartea cu ID " << id << " nu a fost gasita!" << endl; } } // ADAUGAT: funcție pentru căutarea cărților după nume void cautaCarteNumе(const char* nume) { cout << "\n=== REZULTATE CAUTARE: " << nume << " ===" << endl; bool gasit = false; for (int i = 0; i < nr_carti; i++) { if (strstr(carti[i].book_name, nume) != nullptr) { carti[i].afisare(); cout << "-------------------" << endl; gasit = true; } } if (!gasit) { cout << "Nu s-au gasit carti cu numele: " << nume << endl; } } }; struct Scoala { Student student; Biblioteca biblioteca; // CORECTAT: numele structurii void meniu() { cout << "\n===============================\n"; cout << " BIBLIOTECA SCOALA \n"; cout << "===============================\n"; cout << "1. Adaugare carte" << endl; cout << "2. Afisare cartile mele" << endl; cout << "3. Stergere carte" << endl; cout << "4. Afisare toate cartile" << endl; // ADAUGAT cout << "5. Cautare carte dupa nume" << endl; // ADAUGAT cout << "6. Iesire" << endl; // ADAUGAT cout << "===============================\n"; cout << "Alegerea dvs: "; } // ADAUGAT: funcție pentru inițializarea studentului void initializeazaStudent() { cout << "=== INITIALIZARE STUDENT ===" << endl; cout << "ID student: "; cin >> student.id; cin.ignore(); // pentru a consuma newline-ul cout << "Prenume: "; cin.getline(student.first_name, 100); cout << "Nume: "; cin.getline(student.last_name, 100); cout << "Email: "; cin.getline(student.email, 100); cout << "Varsta: "; cin >> student.age; cin.ignore(); cout << "Student inregistrat cu succes!" << endl; cout << "Bun venit, " << student.first_name << "!" << endl; } void play() { cout << "=== SISTEM BIBLIOTECA SCOALA ===" << endl; initializeazaStudent(); // ADAUGAT: inițializare student la început bool running = true; while(running) { meniu(); char alegere[100] = ""; cin.getline(alegere, 100); int val = atoi(alegere); switch (val) { case 1: adaugareCarte(); break; case 2: afisareCartiStudent(); break; case 3: stergereCarte(); // IMPLEMENTAT break; case 4: // ADAUGAT biblioteca.afiseazaCarti(); break; case 5: // ADAUGAT cautareCarte(); break; case 6: // ADAUGAT: opțiunea de ieșire running = false; cout << "La revedere, " << student.first_name << "!" << endl; break; default: cout << "Alegere incorecta! Va rugam alegeti 1-6." << endl; } // ADAUGAT: pauză pentru citirea mesajelor if (running) { cout << "\nApasati Enter pentru a continua..."; cin.getline(alegere, 100); } } } void afisareCartiStudent() { biblioteca.afiseazaCartiStudent(student.id); } void adaugareCarte() { cout << "\n=== ADAUGARE CARTE NOUA ===" << endl; // ADAUGAT: validare input cout << "ID carte: "; char text_id[100] = ""; cin.getline(text_id, 100); int id = atoi(text_id); if (id <= 0) { cout << "ID invalid! Va rugam introduceti un numar pozitiv." << endl; return; } // ADAUGAT: verificare dacă ID-ul există deja if (biblioteca.pozCarte(id) != -1) { cout << "Exista deja o carte cu ID-ul " << id << "!" << endl; return; } cout << "Numele cartii: "; char book_name[100] = ""; cin.getline(book_name, 100); if (strlen(book_name) == 0) { cout << "Numele cartii nu poate fi gol!" << endl; return; } cout << "Data (DD/MM/YYYY): "; char created_date[100] = ""; cin.getline(created_date, 100); Carte carte; carte.id = id; strcpy(carte.book_name, book_name); strcpy(carte.created_date, created_date); carte.student_id = student.id; biblioteca.adaugaCarte(carte); cout << "Cartea '" << book_name << "' a fost adaugata cu succes!" << endl; } void stergereCarte() { // IMPLEMENTAT: funcția lipsă cout << "\n=== STERGERE CARTE ===" << endl; cout << "ID-ul cartii de sters: "; char text_id[100] = ""; cin.getline(text_id, 100); int id = atoi(text_id); if (id <= 0) { cout << "ID invalid!" << endl; return; } // ADAUGAT: verificare dacă cartea aparține studentului int poz = biblioteca.pozCarte(id); if (poz != -1) { if (biblioteca.carti[poz].student_id == student.id) { biblioteca.stergereCarte(id); } else { cout << "Nu puteti sterge cartea altui student!" << endl; } } else { cout << "Cartea cu ID-ul " << id << " nu a fost gasita!" << endl; } } // ADAUGAT: funcție pentru căutarea cărților void cautareCarte() { cout << "\n=== CAUTARE CARTE ===" << endl; cout << "Numele cartii de cautat: "; char nume[100] = ""; cin.getline(nume, 100); if (strlen(nume) == 0) { cout << "Va rugam introduceti un nume pentru cautare!" << endl; return; } biblioteca.cautaCarteNumе(nume); } }; // ADAUGAT: funcția main pentru demonstrație int main() { Scoala scoala; scoala.play(); return 0; }

Îmbunătățiri majore aduse:

  • Corectat tipul email din int în char[100]
  • Adăugat inițializarea studentului la început
  • Implementat complet opțiunea 3 (ștergere)
  • Adăugat validări pentru toate inputurile
  • Adăugat opțiuni noi: afișare toate cărțile, căutare
  • Adăugat opțiunea de ieșire din program
  • Mesaje informative și interfață mai prietenoasă
  • Verificări de securitate (un student nu poate șterge cărțile altuia)