Răspuns :
#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++.

Vă mulțumim că ați ales să vizitați site-ul nostru dedicat Informatică. Sperăm că informațiile disponibile v-au fost utile. Dacă aveți întrebări sau aveți nevoie de asistență suplimentară, vă rugăm să ne contactați. Revenirea dumneavoastră ne va bucura, iar pentru acces rapid, nu uitați să ne salvați la favorite!