Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Что возвращать при делении на ноль? - C++

28.12.2012, 14:54. Просмотров 878. Ответов 16
Метки нет (Все метки)

Что возвращать при делении на ноль? Или какое бросать исключение?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2012, 14:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что возвращать при делении на ноль? (C++):

Как заставить программу завершаться при делении на ноль? - C++
Проблема состоит в том, что при решении задач матфизики трудно поставить условия так, чтобы не возникала численная неустойчивость. При...

Найти те числа, что при делении на 7 дают остаток 1, 2, или 5 - C++
даны натуральные числа N, A1, ... , An. плоучить среднее арифметическое тех членов которые при делении на 7 дают остаток 1, 2, или 5 ...

Айти количество целых чисел x таких, что 0 <= x < n и число a*x при делении дает остаток b. - C++
Даны числа a, b и n. Требуется найти количество целых чисел x таких, что 0 &lt;= x &lt; n и число a*x при делении дает остаток b.

Найти все пятизначные числа, которые при делении на A дают в остатке B, а при делении на C дают в остатке D - C++
C++ Напишите программу, которая вводит четыре натуральных числа (a, b, c и d) и находит все пятизначные числа, которые при делении на a...

Найти числа, которые при делении на 47 дают в остатке 43, а при делении на 43 дают в остатке 47 - C++
Мне нужно написать программу в Dev-C++ для поиска трехзначных чисел, которые при делении на 47 дают в остатке 43, а при делении на 43 дают...

Что значит возвращать значение - C++
Функция возвращает значение; функция удаляет, но не возвращает значения; Функция не возвращает значения. Что значит...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
28.12.2012, 15:25 #2
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
#include <iostream>
 
class ex
{
 public:
          ex();              
};
ex::ex()
{
    std::cout<<"Divide by zero"<<'\n';
}
int main()
{
     try 
      {
          int i = 3,b=0;
          if (i/b==0); 
             throw ex();
      }
     catch(ex)
     {
         std::cout<<"I`m closing..."<<'\n';
     }
     return 0;
}
2
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,455
Записей в блоге: 2
28.12.2012, 15:51 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если же в общем случае неизвестно, какая из переменных может стать виновницей деления на ноль, тогда придется отлавливать непосредственно деление на ноль. При этом, важно помнить, что деление на ноль - структурное исключение, и его придется превращать в типизированное C++ исключение. Для этого нужно будет установить свой транслятор, в котором будет сгенерировано перехватываемое в дальнейшем исключение. Например:
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
#include <iostream>
#include <windows.h>
 
void testfunc()
{
    int x, y=0;
    x = 5 / y;
}
 
void translator_func(unsigned int u, EXCEPTION_POINTERS* pExp)
{
    std::cout<<"Some structured exception occurred."<<std::endl;
    throw std::exception("Division by zero");
}
 
int main()
{
    try
    {
        _set_se_translator(translator_func);
        testfunc();
    }
    catch(const std::exception& e)
    {
        std::cout<<"Caught exception - "<<std::endl<<e.what()<<std::endl;
    }
    return 0;
}
Компилировать с ключом /EHa.
5
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.12.2012, 16:18  [ТС] #4
Цитата Сообщение от BumerangSP Посмотреть сообщение
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
#include <iostream>
 
class ex
{
 public:
          ex();              
};
ex::ex()
{
    std::cout<<"Divide by zero"<<'\n';
}
int main()
{
     try 
      {
          int i = 3,b=0;
          if (i/b==0); 
             throw ex();
      }
     catch(ex)
     {
         std::cout<<"I`m closing..."<<'\n';
     }
     return 0;
}
Что это?

Добавлено через 1 минуту
Цитата Сообщение от HighPredator Посмотреть сообщение
Если же в общем случае неизвестно, какая из переменных может стать виновницей деления на ноль, тогда придется отлавливать непосредственно деление на ноль. При этом, важно помнить, что деление на ноль - структурное исключение, и его придется превращать в типизированное C++ исключение. Для этого нужно будет установить свой транслятор, в котором будет сгенерировано перехватываемое в дальнейшем исключение. Например:
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
#include <iostream>
#include <windows.h>
 
void testfunc()
{
    int x, y=0;
    x = 5 / y;
}
 
void translator_func(unsigned int u, EXCEPTION_POINTERS* pExp)
{
    std::cout<<"Some structured exception occurred."<<std::endl;
    throw std::exception("Division by zero");
}
 
int main()
{
    try
    {
        _set_se_translator(translator_func);
        testfunc();
    }
    catch(const std::exception& e)
    {
        std::cout<<"Caught exception - "<<std::endl<<e.what()<<std::endl;
    }
    return 0;
}
Компилировать с ключом /EHa.
Не понял. Я пишу оператор деления. Как он должен поступать при нулевом делителе?
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,455
Записей в блоге: 2
28.12.2012, 16:21 #5
Цитата Сообщение от taras atavin Посмотреть сообщение
Как он должен поступать при нулевом делителе?
Код
if(делитель==0) бросить_исключение
См. код от BumerangSP.

Добавлено через 33 секунды
Если все еще не понимаете, тогда вариант проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
 
int testfunct(int x,int y)
{
    if(y==0) throw "Division by zero.";
    return x/y;
}
    
int main()
{
    try 
        {
        
        std::cout<<testfunct(2,0)<<std::endl;
    }
    catch(const char *exc)
    {
        std::cout<<exc<<std::endl;
    }
    return 0;
}
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,674
Записей в блоге: 17
28.12.2012, 16:34 #6
Цитата Сообщение от taras atavin Посмотреть сообщение
Что возвращать при делении на ноль? Или какое бросать исключение?
Ну это системное исключение или как то там...в общем подходящего исключения в самом языке нет, насколько я знаю.

Поэтому если пишется с библиотека или класс то логичнее создать свой класс исключения и бросать его (из нутри его методов) ...
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.12.2012, 17:13  [ТС] #7
Цитата Сообщение от HighPredator Посмотреть сообщение
бросить_исключение
Какое? И как?

Добавлено через 44 секунды
Цитата Сообщение от Avazart Посмотреть сообщение
Ну это системное исключение или как то там...в общем подходящего исключения в самом языке нет, насколько я знаю.
Мне надо учесть нулевой делитель в операторе длинной арифметики. Как и кого бросать?
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,674
Записей в блоге: 17
28.12.2012, 17:15 #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Мне надо учесть нулевой делитель в операторе длинной арифметики.
Ну так создавайте свое исключение... можно наследоваться от std::exception ...
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.12.2012, 17:16  [ТС] #9
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так создавайте свое исключение... можно наследоваться от std::exception ...
Как?
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,674
Записей в блоге: 17
28.12.2012, 17:25 #10
Я к примеру недавно писал такое

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace imap4{
//------------------------ IMAP4 --------------------------------------------
class exception: public std::exception
{
 protected:
    std::string _err_msg;
 
 public:
    exception(const std::string& err_msg):_err_msg(err_msg){ }
 
    virtual const char* what() const { return _err_msg.c_str(); }
};
//---------------------------------------------------------------------------
//...
}
Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
// А затем где то в классе imap4::client
//---------------------------------------------------------------------------
void client::connect()
{
    tcp::client::connect();
 
    if(! check_connected( read_ln() ) ) throw imap4::exception("Не удалось установить соединение");
}
//-------------------------------------------------------------------------
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,455
Записей в блоге: 2
28.12.2012, 17:31 #11
Цитата Сообщение от taras atavin Посмотреть сообщение
бросить_исключение
Какое? И как?
Смотрим пост Что возвращать при делении на ноль?
Смотрим внимательно. Конкретно, смотрим код внизу поста. Крепко думаем.
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,674
Записей в блоге: 17
28.12.2012, 18:18 #12
А где-то в main

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
imap4::client client1;
try
    {
        client1.set_addr("imap.yandex.ru");
        client1.set_timeout(15000);
        client1.set_username("*******");
        client1.set_password("*******");
        client1.connect();
        client1.login();
        client1.select("INBOX");
        client1.search("SEEN");
                    // ...
        client1.close();
    }
catch(imap4::exception &e) // или std::exception
    {
        cerr<< e.what()<<endl;
        client1.close();
    }
Добавлено через 46 минут
Кстати Ваша же тема Коды исключений
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.12.2012, 18:34 #13
Цитата Сообщение от BumerangSP Посмотреть сообщение
class ex
{
*public:
* * * * * ex(); * * * * * * *
};
ex::ex()
{
* * std::cout<<"Divide by zero"<<'\n';
}
int main()
{
* * *try
* * * {
* * * * * int i = 3,b=0;
* * * * * if (i/b==0);
* * * * * * *throw ex();
Лучше наследоваться от стандартного класса.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.12.2012, 18:52  [ТС] #14
А мне как?
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
28.12.2012, 19:13 #15
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 <stdexcept>
 
class divide_by_zero : public std::runtime_error {
 
public:
    divide_by_zero(const char* what_arg)
        : std::runtime_error(what_arg) {
 
    }
};
 
double divide(double a, double b) {
 
    if(b == 0)
        throw divide_by_zero("Error: divide_by_zero");
    
    return a / b;
}
 
int main() {
 
    try {
        
        divide(1, 0);
    }
 
    catch(divide_by_zero& e) {
 
        std::cerr << e.what() << std::endl;
    }
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2012, 19:13
Привет! Вот еще темы с ответами:

Что может возвращать выражение в С++? - C++
В стандарте написано, что &quot;Выражение может возвращать значение в качестве результата и может вызывать побочные эффекты.&quot; Правильно ли...

Перегрузка операторов: что возвращать? - C++
У меня есть класс Rational-рациональная дробь.Не могу перегрузить оператор +=. Вся проблема,скорее всего,что не понимаю что возвращать.Все...

Что возвращать из оператора присваивания? - C++
//------------------------------------------------------------------------------------------------------------------------------------------...

Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. - C++
Вектор длины N нужно заполнить случайными целыми числами(от X до Y) и сделать, чтобы сначала шли числа кратные 3, потом с остатком 2 при...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.12.2012, 19:13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru