Содержание
Цель работы
Приобрести навыки по организации контроля за возникновением непредвиденных или аварийных ситуаций во время работы программы.
Общая постановка
Даны два выражения $Z1$ и $Z2$. Написать функции для вычисления этих выражений с организацией обнаружения нештатной ситуации (например деление на ноль) и ее обработки. Передача аргументов в функции — по ссылкам.
➡ В случае успеха значения $Z1$ и $Z2$ должны быть приблизительно одинаковыми.
Индивидуальные задания
№ | $Z_1$ | $Z_2$ |
1 | $\frac{\sqrt{2b+2\sqrt{b^2 + 4}}}{\sqrt{b^2-4} + b — 2}$ | $\frac{1}{\sqrt{b+2}}$ |
2 | $\frac{x^2 + 2x — 3 + (x + 1)\sqrt{x^2 — 9}}{x^2 — 2x — 3 + (x — 1)\sqrt{x^2 — 9}}$ | $\sqrt{\frac{x+3}{x-3}}$ |
3 | $\frac{\sqrt{(3m+2)^2 — 24m}}{3\sqrt{m} — \frac{2}{\sqrt{m}}}$ | $-\sqrt{m}$ |
4 | $(\frac{a+2}{\sqrt{2a}} — \frac{a}{\sqrt{2a}+2} + \frac{2}{a — \sqrt{2a}}) \cdot \frac{\sqrt{a} — \sqrt{2}}{a+2}$ | $\frac{1}{\sqrt{a} + \sqrt{2}}$ |
5 | $(\frac{1 + a + a^2}{2a + a^2} + 2 — \frac{1 — a + a^2}{2a — a^2})^{-1} \cdot (5 — 2a^2)$ | $\frac{4 — a^2}{2}$ |
6 | $\frac{(m\ -\ 1)\sqrt{m}\ -\ (n\ -\ 1)\sqrt{n}}{\sqrt{m^3 n}\ +\ nm\ +\ m^2\ -\ m}$ | $\frac{\sqrt{m}\ -\ \sqrt{n}}{m}$ |
7 | $\frac{\sqrt{2m\ +\ 2\sqrt{m^2\ -\ 4}}}{m\ +\ \sqrt{m^2\ -\ 4}\ +\ 2}$ | $\frac{1}{\sqrt{m\ +\ 2}}$ |
8 | $\frac{(x\ +\ 1) \sqrt{x^2\ -\ 9}\ +\ x(x\ +\ 2)\ -\ 3}{(x\ -\ 1) \sqrt{x^2\ -\ 9}\ +\ x^2\ -\ 2x\ -\ 3}$ | $\sqrt{\frac{x\ +\ 3}{x\ -\ 3}}$ |
9 | $(2\ +\ \frac{1\ +\ x\ +\ x^2}{2x\ +\ x^2}\ -\ \frac{1\ -\ x\ +\ x^2}{2x\ -\ x^2})^{-1} \cdot (5\ -\ 2x^2)$ | $\frac{4\ -\ x^2}{2}$ |
10 | $(\frac{2}{x\ -\ \sqrt{2x}}\ +\ \frac{x\ +\ 2}{\sqrt{2x}}\ -\ \frac{x}{\sqrt{2x}\ +\ 2}) \cdot \frac{\sqrt{x}\ -\ \sqrt{2}}{x\ +\ 2}$ | $\frac{1}{\sqrt{x}\ +\ \sqrt{2}}$ |
11 | $\frac{\sqrt{(3x + 2)^2 — 24x}}{3\sqrt{x} — \frac{2}{\sqrt{x}}}$ | $-\sqrt{x}$ |
12 | $\frac{(a\ -\ 1)\sqrt{a}\ -\ (b\ -\ 1)\sqrt{b}}{\sqrt{a^3b}\ +\ ba\ +\ a^2\ -\ a}$ | $\frac{\sqrt{a}\ -\ \sqrt{b}}{a}$ |
13 | $\frac{\sqrt{2\sqrt{x^2\ -\ 4}\ +\ 2x}}{x\ +\ \sqrt{x^2\ -\ 4}\ +\ 2}$ | $\frac{1}{\sqrt{x\ +\ 2}}$ |
14 | $(\frac{m\ +\ 2}{\sqrt{2m}} + \frac{2}{m\ -\ \sqrt{2m}} — \frac{m}{\sqrt{2m}\ +\ 2}) \cdot \frac{\sqrt{m}\ -\ \sqrt{2}}{m\ +\ 2}$ | $\frac{1}{\sqrt{m} + \sqrt{2}}$ |
15 | $\frac{(x\ -\ 1)\sqrt{x}\ -\ (y\ -\ 1)\sqrt{y}}{\sqrt{x^3y}\ +\ xy\ +\ x^2\ -\ x}$ | $\frac{\sqrt{x}\ -\ \sqrt{y}}{x}$ |
Образец выполнения (вариант №1)
Условие задания звучит так:
$z_1 = \frac{\sqrt{2b\ +\ 2\sqrt{b^2\ -\ 4}}}{\sqrt{b^2\ -\ 4}\ +\ b\ +\ 2}, \ \ \ \ z_2 = \frac{1}{\sqrt{b\ +\ 2}}$
💡 Прежде чем приступать к кодированию выражений $Z_1$ и $Z_2$ надо понять, а в каких случаях могут возникать исключительные ситуации.
- Так как оба выражения $Z$ содержат дроби, то, очевидно, что нужно предусмотреть случай, когда знаменатель будет равен $0$. Потому что на $0$ в математике делить запрещено.
- Также оба выражения $Z$ в своем составе имеют арифметические корни. Как известно, выражение, стоящее под знаком корня, должно быть неотрицательным, то есть $\geq 0$.
Запишем область определения для заданных выражений $Z$:
- $b^2\ -\ 4 \geq 0$
- $2b\ +\ 2\sqrt{b^2\ -\ 4} \geq 0$
- $\sqrt{b^2\ -\ 4}\ +\ b\ +\ 2 \ne 0$
- $b\ +\ 2 > 0$
➡ Мной, разработчиком данной программы, было принято решение генерировать ошибку в виде строкового сообщения. Это придает максимальную гибкость и позволяет пользователю передать точное описание ошибки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include <iostream> // консольный ввод-вывод #include <clocale> // для руссификации диалогов #include <string> // для формирования сообщения об ошибке #include <cmath> // для математических функций: возведение в степень, извлечение корня using namespace std; // вычисление выражения Z1 double Z1(double &b) { string error; // хранит точное описание возникшей исключительной ситуации double a = pow(b, 2.0) - 4; // вспомогательная расчетная переменная // блок проверок на допустимость расчета выражения Z1 if(a < 0) { error = "Вычислить значение выражения Z1 невозможно, т к подкоренное выражение (b^2 - 4) меньше 0!"; throw error; } if(2*b + 2*sqrt(a) < 0) { error = "Вычислить значение выражения Z1 невозможно, т к числитель этого выражения отрицателен!"; throw error; } if((a + b + 2) == 0) { error = "Вычислить значение выражения Z1 невозможно, т к при заданном b знаменатель Z1 равен 0!"; throw error; } // ошибок нет, поэтому вычисляем конкретное значение выражения Z1 при заданном b return (sqrt(2*b + 2*sqrt(a))) / (sqrt(a) + b + 2); } // вычисление выражения Z2 double Z2(double &b) { string error; // хранит точное описание возникшей исключительной ситуации // блок проверок на допустимость расчета выражения Z2 if((b + 2) <= 0) { error = "Вычислить значение выражения Z2 невозможно, т к при заданном b знаменатель Z2 не является положительным!"; throw error; } // ошибок нет, поэтому вычисляем конкретное значение выражения Z1 при заданном b return (1 / sqrt(b + 2)); } // главная функция программы (точка входа) int main(void) { double b; // входное значение аргумента для выражений Z1/Z2 double z1; // хранит значение выражения Z1 double z2; // хранит значение выражения Z2 // руссификация диалогов программы setlocale(LC_ALL, "rus"); // запрашиваем ввод значения b с клавиатуры cout << "Введите значение b: "; cin >> b; // используя механизм перехвата исключений начинаем вычисления try { z1 = Z1(b); // попытка вычислить значение выражения Z1 cout << "\tZ1(" << b << ") = " << z1 << endl; z2 = Z2(b); // попытка вычислить значение выражения Z2 cout << "\tZ2(" << b << ") = " << z2 << endl; } catch(string s) // перехватываем сообщение об ошибке { cout << s; // выводим сообщение о возникшей ошибке на экран } cout << endl << endl << "Для завершения работы программы нажмите ENTER..."; // задержка работы программы, чтобы можно было просмотреть результат cin.get(); cin.get(); return 0; // завершение работы программы и передача управления в ОС (код 0 - все прошло успешно!) } |
Результаты работы программы
Стоимость заказа работы своего варианта
➡ Стоимость программы из любого варианта составляет $300$ рублей.
Для оформления заказа пишите на почту: proglabs@mail.ru.
Время нашего ответа обычно составляет не более $10$ минут.
Добавить комментарий