Лабораторная работа № 3 «Декомпозиция программы и контроль ее корректности»

Цель работы

Задание

Задание выполняется как переработка своего варианта решения ЛР № 1. При его утрате можно взять готовое общее решение.

  1. Определить в программе тип данных для температуры и шкалы.

    Шкала (Scale) может быть Кельвина, Цельсия или Фаренгейта. Температура (Temperature) — это значение и шкала, в котором оно измерено.

  2. Реализовать оператор ввода температуры из текстового потока в формате: 0K (по Кельвину), -42C (по Цельсию), 451F (по Фаренгейту).

    На данном этапе контролировать корректность ввода не нужно.

    1. Реализовать оператор ввода шкалы из текстового потока.

    2. Воспользоваться оператором ввода шкалы для реализации оператора ввода температуры.

  3. Обеспечить автоматическое тестирование кода из пункта 2.

    1. Создать функцию-тест test_temperature_input без параметров и возвращаемого значения и вызывать ее раньше остальной программы.

    2. В функции-тесте сделать однотипные проверки для каждой из шкал: вычитать температуру из строки (через std::istringstream) и с помощью assert() проверить, что считывание успешно и корректное.

    3. Добиться прохождения всех проверок (программа не должна завершаться по assert()).

  4. Написать функцию, преобразующую температуру input из шкалы from в шкалу to.

    На данном этапе контролировать корректность температуры не нужно.

  5. Реализовать оператор «меньше» для двух температур в произвольных шкалах.

  6. Перевести построение гистограммы с чисел на температуры.

    Необходимо принимать на входе программы последовательность температур, шкалы которых могут быть разными, и строить их гистограмму.

    Если вариант ЛР № 1 предполагает вывод значений (например, в подписях), это нужно делать по Кельвину.

  7. Выделить модуль для работы с температурами.

    1. Создать заголовочный файл temperature.h, где разместить определения шкалы и температуры, а также объявления операторов над ними и функции преобразования.

    2. Перенести реализацию функций, объявленных в temperature.h, в файл temperature.cc. Добавить последний в список файлов для компиляции в CMakeLists.txt.

  8. В temperature.cc написать функцию, проверяющую корректность температуры (допустимость шкалы, неотрицательность по Кельвину).

  9. Добавить проверку корректности температуры при вводе.

    1. Устанавливать флаг потока в операторе чтения из него шкалы. При чтении температуры этот флаг необходимо проверять.

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

      Указание. Ошибка может возникнуть и при чтении числа-значения.

    3. Проверять состояние потока в основной программе после чтения каждой температуры. При ошибке печатать сообщение и завершать работу программы.

    4. Добавить в функцию-тест проверки того, что некорректные температуры переводят поток в состояние ошибки.

  10. Выделить тест в отдельную программу.

    1. Перенести функцию-тест в файл test_input.cc, переименовав в main().

    2. Добавить с CMakeLists.txt инструкции для компиляции теста в программу по аналогии с основной программой (add_executable). Программа должна называться test_input.

      Указание. Тест использует код не только из test_input.cc.

    3. Организовать запуск проверяющей программы как теста, добавив в конец CMakeLists.txt (справка):

      enable_testing()
      add_test(NAME test_input COMMAND test_input)

      Указание. Когда в проекте несколько целей (targets), как в данном случае несколько add_executable(), чтобы собирать их все, в CLion необходимо выбрать конфигурацию сборки Build all (вверху).

  11. Освоить запуск тестов программой ctest.

    1. Выполнить тест, перейдя в терминале CLion в каталог сборки (например, cmake-build-debug) и дав команду:

      ctest . (в конце точка)

      Убедиться, что тест выполнился успешно. Занести в отчет вывод ctest.

    2. Внести в программу ошибку так, чтобы тест не проходил и пересобрать его. Повторить прогон теста командой (ключ -V дает более полный вывод):

      ctest -V .

      Убедиться, что тест провалился. Занести в отчет вывод ctest.

      Вернуть программу в работоспособное состояние.