1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
1

Непонятное поведение программы

06.09.2014, 00:34. Показов 565. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет народ, вот кароч:
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
#include"stdafx.h"
#include"iostream"
using namespace std;
class calc{
    int *i, *j;
public:
    int &set_i();
    int &set_j();
    int add();
    int sub();
    int mul();
    float div();
    calc();
    ~calc();
};
int main(){
    typedef short unsigned su;
    setlocale(LC_ALL, "Russian");
    calc c;
    su v;
    do{
        cout << "Какое действие выполнить?\n   0. Выйти\n   1. Сложение   2. Вычитание   3. Умножение   4. Деление\n     Ваш ответ: ";
        cin >> v;
        switch (v){
        case 0:
            cout << "Всего доброго!\n";
            break;
        case 1:
            cout << "Введите значения операндов:\n";
            cin >> c.set_i() >> c.set_j();
            cout << "Ответ: " << c.add();
            break;
        case 2:
            cout << "Введите значения операндов:\n";
            cin >> c.set_i() >> c.set_j();
            cout << "Ответ: " << c.sub();
            break;
        case 3:
            cout << "Введите значения операндов:\n";
            cin >> c.set_i() >> c.set_j();
            cout << "Ответ: " << c.mul();
            break;
        case 4:
            cout << "Введите значения операндов:\n";
            cin >> c.set_i() >> c.set_j();
            cout << "Ответ: " << c.div();
            break;
        default:;
        }
    } while (v);
    system("pause");
    return 0;
}
calc::calc(){
    i = new int, j = new int;
    cout << "Память успешно выделена.\n";
}
calc::~calc(){
    delete i;
    delete j;
    cout << "Память успешно очищена.\n";
}
int &calc::set_i(){
    return *i;
}
int &calc::set_j(){
    return *j;
}
int calc::add(){
    return *i + *j;
}
int calc::sub(){
    return *i - *j;
}
int calc::mul(){
    return *i**j;
}
float calc::div(){
    return (float)*i/(*j);
}
Всё норм, но вот незадача: когда я ввожу сразу (cin>>v) что-то типо "рлшпмукпрлок" то у меня сразу сообщение "Всего доброго!" и я перехожу на "system("pause")", а если case 0 и всё что к нему причитается нет, то сразу на system("pause"), так вот, почему при подобном вводе не сбивается потом и программа не начинает беспорядочно выводить что попало? и почему срабатывает case 0? Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2014, 00:34
Ответы с готовыми решениями:

Непонятное поведение программы
Доброго времени суток. Уважаемые форумчане, очень нуждаюсь в вашей консультации насчёт своей...

Непонятное поведение программы
Пишу статическую либу. В ней есть кусок кода, который уходит в рекурсию.. Только причины мне...

Непонятное поведение
Всем привет! В книге &quot;Прата - Язык программирования C++. Лекции и управжения 2011&quot; нашёл вот такой...

Непонятное поведение функтора
Почему-то не считается произведение 1 и 6 ... #include &lt;iostream&gt; #include &lt;algorithm&gt;...

6
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
06.09.2014, 01:02 2
есть что-то наподобие этого:
C++
1
2
3
4
5
while (!(cin >> v)){
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "Invalid input.  Try again: ";
        }
Можно так же читать строку и пытаться преобразовать её в число, в случае неудачи - повторить ввод.

PS: если компилятор возмутится на max, нужно добавить выше
C++
1
#undef max
Добавлено через 4 минуты
и что за манипуляции с указателями, вполне прокатит
C++
1
2
3
4
5
class calc{
    int i, j;
...
int &calc::set_i(){
    return i;
Нет тонн звездочек, выделение памяти тоже не надо.

Добавлено через 2 минуты
И зачем делать функцию, которая вернет ссылку на значение, не проще ли i j запихнуть в паблик тогда, результат тот же (если только вы не хотите поизвращаться над кодом), только палками все равно бить будут за вынос внутренних переменных в паблик секцию. Геттеры и сеттеры надо бы.
0
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
06.09.2014, 01:05  [ТС] 3
Спасибо за ответ, по поводу звёздочек: просто вспоминаю пройдённое.
Порылся немного, я так понимаю, что при нарушении потока, объект cin пытается передать прошлые введённые значения, а так как "мивртимкаирот" был первым, то передаётся 0, и срабатывает case 0 и вылетает цикл.
Небольшая защита от разрушенного потока:
вместо while (v);
надо while (v && cin.good());
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
06.09.2014, 01:10 4
lenchis001, защита от некорректного ввода уже есть в моем нагло стыренном с англ ресурса коде. Так что тут можете не беспокоиться.
0
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
06.09.2014, 01:15  [ТС] 5
Да, я пробовал, так тоже работает, спасибо.
Но такой вариант как мне кажется мало применим к циклу типа do while, во всяком случае это будет не очень смотреться, но к циклу while согласен - то, что нужно.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
06.09.2014, 01:18 6
хозяин - барин ))
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2014, 01:32 7
Цитата Сообщение от lenchis001 Посмотреть сообщение
и почему срабатывает case 0?
Почему срабатывет непонятно. У меня (студия 10), например, не срабатывает, просто зацикливание. Если поток ждёт цифру, а вводится буква, то поток ломается, невведённое остаётся в очереди, переменная остаётся неинициализированной (у меня там получается 52428), и происходит зацикливание. Среда какая?

Добавлено через 2 минуты
Некоторые компиляторы неинициализированные переменные инициализируют нулём, может это тот случай.
0
06.09.2014, 01:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2014, 01:32
Помогаю со студенческими работами здесь

Непонятное поведение функции
Есть некоторый метод класса: int mustAttack(Chess &amp;chess, Player&amp; p1, Player&amp; p2, int...

Непонятное мне поведение функции
Эта функция себя странно ведёт. Она работает и если с первого раза ввести цифры с клавиатуры, то...

Непонятное поведение простейшей формулы
Добрый вечер. Дано: double a; double d; unsigned int c; unsigned int b; for loop{...

Непонятное поведение std::valarray
Есть такой код: #include &lt;iostream&gt; #include &lt;valarray&gt; using namespace std; int main() {...

непонятное поведение метода getline
Всем привет. Прошу помощи, так как не могу понять логику поведения в работе метода...

Непонятное поведение rvalue/lvalue
Всем привет, объясните, пожалуйста, немного про р-вэлью и л-вэлью в этом коде: #include &lt;iostream&gt;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru