В текстовом файле есть ведомость результатов сдачи экзаменов студенческой группы. Ведомость содержит для каждого студента фамилию, имя отчество и оценки по пяти предметам. Студентов в группе не более 20 человек.
Написать программу, которая предоставляет следующую информацию:
- список студентов (ФИО);
- список студентов, которые сдали все экзамены только на 5;
- список студентов, которые имеют хотя-бы одну тройку по экзаменам;
- список студентов, у которых есть двойки. Если студент, имеет более чем одну двойку, он исключается из списка.
Задачу решил Naikon, он, как всегда, впереди всех. Собственно, вот код:
#include <iostream> #include <fstream> #include <windows.h> #include <vector> using namespace std; struct Student { void fn_student_list()///Выводим список студентов { for(unsigned int i=0;i<vec_FIO.size();++i)cout<<vec_FIO[i]<<endl; } vector<string>vec_FIO; vector<int> vec_math,vec_physics,vec_chemistry,vec_geometry,vec_rus; void fn_student_exam_5()///Список студентов которые сдали все экзамены только на пять { bool five=false; for(unsigned int i=0;i<vec_FIO.size();++i) { unsigned int sum=0; if(vec_math[i]==5)sum+=5; if(vec_physics[i]==5)sum+=5; if(vec_chemistry[i]==5)sum+=5; if(vec_geometry[i]==5)sum+=5; if(vec_rus[i]==5)sum+=5; if(sum==25) { cout<<vec_FIO[i]<<endl; five=true; } } if(five==false)cout<<"Таких студентов нет :("<<endl; } void fn_student_exam_3()///Список студентов которые имеют хотя-бы одну тройку по экзаменам { bool three=false; for(unsigned int i=0;i<vec_FIO.size();++i) { unsigned int sum=0; if(vec_math[i]==3)sum++; if(vec_physics[i]==3)sum++; if(vec_chemistry[i]==3)sum++; if(vec_geometry[i]==3)sum++; if(vec_rus[i]==3)sum++; if(sum>=1) { cout<<vec_FIO[i]<<endl; three=true; } } if(three==false)cout<<"Таких студентов нет :("<<endl; } void fn_student_exam_2()///Список студентов у которых есть двойки { bool two=false; for(unsigned int i=0;i<vec_FIO.size();++i)///удаляем студентов у котороыъ больше одной двойки { int sum=0; if(vec_math[i]==2)sum++; if(vec_physics[i]==2)sum++; if(vec_chemistry[i]==2)sum++; if(vec_geometry[i]==2)sum++; if(vec_rus[i]==2)sum++; if(sum>=2) { vec_FIO.erase(vec_FIO.begin()+i); vec_math.erase(vec_math.begin()+i); vec_physics.erase(vec_physics.begin()+i); vec_chemistry.erase(vec_chemistry.begin()+i); vec_geometry.erase(vec_geometry.begin()+i); vec_rus.erase(vec_rus.begin()+i); } } for(unsigned int i=0;i<vec_FIO.size();++i)///Выводим список студентов { unsigned int sum=0; if(vec_math[i]==2)sum++; if(vec_physics[i]==2)sum++; if(vec_chemistry[i]==2)sum++; if(vec_geometry[i]==2)sum++; if(vec_rus[i]==2)sum++; if(sum>=1) { cout<<vec_FIO[i]<<endl; two=true; } } if(two==false)cout<<"Таких студентов нет :("<<endl; } }; int main() { Student student; string str,fstr; SetConsoleOutputCP(1251); int value,math,physics,chemistry,geometry,rus,number_of_students=0; ifstream in("file.txt"); if(!in)///Если не смогли открыть файл { cout<<"Can't open file\n"; return 1; } getline(in,str); while(in>>str) { fstr+=str+' '; for(int i=0;i<2;++i) { in>>str; fstr+=str+' '; } student.vec_FIO.push_back(fstr); fstr.clear(); in>>math; student.vec_math.push_back(math); in>>physics; student.vec_physics.push_back(physics); in>>chemistry; student.vec_chemistry.push_back(chemistry); in>>geometry; student.vec_geometry.push_back(geometry); in>>rus; student.vec_rus.push_back(rus); number_of_students++; if(number_of_students==20)break; } in.close();///Закрыли файл start:cout<<"\n1. Список студентов (ФИО)"<<endl; cout<<"2. Список студентов которые сдали все экзамены только на пять."<<endl; cout<<"3. Список студентов которые имеют хотя-бы одну тройку по экзаменам."<<endl; cout<<"4. Список студентов у которых есть двойки."<<endl; cout<<"(если студент имеет больше одной двойки он исключается из списка)."<<endl; cout<<"5. Введите 'q' для выхода"<<endl; cout<<"Пожалуйста сделайте свой выбор: "; char c; cin>>c; switch(c) { case '1': { student.fn_student_list(); goto start; } case '2': { student.fn_student_exam_5(); goto start; } case '3': { student.fn_student_exam_3(); goto start; } case '4': { student.fn_student_exam_2(); goto start; } case 'q': { return 0; } default: { cout<<"Неверный ввод :( Попробуйте снова\n"; goto start; } } return 0; }
Как я успел увидеть, код платформо-зависимый, обратите внимание на заголовки, строка 3, там подключен файл <windows.h>. То есть, под линуксом уже такую программу сразу не скомпилируешь. Но из этой ситуации можно легко выбраться. В программе функция SetConsoleOutputCP(1251); для установки кодировки cp-1251, это необходимо, если в консоли появляются каракули вместо символов русского алфавита. Но в линуксе с отображением кириллицы в консоли все в порядке, а значит и эта функция не нужна. Так что, те, кто на линуксе работают, перед компиляцией программы, смело комментируйте строки 3 и 95, они вам не нужны.
Входные данные из файла:
- Ф.И.О Алгебра Физика Химия Геометрия Русс. язык
- Иванов И. И. 3 4 4 4 5
- Карпов И. С. 5 5 5 5 3
- Петров С. К. 3 3 4 4 3
- Борзенков А. А. 4 4 4 4 4
- Константинов П. П. 5 5 5 5 5
Смотри на результат работы программы:
1. Список студентов (ФИО) 2. Список студентов которые сдали все экзамены только на пять. 3. Список студентов которые имеют хотя-бы одну тройку по экзаменам. 4. Список студентов у которых есть двойки. (если студент имеет больше одной двойки он исключается из списка). 5. Введите 'q' для выхода Пожалуйста сделайте свой выбор: 1 Иванов И. И. Карпов И. С. Петров С. К. Борзенков А. А. Константинов П. П. 1. Список студентов (ФИО) 2. Список студентов которые сдали все экзамены только на пять. 3. Список студентов которые имеют хотя-бы одну тройку по экзаменам. 4. Список студентов у которых есть двойки. (если студент имеет больше одной двойки он исключается из списка). 5. Введите 'q' для выхода Пожалуйста сделайте свой выбор: 2 Константинов П. П. 1. Список студентов (ФИО) 2. Список студентов которые сдали все экзамены только на пять. 3. Список студентов которые имеют хотя-бы одну тройку по экзаменам. 4. Список студентов у которых есть двойки. (если студент имеет больше одной двойки он исключается из списка). 5. Введите 'q' для выхода Пожалуйста сделайте свой выбор: 3 Иванов И. И. Карпов И. С. Петров С. К. 1. Список студентов (ФИО) 2. Список студентов которые сдали все экзамены только на пять. 3. Список студентов которые имеют хотя-бы одну тройку по экзаменам. 4. Список студентов у которых есть двойки. (если студент имеет больше одной двойки он исключается из списка). 5. Введите 'q' для выхода Пожалуйста сделайте свой выбор: 4 Таких студентов нет :( 1. Список студентов (ФИО) 2. Список студентов которые сдали все экзамены только на пять. 3. Список студентов которые имеют хотя-бы одну тройку по экзаменам. 4. Список студентов у которых есть двойки. (если студент имеет больше одной двойки он исключается из списка). 5. Введите 'q' для выхода Пожалуйста сделайте свой выбор:
Комментарии
Alistra
Юзала код, который представлен в решении. В итоге он не считывает все строки и смысл удалять двоечников из массива если в файле они всё ровно останутся. Не судите строго мой код, это моя первая задача такой сложности. Реализовала удаление двоечников из самого файла и вывод их данных. Хотелось бы услышать критику(оценку).)))
Alistra
Den4ik
А можно в эту программу добавить пункт добавления новых студентов?
NaikoN
Спасибо :)
admin
Исправил!
Сергей Клементьев
Решение есть, а в строке «статус» стоит прочерк :-)