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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Minor1310
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 23
#1

Проверка вводимых значений - C++

15.04.2013, 18:09. Просмотров 874. Ответов 8
Метки нет (Все метки)

Стоит задача не допустить ввода значений помимо чисел(0..9), точки(".") и "+" или "-".
При условии, что используется данная функция:
Кликните здесь для просмотра всего текста
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
void input()
    {
        cout<<" * umnogenie \n / delenie \n + summa \n - raznost' \n ^ vozvedenie v stepen'"<<endl;
        cout<<"vvedite celuy chast' pervogo kompleksnogo chisla  "; cin>>n1;
        cout<<"vvedite mnimuy chast' pervogo kompleksnogo chisla  "; cin>>m1;
        cout<<"vvedite deystvie --> "; cin>>z;
        if (z!='^')
        {
            cout<<"vvedite celuy chast' vtorogo kompleksnogo chisla  ";cin>>n2;
 
        cout<<"vvedite mnimuy chast' vtorogo kompleksnogo chisla  "; cin>>m2;
        
 
            if (z=='+')
            { sum(n1,n2,m1,m2);}
            else
                if (z=='-')
                {raz(n1,n2,m1,m2);}
                else
                    if (z=='*')
                    {umn(n1,m1,n2,m2);}
                    else
                        if (z=='/')
                        {del(n1,m1,n2,m2);}
                        else
                            cout<<"error"<<endl;
        }
        else {step(n1,m1);}
        
    }

последнее значение(m2) в виде: *число или /число он воспринимает его как 0. При вводе тким же образом m1, n1, n2 программа падает.
а при использовании после каждой или любой из строк
C++
1
2
3
4
5
if (scanf ("%d", &m2) != 1) 
{
 printf("ne to znachenie");
exit(500);
}
он не дает вводить "+", "-", "."
Как грамотно исправить этот баг + объясните логику почему крэшится именно на m2 ?

Заранее всем благодарен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2013, 18:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка вводимых значений (C++):

Проверка вводимых значений - C++
есть динам. массив, который вручную заполняется for (int i=0;i&lt;n;i++) { cout&lt;&lt;&quot;Введите &quot;&lt;&lt;i+1&lt;&lt;&quot; значение Urab (5...60 B) :...

Проверка корректности вводимых значений - C++
Имеется следующий код: #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; int main() { double a, b, c; ...

Проверка вводимых данных. - C++
предполагается, что функция будет проверять, что ввел пользователь, и, если он ввел не натуральное число заранее заданного диапазона,...

Проверка вводимых символов - C++
Привет форум! Уже пытался кое-что найти в книжках по С++ по поводу сабжа, но многое мне не ясно, ибо я очень очень чайник. Вот что мне...

Проверка вводимых данных - C++
#include &lt;iostream&gt; using namespace std; int main() { double a, b, c; cout &lt;&lt; &quot;Enter the first side of the...

Проверка вводимых символов - C++
Что то я так и не нашел в с++ под линукс есть ли встроенные регэкспы. Мне нужно что бы люди при загрузке файла не могли подменить имя, то...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.04.2013, 10:18 #2
Minor1310, приведите код, который можно собрать.
Minor1310
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 23
17.04.2013, 13:00  [ТС] #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Minor1310, приведите код, который можно собрать.
Вы имеете ввиду полный код программы плюс значения которые не устраивют?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.04.2013, 14:00 #4
Цитата Сообщение от Minor1310 Посмотреть сообщение
Вы имеете ввиду полный код программы плюс значения которые не устраивют?
Да.
Minor1310
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 23
17.04.2013, 20:33  [ТС] #5
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
#include <iostream>
#include <cmath>
#include <math.h>
#include <fstream>
#include <complex>
using namespace std;
typedef std::complex<double> compl;
double n1,m1,n2,m2;
char z; 
class dejstvija
{
public:
    void input()
    {
        cout<<" * umnogenie \n / delenie \n + summa \n - raznost' \n ^ vozvedenie v stepen'"<<endl;
        cout<<"vvedite celuy chast' pervogo kompleksnogo chisla  "; cin>>n1;
        cout<<"vvedite mnimuy chast' pervogo kompleksnogo chisla  "; cin>>m1;
        cout<<"vvedite deystvie --> "; cin>>z;
        if (z!='^')
        {
            cout<<"vvedite celuy chast' vtorogo kompleksnogo chisla  ";cin>>n2;
 
        cout<<"vvedite mnimuy chast' vtorogo kompleksnogo chisla  "; cin>>m2;
        
 
            if (z=='+')
            { sum(n1,n2,m1,m2);}
            else
                if (z=='-')
                {raz(n1,n2,m1,m2);}
                else
                    if (z=='*')
                    {umn(n1,m1,n2,m2);}
                    else
                        if (z=='/')
                        {del(n1,m1,n2,m2);}
                        else
                            cout<<"error, nekorrektnoe dejstvie "<<endl;
        }
        else {step(n1,m1);}
        
    }
    compl  step(double z_real, double z_imag)
    {
        double  z_p_real = 0;
        double  z_p_imag = 0;
        if(z_real || z_imag)
        {   double p;
        cout<<"Vvod sstepeni "; cin>>p;
        cout<<endl;
        //Пронормируем заданное комплексное число.
        double  norm     = sqrt(z_real * z_real + z_imag * z_imag);
        double  cos_phi  = z_real / norm;        
        double  phi      = acos(cos_phi);    
 
        //Представим заданное комплексное число
        //z == z_real + i * z_imag
        //в виде
        //z == norm * (cos(phi) + i * sin(phi)).
        //Возводя это число в степень p по формуле Муавра, получим:
        //z^p = norm^p * (cos(p * phi) + i * sin(p * phi)),
        //откуда
        double  norm_p  = pow(norm, p);
        z_p_real        = norm_p * cos(p * phi);
        z_p_imag        = norm_p * sin(p * phi); 
        cout<<z_p_real<<"+i*("<<z_p_imag<<")"<<endl;
        }
        return compl(z_p_real, z_p_imag);
 
    }
    void sum(double n1, double n2, double m1, double m2)
    {
        cout<<"otvet "<<n1+n2<<"+i*("<<m1+m2<<")"<<endl;
    }
    void raz(double n1, double n2, double m1, double m2)
    {
        cout<<"otvet "<<n1-n2<<"+i*("<<m1-m2<<")"<<endl;
    }
    void umn(double n1, double m1, double n2, double m2)
    { 
        cout<<"otvet "<<n1*n2-m1*m2<<"+i*("<<n1*m2+m1*n2<<")"<<endl;
    }
    void del(double n1, double m1, double n2, double m2)
    {   if(pow(n2,2)+pow(m2,2)==0) cout<<"error"<<endl;
    else
        cout<<"otvet "<<(n1*n2+m1*m2)/(n2*n2+m2*m2)<<"+i*("<<(n2*m1-n1*m2)/(n2*n2+m2*m2)<<")"<<endl;
    }
};
int main ()
{
    dejstvija clas;
    clas.input();
    system ("pause");
    return 0;
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
18.04.2013, 11:19 #6
Minor1310, не очень понял в чем у Вас конкретно проблема. При каких входных значениях ведет себя не так как надо? И, кстати, если уж используется класс std::complex, почему бы его не использовать по полной?
Minor1310
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 23
18.04.2013, 13:02  [ТС] #7
Цитата Сообщение от Tulosba Посмотреть сообщение
Minor1310, не очень понял в чем у Вас конкретно проблема. При каких входных значениях ведет себя не так как надо? И, кстати, если уж используется класс std::complex, почему бы его не использовать по полной?
Ммм проблема в том, что при вводе 4го значния типа: "/3" или "*8" - число роли не играет программа считввает его как 0, а при вводе остальных оно падает. Как пофиксить этот баг?
З,ы. То что это быдлокод - знаю, но другу обещал помочь, это его творение.

Добавлено через 3 минуты
Под пофикить баг подразумеваю написать проверку вводимых значений
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
18.04.2013, 13:10 #8
Цитата Сообщение от Minor1310 Посмотреть сообщение
а при вводе остальных оно падает
Ошибку программа пишет только когда действие неверное обнаружено. А если действие ввели успешно, то дальнейшие ошибки ввода не будут обработаны. По-хорошему, после каждого cin >> нужно проверять cin.fail().
Minor1310
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 23
19.04.2013, 00:51  [ТС] #9
Спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 00:51
Привет! Вот еще темы с ответами:

Проверка вводимых данных - C++
Доброго времени суток, форумчане. Я столкнулся с такой проблемой: при введении еденицы измерения, если та инициализирована ранее то все...

Проверка вводимых данных - C++
Вот часть программы int main(void) { int vop; setlocale(LC_ALL, &quot;Russian&quot;); int mas1, mas2, mas3, outmas; int ke1, ke2,...

Проверка корректности вводимых данных - C++
Здравствуйте, подскажите,пожалуйста, как прописать условия проверки. Мне нужно: если вводится радиус e больше одной из сторон, выводилось...

Проверка типа вводимых данных. - C++
Собственно,как осуществить ? К примеру,здесь: int main() { int x; int y; cin &gt;&gt; x;


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.04.2013, 00:51
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru