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

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

Войти
Регистрация
Восстановить пароль
 
 
Максусс
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
#1

Обработка ошибочных ситуаций с использованием исключений - C++

06.03.2016, 15:25. Просмотров 358. Ответов 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
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
87
88
89
90
91
92
93
94
95
96
97
// SLU_GAUS.cpp: 
#include "stdafx.h"
#include "iostream"
#include "stdio.h"
#include <cctype>
//-----------------------------------------------
using namespace std;
//-----------------------------------------------
bool gauss(double **a, int size, double *x)
{
    try
    {
        for (int k = 0; k < size; k++)
        {
            for (int i = size; i >= 0; i--)
                a[k][i] = a[k][i] / a[k][k];
            for (int i = k + 1; i < size; i++)
                for (int j = size; j >= k; j--)
                    a[i][j] = a[i][j] - a[k][j] * a[i][k];
        }
        for (int k = size - 1; k >= 0; k--)//перебираем от предпоследнего уровнения до первого
        {
            double m = a[k][size];
            for (int i = size - 1; i > k; i--)
                m = m - a[k][i] * x[i];
            x[k] = m;
            //cout<<"X "<<(k + 1)<<" = "<<m<<endl;
        }
    }
    catch (char *msg)
    {
        cout << "ОШИБКА ИЛИ РЕШЕНИЙ НЕТ" << endl;
        cout << msg << endl;
        return false;
    }
    return true;
}
//-----------------------------------------------
bool getMatrixCoef(double **a, int size)
{
    try
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cout << "Введите " << j + 1 << " коиффициент " << i + 1 << " уравнения: ";
                cin >> a[i][j];
            }
            cout << "Введите  свободный член " << i + 1 << " уравнения: ";
            cin >> a[i][size];
        }
    }
 
    catch (char *msg)
    {
        cout << "ВОЗНИКЛА ОШИБКА" << endl;
        cout << msg << endl;
        return false;
    }
    return true;
}
//-----------------------------------------------
void showMatrixCoef(double **a, int size)
{
    cout << "Матрица коэффициентов СЛУ и соотв. свободные члены:" << endl;
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size + 1; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }
}
//-----------------------------------------------
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE, "Russian");
    cout << "Введите колличество уровнений: ";
    int size;
    cin >> size;
    double **a = new double*[size];
    for (int i = 0; i < size; i++)
        a[i] = new double[size + 1];
 
    double *x = new double[size];
    if (getMatrixCoef(a, size))
    {
        cout << endl << endl << endl;
        showMatrixCoef(a, size);
        if (gauss(a, size, x))
            showResult(x, size);
    }
    cout << endl;
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2016, 15:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка ошибочных ситуаций с использованием исключений (C++):

Способы обработки ошибочных ситуаций - C++
Добрый вечер!! Расскажите ваше мнение на тему обработки ошибок, как лучше реализовать? Заранее благодарю вас за ответы!!

Обработка исключений с пмощью структурированной обработки исключений - C++
Есть функция, которая определенным образом работает с файлами,но при работе с файлами &quot;не подходящего&quot; типа вызывается необработанное...

Обработка исключительных ситуаций - C++
Нужна одна работающая программа из 2. 1) Наберите текст программы приведенного примера обработки исключительных ситуаций и...

Обработка исключительных ситуаций - C++
Всем доброго времени суток, не понимаю как сделать обработку исключительной ситуации когда при вводе количества строк, вводится не целое, а...

Обработка исключительных ситуаций - C++
Помогите сделать обработку исключительных ситуаций вот мой код: #include &lt;iterator&gt; #include &quot;conio.h&quot; #include &lt;iostream&gt; ...

Обработка исключительных ситуаций - C++
Здравствуйте, друзья. Подскажите, пожалуйста, как можно при помощи try-throw-catch &quot;защититься&quot; от ввода пользователем &quot;не того типа...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,227
Завершенные тесты: 1
06.03.2016, 15:39 #2
Исключения надо выбрасывать в программе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
try
{
  ....
    if(a[k][k]==0)
       throw "Деление на нуль";
...
}catch (char *msg)
{
     cout << "ОШИБКА" << endl;
     cout << msg << endl;
     return false;
}
Максусс
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
07.03.2016, 16:54  [ТС] #3
Спасибо) я сегодня попробую.. Там вместо многоточия что писать?

Добавлено через 2 минуты
А не могли бы вы мне ещё написать чтоб ошибку выдавал если букву вводишь или запятую в дроби пишешь вместо точки.. Очень надо(

Добавлено через 4 часа 33 минуты
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
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
87
88
89
90
91
92
93
94
95
96
97
// SLU_GAUS.cpp: 
#include "stdafx.h"
#include "iostream"
#include "stdio.h"
#include <cctype>
//-----------------------------------------------
using namespace std;
//-----------------------------------------------
bool gauss(double **a, int size, double *x)
{
    try
    {
        for (int k = 0; k < size; k++)
        {
            for (int i = size; i >= 0; i--)
                a[k][i] = a[k][i] / a[k][k];
            for (int i = k + 1; i < size; i++)
                for (int j = size; j >= k; j--)
                    a[i][j] = a[i][j] - a[k][j] * a[i][k];
        }
        for (int k = size - 1; k >= 0; k--)//перебираем от предпоследнего уровнения до первого
        {
            double m = a[k][size];
            for (int i = size - 1; i > k; i--)
                m = m - a[k][i] * x[i];
            x[k] = m;
            //cout<<"X "<<(k + 1)<<" = "<<m<<endl;
        }
    }
    catch (char *msg)
    {
        cout << "ОШИБКА ИЛИ РЕШЕНИЙ НЕТ" << endl;
        cout << msg << endl;
        return false;
    }
    return true;
}
//-----------------------------------------------
bool getMatrixCoef(double **a, int size)
{
    try
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cout << "Введите " << j + 1 << " коиффициент " << i + 1 << " уравнения: ";
                cin >> a[i][j];
            }
            cout << "Введите  свободный член " << i + 1 << " уравнения: ";
            cin >> a[i][size];
        }
    }
 
    catch (char *msg)
    {
        cout << "ВОЗНИКЛА ОШИБКА" << endl;
        cout << msg << endl;
        return false;
    }
    return true;
}
//-----------------------------------------------
void showMatrixCoef(double **a, int size)
{
    cout << "Матрица коэффициентов СЛУ и соотв. свободные члены:" << endl;
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size + 1; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }
}
//-----------------------------------------------
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE, "Russian");
    cout << "Введите колличество уровнений: ";
    int size;
    cin >> size;
    double **a = new double*[size];
    for (int i = 0; i < size; i++)
        a[i] = new double[size + 1];
 
    double *x = new double[size];
    if (getMatrixCoef(a, size))
    {
        cout << endl << endl << endl;
        showMatrixCoef(a, size);
        if (gauss(a, size, x))
            showResult(x, size);
    }
    cout << endl;
    system("pause");
    return 0;
}
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,227
Завершенные тесты: 1
07.03.2016, 17:37 #4
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
bool getMatrixCoef(double **a, int size)
{
    char c;
    try
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cout << "Введите " << j + 1 << " коиффициент " << i + 1 << " уравнения: ";
                cin.get(c);
                if(isdigit(c))
                {
                    cin.unget();
                    cin >> a[i][j];
                 }else
                    throw "При вводе коффициента Введена не цифра";
            }
            cout << "Введите  свободный член " << i + 1 << " уравнения: ";
            cin.get(c);
            if(isdigit(c))
            {
                    cin.unget();
                    cin >> a[i][size];
             }else
                    throw "При вводе свободного члена Введена не цифра";
 
        }
    }
 
    catch (char *msg)
    {
        cout << "ВОЗНИКЛА ОШИБКА" << endl;
        cout << msg << endl;
        return false;
    }
    return true;
}
Максусс
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
07.03.2016, 17:56  [ТС] #5
этот обработчик срабатывает и на начало программы когда ввожу количество уравнений, он сразу выдает ошибку, хотя я ввожу цифру
..

Добавлено через 5 минут
в int_tmain там есть код на ввод количество уравнений, и когда я ввожу цифру, он сразу пишет возникла ошибка и заканчивает программу

Добавлено через 44 секунды
zss, этот обработчик срабатывает и на начало программы когда ввожу количество уравнений, он сразу выдает ошибку, хотя я ввожу цифру
..

Добавлено через 5 минут
в int_tmain там есть код на ввод количество уравнений, и когда я ввожу цифру, он сразу пишет возникла ошибка и заканчивает программу
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,227
Завершенные тесты: 1
07.03.2016, 17:58 #6
А что Вам мешает написать аналогичный код на ввод количество уравнений?
C++
1
2
3
4
5
6
7
8
    cout << "Введите  количество уравнений: ";
            cin.get(c);
            if(isdigit(c))
            {
                    cin.unget();
                    cin >> size;
             }else
                    throw "При вводе size Введена не цифра";
Максусс
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
07.03.2016, 19:01  [ТС] #7
Добавлено через 1 минуту
его надо написать в bool или там же в int_tmain?

Добавлено через 3 минуты
zss, а это добавить в int_tmain или так же в try?

Добавлено через 4 минуты
это в int_tmain или в обработчик try добавить?
я вроде и туда и туда попытался добавить а все равно про вводе цифры выдает ошибку, можнт я что то не так делаю?

Добавлено через 29 минут
zss, Сергей Сергеевич я вас прошу помогите мне с этой ужасной задачей, я буду премного благодарен вам!

Добавлено через 2 минуты


Добавлено через 6 минут
я понял еще кое-что, там где мы пишем команды на проверку ввода эта проверка вообще не нужна, потому что в этом операторе идет всего лишь счет: Введите 1 коэф 1 уравнения > Введите 2 коэф 2 уравнения..
Здесь не будет ошибок ввода потому что мы здесь ничего не вводим..
тогда другой вопрос куда писать?

Добавлено через 8 минут
блин я запутался..

Добавлено через 1 минуту
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
bool gauss(double **a, int size, double *x)
{
    try
    {
        for (int k = 0; k < size; k++)//переьираем уровнения
        {
            for (int i = size; i >= 0; i--)//перебираем индексы уровнения от последнего до первого
                a[k][i] = a[k][i] / a[k][k];//делем индексы уровнения К на К индекс этого уровнения, т.е. на диагональный индекс
            for (int i = k + 1; i < size; i++)//пребираем уровнения от К+1 уровнения
                for (int j = size; j >= k; j--)// перебираем индексы уровнения от последнего до К, т.е. до диагонального
                    a[i][j] = a[i][j] - a[k][j] * a[i][k];
        }
        for (int k = size - 1; k >= 0; k--)//перебираем от предпоследнего уровнения до первого
        {
            double m = a[k][size];
            for (int i = size - 1; i > k; i--)//перебираем индексы от предпоследнего до К
                m = m - a[k][i] * x[i];
            x[k] = m;
            //cout<<"X "<<(k + 1)<<" = "<<m<<endl;
        }
    }
    catch (char *msg)
    {
        cout << "ОШИБКА ИЛИ РЕШЕНИЙ НЕТ" << endl;
        cout << msg << endl;
        return false;
    }
    return true;
}
Вот тут наверно надо написать код для проверки ввода данных..
Ника))
41 / 41 / 8
Регистрация: 08.12.2010
Сообщений: 339
07.03.2016, 19:14 #8
Максусс, а в чем проблема добавления проверки, при вводе количества уравнений?
Покажи код куда ты пытался вставить (где все вместе) =)
Максусс
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
07.03.2016, 19:18  [ТС] #9
Добавлено через 23 секунды
Ника)), для меня с++ это почти темный лес, и я уже писал что ошибки скорее всего надо искать не в bool getMatrixCoef а в
bool gauss... так как по моему в bool getMatrixCoef не происходит как такогого ввода данных там идет обычный счет чтоб писало 1коэф 1 уравн > 2коэф 2 уравн > 3коэф 3уравн и все.. а как добавить проверку в bool gauss вот щас пытаюсь..

Добавлено через 1 минуту
может я что то не так говорю или делаю?
поправьте меня..
Ника))
41 / 41 / 8
Регистрация: 08.12.2010
Сообщений: 339
07.03.2016, 19:53 #10
Бюджетный вариант:
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
bool getMatrixCoef(double **a, int size)
{
    try
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cout << "Введите " << j + 1 << " коэффициент " << i + 1 << " уравнения: ";
                char vrem[256];
            cin >> vrem;
            while (!atof(vrem))
            {
            cout << "Введена не цифра, повторите ввод:" ;
            cin >> vrem;
            }
                 a[i][j]=atof(vrem);
            }
            cout << "Введите  свободный член " << i + 1 << " уравнения: ";
            cin >> a[i][size];
        }
    }
 
    catch (char *msg)
    {
        cout << "ВОЗНИКЛА ОШИБКА" << endl;
        cout << msg << endl;
        return false;
    }
    return true;
}
Максусс
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
07.03.2016, 20:06  [ТС] #11
Ника)), Ника ОГРОМНОЕ СПАСИБО!!!! НАКОНЕЦ ВСЕ РАБОТАЕТ! вы просто мозг, просто супер!
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,227
Завершенные тесты: 1
07.03.2016, 20:15 #12
Ника)), И в каких случаях по Вашему сработает блок catch.
Я смею утверждать что НИКОГДА!
Максусс
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
07.03.2016, 20:32  [ТС] #13
Ника)), Стоп! А почему при вводе свободного члена повтор ввода при вводе буквы не появляется?

Добавлено через 46 секунд
zss, я не знаю как его так удалить чтоб ошибок не выдавало..

Добавлено через 55 секунд
На ввод коэффициентов срабатывает а вот на ввод свободного члена нет, хотя я написал точно так же как и для коэффициентов

Добавлено через 14 минут
zss, Скажите как удалить блок catch чтоб ошибок не было?
Ника))
41 / 41 / 8
Регистрация: 08.12.2010
Сообщений: 339
07.03.2016, 21:08 #14
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
bool getMatrixCoef(double **a, int size)
{
   
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cout << "Введите " << j + 1 << " коэффициент " << i + 1 << " уравнения: ";
                char vrem[256];
                cin >> vrem;
              while (!atof(vrem))
               {
                cout << "Введена не цифра, повторите ввод:" ;
                cin >> vrem;
                }
                 a[i][j]=atof(vrem);
            }
            cout << "Введите  свободный член " << i + 1 << " уравнения: ";
             char vrem[256];
                cin >> vrem;
                while (!atof(vrem))
                 {
                    cout << "Введена не цифра, повторите ввод:" ;
                    cin >> vrem;
                 }
           a[i][size]=atof(vrem);
        }
   
 
 
    return true;
}
Максусс
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
08.03.2016, 10:30  [ТС] #15
Спасибо вам большое, я вчера уже сам допер как сделать чтоб проверка была и на количество уравнений и на ввод свободного члена.. Вот только как грамотно удалить блок catch я так и не понял..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2016, 10:30
Привет! Вот еще темы с ответами:

Обработка исключительных ситуаций - C++
Код программы,Что та не робит помогите #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; int...

Обработка исключительных ситуаций - C++
Доброго времени суток уважаемы программисты и начинающие программисты :) Скажите, почему появляется ошибка на 6й строке? Задача стоит...

Обработка исключительных ситуаций - C++
Мне нужно было создать шаблонный класс и написать обработку исключающих ситуаций. Вот, что я сделал #pragma once #include &lt;iostream&gt;...

Обработка исключительных ситуаций - C++
Правильно ли тут я обрабатываю исключения? #pragma once #include &lt;iostream&gt; #include &quot;stdio.h&quot; #include &quot;stdlib.h&quot; #include...


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

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

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