Răspuns :
Răspuns:
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
class Student
{
private:
std::string _numeStudent, _indiceleGrupei;
std::vector<int> _noteleStudentului;
public:
Student(std::string numeStudent, std::string indiceleGrupei, std::vector<int> noteleStudentului)
: _numeStudent(numeStudent), _indiceleGrupei(indiceleGrupei), _noteleStudentului(noteleStudentului) {}
std::vector<int> getNoteleStudentului() { return _noteleStudentului; }
std::string getNumeStudent() { return _numeStudent; }
std::string getIndiceGrupa() { return _indiceleGrupei; }
};
static std::vector<Student> creazaStudent()
{
std::vector<Student> vectorStudenti;
std::vector<int> noteStudent;
std::vector<std::string> elementeSeparate;
std::string liniaCurenta, elementCurent;
std::ifstream ifstream("student.in");
if (!ifstream.good())
exit(EXIT_FAILURE);
while (std::getline(ifstream, liniaCurenta))
{
std::istringstream stringStream(liniaCurenta);
while (std::getline(stringStream, elementCurent, ';'))
elementeSeparate.push_back(elementCurent);
for (int i = 2; i <= 4; i++)
noteStudent.push_back(std::stoi(elementeSeparate[i]));
vectorStudenti.emplace_back(elementeSeparate[1], elementeSeparate[0], noteStudent);
elementeSeparate.clear();
noteStudent.clear();
}
ifstream.close();
return vectorStudenti;
}
static void afisareEleviCareNuReusesc(std::vector<Student> &vectorStudenti)
{
for (auto &studentCurent : vectorStudenti)
{
int contorNote{};
for (auto ¬aCurenta : studentCurent.getNoteleStudentului())
if (notaCurenta < 5)
contorNote++;
if (contorNote > 0)
std::cout << "Elevul " << studentCurent.getNumeStudent() << " din grupa "
<< studentCurent.getIndiceGrupa() << " nu reuseste la un numar de "
<< contorNote << " din 3 materii!" << std::endl;
}
}
int main()
{
std::vector<Student> vectorStudenti = creazaStudent();
afisareEleviCareNuReusesc(vectorStudenti);
return 0;
}
Explicație:
- creazaStudent(...) citește line cu linie dintr-un fișier ( cât timp există linii ) „student.in”. Preia linia curentă pe care o introducem într-un istringstream ca mai apoi să o „spargem” în token-uri pe care le vom introduce pe rând într-un vector de unde le vom prelua ulterior pentru a construi obiectul de tip Student ( obiect ce-l vom adăuga într-un vector pe care-l și returnăm la final ).
- afisareEleviCareNuReusesc(...) va parcurge vectorul cu studenți, va prelua vectorul cu notele studentului curent și dacă găsește o notă mai mică decât 5 incrementează contorul notelor. Dacă contorul notelor, după ce a parcurs toate notele studentului este mai mare decât 0 înseamnă că studentul nu se descurcă la o materie deci îl afișăm ( contorul se resetează la 0 de fiecare dată când preluăm din vector un nou Student ).
- Conținutul din „student.in” trebuie să fie de forma
1;Vasilescu Vasile;5;6;6
2;Alex Alexandrescu;5;4;4
1;Ion Ionescu;10;4;9