Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <vector>
- #include <string>
- #include <algorithm>
- #include <fstream>
- using namespace std;
- ifstream fcin("input.txt"); // для тестирования, ввод из файла
- ofstream fcout("output.txt");
- struct student{
- string lastName;
- string firstName;
- string middleName;
- float rating;
- int rank; // место
- };
- int n; // количество студентов
- vector<student> students; //массив с информацией о студентах
- int t; // ответ на вопрос "что требуется определить"
- int k; // для поиска по заданному месту
- int maxRank; //максимальное место
- // Ввод
- void input(){
- fcout << "Введите количество студентов ";
- fcin >> n;
- students.resize(n);//изменяем размер массива, по количеству студентов
- for (int i = 0; i<n; i++){
- fcout << "Информация о студенте #" << i + 1 << ":" << endl;
- fcout << "Фамилия: ";
- fcin >> students[i].lastName;
- fcout << "Имя: ";
- fcin >> students[i].firstName;
- fcout << "Отчество: ";
- fcin >> students[i].middleName;
- fcout << "Значение рейтинга: ";
- fcin >> students[i].rating;
- fcout << endl;
- }
- }
- // компоратор (используется для сортировки массива структур)
- bool cmp(student a, student b){
- // принимает на вход данные о двух студентах и сравнивет их рейтинги
- // возвращает true, если больше рейтинг первого студента, false - если второго, или рейтинги равны
- // если рейтинг первого больше рейтинга второго, сортировка будет производиться по возрастанию
- return a.rating>b.rating;
- }
- // Распределение по местам
- void positioning(){
- sort(students.begin(), students.end(), cmp); // сортируем массив студентов используюя компоратор
- // теперь массив students уже отсортированный
- float p = -1; // значение рейтинга предыдущего студента
- int j = 0; // текущее место
- for (int i = 0; i<n; i++){
- if (students[i].rating != p){
- j++; // Переходим к следующему месту, когда рейтинг текущего студента отличается от рейтинга предыдущего
- }
- students[i].rank = j;
- p = students[i].rating; // рейтинг текущего студента, становится рейтингом предыдущего студента
- }
- maxRank = students[n - 1].rank; // т.к. места по возрастанию, максимальное место у последнего
- }
- void question(){
- fcout << "Что требуется определить?" << endl;
- fcout << "1 - студентов, занявших три первых места" << endl;
- fcout << "2 - студентов, занявших три последних места" << endl;
- fcout << "3 - студентов, занявших k-ое место" << endl;
- fcin >> t;
- if (t == 3){
- fcout << "Какое место искать? ";
- fcin >> k;
- }
- positioning();
- }
- //Заголовок таблицы
- void printTitle(){
- fcout << setw(6) << "Место" << setw(11) << "Фамилия" << setw(9) << "Имя" << setw(14) << "Отчество" << setw(8) << "Рейтинг" << endl;
- }
- //строка таблицы
- void printStudent(student s){
- fcout << setw(6) << s.rank;
- fcout << setw(11) << s.lastName;
- fcout << setw(9) << s.firstName;
- fcout << setw(14) << s.middleName;
- fcout << setw(8) << s.rating;
- fcout << endl;
- }
- // вывод
- void output(){
- fcout.setf(ios::left);//выравнивание по левому краю
- switch (t) {
- case 1:
- fcout << "Студенты, занявшие три первых места:" << endl;
- printTitle();
- for (int i = 0; i<n; i++){
- if (students[i].rank <= 3){
- printStudent(students[i]);
- }
- }
- break;
- case 2:
- fcout << "Студенты, занявшие три последних места:" << endl;
- printTitle();
- for (int i = 0; i<n; i++){
- if (students[i].rank > maxRank-3){
- printStudent(students[i]);
- }
- }
- break;
- case 3:
- fcout << "Студенты, занявшие " << k << "-ое место:" << endl;
- printTitle();
- for (int i = 0; i<n; i++){
- if (students[i].rank == k){
- printStudent(students[i]);
- }
- }
- break;
- }
- }
- int main()
- {
- //setlocale(LC_ALL, "Russian");
- system("chcp 1251");
- input();
- question();
- output();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement