Задачка по C++ Таблица студентов с отличными оценками
нужна помощь по задачке на c++, не получается выполнить. Нужно вывести таблицу, содержащую номера, фамилии, оценки студентов, которые имеют только отличные оценки.
Данные: Иванчук С.О. (оценки 4 3 3 4) Панченко И.А.(5 4 4 5) Заец О.М. (3 4 4 4) Вельбицький П.О(4 3 3 3) Сидоренко В.Р.(2 3 3 2) Кравченко З.И.(3 5 4 5) Якубов Р.Н.(5 4 4 3) Зоренко П.М.(4 2 3 3) Берестяк Г.С.(4 5 5 5) Дячик Н.С. (5 5 4 4)
Пробовал вручную всё прописывать, пробовал с помощью 2 файлов, но всё никак не получается(
Попытка:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
int end(int ret = 0){cout << "\nEND\n"; return ret;}
template <typename T>
ostream& operator<<(ostream& out, vector<T>& vT)
{
for(int i = 0; i < vT.size(); i++)
out << vT[i] << ' ';
return out;
}
class student
{
string name, sname;
vector<int> marks;
public:
student();
void get_marks(vector<int>&);
void chng_mark(int, int);
bool is_good_boy();
friend ifstream& operator>>(ifstream&, student&);
friend ostream& operator<<(ostream&, student&);
};
student::student(){}
void student::get_marks(vector<int>& in)
{
marks = in;
}
void student::chng_mark(int wh, int tw)
{
marks[wh] = tw;
}
bool student::is_good_boy()
{
for(int i = 0; i < marks.size(); i++)
if(marks[i] < 4)
return false;
return true;
}
ifstream& operator>>(ifstream& fin, student& s)
{
fin >> s.name;
fin >> s.sname;
return fin;
}
ostream& operator<<(ostream& out, student& s)
{
out << "Student: " << s.name << ' ' << s.sname << endl
<< "Marks[" << s.marks.size() << "]: " << s.marks << endl;
return out;
}
ostream& operator<<(ostream& out, vector<student>& vec)
{
for(int i = 0; i < vec.size(); i++)
out << vec[i] << endl;
return out;
}
int main()
{
vector<student> data;
ifstream fin("ffam.txt");
while(fin)
{
data.push_back(student());
fin >> data.back();
}
data.pop_back();
fin.close();
fin.open("fnote.txt");
vector<int> tm;
int i = 0;
while(fin)
{
tm.clear();
while(fin && fin.peek() != '\n')
{
tm.push_back(int());
fin >> tm.back();
}
fin.get();
data[i].get_marks(tm);
i++;
}
fin.close();
cout << "All students:\n" << data;
cout << "Only good boys:\n";
for(int i = 0; i < data.size(); i++)
if(data[i].is_good_boy())
cout << data[i] << endl;
return end();
}
Далее файл с фамилиями студентов:
Иванчук С.О.
Панченко И.А.
Заец О.М.
Вельбицький П.О.
Сидоренко В.Р.
Кравченко З.И.
Якубов Р.Н.
Зоренко П.М.
Берестяк Г.С.
Дячик Н.С.
И файл с оценками:
4 3 3 4
5 4 4 5
3 4 4 4
4 3 3 3
2 3 3 2
3 5 4 5
5 4 4 3
4 2 3 3
4 5 5 5
5 5 4 4
Компилятор же выдает это:
All students:
Student: Иванчук С.О.
Marks[41]: 4 3 3 4 5 4 4 5 3 4 4 4 4 3 3 3 2 3 3 2 3 5 4 5 5 4 4 3 4 2 3 3 4 5 5 5 5 5 4 4 0
Student: Панченко И.А.
Marks[0]:
Student: Заец О.М.
Marks[0]:
Student: Вельбицький П.О.
Marks[0]:
Student: Сидоренко В.Р.
Marks[0]:
Student: Кравченко З.И.
Marks[0]:
Student: Якубов Р.Н.
Marks[0]:
Student: Зоренко П.М.
Marks[0]:
Student: Берестяк Г.С.
Marks[0]:
Student: Дячик Н.С.
Marks[0]:
Only good boys:
Student: Панченко И.А.
Marks[0]:
Student: Заец О.М.
Marks[0]:
Student: Вельбицький П.О.
Marks[0]:
Student: Сидоренко В.Р.
Marks[0]:
Student: Кравченко З.И.
Marks[0]:
Student: Якубов Р.Н.
Marks[0]:
Student: Зоренко П.М.
Marks[0]:
Student: Берестяк Г.С.
Marks[0]:
Student: Дячик Н.С.
Marks[0]:
END
** Process exited - Return Code: 0 **`**
Ответы (1 шт):
Ну если пройдетесь дебаггером то увидите, что все оценки из файла вводятся за один цикл и попадают 1 ученику в списке. Потому что условие цикла fin.peek() != '\n' не срабатывает.
while(fin && fin.peek() != '\n')
{
tm.push_back(int());
fin >> tm.back();
}
У меня сработало условие fin.peek() != '\r' - это зависит от системы и входного файла. Вообще такой принцип детектирования конца строки наверное не самый лучший. Раз у вас оценки одного ученика находятся в одной строке - считайте строку. Она всегда считается до корректного разделителя в системе. И потом разбирайте строку на отдельные оценки.