Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 42
#1

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

21.03.2014, 19:00. Просмотров 1052. Ответов 11
Метки нет (Все метки)

Всем добрый день.

Делаю маленькую наработку, пока есть только начало. Ниже код:
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 на букву, но пока не получилось реализовать.
Может есть другие причины такого поведения?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2014, 19:00
Ответы с готовыми решениями:

Странная реакция на нажатие стрелки
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() {...

Мусорка или "странная" работа массива указателей
Всем привет. Постепенно поглащаю C++. Знания пока на уровне нуля. Учусь по...

Странная ошибка
// ConsoleApplication5.cpp: определяет точку входа для консольного приложения....

Странная ошибка
#ifndef HUGEINTEGER_H #define HUGEINTEGER_H class HugeInteger { ...

Странная инструкция))
Доброго времени суток! Смутила функция, приведенная в примере одной книжки: ...

11
Croessmah
++Ͻ
14527 / 8289 / 1556
Регистрация: 27.09.2012
Сообщений: 20,352
Записей в блоге: 3
Завершенные тесты: 1
21.03.2014, 19:10 #2
Цитата Сообщение от Ukrainis Посмотреть сообщение
Может есть другие причины такого поведения?
поток переходит в "ошибочное состояние"
1
zss
Модератор
Эксперт С++
7096 / 6627 / 4196
Регистрация: 18.12.2011
Сообщений: 17,473
Завершенные тесты: 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;
   }
1
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 42
21.03.2014, 20:14  [ТС] #4
zss, можете обьяснить, как в вашем коде идет проверка, цифра или нет была введена пользователем?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
21.03.2014, 20:34 #5
Лучший ответ Сообщение было отмечено Ukrainis как решение

Решение

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; 
}
1
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 42
21.03.2014, 20:38  [ТС] #6
IGPIGP, спасибо, и опять же, можете обьяснить, как тут происходит проверка?
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.03.2014, 21:14 #7
std::cin, являющийся объектом класса std::istream имеет operator void* (для C++98) или operator bool (С++11), который обеспечивает в итоге преобразование выражения ( cin >> choice ) к булеву типу (true/false). Преобразование реализовано таким образом, что возвращается true если не было ошибки чтения, или false, если была. Т.к. choice имеет целый тип, то если будет прочитано что-то, что не может быть интерпретировано как целое, будет выставлен флаг ошибки. Более подробно см. тут.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
21.03.2014, 21:14 #8
Цитата Сообщение от Ukrainis Посмотреть сообщение
как тут происходит проверка?
Не понимаю, что объяснить. Для char определена операция сравнения, то есть:
C++
1
choice == '1'
тогда и только тогда, когда значение choice это символ '1'.
а тут:
C++
1
choice - '0'
происходит преобразование обеих переменных к целому типу, зависящему от кодировки (например ASCI). Это потому, что вычитание определено для целых. То есть будет работать, если коды символов в диапазоне '0'...'9' расположены последовательно. Обычно так и есть, наверное.
1
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 42
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;
}
Задача в том, чтобы на неправильную цифру или букву или еще что, он просто предлагал еще раз ввести цифру, а чтобы на правильную он шел дальше.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.03.2014, 21:58 #10
Замените
C++
1
if (choice == 1 || choice == 2 || choice == 3)
на
C++
1
if (choice == '1' || choice == '2' || choice == '3')
1
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 42
21.03.2014, 22:01  [ТС] #11
Самое смешное, до этого пробовал двойные кавычки, так выдал ошибку))), до одинарных не додумался(.
А в сообщении от IGPIGP не обратил на них внимание вначале.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.03.2014, 22:07 #12
Цитата Сообщение от Ukrainis Посмотреть сообщение
до этого пробовал двойные кавычки
Методом проб и ошибок многому не научитесь в программировании. Лучше читайте литературу чтобы не путаться в типах.
1 - число
'1' - символ
"1" - строка
1
21.03.2014, 22:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2014, 22:07

Странная задача
Создать класс живущих с местоположением. Определить наследуемые классы - лиса,...

Странная формула.
Есть задание: Дано натуральное n, вычислить 1/0!+1/1!+...+1/n! Как...

Странная программа
Всем привет! Я написал простенькую программу: #include&lt;stdio.h&gt;...


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

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

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