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

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

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

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

01.03.2012, 17:07. Просмотров 377. Ответов 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
#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++
перегрузка операторов C++
C++ использования операторов
О перегрузке операторов C++
C++ Перегрузка операторов
Какое значение будет выведено в результате выполнения последовательности операторов C++
Перегрузка операторов C++
Перегрузка операторов C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,467
Записей в блоге: 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
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,467
Записей в блоге: 26
03.03.2012, 00:20     Нарушение последовательности операторов #4
Используй не массив char'ов, а класс std::string

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

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

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