Перейти к основному содержанию
EDU-MMCS
Вы используете гостевой доступ (Вход)

Программирование на C++

  1. В начало
  2. Курсы
  3. Осенний семестр
  4. Математика, механика
  5. Программирование на C++
  6. Модуль 2. Массивы и структурные типы данных. Лабор...
  7. Лабораторная работа №3. Структуры, перечисления, п...

Лабораторная работа №3. Структуры, перечисления, пары и кортежи

Открыто с: вторник, 22 сентября 2026, 13:45
Требуемые условия завершения

Цель занятия: научиться объединять связанные данные в составные типы и возвращать из функции несколько логически связанных результатов.

Необходимые темы и конструкции C++:

  • struct, инициализация и доступ к полям
  • передача структуры по значению, ссылке и константной ссылке
  • enum class и switch
  • std::pair, std::tuple, структурное связывание
  • псевдонимы типов через using

Структура проекта

Разместите решение в следующих файлах:

  • main.cpp
  • models.h
  • models.cpp
  • tests.cpp

Общие требования

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

Основные задания

  1. Точка и отрезок

    Описать структуры Point и Segment. Реализовать вычисление длины отрезка и его середины.

    Требуемая сигнатура:

    struct Point { double x; double y; };
    struct Segment { Point begin; Point end; };
    double length(const Segment& segment);
    Point midpoint(const Segment& segment);
    Входные данные / вызов Результат
    Segment{{0,0},{4,2}}
    length=4.472...; midpoint=(2,1)
  2. Дни недели

    Добавить перечисление, элементы которого соответствуют дням недели

    enum class DayOfWeek { SUNDAY, MONDAY, ... }; // остальные элементы добавить самостоятельно
    
    Создать:
    • функцию void showDayOfWeek(DayOfWeek dayOfWeek), которая выводит на консоль название дня недели с использованием оператора switch;
    • функцию DayOfWeek nextDayOfWeek(DayOfWeek dayOfWeek), которая возвращает следующий день недели. При этом не используйте оператор выбора, а только условные оператор и оператор явного приведения типа. Сперва идёт проверка, является ли день субботой, если да, возвращается воскресенье. Иначе переменная dayOfWeek приводится к целому числу при помощи оператора явного приведения типа static_cast<int>(dayOfWeek). К полученному числу прибавляется единица и результат сложения при помощи static_cast<dayOfWeek>() приводится к дню недели, который возвращает функция;
    • функцию DayOfWeek prevDayOfWeek(DayOfWeek dayOfWeek), которая возвращает предыдущий день недели. Алгоритм работы аналогичен предыдущей функции;
    • функцию bool isWeekend(DayOfWeek dayOfWeek), которая возвращает истину, если день является выходным;
  3. Вид треугольника

    По трём положительным длинам сторон проверить существование треугольника и определить его вид по сторонам.

    Требуемая сигнатура:

    enum class TriangleKind { invalid, scalene, isosceles, equilateral };
    TriangleKind classify_triangle(double a, double b, double c);

    Требования:

    • Сначала проверьте неравенства треугольника.
    • Результат выведите через отдельную функцию с switch.
    Входные данные / вызов Результат
    classify_triangle(5, 5, 8)
    isosceles
    classify_triangle(1, 2, 3)
    invalid

    Замечание:

    Помните о том, что непосредственная проверка чисел с плавающей запятой на равенство (a == b) нежелательна. Используйте константу DBL_EPSILON следующим образом: abs(a - b) < DBL_EPSILON
  4. Три результата измерений

    Для трёх вещественных измерений вернуть минимум, максимум и среднее арифметическое в кортеже. В вызывающем коде распаковать результат структурным связыванием.

    Требуемая сигнатура:

    std::tuple<double, double, double> summarize(double a, double b, double c);
    Входные данные / вызов Результат
    summarize(7.5, 2.0, 5.5)
    min=2; max=7.5; mean=5
  5. Модульные тесты

    Для построенных функций (кроме showDayOfWeek) реализуйте модульные тесты. Не менее трёх тестов для каждой.

Домашнее задание

  1. Корректная дата

    Описать структуру даты и функции проверки корректности и перехода к следующему дню.

    Требуемая сигнатура:

    struct Date { int day; int month; int year; };
    bool is_valid(const Date& date);
    Date next_date(const Date& date);

    Требования:

    • Для некорректной исходной даты next_date не вызывается.
    Входные данные / вызов Результат
    next_date({28, 2, 2024})
    {29, 2, 2024}
  2. Пересечение прямоугольников

    Прямоугольник со сторонами, параллельными осям, задаётся координатами левой нижней и правой верхней вершин. Найти прямоугольник пересечения.

    Требуемая сигнатура:

    struct Rectangle { double left; double bottom; double right; double top; };
    bool intersection(const Rectangle& a, const Rectangle& b, Rectangle& result);

    Требования:

    • Касание по стороне или вершине не считать пересечением положительной площади.
    Входные данные / вызов Результат
    {0,0,4,3}, {2,1,5,5}
    true; {2,1,4,3}
  3. Рациональное число

    Описать структуру рационального числа. Реализовать нормализацию знака и сокращение дроби, сложение и сравнение двух дробей.

    Требуемая сигнатура:

    struct Rational { long long numerator; long long denominator; };
    void normalize(Rational& value);
    Rational add(const Rational& a, const Rational& b);
    int compare(const Rational& a, const Rational& b);

    Требования:

    • Знаменатель не должен быть равен нулю.
    • После нормализации знаменатель положителен, числитель и знаменатель взаимно просты.
    Входные данные / вызов Результат
    add({1,6}, {1,4})
    {5,12}

◄ Лабораторная работа №2. Функции, ссылки и многофайловая программа
Лабораторная работа №4. Представление данных, битовые операции и случайные числа ►

Блоки

Пропустить Навигация

Навигация

  • В начало

    • Страницы сайта

      • Мои курсы

      • Теги

    • Мои курсы

    • Курсы

      • Осенний семестр

        • Прикладная математика и информатика

        • Фундаментальная информатика и ИТ

        • Математика, механика

          • Программирование на C++

            • Самое главное

            • Лекции

            • Коллоквиумы

            • Модуль 1. Введение в C++. Лабораторные работы

            • Модуль 1. Контрольные работы

            • Модуль 2. Массивы и структурные типы данных. Лабор...

              • ЗаданиеЛабораторная работа №3. Структуры, перечисления, п...

              • ЗаданиеЛабораторная работа №4. Представление данных, бито...

              • ЗаданиеЛабораторная работа №5. Статические массивы и осно...

              • ЗаданиеЛабораторная работа №6. std::array, std::span и ук...

              • ЗаданиеЛабораторная работа №7. Сортировки, оценка сложнос...

            • Модуль 2. Контрольные работы

            • Модуль 3. Файлы и динамические структуры данных. Л...

            • Модуль 3. Контрольные работы

          • Введение в проект - Проект 1

          • ТМ_26

          • ЭМТДТ

          • ООП 2019

          • Программирование*

        • Педагогическое образование

        • Магистратура

          • Разработка мобильных приложений и компьютерных игр

        • Аспирантура

        • Вечернее отделение

        • Другое

        • Этика ИИ

        • ОНС-Н_1

        • Прогр-ММ-2

        • Прогр-ММ-1

        • АБиМ-ИИБ26

        • МСиТВ_АБМ_2026

        • Python Eng

        • Экзамен ИКТ

        • ТестИИ

        • Информатика-Осень-ПМИ-2

        • Информатика-осень-ПМИ-1

      • Весенний семестр

        • Прикладная математика и информатика

        • Фундаментальная информатика и ИТ

        • Математика, механика

        • Педагогическое образование

        • Магистратура

          • Разработка мобильных приложений и компьютерных игр

        • Аспирантура

        • Вечернее отделение

        • Другое

      • Воскресная компьютерная школа

        • Пользователь компьютера плюс

        • Пользователь прикладных программ

        • Программирование I ступень

        • Программирование II ступень

        • Программирование III ступень

        • Архив

      • Воскресная математическая школа

        • Открытое тестирование РНОМЦ и мехмата ЮФУ

          • Открытое тестирование РНОМЦ и мехмата ЮФУ - 2026

          • Открытое тестирование РНОМЦ и мехмата ЮФУ - 2025

        • Олимпиадная математическая школа

        • Повышение квалификации

        • Доступная математика

        • Лаборатория математического онлайн-образования мех...

        • Осенняя универсиада

        • Научно-практическая конференция

        • ВМШ

          • ВМШ -2025

          • ВМШ - 2026

        • Летняя олимпиадная математическая школа РНОМЦ и ме...

      • Государственная итоговая аттестация

      • Дополнительное образование

      • Олимпиады

      • Видеолекции

      • Разное

      • Архив курсов

      • Заочная школа мехмата ЮФУ

Дополнительные блоки

Вы используете гостевой доступ (Вход)
Программирование на C++
Сводка хранения данных
Скачать мобильное приложение
Яндекс.Метрика