Перейти к содержанию

Лабораторная работа 1. Вариант 15

К списку вариантов · Общие требования

Два задания выполняются в двух отдельных файлах: lab01_v15_task1.cpp и lab01_v15_task2.cpp. Каждый файл начинается со своей шапки и блока тестов; весь исполняемый код находится в main.

Задание 1. Четверть кольца

Постановка задачи

Деталь ограничена двумя концентрическими дугами и двумя перпендикулярными радиальными отрезками. Угол сектора — 90°. Найдите её площадь.

Закрашена область, площадь которой нужно найти. Рисунок схематический; размеры берите из ввода. Все длины заданы в метрах.

Расчётная формула:

\[ s = \dfrac{\pi \left(\mathrm{outer}^2 - \mathrm{inner}^2\right)}{4} \]

Результат: Площадь s, м².

Ограничения

Исходные данные вводятся с клавиатуры в порядке строк таблицы.

Обозначение Величина Тип Допустимые значения
outer наружный радиус, м double \(0.001 \le \mathrm{outer} \le 100\)
inner внутренний радиус, м double \(0.001 \le \mathrm{inner} \le 100\)

Дополнительные условия и постоянные величины:

  • Должно выполняться \(\mathrm{inner} < \mathrm{outer}\).
  • постоянная: \(\pi = 3.141592653589793\).

Допустимое отличие результата от математического эталона — \(10^{-9} \cdot \max(1,\ |s_\text{эт}|)\); вычислять допуск в программе не нужно.

Требования к выполнению

  1. Вывести приглашение к вводу: перечислить величины, их единицы и порядок (outer, inner).
  2. Прочитать 2 значения с помощью scanf_s в переменные типа double.
  3. Проверить результат чтения. Если прочитаны не все числа — вывести Input error и завершить программу через return 1;.
  4. До любых вычислений проверить все ограничения из раздела выше. Если нарушено хотя бы одно — вывести Data error и завершить программу через return 1;. Результат при этом не вычисляется и не выводится.
  5. Вычислить \(s\) по формуле из постановки задачи.
  6. Вывести подписанный результат с единицей измерения; само число — форматом %.10lf. Завершить программу через return 0;.
  7. Перенести формулу, смысл обозначений и ограничения в шапку исходного файла, а классы эквивалентности и тесты границ — в блок тестов, до первого запуска (как составлять тесты).

Примеры тестовых данных

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

Ввод Ожидаемое число в выводе
2 1 2.3561944902
0.5 0.3 0.1256637061

Результат иррационален, поэтому значения приближённые: показанные цифры верны, но последняя может отличаться на единицу из-за округления. Сравнивайте с допуском \(10^{-9} \cdot \max(1,\ |s_\text{эт}|)\).

Задание 2. Температура смеси: сравнение типов

Постановка задачи

Смешивают две порции одной жидкости: массу m1 при температуре t1 и массу m2 при температуре t2. Найдите температуру смеси после выравнивания.

Расчётная формула:

\[ \mathrm{result} = \dfrac{m_1t_1 + m_2t_2}{m_1 + m_2} \]

Единица результата — °C.

Считать нужно трижды — в int, в float и в double — по одной и той же формуле, с одинаковым порядком операций и расстановкой скобок. Само число здесь не главное: задание в том, чтобы получить три результата и объяснить, чем они различаются и почему.

Ограничения

Все исходные значения целые: их читают один раз в переменные типа int в порядке строк таблицы, чтобы все три расчёта начинались с одних и тех же чисел.

Обозначение Величина Тип Допустимые значения
m1 масса первой порции, кг int \(1 \le m_1 \le 1000\)
t1 температура первой порции, °C int \(1 \le t_1 \le 1000\)
m2 масса второй порции, кг int \(1 \le m_2 \le 1000\)
t2 температура второй порции, °C int \(1 \le t_2 \le 1000\)

Дополнительные условия и допущения:

  • Обе температуры должны быть не выше 99 °C.
  • Смешивается одна и та же жидкость; теплоёмкость постоянна, потерь и фазовых переходов нет.

Допустимое отличие от математического эталона — \(2 \cdot 10^{-6} \cdot \max(1,\ |s_\text{эт}|)\) для float и \(2 \cdot 10^{-14} \cdot \max(1,\ |s_\text{эт}|)\) для double. Пределы подобраны так, чтобы расчёт в 32-битном int не переполнялся.

Требования к выполнению

  1. Вывести приглашение к вводу и прочитать 4 целых значения (m1, t1, m2, t2) с помощью scanf_s.
  2. Проверить результат чтения и все ограничения. Сообщения об ошибках те же, что в задании 1: Input error и Data error, затем return 1;.
  3. Выполнить расчёт в int по формуле из постановки задачи.
  4. Скопировать исходные значения в переменные типа float и повторить расчёт в float.
  5. Скопировать исходные значения в переменные типа double и повторить расчёт в double.
  6. Вывести три подписанные строки с единицей результата: int — форматом %d, float%.9f, double%.17lf.
  7. Заполнить блок тестов записями сравнения точности для наборов А, Б и собственного набора, а после программы добавить комментарий с выводами о точности (памятка о точности).

Числовые константы формулы должны соответствовать типу расчёта: 60, 60.0f, 60.0. Нельзя получить целочисленный ответ и затем присвоить его переменным float и double — это не сравнение типов, а печать одного и того же числа тремя способами.

Примеры тестовых данных

Два набора для самопроверки; каждый запускается отдельно. Порядок значений совпадает с таблицей ввода.

Набор Ввод Точное значение int float double
А 1 20 1 40 \(30\) 30 30.000000000 30.00000000000000000
Б 1 20 2 40 \(\dfrac{100}{3}\) 33 33.33333 33.33333333333334

float хранит около 7 значащих десятичных цифр, double — около 16, поэтому приближённые значения выше даны с этой точностью. Форматы %.9f и %.17lf печатают больше цифр, чем есть на самом деле: хвост за последней значащей цифрой у вас может отличаться от показанного. Это не ошибка, а как раз то, что в задании нужно объяснить.

К списку вариантов