Загружаем лабораторные…
>_ cifra / labs

~/cpp/labs/

Лабораторные по C++

Требования к коду, оформление отчёта и тестированиеВсё для сдачи работы: правила, шаблон отчёта, редактор блок-схем и примеры тестов.Открыть памяткуСвернуть памятку

Отчёт и блок-схема

Пример оформления отчёта

заготовка.docx

Готовый шаблон для лабораторной работы. Скачайте файл и заполните его своими данными.

Скачать шаблон

Блок-схема алгоритма

draw.io

Редактор блок-схем в браузере. Нарисуйте алгоритм и экспортируйте схему для отчёта.

Перейти в draw.io

Заполните титульный лист своими данными. Для каждого задания укажите условие и вариант, ход решения, блок-схему, исходный код, таблицу тестов и полученные результаты. В конце кратко опишите, что проверили и каких результатов добились.

Как оформить блок-схему

Покажите начало и конец, ввод и вывод, вычисления и переходы между ними. Если в вашем решении есть условие, подпишите выходы «да» и «нет»; для цикла покажите проверку и возврат к ней. Схема должна соответствовать вашей программе.

Сохраните редактируемый файл .drawio, а в отчёт вставьте экспортированную схему в SVG или PNG. Блок-схему составляйте до программирования и уточняйте после изменений алгоритма.

Требования к оформлению кода

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

Это правила оформления курса. Стиль имён и положение констант не являются требованиями языка C++. Перед первой работой разберите параметры и результат функции, именованные константы и проверку ввода, затем объясните каждую часть общей заготовки своими словами.

  1. Каждое задание — отдельная функция. Например, первое задание выполняет calculateRectangleArea, второе — countFullMeters. При необходимости выделяйте дополнительные вспомогательные функции. Не размещайте решения обоих заданий целиком в main.
  2. Метаинформация выводится отдельной функцией. Функция printLabInfo печатает номер лабораторной, вариант, ФИО и группу. Вызывайте её один раз в начале main, до ввода данных и результатов заданий.
  3. Имена переменных и функций отражают смысл. Используйте один стиль, например camelCase: elementCount, lengthCentimeters, calculateAverage. Избегайте aaa, tmp1, qwerty и транслита. Короткие i, j уместны для индексов; x, y — для аргументов формулы, если их смысл пояснён.
  4. Постоянные величины объявляются один раз и называются капсом. Используйте const или constexpr и стиль UPPER_SNAKE_CASE: ARRAY_SIZE, LAB_NUMBER, CENTIMETERS_PER_METER. Размеры из условия, коэффициенты и настройки не должны повторяться по программе как необъяснённые числа. Объявляйте константы перед использованием, отдельно от вычислений.
  5. Данные передаются через параметры, результат — через возвращаемое значение. Если задание предполагает изменение массива или другого объекта, передавайте его подходящим способом. Не используйте глобальные изменяемые переменные для обмена данными между функциями. В лабораторной 6 «Подпрограммы» ввод и вывод выполняйте в main, данные передавайте параметрами.
  6. main показывает общий порядок действий. Вывод метаинформации → ввод и проверка данных → вызовы функций заданий → вывод результатов. Вычисления отделяйте от оформления вывода, чтобы их можно было проверить независимо.
  7. Форматирование единообразное. Используйте отступ в четыре пробела, пробелы вокруг операторов и пустые строки между функциями и логическими частями. Комментарии поясняют алгоритм, ограничения и неочевидные действия; не дублируют каждую строку кода.
  8. Входные данные проверяются, результат понятен. Проверяйте успешность чтения и ограничения задачи до вычислений. Подписывайте результаты каждого задания. Перед сдачей программа должна компилироваться без ошибок; предупреждения компилятора нужно разобрать и устранить.

Пример оформления программы

Демонстрационные задания: вычислить площадь прямоугольника и число полных метров в заданном количестве сантиметров. Замените задания, номер работы, вариант, ФИО и группу своими данными. Константы объявлены в глобальной области, сразу после подключений и до определений функций. Из main они передаются в функции параметрами.

Открыть пример кода C++
lab_structure.cpp
#include <iostream>
#include <string>

constexpr int LAB_NUMBER = 1;
constexpr int VARIANT_NUMBER = 0; // учебный пример
constexpr int CENTIMETERS_PER_METER = 100;
const std::string STUDENT_NAME = "Фамилия Имя";
const std::string GROUP_NAME = "Группа";

void printLabInfo(int labNumber, int variantNumber,
                  std::string studentName, std::string groupName) {
    std::cout << "Лабораторная работа №" << labNumber << '\n'
              << "Вариант: " << variantNumber << '\n'
              << "Студент: " << studentName << '\n'
              << "Группа: " << groupName << "\n\n";
}

// Задание 1: вычислить площадь прямоугольника.
double calculateRectangleArea(double width, double height) {
    return width * height;
}

// Задание 2: найти число полных метров в длине, заданной в сантиметрах.
int countFullMeters(int lengthCentimeters, int centimetersPerMeter) {
    return lengthCentimeters / centimetersPerMeter;
}

int main() {
    printLabInfo(LAB_NUMBER, VARIANT_NUMBER, STUDENT_NAME, GROUP_NAME);

    double width = 0.0;
    double height = 0.0;
    int lengthCentimeters = 0;

    std::cout << "Введите ширину, высоту и длину в сантиметрах: ";
    if (!(std::cin >> width >> height >> lengthCentimeters)) {
        std::cerr << "Ошибка: требуются два числа и целое число.\n";
        return 1;
    }
    if (width <= 0.0 || height <= 0.0 || lengthCentimeters < 0) {
        std::cerr << "Ошибка: стороны должны быть положительными, длина — неотрицательной.\n";
        return 1;
    }

    double rectangleArea = calculateRectangleArea(width, height);
    int fullMeters = countFullMeters(lengthCentimeters, CENTIMETERS_PER_METER);

    std::cout << "Задание 1. Площадь: " << rectangleArea << '\n';
    std::cout << "Задание 2. Полных метров: " << fullMeters << '\n';
    return 0;
}
Ввод: 2 3 250. Результаты заданий: площадь 6 и 2 полных метра. Кнопка копирования переносит всю программу.

В примере constexpr задаёт целочисленные константы, известные при компиляции, а const запрещает менять строки с данными студента. Число 100 именовано один раз; функция второго задания получает его как параметр. Обе функции вычислений возвращают результат, а печать выполняет main.

Повторить: main · создание функций · области видимости · ввод и вывод.

Тестирование

Как исправить найденную ошибку

Пример: для массива из трёх элементов программа допускает индекс 3. Сократите вход до трёх значений, запишите ожидаемый отказ и выдвиньте гипотезу о неверной границе. Найдите проверку index > size и замените её на index >= size до обращения к элементу. Повторите входы 0, 2, 3 и пустой массив; сохраните найденный случай в таблице тестов. Исправление проверяется повторным запуском.

Для составного условия различайте два вида покрытия. Покрытие решений проверяет истинный и ложный исход всего if. Покрытие условий дополнительно требует истинного и ложного значения каждой проверяемой части. Для a>0 && b!=0 возьмите (1,1), (0,1), (1,0); поясните короткое замыкание во втором случае. Одних обычных значений для такой проверки недостаточно.

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

Ниже показаны типы данных и основные исходы проверки. Базовый пример: программа читает два вещественных числа a и b и вычисляет a / b. При b = 0, ошибке формата или отсутствии одного числа она должна вывести «Ошибка входных данных» и завершить вычисление. Последние строки отдельно показывают ошибки сборки, формат, ограничения ресурсов и незапущенный тест; лимиты проверяйте, если они установлены заданием.

СитуацияВходОжидаетсяФактическиИтог
Обычные данные
6 3
Результат: 2
Результат: 2
Пройден
Допустимая граница
0 3
Результат: 0
Результат: 0
Пройден
Отрицательное значение
-6 3
Результат: -2
Результат: -2
Пройден
Запрещённое значение
6 0
Ошибка входных данных
Ошибка входных данных
Пройден
Неверный формат
abc 3
Ошибка входных данных
Ошибка входных данных
Пройден
Данных не хватает
6 и конец ввода
Ошибка входных данных
Ошибка входных данных
Пройден
Ошибка вычислений
6 3
Результат: 2
Результат: 3
Не пройден
Ошибочно отклонён верный ввод
0 3
Результат: 0
Ошибка входных данных
Не пройден
Ошибочно принят неверный ввод
6 0
Ошибка входных данных
inf или продолжение вычислений
Не пройден
Аварийное завершение
6 3
Результат: 2 и завершение
Падение программы
Не пройден
Зависание
6 3
Результат: 2 и завершение
Программа не заканчивает работу
Не пройден
Неполный вывод
6 3
Результат: 2
Нет ответа или нельзя понять, к какому заданию он относится
Не пройден
Нарушен требуемый формат
6 3
Только число 2, если так требует условие
Ответ вычислен верно, но формат другой
Не пройден
Ошибка компиляции
До запуска
Исполняемая программа
Пропущена точка с запятой; компилятор отклонил код
Тесты не выполнены
Ошибка компоновки
До запуска
Исполняемая программа
Вызвана объявленная функция без определения
Тесты не выполнены
Превышен лимит памяти
Большой допустимый набор
Результат в установленном лимите
Программа бесконтрольно выделяет память
Не пройден
Тест не запускался
6 3
Результат: 2
Фактический результат отсутствует
Не выполнен

Для своей задачи составьте такую же таблицу. Проверьте обычный вход, минимальные и максимальные допустимые значения, неверный формат и нарушения ограничений. Для контейнеров добавьте пустой набор и один элемент; для условий — обе ветви; для циклов — ноль, один и несколько проходов, если они допустимы условием.

Вещественные результаты сравнивайте с обоснованным допуском. Например, для ответа 1 / 3 при абсолютном допуске 0.000001 значение 0.333333 подходит, а 0.33 — нет. Отдельно убедитесь, что программа соблюдает требуемый формат вывода.

  1. 01
    lab_01.cpp · подготовка по навыкам

    Переменные и выражения

    Линейные алгоритмы, вычисление выражений, ввод исходных данных и вывод результатов.

    Типы, деление и остаток · Вещественные вычисления

  2. 02
    lab_02.cpp · подготовка по навыкам

    Ветвления

    Условия, альтернативы, переключатели и структурное тестирование программы.

    Типы, деление и остаток · Вещественные вычисления · Условия и логические операции

  3. 03
    lab_03.cpp · подготовка по навыкам

    Циклы

    Три задания: while и do while, вычисления циклом for и таблица значений функции.

    Типы, деление и остаток · Вещественные вычисления · Условия и логические операции · Цикл и накопление результата

  4. 04
    lab_04.cpp · подготовка по навыкам

    Строки

    Обработка символов, поиск, преобразование слов и проверка границ строки.

    Условия и логические операции · Цикл и накопление результата · find, substr, erase, insert и getline

  5. 05
    lab_05.cpp · подготовка по навыкам

    Массивы

    Одномерные и многомерные массивы, индексы, поиск и преобразование элементов.

    Условия и логические операции · Цикл и накопление результата · Размер, индекс и обход vector · Экстремумы, индексы и матрицы

  6. 06
    lab_06.cpp · подготовка по навыкам

    Подпрограммы

    Пользовательские функции, передача массивов и отделение вычислений от ввода-вывода.

    Условия и логические операции · Цикл и накопление результата · find, substr, erase, insert и getline · Экстремумы, индексы и матрицы · Передача диапазона и длины · Изменение через ссылку и выходные параметры

  7. 07
    lab_07.cpp · подготовка по навыкам

    Файлы

    Обработка числового файла, текстовой матрицы и подсчёт строк и слов в тексте.

    Условия и логические операции · Цикл и накопление результата · find, substr, erase, insert и getline · Открытие, последовательное чтение и ошибки файла

  8. 08
    lab_08.cpp · подготовка по навыкам

    Функции

    Два задания: генератор функций с замыканием и простая рекурсивная функция.

    Условия и логические операции · Время жизни объекта · Лямбда и захват настроек по значению · База рекурсии, шаг и возврат результата