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

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

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

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

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

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

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

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

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

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

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

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

6
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
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
lenchis001
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
06.09.2014, 01:05  [ТС] #3
Спасибо за ответ, по поводу звёздочек: просто вспоминаю пройдённое.
Порылся немного, я так понимаю, что при нарушении потока, объект cin пытается передать прошлые введённые значения, а так как "мивртимкаирот" был первым, то передаётся 0, и срабатывает case 0 и вылетает цикл.
Небольшая защита от разрушенного потока:
вместо while (v);
надо while (v && cin.good());
0
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
06.09.2014, 01:10 #4
lenchis001, защита от некорректного ввода уже есть в моем нагло стыренном с англ ресурса коде. Так что тут можете не беспокоиться.
0
lenchis001
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
06.09.2014, 01:15  [ТС] #5
Да, я пробовал, так тоже работает, спасибо.
Но такой вариант как мне кажется мало применим к циклу типа do while, во всяком случае это будет не очень смотреться, но к циклу while согласен - то, что нужно.
0
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
06.09.2014, 01:18 #6
хозяин - барин ))
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2014, 01:32 #7
Цитата Сообщение от lenchis001 Посмотреть сообщение
и почему срабатывает case 0?
Почему срабатывет непонятно. У меня (студия 10), например, не срабатывает, просто зацикливание. Если поток ждёт цифру, а вводится буква, то поток ломается, невведённое остаётся в очереди, переменная остаётся неинициализированной (у меня там получается 52428), и происходит зацикливание. Среда какая?

Добавлено через 2 минуты
Некоторые компиляторы неинициализированные переменные инициализируют нулём, может это тот случай.
0
06.09.2014, 01:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2014, 01:32
Привет! Вот еще темы с ответами:

Непонятное поведение простой функции - C++
Решал одну задачу на рекурсию, долго не мог добится результата пока не понял что проблема не в рекурсии а в аргументах функции, сделал...

Непонятное поведение list, vector в другом классе - C++
Салют. class _auxObserver { --- list&lt;gmObjBase*&gt; mObservedObj; vector&lt;int&gt; b; public: ...

Шаблонный класс с шаблонным оператором внутри - непонятное поведение - C++
Написал &quot;кукольный&quot; пример, дабы не смущать читателей ненужными деталями. #include &lt;iostream&gt; template &lt;typename T&gt; struct foo...

Непонятное поведение потока ввода: в одной функции букву ввёл = во всех функциях наперёд ввёл. Распродажа! - C++
Парни, у меня возникла щекотливая ситуация. Делаю маленькую программу работающую с двоичным деревом поиска. Для удобства сделал что-то...


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

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

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