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

Определение типа вводимых данных - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
vilkoqwerty
0 / 0 / 0
Регистрация: 02.03.2012
Сообщений: 3
02.03.2012, 12:42     Определение типа вводимых данных #1
Здравствуйте. Мне, как новичку, нужна помощь. Я делаю программу для работ с функциями. В начале программа просит нажать на цифру 1, 2 или 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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
int main(int argc, const char * argv[])
{
    // переменные
        double a, b, c, x1, x2, D, vertexX, vertexY;
        float choise1, choise2;
        cout << "Press: " << endl;
     g1:cout << "1 - Linear Equation" << endl;
        cout << "2 - Quadratic Equation" << endl;
        cout << "3 - Quit" << endl;
        cin >> choise1;
        if (choise1 == 1) {
            cout << "y = ax + b" << endl;
            cout << "Enter a" << endl;
            cin >> a;
            cout << "Enter b" << endl;
            cin >> b;
            if (b == 0) {
                cout << "\nIntersection with X axis is at: (0; 0)"<< endl;
                cout <<   "Intersection with Y axis is at: (0; 0)"<< endl;            
            }
            else {
                cout <<  "\nIntersection with X axis is at: (" << -b/a << "; 0)" << endl;
                cout << "Intersection with Y axis is at: (0; " << a*0 + b << ")" << endl;
            }
            
            if (a*1 + b < a*2 + b) {
                cout << "Increasing Function" << endl;
            }
            else if(a*1 + b > a*2 + b){
                cout << "Descreasing Function" << endl;
            }
            else {
                cout << "Parallel Function" << endl;
            }
            //choise 2
        g2: cout << "\nPress 1 to go to choise section, press 2 to quit" << endl;
            cin >> choise2;
            if (choise2 == 1) {
                goto g1;
            }
            else if (choise2 == 2) {
                exit(EXIT_SUCCESS);
            }
            else {
                cout << "You've pressed the wrong number (press 1 or 2)" << endl;
                goto g2;
            }
        }
        else if(choise1 == 2){
            cout << "y = ax^2 + bx + c" << endl;
            cout << "Enter a" << endl;
            cin >> a;
            cout << "Enter b" << endl;
            cin >> b;
            cout << "Enter c" << endl;
            cin >> c;
            
            vertexX = -b/(2*a);
            vertexY = a*vertexX*vertexX + b* vertexX + c;
            D = b*b - 4*a*c;
            
            cout << "\nVertex is at: (" << vertexX << "; " << vertexY << ")" << endl;
            cout << "Discriminant = " << D << endl;
            
            if (D < 0) {
                cout << "No intersection with axis X" << endl;
                cout << "Intersection 1 with axis Y is at: (0; " << c << ")" << endl;
                cout << "Intersaction 2 with axis Y is at: ("<< -b/a << "; " << c << ")" << endl;
            }
            else if (D == 0) {
                x1 = (-b + sqrt(D))/(2*a);
                cout << "Intersection with axis X is at: (" << x1 << "; 0)" << endl;
                cout << "Intersaction with axis Y is at: (0; " << c << ") and ("<< -b/a << "; " << c << ")" << endl;
            }
            else {
                x1 = (-b + sqrt(D))/(2*a);
                x2 = (-b - sqrt(D))/(2*a);
                if (x1 > x2) {
                    cout << "Intersaction 1 with axis X is at: (" << x2 << "; 0)" << endl;
                    cout << "Intersaction 2 with axis X is at: (" << x1 << "; 0)" << endl;
                }
                else if (x1 < x2) {
                    cout << "Intersaction 1 with axis X is at: (" << x1 << "; 0)" << endl;
                    cout << "Intersaction 2 with axis X is at: (" << x2 << "; 0)" << endl;
                }
            }
            
            if (a > 0) {
                cout << " xв€€(-в€ћ; " << vertexX << ") - Function Descreases" << endl;
                cout << " xв€€(" << vertexX << "; +в€ћ) - Function Increases" << endl;
            }
            else if(a < 0) {
                cout << " xв€€(-в€ћ; " << vertexX << ") - Function Increases" << endl;
                cout << " xв€€(" << vertexX << "; +в€ћ) - Function Descreases" << endl;
            }
            else {
                if (a*1 + b < a*2 + b) {
                    cout << "Increasing Function" << endl;
                }
                else if(a*1 + b > a*2 + b){
                    cout << "Descreasing Function" << endl;
                }
                else {
                    cout << "Parallel Function" << endl;
                }
            }
            //choise 2
        g3: cout << "\nPress 1 to go to choise section, press 2 to quit" << endl;
            cin >> choise2;
            if (choise2 == 1) {
                goto g1;
            }
            else if (choise2 == 2) {
                exit(EXIT_SUCCESS);
            }
            else {
                cout << "You've pressed the wrong number (press 1 or 2)" << endl;
                goto g3;
            }
        }
        else if (choise1 == 3) {
            exit(EXIT_SUCCESS);
        }
        else if (choise1 == 'a' || choise1 == 'b' || choise1 =='c' || choise1 =='d' || choise1 =='e') {
            cout << "You've entered the letter" << endl;
        }
        
        else{
            cout << "You've pressed the wrong number (press 1, 2 or 3)" << endl;
            goto g1;
        }
 
    
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
13993 / 8824 / 1231
Регистрация: 24.12.2010
Сообщений: 15,990
02.03.2012, 14:24     Определение типа вводимых данных #2
Вводи не в число, а в строку. И сам уже анализируй, что там находится, а не доверяй эту работу черному ящику.
thebvog
 Аватар для thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
02.03.2012, 14:26     Определение типа вводимых данных #3
vilkoqwerty, или как вариант, хоть и не самый правильный - лови исключения конструкциями try { ... } catch(...) { ... }.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
02.03.2012, 16:10     Определение типа вводимых данных #4
Цитата Сообщение от thebvog Посмотреть сообщение
vilkoqwerty, или как вариант, хоть и не самый правильный - лови исключения конструкциями try { ... } catch(...) { ... }
только кто будет эти исключения кидать?
thebvog
 Аватар для thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
02.03.2012, 16:18     Определение типа вводимых данных #5
Nameless One, он же вводит переменную типа double, и если букву вместо числа ввести, то по идее будет исключение, или я ошибаюсь. Но таким способом я ловил atoi, не знаю про cin.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
02.03.2012, 16:23     Определение типа вводимых данных #6
Цитата Сообщение от thebvog Посмотреть сообщение
или я ошибаюсь
да

Цитата Сообщение от thebvog Посмотреть сообщение
Но таким способом я ловил atoi, не знаю про cin.
только если в параллельной вселенной. К сожалению, большинство стандартных функций С++ не кидают исключения там, где, по идее, их можно было бы ожидать

Добавлено через 1 минуту
Хотя для потоков это поведение можно поменять: http://cplusplus.com/reference/iostream/ios/exceptions/
thebvog
 Аватар для thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
02.03.2012, 16:28     Определение типа вводимых данных #7
Nameless One, а, блин, точно, я же не в С++ это ловил, вот и память
Тогда может просто строку считывать, и если нет символов в число переводить.
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
02.03.2012, 17:56     Определение типа вводимых данных #8
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
    double a, b, c, x1, x2, D, vertexX, vertexY;
    int choise1, choise2;
g1:
    do {
        clrscr( );
        cin.clear( );
        cin.sync( );
        cout << "Press: " << endl;
        cout << "1 - Linear Equation" << endl;
        cout << "2 - Quadratic Equation" << endl;
        cout << "3 - Quit" << endl;
        cin >> choise1;
    } while ( choise1 != 1 && choise1 != 2 && choise1 != 3 );
 
    if ( choise1 == 1 ) {
        //...
    }
    else if ( choise1 == 2 ) {
        //...
    }
    else if ( choise1 == 3 ) {
        //...
    }
    else {
        goto g1;
    }
Кстати, лучше-таки научитесь не использовать метки - ничего особо хорошего в них нет.
thebvog
 Аватар для thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
02.03.2012, 18:05     Определение типа вводимых данных #9
BRcr,

Не по теме:

метки вещь полезная, если низкоуровневая программа

vilkoqwerty
0 / 0 / 0
Регистрация: 02.03.2012
Сообщений: 3
02.03.2012, 18:10  [ТС]     Определение типа вводимых данных #10
А чем можно их заменить?
thebvog
 Аватар для thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
02.03.2012, 18:12     Определение типа вводимых данных #11
vilkoqwerty, условиями, вызовами функций, например.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
02.03.2012, 18:15     Определение типа вводимых данных #12
thebvog, + механизм исключений, который так же позволяет «прыгать» по стеку вызовов функций. Также в некоторых современных языках высокого уровня введены новые средства для управления потоком выполнения приложения, например, сопрограммы (coroutines) в Python (конструкция yield) и продолжения (continuations) в Scheme.
Но это уже другой вопрос, так что прекращаем офтоп.
thebvog
 Аватар для thebvog
73 / 53 / 3
Регистрация: 20.02.2012
Сообщений: 239
02.03.2012, 18:19     Определение типа вводимых данных #13
Nameless One,

Не по теме:

+Asm

BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
02.03.2012, 18:31     Определение типа вводимых данных #14
Цитата Сообщение от vilkoqwerty Посмотреть сообщение
А чем можно их заменить?
В основном комбинациями циклов и условий. Если условия сложные и многоуровневые, то, чтобы повысить их читабельность, старайтесь разделять код по функционалу и раскидывать в функции, заменяя таким образом куски кода вызовами соответствующих функций. Тогда в вашем коде будет проще разбираться - и вам в том числе.
Nameless One
02.03.2012, 18:36
  #15
 Комментарий модератора 
Еще раз напоминаю всем присутствующим, здесь обсуждается проверка вводимых данных на корректность.
Желающим обсудить вопрос меток и их аналогов в языках высокого уровня — создавайте новую тему. Дальнейшие сообщения не по теме будут удалены, провинившиеся (возможно) — наказаны.
vilkoqwerty
0 / 0 / 0
Регистрация: 02.03.2012
Сообщений: 3
04.03.2012, 16:26  [ТС]     Определение типа вводимых данных #16
А как вы бы заменили goto в данном случае?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2012, 16:27     Определение типа вводимых данных
Еще ссылки по теме:

C++ Проверка вводимых данных
C++ Проверка вводимых данных на соответствие типа
C++ Определение типа данных

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.03.2012, 16:27     Определение типа вводимых данных #17
vilkoqwerty, цикл do ... while, например. Либо (еще лучше) вынести ввод данных в отдельную функцию, которая может сигнализировать об успехе или неудаче операции
Yandex
Объявления
04.03.2012, 16:27     Определение типа вводимых данных
Ответ Создать тему
Опции темы

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