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

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

Восстановить пароль Регистрация
 
lenchis001
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
06.09.2014, 00:34     Непонятное поведение программы #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
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? Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
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 запихнуть в паблик тогда, результат тот же (если только вы не хотите поизвращаться над кодом), только палками все равно бить будут за вынос внутренних переменных в паблик секцию. Геттеры и сеттеры надо бы.
lenchis001
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
06.09.2014, 01:05  [ТС]     Непонятное поведение программы #3
Спасибо за ответ, по поводу звёздочек: просто вспоминаю пройдённое.
Порылся немного, я так понимаю, что при нарушении потока, объект cin пытается передать прошлые введённые значения, а так как "мивртимкаирот" был первым, то передаётся 0, и срабатывает case 0 и вылетает цикл.
Небольшая защита от разрушенного потока:
вместо while (v);
надо while (v && cin.good());
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
06.09.2014, 01:10     Непонятное поведение программы #4
lenchis001, защита от некорректного ввода уже есть в моем нагло стыренном с англ ресурса коде. Так что тут можете не беспокоиться.
lenchis001
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
06.09.2014, 01:15  [ТС]     Непонятное поведение программы #5
Да, я пробовал, так тоже работает, спасибо.
Но такой вариант как мне кажется мало применим к циклу типа do while, во всяком случае это будет не очень смотреться, но к циклу while согласен - то, что нужно.
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
06.09.2014, 01:18     Непонятное поведение программы #6
хозяин - барин ))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2014, 01:32     Непонятное поведение программы
Еще ссылки по теме:

C++ Непонятное поведение потока ввода: в одной функции букву ввёл = во всех функциях наперёд ввёл. Распродажа!
C++ Непонятное поведение программы
C++ Шаблонный класс с шаблонным оператором внутри - непонятное поведение

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2014, 01:32     Непонятное поведение программы #7
Цитата Сообщение от lenchis001 Посмотреть сообщение
и почему срабатывает case 0?
Почему срабатывет непонятно. У меня (студия 10), например, не срабатывает, просто зацикливание. Если поток ждёт цифру, а вводится буква, то поток ломается, невведённое остаётся в очереди, переменная остаётся неинициализированной (у меня там получается 52428), и происходит зацикливание. Среда какая?

Добавлено через 2 минуты
Некоторые компиляторы неинициализированные переменные инициализируют нулём, может это тот случай.
Yandex
Объявления
06.09.2014, 01:32     Непонятное поведение программы
Ответ Создать тему
Опции темы

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