С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 42
#1

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

21.03.2014, 19:00. Просмотров 475. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Странная(или не странная, незнаю) реакция на буквы, знаки операций (C++):

Странная реакция на нажатие стрелки - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { char a; for(;;){ a=getch(); ...

Мусорка или "странная" работа массива указателей - C++
Всем привет. Постепенно поглащаю C++. Знания пока на уровне нуля. Учусь по дейтелу + шилду + интернет. &quot;Пишу&quot; в Dev-C++. Дошёл до объектов....

Странная ошибка - C++
#ifndef HUGEINTEGER_H #define HUGEINTEGER_H class HugeInteger { public: ...

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

странная последовательность - C++
Во входном файле записана последовательность чисел в странном формате: у каждого числа сначала записано количество цифр в этом числе, а...

Странная функция - C++
Здравствуйте. Кто-нибудь сталкивался с такой функцией. Yi известно....

11
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
21.03.2014, 19:10 #2
Цитата Сообщение от Ukrainis Посмотреть сообщение
Может есть другие причины такого поведения?
поток переходит в "ошибочное состояние"
1
zss
Модератор
Эксперт С++
6584 / 6146 / 2025
Регистрация: 18.12.2011
Сообщений: 16,024
Завершенные тесты: 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
Комп_Оратор)
Эксперт по математике/физике
6519 / 3156 / 309
Регистрация: 04.12.2011
Сообщений: 8,726
Записей в блоге: 5
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; 
}
1
Ukrainis
2 / 2 / 0
Регистрация: 26.10.2013
Сообщений: 42
21.03.2014, 20:38  [ТС] #6
IGPIGP, спасибо, и опять же, можете обьяснить, как тут происходит проверка?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Комп_Оратор)
Эксперт по математике/физике
6519 / 3156 / 309
Регистрация: 04.12.2011
Сообщений: 8,726
Записей в блоге: 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
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Привет! Вот еще темы с ответами:

Странная ошибка с else - C++
Мне пишет что в 21 строке ошибка, делал и с цифрами и с текстом, ошибка всегда на else, ошибка: D:\CBProject\Test1\main.cpp||In...

Странная программа - C++
Всем привет! Я написал простенькую программу: #include&lt;stdio.h&gt; #include&lt;conio.h&gt; int main() { double a,b,c,d; ...

Странная штука - C++
Фсё было хорошо а тут средь бело дня вот такая штука как с этим спавиться

Странная запись: 1L - C++
Здравствуйте! Только что наткнулся на запись var = 1L &lt;&lt; 1. Все понятно кроме одного: зачем добавлять L после 1?


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

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

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