Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- ifstream in("input.txt");
- ofstream out("output.txt");
- /*
- Небольшое введение в классы для лучшего понимания.
- Ты являешься экземпляром класса Студент.
- Студент это можно сказать, как шаблон(понятие не из проганья).
- У студента есть такие параметры, как ИМЯ, ФАМИЛИЯ, ГРУППА (переменные
- присущие классу Студент), а так же у него есть какие-то функции.
- К примеру:
- void прийти_на_пару(),
- void прогулять_пару(),
- void проспать().
- Почему void? Потому что это просто действия без результата.
- int получить_оценку() - результатом будет оценка.
- bool сдать_задачу() - результатом будет "сдал" или "не сдал".
- Данные функции будут относиться только к классу Студент.
- Любую вещь в мире можно описать через класс будь то машина, дерево, игрушка
- и т.д.
- К примеру экземпляром класса Машина будет Лада Калина.
- У всех них есть свойства и действия, которые свойственны только им.
- */
- class Pupil{
- /*
- private - перевод: приватный -
- это методы(так называются функции в классе) или переменные о которых
- другим знать не нужно, а нужно знать только нашему классу.
- */
- private:
- string lastName, firstName;
- string clas;
- int grade;
- public:
- /*
- Стандартный конструктор. Создает пустой экземпляр класса.
- Мы будем использовать его для создания массивов, но так же
- его можно использовать для создание одного экземпляра.
- Выглядеть это будет так:
- Pupil anna;
- */
- Pupil(){}
- /*
- Конструктор для одного экземпляра с заданными
- именем, фамилией, классом, оценкой.
- Экземпляр класса будет выглядеть так:
- Pupil anna("Литвинова", "Анна", "В", 5);
- */
- Pupil(string last, string first, string cl, int gr)
- {
- /*
- Ключевое слово this говорит компилятору о том,
- что это значение принадлежит только этому экземпляру и только
- этому классу и никаким другим больше.
- Если ты не напишешь this, то он будет искать переменную с таким именем
- в своей области видимости.
- К примеру, если бы ты просто написала lastName = last,
- то это выдало бы ошибку, ибо такой переменной
- в функции нет. Но если ты пишешь this->lastName, то он обращается
- именно к переменной класса.
- */
- this->lastName = last;
- this->firstName = first;
- this->clas = cl;
- this->grade = gr;
- }
- /*
- Функции, которые задают переменным класса значения.
- Они используется только для экземпляров данного класса
- и без них не могут быть использованы.
- К примеру можно поменять или назначить имя:
- anna.set_firstName("Анна");
- Так же и для элемента массива:
- arr[i].set_firstName("Анна");
- */
- void set_firstName(string name)
- {
- this->firstName = name;
- }
- void set_lastName(string name)
- {
- this->lastName = name;
- }
- void set_class(string class_name)
- {
- this->clas = class_name;
- }
- void set_grade(int grade)
- {
- this->grade = grade;
- }
- /*
- Ключевое слово static говорит нам, что данную функцию
- или переменную можно запускать от имени данного класса,
- так сказать "маршировать под знаменем этого войска".
- Их можно использовать без инициализации экземпляра,
- просто написав Имя_класса::функция_класса.
- К примеру:
- Pupil::sort(arr, n);
- При этом arr будет массивом экземпляров.
- */
- // Сортировка выбором
- static void sort(Pupil* (&a), int n){
- string lowkey;
- int i, j, lowindex;
- for(i = 0; i < n - 1; i++)
- {
- lowindex = i;
- lowkey = a[i].clas;
- for(j = i + 1; j < n; j++)
- if(a[j].clas < lowkey)
- {
- lowkey = a[j].clas;
- lowindex = j;
- }
- swap(a[i], a[lowindex]);
- }
- }
- static void midGrade(Pupil* arr, int n){
- // Вектор букв классов
- // В данном векторе только по одной букве данного класса
- vector<string>classes;
- // Переменные для суммы оценок и кол-ва учеников
- int m_grade = 0, m_count = 0;
- // Создает вектор букв классов выглядит так [А, Б, В]
- for(int i = 0; i < n; i++)
- /*
- find(vec.begin, vec.end, elem)
- find пробегает по всему вектору от начала(vec.begin)
- до его конца(vec.end) в поисках заданного элемента elem.
- Если он не находит elem, то результатом его работы
- будет конец вектора (vec.end)
- */
- // Проверяем нет ли такой буквы в classes
- if(find(classes.begin(), classes.end(), arr[i].clas) == classes.end())
- classes.push_back(arr[i].clas);
- // Проходим по всеми классам
- for(int i = 0; i < classes.size(); i++){
- // Проходим во всем ученикам
- for(int j = 0; j < n; j++)
- // Выбираем только тех учеников, которые относятся к классу
- // classes[i] к примеру к классу под буквой А
- if(classes[i] == arr[j].clas){
- // Суммируем оценки
- m_grade += arr[j].grade;
- // Считаем кол-во учеников данного класса
- m_count++;
- }
- // Считаем среднее арифметическое
- m_grade = m_grade / m_count;
- // Выводим получившийся результат в файл
- out << "Средняя оценка класса " << classes[i] << " равна " << m_grade << endl;
- // Обнуляем переменные для суммы оценок и кол-ва учеников
- m_grade = 0;
- m_count = 0;
- }
- // Делаем перевод на следующую строку в файле
- out << endl;
- }
- void print(){
- // Выводим одну запись
- out << this->firstName << " " << this->lastName << " " << this->clas << " " << this->grade << endl;
- }
- };
- int main(){
- setlocale(LC_ALL, "Russian");
- int n;
- // Чтение кол-ва учеников из файла
- in >> n;
- string lastName, firstName;
- string class_n;
- int grade;
- // Массив экземпляров класса Pupil
- Pupil* arr = new Pupil [n];
- // Чтение учеников из файла
- for(int i = 0; i < n; i++){
- in >> firstName >> lastName >> class_n >> grade;
- arr[i].set_lastName(lastName);
- arr[i].set_firstName(firstName);
- arr[i].set_class(class_n);
- arr[i].set_grade(grade);
- }
- /*
- Вызов статически функций класса
- Они работаю без вызова через экземпляр и не будут работать,
- если их вызвать так.
- Пример вызова через экземпляр: exemplar.sort(arr, n); - будет ошибка
- ПРАВИЛЬНО: Pupil::sort(arr, n);
- */
- Pupil::sort(arr, n);
- Pupil::midGrade(arr, n);
- // Вывод результата в файл
- for(int i = 0; i < n; i++){
- arr[i].print();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement