Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
1

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

06.03.2016, 15:25. Показов 1040. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Проблемка заключается в том что все работает правильно вот только не выдат сообщение об ошибке, не реагирует не на что.. вводил букву, знак, обыкновенную дробь, текст. программа просто дает сбой, а нужно чтоб выдавала сообщение об ошибке хоть на что нибудь..
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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2016, 15:25
Ответы с готовыми решениями:

Способы обработки ошибочных ситуаций
Добрый вечер!! Расскажите ваше мнение на тему обработки ошибок, как лучше реализовать? ...

Обработка ошибок с использованием исключений
Вот у меня есть программа, подсчёт количества каждого слова в файле, нужно в неё добавить обработку...

Обработка исключений с использованием Message Box
Подскажите пожалуйста как обрабатывать исключения с помощью message box. Например у меня возникают...

Обработка исключений. Как организовать общий обработчик исключений?
У меня есть последовательность вызова методов для внесения данных в таблицу БД. Сам метод...

15
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
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 / 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;
}
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
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;
}
1
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
07.03.2016, 17:56  [ТС] 5
этот обработчик срабатывает и на начало программы когда ввожу количество уравнений, он сразу выдает ошибку, хотя я ввожу цифру
..

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

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

Добавлено через 5 минут
в int_tmain там есть код на ввод количество уравнений, и когда я ввожу цифру, он сразу пишет возникла ошибка и заканчивает программу
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
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 Введена не цифра";
1
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;
}
Вот тут наверно надо написать код для проверки ввода данных..
0
43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
07.03.2016, 19:14 8
Максусс, а в чем проблема добавления проверки, при вводе количества уравнений?
Покажи код куда ты пытался вставить (где все вместе) =)
0
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 минуту
может я что то не так говорю или делаю?
поправьте меня..
0
43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
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;
}
1
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
07.03.2016, 20:06  [ТС] 11
Ника)), Ника ОГРОМНОЕ СПАСИБО!!!! НАКОНЕЦ ВСЕ РАБОТАЕТ! вы просто мозг, просто супер!
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
07.03.2016, 20:15 12
Ника)), И в каких случаях по Вашему сработает блок catch.
Я смею утверждать что НИКОГДА!
0
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
07.03.2016, 20:32  [ТС] 13
Ника)), Стоп! А почему при вводе свободного члена повтор ввода при вводе буквы не появляется?

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

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

Добавлено через 14 минут
zss, Скажите как удалить блок catch чтоб ошибок не было?
0
43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
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 / 0
Регистрация: 06.03.2016
Сообщений: 14
08.03.2016, 10:30  [ТС] 15
Спасибо вам большое, я вчера уже сам допер как сделать чтоб проверка была и на количество уравнений и на ввод свободного члена.. Вот только как грамотно удалить блок catch я так и не понял..
0
43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
08.03.2016, 10:49 16
Максусс, ты хоть в курсе как он работает ( я про твой блок "catch" )?
Если нет, то:
http://google.gik-team.com/?q=... ch+c%2B%2B
0
08.03.2016, 10:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2016, 10:49
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru