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

Странная(или не странная, незнаю) реакция на буквы, знаки операций - C++

Восстановить пароль Регистрация
 
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 40
21.03.2014, 19:00     Странная(или не странная, незнаю) реакция на буквы, знаки операций #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
#include <iostream> 
#include <cstdlib>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
 int choice; 
 cout <<"Добро пожаловать в мою программу :)\n";
 cout <<"Введите пожалуйста цифру 1, чтобы перейти к расчету зарплаты на руки.\n";
 cout <<"Введите пожалуйста цифру 2, чтобы перейти к расчету зарплаты с налогами.\n";
 cout <<"Введите пожалуйста цифру 3, чтобы выйти из программы.\n";
 for (;;) 
  {
   cout << "Введите число от 1 до 3: "; 
   cin >> choice;
   if (choice == 1 || choice == 2 || choice == 3) 
      {
        break;
      }
    
    else
      {
        cout <<"Извините, но вы ввели число не из диапазона от 1 до 3, попробуйте еще раз :)\n";
      }
  } 
  
 cout <<"Вы ввели цифру: "<<choice<<endl;   
 system("pause");
 return 0;
}
При вводе буквы, знака плюса, минуса и т.д., программа впадает в бесконечный цикл.
У меня есть предположение, что надо сделать проверку переменной choice на букву, но пока не получилось реализовать.
Может есть другие причины такого поведения?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2014, 19:00     Странная(или не странная, незнаю) реакция на буквы, знаки операций
Посмотрите здесь:

C++ Странная инструкция))
Странная программа C++
Странная запись: 1L C++
Странная задача C++
C++ Странная ошибка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,910
Записей в блоге: 2
Завершенные тесты: 1
21.03.2014, 19:10     Странная(или не странная, незнаю) реакция на буквы, знаки операций #2
Цитата Сообщение от Ukrainis Посмотреть сообщение
Может есть другие причины такого поведения?
поток переходит в "ошибочное состояние"
zss
Модератор
Эксперт С++
 Аватар для zss
5948 / 5553 / 1785
Регистрация: 18.12.2011
Сообщений: 14,188
Завершенные тесты: 1
21.03.2014, 19:40     Странная(или не странная, незнаю) реакция на буквы, знаки операций #3
Можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
   if( cin >> choice)
   {
        cout <<"Вы ввели цифру: "<<choice<<endl;   
        if (choice == 1 || choice == 2 || choice == 3) 
            break;
        else
            cout <<"Извините, но вы ввели число не из диапазона от 1 до 3, попробуйте еще раз :)\n";
   }else
   {
        cout <<"Извините, но вы ввели не число.\n";
    break;
   }
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 40
21.03.2014, 20:14  [ТС]     Странная(или не странная, незнаю) реакция на буквы, знаки операций #4
zss, можете обьяснить, как в вашем коде идет проверка, цифра или нет была введена пользователем?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
21.03.2014, 20:34     Странная(или не странная, незнаю) реакция на буквы, знаки операций #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream> 
using namespace std;
int main(){
    setlocale(LC_ALL, "rus"); 
    char choice; cout <<"Добро пожаловать в мою программу :)\n"; 
    cout <<"Введите пожалуйста цифру 1, чтобы перейти к расчету зарплаты на руки.\n"; 
    cout <<"Введите пожалуйста цифру 2, чтобы перейти к расчету зарплаты с налогами.\n"; 
    cout <<"Введите пожалуйста цифру 3, чтобы выйти из программы.\n"; 
    for (;;) { cout << "Введите число от 1 до 3: "; 
    cin >> choice; 
    if (choice == '1' || choice == '2' || choice == '3') break; 
    else { cout <<"Извините, но вы ввели число не из диапазона от 1 до 3, попробуйте еще раз :)\n";
    } 
    }
    cout <<"Вы ввели цифру: "<<(choice - '0')<<endl;
    system("pause"); 
    return 0; 
}
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 40
21.03.2014, 20:38  [ТС]     Странная(или не странная, незнаю) реакция на буквы, знаки операций #6
IGPIGP, спасибо, и опять же, можете обьяснить, как тут происходит проверка?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.03.2014, 21:14     Странная(или не странная, незнаю) реакция на буквы, знаки операций #7
std::cin, являющийся объектом класса std::istream имеет operator void* (для C++98) или operator bool (С++11), который обеспечивает в итоге преобразование выражения ( cin >> choice ) к булеву типу (true/false). Преобразование реализовано таким образом, что возвращается true если не было ошибки чтения, или false, если была. Т.к. choice имеет целый тип, то если будет прочитано что-то, что не может быть интерпретировано как целое, будет выставлен флаг ошибки. Более подробно см. тут.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
21.03.2014, 21:14     Странная(или не странная, незнаю) реакция на буквы, знаки операций #8
Цитата Сообщение от Ukrainis Посмотреть сообщение
как тут происходит проверка?
Не понимаю, что объяснить. Для char определена операция сравнения, то есть:
C++
1
choice == '1'
тогда и только тогда, когда значение choice это символ '1'.
а тут:
C++
1
choice - '0'
происходит преобразование обеих переменных к целому типу, зависящему от кодировки (например ASCI). Это потому, что вычитание определено для целых. То есть будет работать, если коды символов в диапазоне '0'...'9' расположены последовательно. Обычно так и есть, наверное.
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 40
21.03.2014, 21:52  [ТС]     Странная(или не странная, незнаю) реакция на буквы, знаки операций #9
Изменил первую переменную на тип char, теперь вообще не заканчивает цикл
Вот новый код:
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
#include <iostream> 
#include <cstdlib>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
 char choice; 
 cout <<"Добро пожаловать в мою программу :)\n";
 cout <<"Введите пожалуйста цифру 1, чтобы перейти к расчету зарплаты на руки.\n";
 cout <<"Введите пожалуйста цифру 2, чтобы перейти к расчету зарплаты с налогами.\n";
 cout <<"Введите пожалуйста цифру 3, чтобы выйти из программы.\n";
 for (;;) 
  {
   cout << "Введите число от 1 до 3: "; 
   cin >> choice;
   if (choice == 1 || choice == 2 || choice == 3) 
      {
        break;
      }
    
    else
      {
        cout <<"Извините, но вы ввели число не из диапазона от 1 до 3, попробуйте еще раз :)\n";
      }
  } 
  
 cout <<"Вы ввели цифру: "<<choice<<endl;   
 system("pause");
 return 0;
}
Задача в том, чтобы на неправильную цифру или букву или еще что, он просто предлагал еще раз ввести цифру, а чтобы на правильную он шел дальше.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.03.2014, 21:58     Странная(или не странная, незнаю) реакция на буквы, знаки операций #10
Замените
C++
1
if (choice == 1 || choice == 2 || choice == 3)
на
C++
1
if (choice == '1' || choice == '2' || choice == '3')
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 40
21.03.2014, 22:01  [ТС]     Странная(или не странная, незнаю) реакция на буквы, знаки операций #11
Самое смешное, до этого пробовал двойные кавычки, так выдал ошибку))), до одинарных не додумался(.
А в сообщении от IGPIGP не обратил на них внимание вначале.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2014, 22:07     Странная(или не странная, незнаю) реакция на буквы, знаки операций
Еще ссылки по теме:

C++ Странная реакция на нажатие стрелки
Странная штука C++
Странная последовательность C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.03.2014, 22:07     Странная(или не странная, незнаю) реакция на буквы, знаки операций #12
Цитата Сообщение от Ukrainis Посмотреть сообщение
до этого пробовал двойные кавычки
Методом проб и ошибок многому не научитесь в программировании. Лучше читайте литературу чтобы не путаться в типах.
1 - число
'1' - символ
"1" - строка
Yandex
Объявления
21.03.2014, 22:07     Странная(или не странная, незнаю) реакция на буквы, знаки операций
Ответ Создать тему
Опции темы

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