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

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

06.03.2016, 15:25. Показов 1304. Ответов 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;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.03.2016, 15:25
Ответы с готовыми решениями:

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

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

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

15
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
06.03.2016, 15:39
Исключения надо выбрасывать в программе:
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  [ТС]
Спасибо) я сегодня попробую.. Там вместо многоточия что писать?

Добавлено через 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
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
07.03.2016, 17:37
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 минут
в int_tmain там есть код на ввод количество уравнений, и когда я ввожу цифру, он сразу пишет возникла ошибка и заканчивает программу

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

Добавлено через 5 минут
в int_tmain там есть код на ввод количество уравнений, и когда я ввожу цифру, он сразу пишет возникла ошибка и заканчивает программу
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
07.03.2016, 17:58
А что Вам мешает написать аналогичный код на ввод количество уравнений?
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  [ТС]
Добавлено через 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
Максусс, а в чем проблема добавления проверки, при вводе количества уравнений?
Покажи код куда ты пытался вставить (где все вместе) =)
0
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
07.03.2016, 19:18  [ТС]
Добавлено через 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
Бюджетный вариант:
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  [ТС]
Ника)), Ника ОГРОМНОЕ СПАСИБО!!!! НАКОНЕЦ ВСЕ РАБОТАЕТ! вы просто мозг, просто супер!
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
07.03.2016, 20:15
Ника)), И в каких случаях по Вашему сработает блок catch.
Я смею утверждать что НИКОГДА!
0
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 14
07.03.2016, 20:32  [ТС]
Ника)), Стоп! А почему при вводе свободного члена повтор ввода при вводе буквы не появляется?

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

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

Добавлено через 14 минут
zss, Скажите как удалить блок catch чтоб ошибок не было?
0
 Аватар для Ника))
43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
07.03.2016, 21:08
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  [ТС]
Спасибо вам большое, я вчера уже сам допер как сделать чтоб проверка была и на количество уравнений и на ввод свободного члена.. Вот только как грамотно удалить блок catch я так и не понял..
0
 Аватар для Ника))
43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
08.03.2016, 10:49
Максусс, ты хоть в курсе как он работает ( я про твой блок "catch" )?
Если нет, то:
http://google.gik-team.com/?q=... ch+c%2B%2B
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.03.2016, 10:49
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru