- Октябрь (+30%)
- Ноябрь (+30%)
- Декабрь (+40%)
Используя одномерные массивы, составить список учебной группы в соответствии с вариантом задания.
Используя меню, обеспечить:
- ввод информации с клавиатуры,
- ввод информации из уже созданного текстового файла (загрузку базы данных),
- ввод информации из уже созданного бинарного файла (загрузку базы данных),
- вывод данных (распечатку ее в виде таблицы) на экран,
- вывод данных в файл,
- распечатку информации данных по запросу (задание из варианта),
- перевод базы данных в текстовый файл,
- перевод содержимого текстового файла в бинарный файл,
- добавление записи,
- изменение записи,
- удаление записи,
- сортировка по любому из полей и в любом направлении,
- выход.
На данный момент (ноябрь) предполагается, что мы можем ввести данные только с клавиатуры. Чтобы узнать какие --> смотрим в вариант
Caution
Этот пример взят из 11 варианта, количество и тип входных данных в вашем варианте могут различаться
Вспоминим некоторые из типов данных:
Имя (индентификатор) типа | Тип данных |
---|---|
bool |
Логический тип |
char |
Символьный тип |
wchar_t |
Символьный двухбайтовый тип |
double |
Вещественные числа двойной точности |
float |
Вещественные числа |
int |
Целые числа |
void |
Значение не возвращается (пустое значение) |
Note
char
: представляет один символ в кодировке ASCII. Занимает в памяти 1 байт (8 бит). Может хранить любое значение из диапазона от -128 до 127, либо от 0 до 255
wchar_t
: представляет расширенный символ. На Windows занимает в памяти 2 байта (16 бит), на Linux - 4 байта (32 бита). Может хранить любой значение из диапазона от 0 до 65 535 (при 2 байтах), либо от 0 до 4 294 967 295 (для 4 байт)
Сопоставим с нашим вариантом:
учеников довольно много, и нам как-то надо все хранить. Но что мы точно знаем? Что набор данных у каждого студента будет одинаковым,
чтобы упростить жизнь Никиты Гудова, мы будем использовать структуры:
Note
структуры - обычно служат для хранения каких-то общедоступных данных в виде публичных переменных
формат определения структуры выглядит таким образом:
struct имя_структуры
{
компоненты_структуры
};
Теперь напишем структуру, подходящую для нашего варианта:
struct Student {
char lastName[30];
char firstName[30];
char patronymic[30];
int birthYear;
int course;
int marks[3];
};
Теперь можно будет запереть всех студентов в массив (тюрьму). Никита точно будет доволен)
Вот так мы создаем массив структур (тюрьма с камерами на одного студента). Предположим, что Салов еще с нами. Тогда, для нашей группы надо 29 камер:
struct Student people[29];
Но!! Это всего лишь пример, нам придется брать число больше, так как будет функция добавления студентов
Скорее всего - самое тяжелое возможно в этой работе. Так как помимо записи данных, надо реализовать такой алгоритм, который будет давать нам выбор: продолжить ли программу, но об этом позже
Вроде пока все понятно:
В цикле пробежимся по всем студентам и будем поочередно выводить данные - с этим проблем быть не должно.
А вот проблема - красиво оформить это в таблице, на этом моменте появляется
Tip
Давайте посмотрим видосик и морально отдохнем от всего этого ******: https://www.youtube.com/watch?v=ZASCPkwAxWc
Теперь предлагаю отложить этот разговор до реализации функций
Создание и использование пользовательских функций в С++ состоит из следующих шагов:
- Сначала надо объявить функцию - предоставить ее прототип
- Определить функцию - описать, что именно должна делать функция
- Вызвать функцию
Примеры рассмотрим в реализации
Чтобы было мне было легче писать код, и вам его прочитать - придумаем и распишем имена функций :
AddStudentManual()
- ввод информации с клавиатуры
PrintTable()
- вывод данных в виде таблицы
SortedYear()
-упорядочить данные по году рождения (задание из варианта)
ChangeStudentInfo()
- изменение записи
DeleteStudent()
- удаление записи
SortedStudents()
- сортировка массива
void AddStudentManual(Student people[], int &count) { // На входе у функции - массив студентов, и их количетсво (тут мы работаем с оригинальной переменной count)
if (count >= 100) { // Проверяем, не превышен ли лимит студентов
std::cout << "Невозможно добавить больше студентов.\n"; // Если превышен - шлём пользователя в баню
return; // Если лимит достигнут, выходим из функции
}
std::cout << "Введите фамилию: ";
std::cin >> students[count].lastName;
std::cout << "Введите имя: ";
std::cin >> students[count].firstName;
std::cout << "Введите отчество: ";
std::cin >> students[count].patronymic;
std::cout << "Введите год рождения: ";
std::cin >> students[count].birthYear;
std::cout << "Введите курс: ";
std::cin >> students[count].course;
std::cout << "Введите 3 оценки: ";
for (int i = 0; i < 3; ++i) { // Цикл для заполнения 3х оценок
std::cin >> people[count].marks[i];
}
count++;
char continueChoice; // Заведем переменную символьного типа, чтобы обеспечить выход из программы
std::cout << "Добавить еще одного студента? (+/-): ";
std::cin >> continueChoice;
if (continueChoice == '+') { // В этом случае, если символ "+", то мы продолжим выполнять программу
AddStudentManual(people, count); // Чтобы продолжить программу достаточно её вызвать
}
}
Когда в функции используются параметры с символом &
, это означает передачу параметра по ссылке. Это означает, что функция работает непосредственно с оригинальной переменной, а не с её копией.
Зачем? Чтобы количество сохранить в main'е и работать в дальнейшем с записями не теряя количество записанных студентов
(В разработке)
По факту - самое отстойное в этой работе. Ведь, как я поняла, сам массив менять не надо, а просто требуется вывести отсортированный массив (надо уточнить).
Но хотя бы можно упростить задачу, применив printTable(), чтобы в это функции еще раз не прописывать вывод
void SortedYear(Student people[], int count) { // На входе у функции - массив студентов, и их количетсво (тут мы работаем с копией переменной count, так как она не будет меняться)
// Пузырьковая сортировка по году рождения
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - 1 - i; j++) {
if (students[j].birthYear > students[j + 1].birthYear) {
// Меняем местами элементы
Student copy = people[j];
people[j] = people[j + 1];
people[j + 1] = copy;
}
}
}
// После сортировки выводим отсортированные данные
std::cout << "Студенты, отсортированные по году рождения:\n";
std::cout << "----------------------------------------\n";
PrintTable(peolpe, count);
}
Как работает пузырьковая сортировка? Вот статья, правда там Java Script, но синтаксис не сильно различается, а логика та же https://thecode.media/bubble-sort/