Advertisement
Guest User

Untitled

a guest
Dec 21st, 2014
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <vector>
  4. #include <string>
  5. #include <algorithm>
  6. #include <fstream>
  7.  
  8. using namespace std;
  9.  
  10. ifstream fcin("input.txt"); // для тестирования, ввод из файла
  11. ofstream fcout("output.txt");
  12.  
  13. struct student{
  14.     string lastName;
  15.     string firstName;
  16.     string middleName;
  17.     float rating;
  18.     int rank; // место
  19. };
  20.  
  21. int n; // количество студентов
  22. vector<student> students; //массив с информацией о студентах
  23. int t; // ответ на вопрос "что требуется определить"
  24. int k; // для поиска по заданному месту
  25. int maxRank; //максимальное место
  26.  
  27. // Ввод
  28. void input(){
  29.     fcout << "Введите количество студентов ";
  30.     fcin >> n;
  31.  
  32.     students.resize(n);//изменяем размер массива, по количеству студентов
  33.  
  34.     for (int i = 0; i<n; i++){
  35.         fcout << "Информация о студенте #" << i + 1 << ":" << endl;
  36.         fcout << "Фамилия: ";
  37.         fcin >> students[i].lastName;
  38.         fcout << "Имя: ";
  39.         fcin >> students[i].firstName;
  40.         fcout << "Отчество: ";
  41.         fcin >> students[i].middleName;
  42.         fcout << "Значение рейтинга: ";
  43.         fcin >> students[i].rating;
  44.         fcout << endl;
  45.     }
  46. }
  47.  
  48. // компоратор (используется для сортировки массива структур)
  49. bool cmp(student a, student b){
  50.     // принимает на вход данные о двух студентах и сравнивет их рейтинги
  51.     // возвращает true, если больше рейтинг первого студента, false - если второго, или рейтинги равны
  52.     // если рейтинг первого больше рейтинга второго, сортировка будет производиться по возрастанию
  53.  
  54.     return a.rating>b.rating;
  55. }
  56.  
  57. // Распределение по местам
  58. void positioning(){
  59.     sort(students.begin(), students.end(), cmp); // сортируем массив студентов используюя компоратор
  60.     // теперь массив students уже отсортированный
  61.     float p = -1; // значение рейтинга предыдущего студента
  62.     int j = 0; // текущее место
  63.     for (int i = 0; i<n; i++){
  64.         if (students[i].rating != p){
  65.             j++; // Переходим к следующему месту, когда рейтинг текущего студента отличается от рейтинга предыдущего
  66.         }
  67.         students[i].rank = j;      
  68.         p = students[i].rating; // рейтинг текущего студента, становится рейтингом предыдущего студента
  69.     }
  70.     maxRank = students[n - 1].rank; // т.к. места по возрастанию, максимальное место у последнего
  71. }
  72.  
  73. void question(){
  74.     fcout << "Что требуется определить?" << endl;
  75.     fcout << "1 - студентов, занявших три первых места" << endl;
  76.     fcout << "2 - студентов, занявших три последних места" << endl;
  77.     fcout << "3 - студентов, занявших k-ое место" << endl;
  78.     fcin >> t;
  79.     if (t == 3){
  80.         fcout << "Какое место искать? ";
  81.         fcin >> k;
  82.     }
  83.     positioning();
  84. }
  85.  
  86. //Заголовок таблицы
  87. void printTitle(){
  88.     fcout << setw(6) << "Место" << setw(11) << "Фамилия" << setw(9) << "Имя" << setw(14) << "Отчество" << setw(8) << "Рейтинг" << endl;
  89. }
  90.  
  91. //строка таблицы
  92. void printStudent(student s){
  93.     fcout << setw(6) << s.rank;
  94.     fcout << setw(11) << s.lastName;
  95.     fcout << setw(9) << s.firstName;
  96.     fcout << setw(14) << s.middleName;
  97.     fcout << setw(8) << s.rating;
  98.     fcout << endl;
  99. }
  100.  
  101. // вывод
  102. void output(){
  103.     fcout.setf(ios::left);//выравнивание по левому краю
  104.     switch (t) {
  105.     case 1:
  106.         fcout << "Студенты, занявшие три первых места:" << endl;
  107.         printTitle();
  108.         for (int i = 0; i<n; i++){
  109.             if (students[i].rank <= 3){
  110.                 printStudent(students[i]);
  111.             }
  112.         }
  113.         break;
  114.     case 2:
  115.         fcout << "Студенты, занявшие три последних места:" << endl;
  116.         printTitle();
  117.         for (int i = 0; i<n; i++){
  118.             if (students[i].rank > maxRank-3){
  119.                 printStudent(students[i]);
  120.             }
  121.         }
  122.         break;
  123.     case 3:
  124.         fcout << "Студенты, занявшие " << k << "-ое место:" << endl;
  125.         printTitle();
  126.         for (int i = 0; i<n; i++){
  127.             if (students[i].rank == k){
  128.                 printStudent(students[i]);
  129.             }
  130.         }
  131.         break;
  132.     }
  133. }
  134.  
  135. int main()
  136. {
  137.     //setlocale(LC_ALL, "Russian");
  138.     system("chcp 1251");   
  139.    
  140.     input();
  141.     question();
  142.     output();
  143.  
  144.     return 0;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement