Se consideră un fişier cu tip numit „Student" ale cărui articole conţin date despre rezultatul atestării unor studenţi: indicele grupei; numele; notele la trei discipline. Să se compună un program care extrage numele studenţilor ce nu reuşesc la învăţătură, cu indicarea indicelui grupei şi numărului de discipline la care nu reuşeşte studentul respectiv.
Răspunsuri la întrebare
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