online: 21; azi: 1149; total: 51604 Manual clasa a xi a - Implementarea structurilor de date - Lista liniara

Probleme Rezolvate



Manual clasa a Xi a

Implementarea structurilor de date

Lista liniara

Pentru biblioteca şcolii sunt aduse cărţi de la mai multe edituri. Cărţile trebuie organizatie în ordinea alfabetică a autorilor, şi pe fiecare autor în ordinea alfabetică a titlurilor. Este posibil ca pentru acelaşi autor şi acelaşi titlu să se primească mai multe exemplare. Se va folosi câte o stivă pentru fiecare autor, în care se va simula teancul de titluri primite, pentru fiecare titlu memorânduse şi numărul de exemplare. Numele autorilor şi adresa vârfului stivei de cărţi asociate se vor memora intr o lista ale carei elemente contin in informaţia utilă două câmpuri: un câmp de tip sir de caractere pentru numele autorului si un câmp de tip pointer căte tipul nod al stivei pentru vârful stivei. Scrieti o aplicatie in c++ care sa asigure următoarele operații prin intermediul unui meniu:
a. Distribuirea pe autori şi titluri a unui teanc de cărţi sosit de la o editură.
b. Afişarea titlurilor şi a numărului de exemplare ale unui autor al cărui nume se citeşte de la tastatură.
c. Afişarea în ordine alfabetia autorilor si a numarului de titluri si de exemplare pentru fiecare autor.
d. Numele autorilor cu cele mai multe, respectiv cu cele mai puţine titluri.
e. Numele autorilor cu cele mai multe, respectiv cu cele mai puţine exemplare.
Pentru a realiza această aplicație în C++, vom aborda următoarele etape:
Mai întâi, definim structurile de date:
# include <iostream>
# include <string>
# include <algorithm>
struct Carte {
std::string titlu;
int numar_exemplare;
Carte* urm;
};
struct Autor {
std::string nume;
Carte* top_stiva;
Autor* urm;
};
Apoi, vom crea funcțiile necesare pentru operațiunile menționate:
// Prototipuri de funcții
void adauga_autor (Autor* &lista_autori, const std::string &nume) ;
void adauga_carte (Autor* &lista_autori, const std::string &nume_autor, const std::string &titlu) ;
Autor* cauta_autor (Autor* lista_autori, const std::string &nume) ;
void afisare_carti_autor (Autor* lista_autori, const std::string &nume_autor) ;
void afisare_autori_titluri_exemplare (Autor* lista_autori) ;
std::pair<std::string, int > autori_min_max_titluri (Autor* lista_autori, bool max_titluri) ;
std::pair<std::string, int > autori_min_max_exemplare (Autor* lista_autori, bool max_exemplare) ;
void eliberare_memorie (Autor* &lista_autori) ;
Acum vom implementa funcțiile și meniul pentru interacțiunea cu utilizatorul:
int main () {
Autor* lista_autori = nullptr ;
int optiune;
std::string nume_autor, titlu_carte;
do {
std::cout << "Meniu:\n" ;
std::cout << "1. Distribuirea cartilor pe autori si titluri\n" ;
std::cout << "2. Afisarea titlurilor si numarului de exemplare ale unui autor\n" ;
std::cout << "3. Afisarea in ordine alfabetica a autorilor si a numarului de titluri si exemplare\n" ;
std::cout << "4. Numele autorilor cu cele mai multe, respectiv cu cele mai putine titluri\n" ;
std::cout << "5. Numele autorilor cu cele mai multe, respectiv cu cele mai putine exemplare\n" ;
std::cout << "0. Iesire\n" ;
std::cout << "Introduceti optiunea: " ;
std::cin >> optiune;
switch (optiune) {
case 1 :
// Implementare distribuire carti
break ;
case 2 :
// Implementare afisare carti autor
break ;
case 3 :
// Implementare afisare autori titluri exemplare
break ;
case 4 :
// Implementare autor cu min/max titluri
break ;
case 5 :
// Implementare autor cu min/max exemplare
break ;
case 0 :
std::cout << "La revedere!\n" ;
break ;
default :
std::cout << "Optiune invalida!\n" ;
}
} while (optiune != 0 );
eliberare_memorie (lista_autori);
return 0 ;
}
Acum vom implementa funcțiile necesare pentru operațiile menționate în enunț:
void adauga_autor (Autor* &lista_autori, const std::string &nume) {
Autor* autor_nou = new Autor;
autor_nou->nume = nume;
autor_nou->top_stiva = nullptr ;
autor_nou->urm = lista_autori;
lista_autori = autor_nou;
}
void adauga_carte (Autor* &lista_autori, const std::string &nume_autor, const std::string &titlu) {
Autor* autor = cauta_autor (lista_autori, nume_autor);
if (!autor) {
adauga_autor (lista_autori, nume_autor);
autor = cauta_autor (lista_autori, nume_autor);
}
Carte* carte_curenta = autor->top_stiva;
while (carte_curenta) {
if (carte_curenta->titlu == titlu) {
carte_curenta->numar_exemplare++;
return ;
}
carte_curenta = carte_curenta->urm;
}
Carte* carte_noua = new Carte;
carte_noua->titlu = titlu;
carte_noua->numar_exemplare = 1 ;
carte_noua->urm = autor->top_stiva;
autor->top_stiva = carte_noua;
}
Autor* cauta_autor (Autor* lista_autori, const std::string &nume) {
Autor* autor_curent = lista_autori;
while (autor_curent) {
if (autor_curent->nume == nume) {
return autor_curent;
}
autor_curent = autor_curent->urm;
}
return nullptr ;
}
void afisare_carti_autor (Autor* lista_autori, const std::string &nume_autor) {
Autor* autor = cauta_autor (lista_autori, nume_autor);
if (!autor) {
std::cout << "Autorul nu a fost gasit.\n" ;
return ;
}
Carte* carte_curenta = autor->top_stiva;
while (carte_curenta) {
std::cout << "Titlu: " << carte_curenta->titlu << " - Exemplare: " << carte_curenta->numar_exemplare << "\n" ;
carte_curenta = carte_curenta->urm;
}
}
void afisare_autori_titluri_exemplare (Autor* lista_autori) {
// Aici se pot folosi alte metode de sortare, cum ar fi sortarea prin inserție sau prin selecție
std::vector<std::string> nume_autori;
Autor* autor_curent = lista_autori;
while (autor_curent) {
nume_autori. push_back (autor_curent->nume);
autor_curent = autor_curent->urm;
}
std:: sort (nume_autori. begin (), nume_autori. end ());
for ( const auto &nume : nume_autori) {
autor_curent = cauta_autor (lista_autori, nume);
int nr_titluri = 0 , nr_exemplare = 0 ;
Carte* carte_curenta = autor_curent->top_stiva;
while (carte_curenta) {
nr_titluri++;
nr_exemplare += carte_curenta->numar_exemplare;
carte_curenta = carte_curenta->urm;
}
std::cout << "Autor: " << autor_curent->nume << " - Titluri: " << nr_titluri << " - Exemplare: " << nr_exemplare << "\n" ;
}
}
std::pair<std::string, int > autori_min_max_titluri (Autor* lista_autori, bool max_titluri) {
Autor* autor_curent = lista_autori;
std::pair<std::string, int > rezultat = { "" , max_titluri ? -1 : 1000000 };
while (autor_curent) {
int nr_titluri = 0 ;
Carte* carte_curenta = autor_curent->top_stiva;
while (carte_curenta) {
nr_titluri++;
carte_curenta = carte_curenta->urm;
}
if (max_titluri && nr_titluri > rezultat.second) {
rezultat = {autor_curent->nume, nr_titluri};
} else if (!max_titluri && nr_titluri < rezultat.second) {
rezultat = {autor_curent->nume, nr_titluri};
}
autor_curent = autor_curent->urm;
}
return rezultat;
}
std::pair<std::string, int > autori_min_max_exemplare (Autor* lista_autori, bool max_exemplare) {
Autor* autor_curent = lista_autori;
std::pair<std::string, int > rezultat = { "" , max_exemplare ? -1 : 1000000 };
while (autor_curent) {
int nr_exemplare = 0 ;
Carte* carte_curenta = autor_curent->top_stiva;
while (carte_curenta) {
nr_exemplare += carte_curenta->numar_exemplare;
carte_curenta = carte_curenta->urm;
}
if (max_exemplare && nr_exemplare > rezultat.second) {
rezultat = {autor_curent->nume, nr_exemplare};
} else if (!max_exemplare && nr_exemplare < rezultat.second) {
rezultat = {autor_curent->nume, nr_exemplare};
}
autor_curent = autor_curent->urm;
}
return rezultat;
}
void eliberare_memorie (Autor* &lista_autori) {
while (lista_autori) {
Autor* autor_curent = lista_autori;
lista_autori = lista_autori->urm;
while (autor_curent->top_stiva) {
Carte* carte_curenta = autor_curent->top_stiva;
autor_curent->top_stiva = autor_curent->top_stiva->urm;
delete carte_curenta;
}
delete autor_curent;
}
}
Acum că avem toate funcțiile implementate, putem să le folosim în meniu pentru a efectua operațiile solicitate. Actualizăm secțiunile corespunzătoare în funcția main :
int main () {
// (...)
do {
// (...)
switch (optiune) {
case 1 :
std::cout << "Introduceti numele autorului: " ;
std::cin >> nume_autor;
std::cout << "Introduceti titlul cartii: " ;
std::cin >> titlu_carte;
adauga_carte (lista_autori, nume_autor, titlu_carte);
break ;
case 2 :
std::cout << "Introduceti numele autorului: " ;
std::cin >> nume_autor;
afisare_carti_autor (lista_autori, nume_autor);
break ;
case 3 :
afisare_autori_titluri_exemplare (lista_autori);
break ;
case 4 :
{
std::pair<std::string, int > autor_max = autori_min_max_titluri (lista_autori, true );
std::pair<std::string, int > autor_min = autori_min_max_titluri (lista_autori, false );
std::cout << "Autorul cu cele mai multe titluri: " << autor_max.first << " - " << autor_max.second << " titluri\n" ;
std::cout << "Autorul cu cele mai putine titluri: " << autor_min.first << " - " << autor_min.second << " titluri\n" ;
}
break ;
case 5 :
{
std::pair<std::string, int > autor_max = autori_min_max_exemplare (lista_autori, true );
std::pair<std::string, int > autor_min = autori_min_max_exemplare (lista_autori, false );
std::cout << "Autorul cu cele mai multe exemplare: " << autor_max.first << " - " << autor_max.second << " exemplare\n" ;
std::cout << "Autorul cu cele mai putine exemplare: " << autor_min.first << " - " << autor_min.second << " exemplare\n" ;
}
break ;
// (...)
}
} while (optiune != 0 );
eliberare_memorie (lista_autori);
return 0 ;
}