28 / 20 / 11
Регистрация: 10.02.2016
Сообщений: 237

Неправильная работа исключений

18.04.2016, 13:25. Показов 649. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сделал в программе исключения, если пользователь направльно ввводит значения:

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
98
99
100
101
102
103
104
105
106
// englerr.cpp
// контроль ввода данных для класса английских расстояний
#include <iostream>
#include <string>
#include <cstdlib> // для atoi(), atof()
using namespace std;
int isFeet(string);// объявление
///////////////////////////////////////////////////////////
class Distance{ // Класс английских расстояний
    private:
        int feet;
        float inches;
    public:
        Distance():feet(0),inches(0.0){}// конструктор (без аргументов)
        Distance(int ft, float in):feet(ft),inches(in){} // конструктор (2 арг.)
        void showdist(){ cout << feet << "\'-" << inches << '"'; }// вывод расстояния
        void getdist();// запросить длину у пользователя
        class getdist_uninteger_feets{};
        class getdist_inches_out_of_bounds{};
};
//---------------------------------------------------------
void Distance::getdist(){ // получение длины от пользователя
    string instr; // для входной строки
    while(true){// цикл, пока футы не будут правильными
        cout << "\n\nВведите футы: ";
        cin.unsetf(ios::skipws);// не пропускать разделители
        cin >> instr; // получить футы как строку
        if(isFeet(instr)){// правильное значение? да
            cin.ignore(10, '\n'); // съесть символы, включая разделитель строк
            feet = atoi(instr.c_str()); // перевести значение в целочисленное
            break;
 
        }   // нет, не целое 
    cin.ignore(100, '\n');// съесть символы, включая разделитель строк
    //cout << "Футы должны быть целыми < 1000\n";
    throw getdist_uninteger_feets();
    }   // выход из цикла 'while'
// конец цикла while для футов
    while(true){    // цикл проверки дюймов
    cout << "Введите дюймы: ";
    cin.unsetf(ios::skipws);// не пропускать разделители
    cin >> inches;// получить дюймы (тип float)
    if(inches >= 12.0 || inches < 0.0){
        //cout << "Дюймы должны быть между 0.0 и 11.99\n";
        cin.clear(ios::failbit);// "искусственно" установить флаг ошибки
        throw getdist_inches_out_of_bounds();
    }
    if(cin.good()){// все ли хорошо с cin,(обычно вводят не цифры)
    cin.ignore(10, '\n'); // съесть разделитель
    break;
// Ввод корректный, выйти из 'while'
    }
    cin.clear();// ошибка; очистить статус ошибки
    cin.ignore(10, '\n');// съесть символы с разделителем
    cout << "Неверно введены дюймы\n"; // заново
    }
// конец while для дюймов
}
//---------------------------------------------------------
class isFeet_out_of_size{};
class isFeet_wrong_input{};
class isFeet_out_of_bounds{};
 
int isFeet(string str){
// true если введена строка с правильным значением футов
    int slen = str.size(); // получить длину
    if(slen == 0 || slen > 5) // не было или слишком много данных
        throw isFeet_out_of_size(); //return 0;
// не целое
    for(int j = 0; j < slen; j++) // проверить каждый символ
        if((str[j] < '0' || str[j] > '9') && str[j] != '-') // если не цифра или минус
            throw isFeet_wrong_input();//return 0; // строка неправильных футов
    double n = atof(str.c_str()); // перевод в double
    if(n <-999.0 || n > 999.0) // вне допустимых значений?
        throw isFeet_out_of_bounds();//return 0; // если да, неправильные футы
    return 1; // правильные футы
}
///////////////////////////////////////////////////////////
int main(){
    Distance d;// создать объект Distance
    char ans,ch='n';
    do{
    try{
        do{
            d.getdist();// получить его значение
            cout << "\nРасстояние = ";
            d.showdist();// вывести его
            cout << "\nЕще раз (y/n)? ";
            cin >> ans;
            cin.ignore(10, '\n'); // съесть символы и разделитель
        }while(ans != 'n'); // цикл до 'n'
    }
    catch(isFeet_out_of_size){cout<<"You enter empty feet or your value is too large..."<<endl
        <<"continue?(y,n): ";cin>>ch;}
    catch(isFeet_wrong_input){cout<<"You entered minus or non-digit..."<<endl
        <<"continue?(y,n): ";cin>>ch;}
    catch(isFeet_out_of_bounds){cout<<"The value is out of bounds..."<<endl
        <<"continue?(y,n): ";cin>>ch;}
    catch(Distance::getdist_uninteger_feets){cout<<"Feets have to be integer..."<<endl
        <<"continue?(y,n): ";cin>>ch;}
    catch(Distance::getdist_inches_out_of_bounds){cout<<"Inches is out of bounds..."<<endl
        <<"continue?(y,n): ";cin>>ch;}
    }while(ch=='y');
    cout<<ch;
    return 0;
}
При вводе в футы 1.1 программа сразу завершается. Подозреваю, что в ch заносится, что-то нето, но поток до этого чистил. Подскажите где косяк?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.04.2016, 13:25
Ответы с готовыми решениями:

Неправильная работа
Почему на неправильно работает? #include&lt;iostream&gt; using namespace std; int main() { int b; for (int i=0; i&lt;=14;...

Неправильная работа scanf_s
Ув. программисты, Есть такой код: #include &lt;stdio.h&gt; #include &lt;iostream&gt; int main() { char name;

Неправильная работа с файлами
#include &lt;iostream.h&gt; #include &lt;fstream.h&gt; #include &lt;windows.h&gt; #include &lt;string&gt; struct student { char name; char...

3
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.04.2016, 14:14
Где ты его чистил? Если isFeet() вызовет исключение, то сразу попадёшь на catch(), который в main().
И для чего вообще такая сложная проверка? Вводи сразу double и проверяй флаг fail у cin и интервал.
0
28 / 20 / 11
Регистрация: 10.02.2016
Сообщений: 237
18.04.2016, 23:48  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
И для чего вообще такая сложная проверка?
Это задание на исключения.

Добавил чистку cin в отлов исключений, но теперь программа зависает после continue

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
98
99
100
101
102
103
104
105
106
// englerr.cpp
// контроль ввода данных для класса английских расстояний
#include <iostream>
#include <string>
#include <cstdlib> // для atoi(), atof()
using namespace std;
int isFeet(string);// объявление
///////////////////////////////////////////////////////////
class Distance{ // Класс английских расстояний
    private:
        int feet;
        float inches;
    public:
        Distance():feet(0),inches(0.0){}// конструктор (без аргументов)
        Distance(int ft, float in):feet(ft),inches(in){} // конструктор (2 арг.)
        void showdist(){ cout << feet << "\'-" << inches << '"'; }// вывод расстояния
        void getdist();// запросить длину у пользователя
        class getdist_uninteger_feets{};
        class getdist_inches_out_of_bounds{};
};
//---------------------------------------------------------
void Distance::getdist(){ // получение длины от пользователя
    string instr; // для входной строки
    while(true){// цикл, пока футы не будут правильными
        cout << "\n\nВведите футы: ";
        cin.unsetf(ios::skipws);// не пропускать разделители
        cin >> instr; // получить футы как строку
        if(isFeet(instr)){// правильное значение? да
            cin.ignore(10, '\n'); // съесть символы, включая разделитель строк
            feet = atoi(instr.c_str()); // перевести значение в целочисленное
            break;
 
        }   // нет, не целое 
    cin.ignore(10, '\n');// съесть символы, включая разделитель строк
    //cout << "Футы должны быть целыми < 1000\n";
    throw getdist_uninteger_feets();
    }   // выход из цикла 'while'
// конец цикла while для футов
    while(true){    // цикл проверки дюймов
    cout << "Введите дюймы: ";
    cin.unsetf(ios::skipws);// не пропускать разделители
    cin >> inches;// получить дюймы (тип float)
    if(inches >= 12.0 || inches < 0.0){
        //cout << "Дюймы должны быть между 0.0 и 11.99\n";
        cin.clear(ios::failbit);// "искусственно" установить флаг ошибки
        throw getdist_inches_out_of_bounds();
    }
    if(cin.good()){// все ли хорошо с cin,(обычно вводят не цифры)
    cin.ignore(10, '\n'); // съесть разделитель
    break;
// Ввод корректный, выйти из 'while'
    }
    cin.clear();// ошибка; очистить статус ошибки
    cin.ignore(10, '\n');// съесть символы с разделителем
    cout << "Неверно введены дюймы\n"; // заново
    }
// конец while для дюймов
}
//---------------------------------------------------------
class isFeet_out_of_size{};
class isFeet_wrong_input{};
class isFeet_out_of_bounds{};
 
int isFeet(string str){
// true если введена строка с правильным значением футов
    int slen = str.size(); // получить длину
    if(slen == 0 || slen > 5) // не было или слишком много данных
        throw isFeet_out_of_size(); //return 0;
// не целое
    for(int j = 0; j < slen; j++) // проверить каждый символ
        if((str[j] < '0' || str[j] > '9') && str[j] != '-') // если не цифра или минус
            throw isFeet_wrong_input();//return 0; // строка неправильных футов
    double n = atof(str.c_str()); // перевод в double
    if(n <-999.0 || n > 999.0) // вне допустимых значений?
        throw isFeet_out_of_bounds();//return 0; // если да, неправильные футы
    return 1; // правильные футы
}
///////////////////////////////////////////////////////////
int main(){
    Distance d;// создать объект Distance
    char ans,ch='n';
    do{
    try{
        do{
            d.getdist();// получить его значение
            cout << "\nРасстояние = ";
            d.showdist();// вывести его
            cout << "\nЕще раз (y/n)? ";
            cin >> ans;
            cin.ignore(10, '\n'); // съесть символы и разделитель
        }while(ans != 'n'); // цикл до 'n'
    }
    catch(isFeet_out_of_size){cout<<"You enter empty feet or your value is too large..."<<endl
        <<"continue?(y,n): ";cin.ignore(10, '\n');cin>>ch;}
    catch(isFeet_wrong_input){cout<<"You entered minus or non-digit..."<<endl
        <<"continue?(y,n): ";cin.ignore(10, '\n');cin>>ch;}
    catch(isFeet_out_of_bounds){cout<<"The value is out of bounds..."<<endl
        <<"continue?(y,n): ";cin.ignore(10, '\n');cin>>ch;}
    catch(Distance::getdist_uninteger_feets){cout<<"Feets have to be integer..."<<endl
        <<"continue?(y,n): ";cin>>ch;}
    catch(Distance::getdist_inches_out_of_bounds){cout<<"Inches is out of bounds..."<<endl
        <<"continue?(y,n): ";cin>>ch;}
    }while(ch=='y');
    cout<<ch;
    return 0;
}
0
28 / 20 / 11
Регистрация: 10.02.2016
Сообщений: 237
22.04.2016, 22:01  [ТС]
Отлаженная программа:

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
#include <iostream>
#include <string>
#include <cstdlib> 
using namespace std;
///////////////////////////////////////////////////////////
class Distance{
    private:
        int feet;
        float inches;
    public:
        ~Distance(){}
        Distance():feet(0),inches(0.0){}
        Distance(int ft, float in):feet(ft),inches(in){}
        void showdist(){ cout << feet << "\'-" << inches << '"'; }
        void getdist();// enter distance
        class inches_out_of_bounds{};
        class out_of_size{};
        class wrong_input{};
        class out_of_bounds{};
};
//---------------------------------------------------------
void Distance::getdist(){ 
    string instr; // incoming string
    cout << "\n\nEnter feet: ";
    cin >> instr; 
    int slen = instr.size();
    if(slen == 0 || slen > 5) // no data or string is to long
        throw out_of_size(); 
    for(int j = 0; j < slen; j++) // check every symbol
        if((instr[j] < '0' || instr[j] > '9') && instr[j] != '-') // if non-digit or minus
            throw wrong_input();// wrong symbol
    double n = atof(instr.c_str());// to double
    if(n <-999.0 || n > 999.0) // if out of bounds
        throw out_of_bounds();
    feet = atoi(instr.c_str()); // to int
//////////////////// check inches
    cout << "Enter inches: ";
    //cin.unsetf(ios::skipws);// не пропускать разделители
    cin >> inches;// получить дюймы (тип float)
    if(inches >= 12.0 || inches < 0.0)
        throw inches_out_of_bounds();
}
///////////////////////////////////////////////////////////
int main(){
    char ans,ch='n';
    do{
    try{
        Distance d;
        do{
            d.getdist();// получить его значение
            cout << "\nРасстояние = ";
            d.showdist();// вывести его
            cout << "\nЕще раз (y/n)? ";
            cin >> ans;
            cin.ignore(10, '\n'); // съесть символы и разделитель
        }while(ans != 'n'); // цикл до 'n'
    }
    catch(Distance::out_of_size){cout<<"You enter empty feet or your value is too large..."<<endl
        <<"continue?(y,n): ";cin.clear();cin.ignore(10, '\n');cin>>ch;}
    catch(Distance::wrong_input){cout<<"You entered minus or non-digit..."<<endl
        <<"continue?(y,n): ";cin.clear();cin.ignore(10, '\n');cin>>ch;}
    catch(Distance::out_of_bounds){cout<<"The value is out of bounds..."<<endl
        <<"continue?(y,n): ";cin.clear();cin.ignore(10, '\n');cin>>ch;}
    catch(Distance::inches_out_of_bounds){cout<<"Inches is out of bounds..."<<endl
        <<"continue?(y,n): ";cin.clear();cin.ignore(10, '\n');cin>>ch;}
    }while(ch=='y');
    cout<<ch;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.04.2016, 22:01
Помогаю со студенческими работами здесь

Неправильная работа деструктора
При выполнении деструктора вылетает ошибка //Врачебный контроль физиологического состояния спортсмена #include &lt;iostream&gt; ...

Неправильная работа программы
была программа, которая считывает английский текст из файла и выводит на экран слова, начинающиеся с гласных букв. вот она) ...

Неправильная работа кода
я уже обращалась с этим вопросом. у меня код написан без ошибок. работать он должен: я задаю ему номер задачи, а он должен выдавать...

Неправильная работа цикла
Есть два цикла: while (infile){ infile &gt;&gt; dist1; cout &lt;&lt; dist1 &lt;&lt; endl; } while (1){ infile &gt;&gt; dist1; ...

Условие цикла if, неправильная работа if
cin.getline(str1,N); //getline-запись данных в строку str1,размерность N; cout&lt;&lt;&quot;Enter second string -&gt; &quot;&lt;&lt;endl;...


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

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

Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru