С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 02.10.2020
Сообщений: 16

Обработка исключений в с++. Ошибки при использовании try, catch, throw

10.02.2021, 16:14. Показов 2123. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание - сделать обработку исключений для такого примера ((2x-4)/sinx)^1/2
Я написал простое выполнение данной программы, когда пытаюсь добавить исключения, постоянно ошибки компилятора.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    int x;
    double z;
    cout << "vvedit' chislo" << endl;
    cin >> x;
    z = sqrt((2*x - 4)/sin(x));
    cout << z;
}
Вот сам код.
Как мне сюда добавить обработку исключений : sin(x)==0, и подкореневое выражение меньше 0.
Знатоки, выручите, я по разному пытался, всегда ошибка.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2021, 16:14
Ответы с готовыми решениями:

try, throw, catch...обработка исключений
помогите разобраться с обработкой исключений...при вводе пароля больше 10 символов должна быть непредвиденная ошибка, пытаюсь ее поймать,но...

Обработка исключений в с++. Ошибки при использовании try, catch, throw
Задание - сделать обработку исключений для такого примера ((2x-4)/sinx)^1/2 Я написал простое выполнение данной программы, когда пытаюсь...

Обработка исключений в с++, ошибки при использовании try, throw, catch
Задание - сделать обработку исключений для такого примера ((2x-4)/sinx)^1/2 Я написал простое выполнение данной программы, когда пытаюсь...

7
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
10.02.2021, 18:06
Цитата Сообщение от bogdan77604 Посмотреть сообщение
когда пытаюсь добавить исключения
И где оно в Вашем коде?
0
Заблокирован
10.02.2021, 23:10
Кликните здесь для просмотра всего текста
bogdan77604, для std::sqrt
https://en.cppreference.com/w/... /math/sqrt

Return value

If no errors occur, square root of arg (√arg

), is returned.

If a domain error occurs, an implementation-defined value is returned (NaN where supported)

If a range error occurs due to underflow, the correct result (after rounding) is returned.
Error handling

Errors are reported as specified in math_errhandling

Domain error occurs if arg is less than zero.

If the implementation supports IEEE floating-point arithmetic (IEC 60559),

If the argument is less than -0, FE_INVALID is raised and NaN is returned.
If the argument is +∞ or ±0, it is returned, unmodified.
If the argument is NaN, NaN is returned
для std::sin

Return value

If no errors occur, the sine of arg (sin(arg)) in the range [-1 ; +1], is returned.

The result may have little or no significance if the magnitude of arg is large
(until C++11)

If a domain error occurs, an implementation-defined value is returned (NaN where supported)

If a range error occurs due to underflow, the correct result (after rounding) is returned.
Error handling

Errors are reported as specified in math_errhandling.

If the implementation supports IEEE floating-point arithmetic (IEC 60559),

if the argument is ±0, it is returned unmodified
if the argument is ±∞, NaN is returned and FE_INVALID is raised
if the argument is NaN, NaN is returned

проще говоря, исключений они не генерируют

Добавлено через 2 минуты
Уважаемый bogdan77604.
Раздел С++, что еще за <math.h> ???
Гуглите обработку ошибок для стандарта С90 по данным функциям ...

Добавлено через 3 минуты
а то что sin(x) может быть ноль, надо проверять самому
0
0 / 0 / 0
Регистрация: 02.10.2020
Сообщений: 16
11.02.2021, 17:21  [ТС]
Да, спасибо, ошибся, должно быть #include <cmath>

Добавлено через 3 минуты
Цитата Сообщение от zss Посмотреть сообщение
И где оно в Вашем коде?
Я не добавлял что бы не запутать.
Я новичок в программировании, да и на форуме также, поэтому ещё учусь что и как.
Есть такая попытка выполнить задание :
C++
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
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    double x, y;
    cout << "Impute x :";
    cin>> x;
 
 
    try
    {
        if(sin(x)==0)
            throw 1;
 
        if(((2*x)-4)/(sin(x))<0)
            throw 2;
 
        y = sqrt(((2*x)-4)/(sin(x)));
        cout<< "Y = "<< y << endl;
    }
    catch(int a)
    {
        if( a==1)
            cout << "Error in znam, division by 0"<< endl;
        if (a==2)
            cout << "Error, negative root" << endl;
    }
    cout << "Hello world!" << endl;
    return 0;
}
Но мне кажется, что не должно всё обрабатываться в блоке try, так как в примере сверху, хотя программа работает
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
11.02.2021, 17:32
Цитата Сообщение от bogdan77604 Посмотреть сообщение
if(sin(x)==0)
Вот это надо чуть подправить.
Действительные числа надо сравнивать с некоторым допуском

C++
1
if( fabs(sin(x))<1e-10)
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
11.02.2021, 17:39
Цитата Сообщение от bogdan77604 Посмотреть сообщение
Но мне кажется, что не должно всё обрабатываться в блоке try, так как в примере сверху, хотя программа работает
C++
1
2
3
4
5
6
#include <stdexcept>
 
struct divide_by_zero: std::runtime_error
{
    using std::runtime_error::runtime_error;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
try
{
    if (sin(x)==0)
        throw divide_by_zero("!!!!");
 
    if(((2*x)-4)/(sin(x))<0)
        throw std::logic_error("negative root");
 
    y = sqrt(((2*x)-4)/(sin(x)));
    cout<< "Y = "<< y << endl;
}
catch(const divide_by_zero &e)
{
    cout << "Error in znam, division by 0"<< endl;
}
catch(const std::exception &e)
{
    cout << e.what() << endl;
}
1
0 / 0 / 0
Регистрация: 02.10.2020
Сообщений: 16
11.02.2021, 17:42  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Вот это надо чуть подправить.
Действительные числа надо сравнивать с некоторым допуском
Можно обяснение краткое? Не совсем понял почему там надо иначе
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
11.02.2021, 17:53
Лучший ответ Сообщение было отмечено bogdan77604 как решение

Решение

Действительные числа задаются с некоторой точностью.
Поэтому при вычислении, например, sin(M_PI) может получится не ноль, а что-то вроде
-0,0000000000000001
Соответственно, сравнение с нулем даст ложь.

Из интереса проверил, получается, что sin(M_PI) равен
1.2246467991473532e-016
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2021, 17:53
Помогаю со студенческими работами здесь

Обработчик исключений try catch throw
void InFind(int RAM){ fstream out(&quot;СС.txt&quot;,ios::out); int n=сс.size(); cout &lt;&lt; &quot;Find RAM&quot;&lt;&lt; endl; for (int i=0; i&lt;n; i++) if...

В чём преимущество механизма исключений (try, throw, catch) ?
Например, у оператора switch я вижу преимущество (в сравнении с if) в наглядности и структурности кода. Может быть, есть пример, который...

Обработка исключений try - catch при сканировании каталога
Напишите программу, которая сканирует некоторую папку (задаётся пользователем) с учётом поддиректорий, все хранящиеся в ней файлы...

Обработка исключений error vs throw
всем доброво времени! сталкнулся с такой дилемой в matlab. привык использовать для раюоты с исключениями конструкции try catch. собственно...

Обработка исключений try catch
Здравствуйте. Программа с использованием CLR. Суть работы очень проста - в три TextBox'а вводятся числа, они сравниваются. Результат...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru