Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

01.03.2012, 17:07. Просмотров 411. Ответов 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;}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2012, 17:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Нарушение последовательности операторов (C++):

Какое значение будет выведено в результате выполнения последовательности операторов - C++
Помогите ответить на вопрос: Какое значение будет выведено в результате выполнения последовательности операторов cin &gt;&gt; x&gt;&gt;y; z=sqrt(...

Задача с использованием логических операторов и операторов ветвления - C++
Вот вам задачка, чтоб голову поломать :D Вася работает программистом и получает 50$ за каждые 100 строк кода. За каждое третье...

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this - C++
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

Найти, сколько членов первой последовательности совпадает с членами второй последовательности - C++
Даны две последовательности целых чисел а1 и а2 an и b1 и b2 bn. Все члены последовательностей различные числа. Найти, сколько членов...

В последовательности найти числа, которые близки к числам другой последовательности - C++
даны две последовательности чисел A = {a1, a2,…, an}, B = {b1, b2, …, bn},напечатать те и только те числа aj из последовательности A, для...

Построить элементы в убывающей последовательности и вывести первоначальные индексы последовательности - C++
Здравствуйте, уважаемые форумчане!! Помогите разобраться с лабораторной работой Задача -&gt; Построить элементы в убывающей...

3
Evg
Эксперт CАвтор FAQ
18912 / 6871 / 503
Регистрация: 30.03.2009
Сообщений: 19,346
Записей в блоге: 30
01.03.2012, 18:22 #2
После того, как ты ввёл "123.456", то "cin >> ret" у тебя из входного потока прочёл "123", а остаток ".456" остался в буфере ввода и, соответсвенно, на следующей итерации цикла попытался прочитать и обломался.

Правильно надо читать строку (а не int), и далее уже анализировать строку на предмет того, что там нет лишних символов
0
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;
}
0
Evg
Эксперт CАвтор FAQ
18912 / 6871 / 503
Регистрация: 30.03.2009
Сообщений: 19,346
Записей в блоге: 30
03.03.2012, 00:20 #4
Используй не массив char'ов, а класс std::string

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

Добавлено через 31 секунду
И пользуйся тэгами, когда код пишешь. Невозможно же его смотреть
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2012, 00:20
Привет! Вот еще темы с ответами:

В последовательности Фибоначчи найти индекс члена последовательности, удовлетворяющего условию - C++
помогите не могу найти ошибку вводится число A,найти номер К такого числа Фибоначчи ,что Xк-1&lt;=A&lt;Xк. #include &lt;iostream&gt; ...

Массив. Найти, сколько членов первой последовательности совпадает с членами второй последовательности - C++
Всем привет! Нужна помощь в решении задачки. Вот её условие: Даны две последовательности целых чисел а1, а2,..., аn и b1, b2,...,...

Найти сумму элементов последовательности, начиная от первого отрицательного элемента и до конца последовательности. - C++
Помогите написать простенькую программку :( Найти сумму элементов последовательности x1, x2, …, xn (x&lt;=30), начиная от первого...

Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности - C++
Никак не приходит в голову, как составить алгоритм, реализующий проверку на то, является ли число простым и является ли совершенным. Если...


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

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

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