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

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

Восстановить пароль Регистрация
 
Максусс
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
06.03.2016, 15:25     Обработка ошибочных ситуаций с использованием исключений #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
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++ Обработка исключительных ситуаций
Обработка исключительных ситуаций C++
C++ Правильная обработка внештатных ситуаций
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 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;
}
Вот тут наверно надо написать код для проверки ввода данных..
Ника))
 Аватар для Ника))
39 / 39 / 8
Регистрация: 08.12.2010
Сообщений: 338
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 минуту
может я что то не так говорю или делаю?
поправьте меня..
Ника))
 Аватар для Ника))
39 / 39 / 8
Регистрация: 08.12.2010
Сообщений: 338
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
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 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 чтоб ошибок не было?
Ника))
 Аватар для Ника))
39 / 39 / 8
Регистрация: 08.12.2010
Сообщений: 338
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:49     Обработка ошибочных ситуаций с использованием исключений
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Ника))
 Аватар для Ника))
39 / 39 / 8
Регистрация: 08.12.2010
Сообщений: 338
08.03.2016, 10:49     Обработка ошибочных ситуаций с использованием исключений #16
Максусс, ты хоть в курсе как он работает ( я про твой блок "catch" )?
Если нет, то:
http://google.gik-team.com/?q=%D0%B1...+catch+c%2B%2B
Yandex
Объявления
08.03.2016, 10:49     Обработка ошибочных ситуаций с использованием исключений
Ответ Создать тему
Опции темы

Текущее время: 06:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru