Maria merge la un magazinul de animale si vede N animale. La intrare in magazin este o lista cu numele fiecarui animal, cantitate si cat costa. Cand a plecat de acasa mama ei i-a dat o suma fixa M pe care nu trebuie sa o depaseasca. Scrieti un program care o ajuta pe Maria sa calculeze suma totala pe care trebuie sa o plateasca pentru animalele preferate, iar in cazul in care suma este mai mare decat bugetul, ajut-o pe Maria sa stearga de pe lista animalul care costa cel mai mult. Restrictii: • 0 < N < 30; • 50 < M < 100; Sectiunea 1 – 60p • Definiti o variabila de tip struct numita Animal care sa contina urmatoarele campuri: 5p o denumire animal; o cantitate; o pret. • Creati o structura de date de tip lista liniara simplu inlantuita in care sa adaugati animalele. 5p • Creati o metoda care adauga animalele in lista. 15p • Creati o metoda care afiseaza pe ecran animalele din lista. 10p • Creati o metoda care sorteaza un vector de tip float. Puteti folosi orice algoritm de sortare doriti.
• Creati o metoda care sterge un animal din lista de pe o anumita pozitie. Realizarea metodei Main: • Cititi de la tastatura numerele intregi M si N.
• Cititi de la tastatura cele N animale.
• Adaugati produse in lista prin apelarea metodei de adaugare.
• Afisati pe ecran lista de animale prin apelarea metodei de afisare.4 • Adaugati numele animalelor intr-un vector de tip string.
• Adaugati pretul/animalului intr-un vector de tip float.
• Sortati vectorul in ordine crescatoare prin apelarea metodei de sortare.
• Calculati suma totala pe care trebuie sa o plateasca pentru animalele din lista.
• Verificati daca suma totala se incadreaza in bugetul alocat: daca da, afisati pe ecran vectorul care contine numele animalelor pe prima linie, iar pe urmatoare pretul/animal ordonat crescator si scrieti intr-un fisier text suma totala. o daca nu, cautati in vector animal cu pretul/animal cel mai mare si eliminati-l atat din vector cat si din lista de animal, recalculati suma t
Răspunsuri la întrebare
#include <iostream>
#include <fstream>
#include <forward_list>
#include <string>
using namespace std;
struct Animal
{
string denumire_animal;
int cantitate;
double pret;
};
void inserareAnimalLista(forward_list<Animal>& lista) {
Animal animal_tmp;
cout << "Introduceti denumire, cantitate, pret : ";
cin >> animal_tmp.denumire_animal >> animal_tmp.cantitate >> animal_tmp.pret;
lista.push_front(animal_tmp);
}
void afisareAnimaleLista(forward_list<Animal>& lista) {
for (auto animal : lista) {
cout << animal.denumire_animal << " ";
}
}
void stergereAnimalLista(forward_list<Animal>& lista, unsigned pozitie) {
auto it = lista.begin();
for (int poz_current = 1; poz_current < pozitie && it != lista.end(); ++poz_current)
++it;
if (it == lista.end()) {
cerr << "Eroare, s-a incercat stergerea unui element de pe pozitie inexistenta";
}
else {
if (pozitie == 0) lista.pop_front();
else lista.erase_after(it);
}
}
bool comparareAnimaleDupaPret(Animal& a, Animal& b) {
if (b.pret < a.pret) return 1;
return 0;
}
void sortareListaAnimale(forward_list<Animal>& lista) {
lista.sort(comparareAnimaleDupaPret);
}
int main() {
forward_list<Animal> lista;
int N, M;
//Citire date
cout << "Numar animale : ", cin >> N;
cout << "Suma maxima : ", cin >> M;
//Citire lista de animale
for (int i = 0; i < N; ++i)
inserareAnimalLista(lista);
//Sortare lista animale crescator dupa pret
sortareListaAnimale(lista);
//Calculare total
double total = 0;
for (auto& animal : lista) {
total += animal.pret;
}
//Cat timp totalul e mai mare decat pretul maxim elimina animalul cel mai scump
while (total > M) {
total -= lista.front().pret;
stergereAnimalLista(lista, 0);
--M;
}
//Afiseaza animalele cumparate, scrie total fisier
afisareAnimaleLista(lista);
ofstream fout("total.txt");
fout << total;
fout.close();
}
Nota :
Mi-am rezervat posibilitatea de a modifica putin cerinta. Nu are sens sa memoram animalele in lista ca structuri si sa sortam separat vectorul cu preturi, incercand in acelasi timp sa il sincronizam cu vectorul de nume (am avea fie o functie de sortare complicata in mod inutil, fie ar trebui sa refacem vectorul de nume cautand iar in lista, ceea ce duce la o complexitate O(n²). Structura ne permite sortarea dupa un camp cheie, tinand restul campurilor "atasate" e una dintre avantajele incapsularii datelor.
Astfel am creat functia sortareListaAnimale care foloseste sortarea standard din C++ pentru liste. Ca parametru acesta primeste o alta functie de comparare care primeste doua argumente de tipul datelor stocate in lista. Daca primul argument ar trebui sa fie inaintea celui de-al doilea argument functia de comparare va returna valoarea true. Te invit sa citesti pe internet despre functiile de comparare, acestea fiind un aspect important al limbajului C++.