С++ Структуры для начинающих (обычные). Создание массива студентов

Некоторое первое время я с трудом понимал смысл обычных структур. Но структуры удобное и полезное средство для программирования собственных типов данных объединением нескольких существующих типов в один собственный. На этой странице продемонстрирован пример частичного решения возможной лабораторной работы: создание списка студентов. Решение будет выполнено на самом обычном массиве структур.
На картинке пример ввода данных:
Структуры в C++ Список студентов

На заметку:

  • Внутри структуры можно группировать несколько переменных.
  • Внутри структуры можно описывать собственные для структуры функции.

  • Функциями, описанными внутри структуры, очень удобно обрабатывать переменные, собранные в структуре.
  • При использовании нескольких структур, внутренности каждой не мешают внутренностям другихф жить. Т. е. в разных структурах можно использовать одно и то же название. Например, если есть две структуры: Студент и Профессор, то в обоих может быть функция sort, но для струтуры Студент функция будет срабатывать так, как описана внутри структуры Студент, а для профессора так, как описана внутри структуры Профессор.
Когда вы используете смешанный ввод: число-строка-число — вам нужно предупредить преждевременное попадание в строку символа нажатой клавиши Enter:


Я для предупреждения просто игнорировал это нажатие с помощью метода ignore, описанного внутри объекта cin. Просто если вводите переменную-число, то нажатый Enter никуда не исчезает, а остается в потоке ввода, а потом в момент хватается строковой переменной.
Дело в том, что никакая нажатая нами клавиша никуда не исчезает. Следы наших действий остаются внутри памяти компьютера. Нажали Enter, наша числовая переменная проглотить не успела, ей не дали, но символ нажатия остался висеть в памяти, строковая переменная увидела его и заглотила влёт. И получилось, что хоть мы и не вводили значения для строковой переменной, мы ввели в неё символ клавиши Enter, т. е. сделали пустую строку.
Надеюсь, что вышенаписанное разобрано и всё понятно. Дальше может/должен возникнуть вопрос: "И что мне теперь с этим дальше делать?". Дальше можно описывать решения для некоторых возникающих задач: вывести список студентов, кто родился между 1999 и 2000 годами; найти всех студентов, у кого сегодня день рождения; вывести список студентов из нужного образовательного учреждения; выполнить сортировку студентов и др.
Сразу всё я писать не стану. Просто добавлю функциональности для вывода студентов, рождённых между заданными двумя годами.
Поскольку работа с массивом предполагает определённую сложность и необходимость в запоминании что там есть что, я массив преобразую в структуру, вы это увидите в коде. Использование новообразованной структуры поможет чтению кода, поэтому вам будет легче понять происходящее. В остальном: добавляется одна функция, которая на вход принимает два параметра: границы годов. Левая граница, в моём случае, включается в диапазон, правая граница не включается. Это обусловлено тем, что если нам нужно найти один год, лежащий между близкими, то включение в диапазон нахождения обоих годов зацепит два года. Кто помнит уроки алгебры и геометрии и занятия с координатами, тот ещё помнит об обозначении скобками: [year1; year2). По хорошему, надо делать не так, но я сделаю так. Между двумя годами не должно цеплять ни левый, ни правый года, это вы можете исправить в нужный вам вид, просто исправив знаки проверки на меньше/больше.

Исправления с датой поступления оставляю на вас. Это совсем несложно.
Гораздо сложнее отсортировать массив структур, например, по каким-нибудь датам.
Предлагаемый сейчас мной способ не относится к стандартным вариантам решения. Обычно перегружают операцию, но тема перегрузок операций на моём сайте пока ещё не описывалась. Поэтому выбрано решение, которое возможно было получить изучив все темы сайта, описанные до наступления текущего момента времени. Я просто создам отдельную функцию, которую буду использовать для сортировки дат. Честно говоря, я её позаимствовал из уже существующих: http://www.cyberforum.ru/post4374459.html и немного адаптировал под свой стиль написания кода в этой статье.
  • Пример с сортировкой массива по возрастанию дат рождений.

  • Если вы хотите русских шрифтов, не забывайте, что в свойствах консоли шрифт должен быть Lusidia Console.
Как правило, люди, дошедшие до структур, уже понимают кое-что, поэтому многие моменты для них вода. Основную сложность, по моему маленькому опыту, представляет из себя как раз сортировка дат. Некоторым новичкам сложно сортировать не только даты, но и массив строк, если каждая строка в массиве представлена в виде указателя на строку. На самом деле это не так сложно, как может казаться. Сейчас я показываю тот же самый код, что был приведён только что, но вместо сортировки по датам сортирую массив студентов по строкам. В лучшем виде вам нужно делать собственное меню, в котором предлагать вариант сортировки, нужный пользователю. Поскольку основной трудностью оказываются сортировка по датам и сортировка по строкам, именно это я и показываю. Но учтите, что показываемый мной способ не идеал для подражания, а нужность для заполнения некоторых пробелов в знании.
  • Пример с сортировкой массива ппофамильно (А-Я).

Обычно для того, чтобы достучаться до элемента внутри структуры, нужно использовать точку или (в случае с указательными переменными с целью удобочитаемости) может использоваться операция ->. Но иногда, как видно по коду, используют операцию разрешения области видимости: ::. Поскольку я объявлял внутри структуры другую структуру, то чтобы достучаться до элементов той внутренней структуры, я должен был разрешить себе видеть из основной структуры элементы внутренней, что я и проделывал операцей разрешения видимости. Такой финт ушами помог мне без проблем задействовать внутреннюю структуру как самостоятельный тип данных внутри параметров вспомогательной функции, предназначенной для сортировки дат.
Надеюсь, эта тема сильно поможет вам в вашем изучении С++.

2 комментария на «“С++ Структуры для начинающих (обычные). Создание массива студентов”»

  1. Gen:

    В функции void Student::Show() //Функция показывает данные структуры на экране опечатка.В 61 строке вместо Date[0],Date[1],Date[2] должно быть Postup[0],Postup[1],Postup[2].
    И если можно вопрос.Как отсортировать по Family ? ❓

  2. Аноним:

    Burn вроде как сжигать переводится, получается концлагерь 😆

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/vadim-dunaev/samouchitel-javascript/?lfrom=15589587
Яндекс.Метрика