Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
1

Разбор блока catch (исключения)

22.06.2014, 17:09. Показов 1377. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание звучит так:

Даны две функции:
double hmean(double a, double b) throw(hmean_error) - нахождение среднего гармонического.
double gmean(double a, double b) throw(gmean_error) - нахождение среднего геометрического.

При расчете этих функций нужно поймать исключение:
для первой функции - если a == -b
для второй функции - если a < 0 или b < 0

Исключения каждой функции должны быть производными от некого базового класса (от потомка logic_error), который хранит два значения аргументов. Также исключения должны содержать метод, который выводит эти значения и имя функции. Также блок catch должен быть единственным и использоваться для обоих исключений.


Помогите, не знаю как заполнить блок catch, ведь неизвестно, именно из какой функции вылетело исключение. Заранее спасибо!

хедер
Кликните здесь для просмотра всего текста
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
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
#define HEADER_H
#ifdef HEADER_H
 
#include <iostream>
#include <stdexcept>
 
class mean_error : virtual public std::logic_error
{
private:
    double arg1;
    double arg2;
public:
    mean_error(double a, double b, const char* ch = "") 
        : std::logic_error(ch), arg1(a), arg2(b) {}
    virtual void show_arg() = 0;
};
 
class hmean_error : public mean_error
{
public:
    hmean_error(double a, double b, const char* ch = "")
        : std::logic_error(ch), mean_error(a,b,ch) {} 
// еще вопрос - правильно ли я указал конструкторы для базовых классов?
    void show_arg();
};
 
class gmean_error : public mean_error
{
public:
    gmean_error(double a, double b, const char* ch = "")
        : std::logic_error(ch), mean_error(a,b,ch) {}
// тут также
    void show_arg();
};
 
/////////////////////////////////////////////////////////////////
 
inline void mean_error::show_arg()
{
    std::cout << "Argument #1: " << arg1 << std::endl;
    std::cout << "Argument #2: " << arg2 << std::endl;
}
 
void hmean_error::show_arg()
{
    std::cout << "Function \"hmean\" is called!\n";
    mean_error::show_arg();
    std::cout << what() << std::endl;
}
 
void gmean_error::show_arg()
{
    std::cout << "Function \"gmean\" is called!\n";
    mean_error::show_arg();
    std::cout << what() << std::endl;
}
#endif

файл срр
Кликните здесь для просмотра всего текста
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "header.h"
#include <iostream>
#include <cmath> 
 
double hmean(double a, double b) throw(hmean_error);
double gmean(double a, double b) throw(gmean_error);
 
int main()
{
    rus;
    using std::cout;
    using std::cin;
    using std::endl;
    double x, y, z;
    cout << "Введите два числа: ";
    while (cin >> x >> y)
    {
        try 
        {
            z = hmean(x,y);
            cout << "Среднее гармоническое " << x << " и " << y
                  << " равно " << z << endl;
            cout << "Среднее геометрическое " << x << " и " << y
                  << " равно " << gmean(x,y) << endl;
            cout << "Введите следующий набор чисел <q для завершения>: ";
        }
        catch (...)
        {
            // ?????
        }
    }
    cout << "Всего наилучшего!\n";
    system("pause");
    return 0;
}
 
double hmean(double a, double b) throw(hmean_error)
{
    if (a == -b)
        throw hmean_error(a,b,"HMEAN ERROR! A = -B");
    return 2.0 * a * b / (a + b);
}
double gmean(double a, double b) throw(gmean_error)
{
    if (a < 0 || b < 0)
        throw gmean_error(a,b,"GMEAN ERROR! ARG < 0");
    return std::sqrt(a * b);
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.06.2014, 17:09
Ответы с готовыми решениями:

Передача исключения из одного catch-блока в другой
Всем привет! Начал тут изучать исключения в С++, хотел бы кое-что прояснить. Если я всё правильно понял, процесс обработки исключений...

Исключения try-catch
Здравствуйте, пытаюсь с помощь try-catch сделать обработку исключений. #include &lt;iostream&gt; #include &lt;cmath&gt; #include...

Зацикленный Catch ( исключения )
Всем доброго времени суток. Столкнулся с такой проблемой: В ниже приведенном коде, почему то, при установке флага failbit, когда управление...

4
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,680
22.06.2014, 17:35 2
Лучший ответ Сообщение было отмечено CHELOVEKPAUK как решение

Решение

Полиморфизм же.
C++
1
2
3
4
catch(mean_error const & e)
{
    e.show_arg();
}
PS. virtual public наследование не нужно в этом случае.
1
Землянин
 Аватар для Pjeroo
34 / 34 / 16
Регистрация: 15.01.2013
Сообщений: 312
22.06.2014, 17:41 3
CHELOVEKPAUK, http://msdn.microsoft.com/ru-r... khbbc.aspx - там есть пример, я думаю это то, что Вам нужно.
1
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
22.06.2014, 18:05  [ТС] 4
Цитата Сообщение от DrOffset Посмотреть сообщение
Полиморфизм же.
Код C++
1
2
3
4
catch(mean_error const & e)
{
* * e.show_arg();
}
PS. virtual public наследование не нужно в этом случае.
А мне кажется, virtual нужно указать, ведь тогда создастся две копии logic_error. Разве это не так? Разъясните пожалуйста.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
22.06.2014, 18:08 5
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
А мне кажется, virtual нужно оказать, ведь тогда создастся две копии logic_error.
Две копии будет в случае ромбовидного наследования.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.06.2014, 18:08
Помогаю со студенческими работами здесь

Обработка исключения на русские буквы (try/catch)
Доброго времени суток. Хотелось бы узнать как обработать исключение на русские буквы через try/catch (желательно кодом) Заранее спасибо

Табулирование функции используя исключения (try, throw, catch)
Написать программу, которая выводит таблицу значений функции y= sqrt(5-pow(x,3)), шаг и интервал ввести с клавиатуры. Использовать...

Работает ли указатель на базовый класс исключения, когда попадает в блок catch
Работает ли указатель на базовый класс исключения, когда попадает в блок catch так же как обычно? То есть, если есть переопределенные...

Как передать управление в блок catch после системного исключения (компилятор g++)?
Вот пример: не удаётся это сделать #include &lt;windows.h&gt; #include &lt;stdio.h&gt; //Эта функция- НОВЫЙ обработчик...

Почему некоторые исключения невозможно обработать стандартным образом при помощи try catch?
Почему некоторые исключения невозможно обработать стандартным образом при помощи try catch? Вместо обработки программу тупо завершается.


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Что нового в C# 14
UnmanagedCoder 10.03.2025
Предстоящая версия C# 14 обещает принести изменения, которые сделают разработку еще более приятной и эффективной. Что стоит отметить, так это влияние сообщества разработчиков на формирование новых. . .
Формулы поворота
Igor3D 10.03.2025
Добрый день Тема Эти формулы приводятся во множестве тьюториалов, часто под видом "матрица вращения на плоскости". x' = x * cos(a) - y * sin(a) y' = y * cos(a) + x * sin(a) Как бы Вы их. . .
Что нового в .NET 10
UnmanagedCoder 10.03.2025
. NET 10 выходит как релиз с длительной поддержкой (LTS), включающей три года обновлений. В этом обновлении Microsoft сфокусировались на нескольких направлениях: производительность, оптимизация. . .
Отложенное высвобождение, RCU и Hazard Pointer в C++26
NullReferenced 09.03.2025
Многопоточное программирование стало важной частью современной разработки. Когда несколько потоков одновременно работают с общими данными, возникает целый ряд проблем, связанных с синхронизацией и. . .
Неблокирующийся стек на C++26
NullReferenced 09.03.2025
Традиционные способы синхронизации в многопоточном программировании — мьютексы, семафоры, условные переменные — часто превращаются в узкое место в плане производительности. При этом неблокирующиеся. . .
Обработка строк в C++26: Новые возможности string и string_view
NullReferenced 09.03.2025
Новый стандарт C++26 предлагает много улучшений для работы с привычными string и относительно новыми string_view. string_view - это невладеющая ссылка на последовательность символов, появившаяся в. . .
Мой первый аддон для Blender 3D, с помощью нейронки (не зная даже азов пайтона, но это не значит что так и с остальным).
Hrethgir 09.03.2025
Потратил весь день. Пол-дня мне хватило, чтобы понять что с версией с 14B мне не одолеть написание функционального кода, на языке с которым я вообще никак не знаком - пайтон. Версия 22B от другого. . .
Einstein@Home сегодня исполняется двадцать лет!
Programma_Boinc 09.03.2025
Einstein@Home сегодня исполняется двадцать лет! Отправлено 19 февраля 2025 года в 17:20:21 UTC Я хочу поздравить всех наших волонтеров, разработчиков и ученых из Einstein@Home. Мы официально. . .
Заполнители и расширенный набор символов в C++26
NullReferenced 09.03.2025
C++26 представляет два важных обновления: заполнители и расширенный набор символов. Заполнители (placeholders) решают давнюю проблему лаконичности кода в шаблонных выражениях и лямбда-функциях. Они. . .
Контракты в C++26
NullReferenced 09.03.2025
Контракты – это механизм, позволяющий указывать предусловия, постусловия и инварианты для функций в коде. Эта функциональность должна была стать частью C++20, но была исключена на встрече комитета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru