Skip to content

detailed analysis of methods for solving the subject "introductory practice"

Notifications You must be signed in to change notification settings

Ms1black/introductory-practice-guide

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 

Repository files navigation

  • Октябрь (+30%)
  • Ноябрь (+30%)
  • Декабрь (+40%)

Содержание:


Общее задание на ознакомительную практику

Используя одномерные массивы, составить список учебной группы в соответствии с вариантом задания.

Используя меню, обеспечить:

  • ввод информации с клавиатуры,
  • ввод информации из уже созданного текстового файла (загрузку базы данных),
  • ввод информации из уже созданного бинарного файла (загрузку базы данных),
  • вывод данных (распечатку ее в виде таблицы) на экран,
  • вывод данных в файл,
  • распечатку информации данных по запросу (задание из варианта),
  • перевод базы данных в текстовый файл,
  • перевод содержимого текстового файла в бинарный файл,
  • добавление записи,
  • изменение записи,
  • удаление записи,
  • сортировка по любому из полей и в любом направлении,
  • выход.

Разговоры о важном


I. Поговорим о входных данных


На данный момент (ноябрь) предполагается, что мы можем ввести данные только с клавиатуры. Чтобы узнать какие --> смотрим в вариант

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 байт)

Сопоставим с нашим вариантом:


II. Поговорим о хранении данных


учеников довольно много, и нам как-то надо все хранить. Но что мы точно знаем? Что набор данных у каждого студента будет одинаковым,



чтобы упростить жизнь Никиты Гудова, мы будем использовать структуры:

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];

Но!! Это всего лишь пример, нам придется брать число больше, так как будет функция добавления студентов


III. Поговорим о вводе данных


Скорее всего - самое тяжелое возможно в этой работе. Так как помимо записи данных, надо реализовать такой алгоритм, который будет давать нам выбор: продолжить ли программу, но об этом позже
Вроде пока все понятно:




IV. Поговорим о выводе данных


В цикле пробежимся по всем студентам и будем поочередно выводить данные - с этим проблем быть не должно.
А вот проблема - красиво оформить это в таблице, на этом моменте появляется

Tip

Давайте посмотрим видосик и морально отдохнем от всего этого ******: https://www.youtube.com/watch?v=ZASCPkwAxWc

Теперь предлагаю отложить этот разговор до реализации функций


Функции


Создание и использование пользовательских функций в С++ состоит из следующих шагов:

  1. Сначала надо объявить функцию - предоставить ее прототип
  2. Определить функцию - описать, что именно должна делать функция
  3. Вызвать функцию

Примеры рассмотрим в реализации


Реализация функций


I. Нейминг

Чтобы было мне было легче писать код, и вам его прочитать - придумаем и распишем имена функций :

AddStudentManual() - ввод информации с клавиатуры

PrintTable() - вывод данных в виде таблицы

SortedYear() -упорядочить данные по году рождения (задание из варианта)

ChangeStudentInfo() - изменение записи

DeleteStudent() - удаление записи

SortedStudents() - сортировка массива


II. Ввод информации с клавиатуры

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'е и работать в дальнейшем с записями не теряя количество записанных студентов


III. Вывод данных

(В разработке)


IV. Распечатка информации по запросу

По факту - самое отстойное в этой работе. Ведь, как я поняла, сам массив менять не надо, а просто требуется вывести отсортированный массив (надо уточнить).
Но хотя бы можно упростить задачу, применив 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/

About

detailed analysis of methods for solving the subject "introductory practice"

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published