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

Нарушение последовательности операторов - C++

Восстановить пароль Регистрация
 
hulio
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 11
01.03.2012, 17:07     Нарушение последовательности операторов #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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<iostream>
#include<clocale>
using namespace std;
int getint(void);
void main( ){
    setlocale(LC_CTYPE, "rus");
    int a, cents, euro;
    double proc;
    while(1){
    cout<<"введите количество товаров"<<endl;
    a=getint( );
    cout<<"введите стоимость за штуку евро "<<endl;
    euro=getint( );
    cout<<"центов "<<endl;
    cents=getint( );
    if(cents>=100){
        for(int i=0; 100<=cents; i++){
            cents=cents-100;
            euro=euro+1;}
    }
    euro=euro*a;
    cents=cents*a;
    if(cents>=100){
        for(int i=0; 100<=cents; i++){
            cents=cents-100;
            euro=euro+1;}
    }
     if(euro==100){
        proc=euro/100*3;
        cout<<"скидка на "<<proc<<" евро"<<endl;}
     else if(euro==200){
        proc=euro/100*5;
        cout<<"скидка на "<<proc<<" евро"<<endl;}
     else if(euro>=300){
        proc=(double)euro/100*7;
        cout<<"скидка на "<<proc<<" евро"<<endl;}
     else cout<<"скидки не будет"<<endl;
    }
}
int getint(void){
    int ret;
do
{
cin>>ret;
if(cin.fail( ))
{
cin.clear( );
cin.get( );
cout<<"\nвведите целое число "<<endl;
}
else break;
}while(1);
return ret;}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2012, 17:07     Нарушение последовательности операторов
Посмотрите здесь:

C++ Найти сумму элементов последовательности, начиная от первого отрицательного элемента и до конца последовательности.
Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности C++
Даны две последовательности.Верно ли, что все числа второй последовательности входят в первую. C++
Какое значение будет выведено в результате выполнения последовательности операторов C++
C++ Каждое простое число последовательности увеличить в два раза, посчитать количество простых чисел в исходной последовательности
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
01.03.2012, 18:22     Нарушение последовательности операторов #2
После того, как ты ввёл "123.456", то "cin >> ret" у тебя из входного потока прочёл "123", а остаток ".456" остался в буфере ввода и, соответсвенно, на следующей итерации цикла попытался прочитать и обломался.

Правильно надо читать строку (а не int), и далее уже анализировать строку на предмет того, что там нет лишних символов
hulio
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 11
02.03.2012, 23:35  [ТС]     Нарушение последовательности операторов #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
#include<iostream>
#include<cstdlib>
#include<clocale>
using namespace std;
int getint(const char *str);
void main( ){
        setlocale(LC_CTYPE, "rus");
        int a, cents, euro;
        double proc;
        char val[10];
        while(1){
        cout<<"введите количество товаров"<<endl;
        cin>>val;
        a=getint(val);
        cout<<"введите стоимость за штуку евро "<<endl;
        cin>>val;
        euro=getint(val);
        cout<<"центов "<<endl;
        cin>>val;
        cents=getint(val);
        if(cents>=100){
                for(int i=0; 100<=cents; i++){
                        cents=cents-100;
                        euro=euro+1;}
        }
        euro=euro*a;
        cents=cents*a;
    if(cents>=100){
                for(int i=0; 100<=cents; i++){
                        cents=cents-100;
                        euro=euro+1;}
        }
         if(euro==100){
                proc=euro/100*3;
                cout<<"скидка на "<<proc<<" евро"<<endl;}
         else if(euro==200){
                proc=euro/100*5;
                cout<<"скидка на "<<proc<<" евро"<<endl;}
         else if(euro>=300){
                proc=(double)euro/100*7;
                cout<<"скидка на "<<proc<<" евро"<<endl;}
         else cout<<"скидки не будет"<<endl;
        }
}
int getint(const char *str){
        int ret;
        bool err;
        char *end=NULL;
        ret=strtol(str, &end, 10);
        err=((*str=='\0')||(*end!='\0'));
        if(err)
            cout<<"вводите целые числа"<<endl;
        return ret;
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
03.03.2012, 00:20     Нарушение последовательности операторов #4
Используй не массив char'ов, а класс std::string

Добавлено через 36 секунд
Ну или если так уж хочется массив char'ов, то влепи размер на 16 килобайт, памяти чтоли жалко

Добавлено через 31 секунду
И пользуйся тэгами, когда код пишешь. Невозможно же его смотреть
Yandex
Объявления
03.03.2012, 00:20     Нарушение последовательности операторов
Ответ Создать тему
Опции темы

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