Лабораторная работа 1. Вариант 15¶
К списку вариантов · Общие требования
Два задания выполняются в двух отдельных файлах: lab01_v15_task1.cpp и lab01_v15_task2.cpp.
Каждый файл начинается со своей шапки и блока тестов; весь исполняемый код находится в main.
Задание 1. Четверть кольца¶
Постановка задачи¶
Деталь ограничена двумя концентрическими дугами и двумя перпендикулярными радиальными отрезками. Угол сектора — 90°. Найдите её площадь.
Закрашена область, площадь которой нужно найти. Рисунок схематический; размеры берите из ввода. Все длины заданы в метрах.
Расчётная формула:
Результат: Площадь 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{эт}|)\); вычислять допуск в программе не нужно.
Требования к выполнению¶
- Вывести приглашение к вводу: перечислить величины, их единицы и порядок (
outer,inner). - Прочитать 2 значения с помощью
scanf_sв переменные типаdouble. - Проверить результат чтения. Если прочитаны не все числа — вывести
Input errorи завершить программу черезreturn 1;. - До любых вычислений проверить все ограничения из раздела выше. Если нарушено хотя бы одно — вывести
Data errorи завершить программу черезreturn 1;. Результат при этом не вычисляется и не выводится. - Вычислить \(s\) по формуле из постановки задачи.
- Вывести подписанный результат с единицей измерения; само число — форматом
%.10lf. Завершить программу черезreturn 0;. - Перенести формулу, смысл обозначений и ограничения в шапку исходного файла, а классы эквивалентности и тесты границ — в блок тестов, до первого запуска (как составлять тесты).
Примеры тестовых данных¶
Два набора для самопроверки: если на них программа печатает не то, ошибку нужно искать до защиты. В блок тестов эти наборы переносить не нужно — там требуется ваш собственный разбор на классы эквивалентности.
| Ввод | Ожидаемое число в выводе |
|---|---|
2 1 |
≈ 2.3561944902 |
0.5 0.3 |
≈ 0.1256637061 |
Результат иррационален, поэтому значения приближённые: показанные цифры верны, но последняя может отличаться на единицу из-за округления. Сравнивайте с допуском \(10^{-9} \cdot \max(1,\ |s_\text{эт}|)\).
Задание 2. Температура смеси: сравнение типов¶
Постановка задачи¶
Смешивают две порции одной жидкости: массу m1 при температуре t1 и массу m2 при температуре t2. Найдите температуру смеси после выравнивания.
Расчётная формула:
Единица результата — °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 не переполнялся.
Требования к выполнению¶
- Вывести приглашение к вводу и прочитать 4 целых значения (
m1,t1,m2,t2) с помощьюscanf_s. - Проверить результат чтения и все ограничения. Сообщения об ошибках те же, что в задании 1:
Input errorиData error, затемreturn 1;. - Выполнить расчёт в
intпо формуле из постановки задачи. - Скопировать исходные значения в переменные типа
floatи повторить расчёт вfloat. - Скопировать исходные значения в переменные типа
doubleи повторить расчёт вdouble. - Вывести три подписанные строки с единицей результата:
int— форматом%d,float—%.9f,double—%.17lf. - Заполнить блок тестов записями сравнения точности для наборов А, Б и собственного набора, а после программы добавить комментарий с выводами о точности (памятка о точности).
Числовые константы формулы должны соответствовать типу расчёта: 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 печатают больше цифр, чем есть на самом деле: хвост за последней значащей цифрой у вас может отличаться от показанного. Это не ошибка, а как раз то, что в задании нужно объяснить.