Advertisement
Guest User

class

a guest
Dec 7th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <vector>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. ifstream in("input.txt");
  9. ofstream out("output.txt");
  10.  
  11.  
  12. /*
  13.   Небольшое введение в классы для лучшего понимания.
  14.  
  15.   Ты являешься экземпляром класса Студент.
  16.  
  17.   Студент это можно сказать, как шаблон(понятие не из проганья).
  18.   У студента есть такие параметры, как ИМЯ, ФАМИЛИЯ, ГРУППА (переменные
  19.   присущие классу Студент), а так же у него есть какие-то функции.
  20.  
  21.   К примеру:
  22.     void прийти_на_пару(),
  23.     void прогулять_пару(),
  24.     void проспать().
  25.  
  26.   Почему void? Потому что это просто действия без результата.
  27.  
  28.     int получить_оценку() - результатом будет оценка.
  29.     bool сдать_задачу() - результатом будет "сдал" или "не сдал".
  30.  
  31.   Данные функции будут относиться только к классу Студент.
  32.  
  33.   Любую вещь в мире можно описать через класс будь то машина, дерево, игрушка
  34.   и т.д.
  35.   К примеру экземпляром класса Машина будет Лада Калина.
  36.   У всех них есть свойства и действия, которые свойственны только им.
  37.  
  38. */
  39.  
  40. class Pupil{
  41.  
  42. /*
  43.  
  44.   private - перевод: приватный -
  45.   это методы(так называются функции в классе) или переменные о которых
  46.   другим знать не нужно, а нужно знать только нашему классу.
  47.  
  48. */
  49. private:
  50.     string lastName, firstName;
  51.     string clas;
  52.     int grade;
  53.  
  54. public:
  55.     /*
  56.       Стандартный конструктор. Создает пустой экземпляр класса.
  57.       Мы будем использовать его для создания массивов, но так же
  58.       его можно использовать для создание одного экземпляра.
  59.       Выглядеть это будет так:
  60.  
  61.       Pupil anna;
  62.  
  63.     */
  64.     Pupil(){}
  65.  
  66.     /*
  67.       Конструктор для одного экземпляра с заданными
  68.       именем, фамилией, классом, оценкой.
  69.       Экземпляр класса будет выглядеть так:
  70.  
  71.       Pupil anna("Литвинова", "Анна", "В", 5);
  72.  
  73.     */
  74.     Pupil(string last, string first, string cl, int gr)
  75.     {
  76.       /*
  77.  
  78.         Ключевое слово this говорит компилятору о том,
  79.         что это значение принадлежит только этому экземпляру и только
  80.         этому классу и никаким другим больше.
  81.  
  82.         Если ты не напишешь this, то он будет искать переменную с таким именем
  83.         в своей области видимости.
  84.  
  85.         К примеру, если бы ты просто написала lastName = last,
  86.         то это выдало бы ошибку, ибо такой переменной
  87.         в функции нет. Но если ты пишешь this->lastName, то он обращается
  88.         именно к переменной класса.
  89.  
  90.       */
  91.         this->lastName = last;
  92.         this->firstName = first;
  93.         this->clas = cl;
  94.         this->grade = gr;
  95.     }
  96.  
  97.     /*
  98.  
  99.       Функции, которые задают переменным класса значения.
  100.       Они используется только для экземпляров данного класса
  101.       и без них не могут быть использованы.
  102.  
  103.       К примеру можно поменять или назначить имя:
  104.  
  105.       anna.set_firstName("Анна");
  106.  
  107.       Так же и для элемента массива:
  108.  
  109.       arr[i].set_firstName("Анна");
  110.  
  111.     */
  112.     void set_firstName(string name)
  113.     {
  114.       this->firstName = name;
  115.     }
  116.  
  117.     void set_lastName(string name)
  118.     {
  119.       this->lastName = name;
  120.     }
  121.  
  122.     void set_class(string class_name)
  123.     {
  124.       this->clas = class_name;
  125.     }
  126.  
  127.     void set_grade(int grade)
  128.     {
  129.       this->grade = grade;
  130.     }
  131.  
  132.     /*
  133.       Ключевое слово static говорит нам, что данную функцию
  134.       или переменную можно запускать от имени данного класса,
  135.       так сказать "маршировать под знаменем этого войска".
  136.  
  137.       Их можно использовать без инициализации экземпляра,
  138.       просто написав Имя_класса::функция_класса.
  139.  
  140.       К примеру:
  141.  
  142.       Pupil::sort(arr, n);
  143.  
  144.       При этом arr будет массивом экземпляров.
  145.     */
  146.  
  147.     // Сортировка выбором
  148.     static void sort(Pupil* (&a), int n){
  149.         string lowkey;
  150.         int i, j, lowindex;
  151.         for(i = 0; i < n - 1; i++)
  152.         {
  153.             lowindex = i;
  154.             lowkey = a[i].clas;
  155.             for(j = i + 1; j < n; j++)
  156.                 if(a[j].clas < lowkey)
  157.                 {
  158.                     lowkey = a[j].clas;
  159.                     lowindex = j;
  160.                 }
  161.             swap(a[i], a[lowindex]);
  162.         }
  163.     }
  164.  
  165.     static void midGrade(Pupil* arr, int n){
  166.       // Вектор букв классов
  167.       // В данном векторе только по одной букве данного класса
  168.         vector<string>classes;
  169.  
  170.       // Переменные для суммы оценок и кол-ва учеников
  171.         int m_grade = 0, m_count = 0;
  172.  
  173.  
  174.       // Создает вектор букв классов выглядит так [А, Б, В]
  175.         for(int i = 0; i < n; i++)
  176.         /*
  177.  
  178.           find(vec.begin, vec.end, elem)
  179.  
  180.           find пробегает по всему вектору от начала(vec.begin)
  181.           до его конца(vec.end) в поисках заданного элемента elem.
  182.  
  183.           Если он не находит elem, то результатом его работы
  184.           будет конец вектора (vec.end)
  185.  
  186.         */
  187.         // Проверяем нет ли такой буквы в classes
  188.             if(find(classes.begin(), classes.end(), arr[i].clas) == classes.end())
  189.               classes.push_back(arr[i].clas);
  190.  
  191.       // Проходим по всеми классам
  192.         for(int i = 0; i < classes.size(); i++){
  193.       // Проходим во всем ученикам
  194.           for(int j = 0; j < n; j++)
  195.           // Выбираем только тех учеников, которые относятся к классу
  196.           // classes[i] к примеру к классу под буквой А
  197.             if(classes[i] == arr[j].clas){
  198.               // Суммируем оценки
  199.               m_grade += arr[j].grade;
  200.               // Считаем кол-во учеников данного класса
  201.               m_count++;
  202.             }
  203.  
  204.           // Считаем среднее арифметическое
  205.             m_grade = m_grade / m_count;
  206.           // Выводим получившийся результат в файл
  207.             out << "Средняя оценка класса " << classes[i] << " равна " << m_grade << endl;
  208.           // Обнуляем переменные для суммы оценок и кол-ва учеников
  209.             m_grade = 0;
  210.             m_count = 0;
  211.         }
  212.  
  213.         // Делаем перевод на следующую строку в файле
  214.         out << endl;
  215.     }
  216.  
  217.     void print(){
  218.       // Выводим одну запись
  219.       out << this->firstName << " " << this->lastName << " " << this->clas << " " << this->grade << endl;
  220.     }
  221.  
  222. };
  223.  
  224.  
  225. int main(){
  226.   setlocale(LC_ALL, "Russian");
  227.   int n;
  228.   // Чтение кол-ва учеников из файла
  229.   in >> n;
  230.  
  231.   string lastName, firstName;
  232.   string class_n;
  233.   int grade;
  234.  
  235.   // Массив экземпляров класса Pupil
  236.   Pupil* arr = new Pupil [n];
  237.  
  238.   // Чтение учеников из файла
  239.   for(int i = 0; i < n; i++){
  240.     in >> firstName >> lastName >> class_n >> grade;
  241.     arr[i].set_lastName(lastName);
  242.     arr[i].set_firstName(firstName);
  243.     arr[i].set_class(class_n);
  244.     arr[i].set_grade(grade);
  245.   }
  246.  
  247.   /*
  248.     Вызов статически функций класса
  249.     Они работаю без вызова через экземпляр и не будут работать,
  250.     если их вызвать так.
  251.  
  252.     Пример вызова через экземпляр: exemplar.sort(arr, n); - будет ошибка
  253.     ПРАВИЛЬНО: Pupil::sort(arr, n);
  254.   */
  255.  
  256.   Pupil::sort(arr, n);
  257.   Pupil::midGrade(arr, n);
  258.  
  259.   // Вывод результата в файл
  260.   for(int i = 0; i < n; i++){
  261.     arr[i].print();
  262.   }
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement