Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 30.12.2021
Сообщений: 2

Проблема с потоком вывода в цикле для проверки правильности вводимого значения в переменную

30.12.2021, 23:29. Показов 1213. Ответов 4

Студворк — интернет-сервис помощи студентам
Я начал изучение С++(изучаю по книге Страуструпа, принципы и практическое использование C++, вроде так). Передо мной стояла задача написать код, который бы переводил количество одной валюты, в количество другой. И на этапе изучения я дошел до раздела изучения инструкции switch, и решил ее использовать для проверки правильности вводимого значения в поток ввода cin. Вот сам код:
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
[SPOILER]
#include "std_lib_facilities.h"
#include "Windows.h"
// Программа переводит доллары в разные мировые валюты и обратно
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    const double usd_per_ien = 114.21; // Коэффициенты перевода из долларов в определенную валюту и обратно
    const double usd_per_euro = 0.883;
    const double usd_per_pnd = 0.749;[INDENT][/INDENT][/SPOILER]
    cout << "МЕНЮ\n1. В йены и обратно\n2. В евро и обратно\n3. В фунты и обратно\n";
    int punct_menu;
 
[B] while (true) { 
        // Этот блок while нужен для проверки того, что будет выбран именно пункт меню, а не что-то другое
        cout << "\nВыберите пункт меню и введите его здесь: ";
        cin >> punct_menu;
        switch (punct_menu) {
        case 1:
            break;
        case 2:
            break;
        case 3:
            break;
        default:
            cout << "\nПожалуйста будьте внимательны и вводите\nто, что вам указывает компьютер\n";
            continue;
        }
 
        break;
    }[/B]
 
    double value_curr;
    string curr;
 
    switch (punct_menu) {
    case 1:
        while (true) {
            cout << "\nВведите количество нужной валюты(пример: 1340 ien, 92 dlr): ";
            cin >> value_curr >> curr;
            if (curr == "ien")
                break;
            if (curr == "dlr")
                break;
            else
                cout << "\nБудьте добры, проверьте схожесть написанного с примером!\n";
                continue;
        }
        cout << value_curr << " " << curr;
    }
    keep_window_open();
}
Основная проблема находиться в коде, выделенным полужирным шрифтом. Она заключается в том, что при вводе туда данных типа string, происходит бесконечный вывод строки: cout << ("\nПожалуйста будьте внимательны и вводите\nто, что вам указывает компьютер\n". Хотя по факту должно было произойти повторение цикла с последующим вводом новых значений в переменную punct_menu, однако этого не происходит. Похожая проблема есть и в последнем участке кода, где я пытаюсь проверить значение переменной curr. Буду очень благодарен, если объясните мне, что тут не так)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.12.2021, 23:29
Ответы с готовыми решениями:

Алгоритм проверки вводимого значения на уникальность.
Здравствуйте друзья, помогите пожалуйста срочно нужно написать алгоритм проверки вводимых значений на уникальность, к примеру вводишь...

Проверка вводимого значения в переменную int
Вот код #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; int main() { int n=1; while (n) { cout &lt;&lt; &quot;Vvedite...

Макрос для проверки полей на значения и вывода сообщения про ошибку или ее отсутствие в этом поле
И так... У меня есть задание на создания макроса, который будет проверять значения полей на их правильность и выводить сообщение если в нем...

4
111 / 74 / 39
Регистрация: 16.05.2020
Сообщений: 292
31.12.2021, 00:11
Цитата Сообщение от DaMiGo Посмотреть сообщение
при вводе туда данных типа string
Это куда?

Добавлено через 17 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cstdlib>
#include <windows.h>
using namespace std;
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int punct_menu;
    while (true){
        cout << "\nВыберите пункт меню и введите его здесь: ";
        cin >> punct_menu;
        switch (punct_menu){
        case 1:  cout << "Первое"; break;
        case 2:  cout << "Второе"; break;
        case 3:  cout << "Третье"; break;
        case 4:  exit(0); break;
        default: cout << "\nПожалуйста будьте внимательны ...р\n";
        break;
        }
    }
}
0
3 / 2 / 1
Регистрация: 11.12.2020
Сообщений: 71
31.12.2021, 01:35
Лучший ответ Сообщение было отмечено DaMiGo как решение

Решение

Жаль, что не очевидно.
Когда пользователь вводит троек, то эти символы помещаются в буфер. Затем оператор >> пытается извлечь твои символы в переменную типа int, чего сделать у него не получается. При этом символы все так же остаются в буфере. При этом выпогнится дальше default...
И снова попытка извлечения. Символы там уже есть, так как извлечения не произошло. В таком случае надо сделать очистку cin.
Подробнее о валидация пользовательского ввода и правильном очистке буфера можно почитать например тут https://ravesli.com/urok-72-ob... cin/#toc-5
0
111 / 74 / 39
Регистрация: 16.05.2020
Сообщений: 292
31.12.2021, 11:30
Не тот блок смотрел ...

Добавлено через 17 минут
C++
1
if (cin >> value_curr >> curr)
0
0 / 0 / 0
Регистрация: 30.12.2021
Сообщений: 2
31.12.2021, 20:00  [ТС]
Я понял свою ошибку, спасибо. Как я понял, я просто зашел дальше, чем должен был, т.к. я еще не разбирал полностью библиотеку iostream и не знал о таких тонкостях. В принципе ошибка довольна простая, как я понял, но думаю углубляться туда пока не стоит. В дальнейшем при изучении я учту то о чем вы мне рассказали, огромное спасибо)

Добавлено через 2 минуты
Цитата Сообщение от ivikis Посмотреть сообщение
Не тот блок смотрел ...

Добавлено через 17 минут
C++
1
if (cin >> value_curr >> curr)
Ivkis, я конечно рад, что вы хотели мне помочь с решением, однако я имел ввиду чутка другое. Мне нужно было знать корень проблемы, чтоб в дальнейшем, я понимал, что я сделал не так. Но вам тоже спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.12.2021, 20:00
Помогаю со студенческими работами здесь

Программа для проверки правильности хэшей
Блокчейн (blockchain) переводится как «цепочка блоков». Это способ хранения данных, защищённый от подделки, используемый, в частности,...

Составить программу для проверки, что больше a^3 или (2*a)^2 ,- для числа а вводимого с клавиатуры
Составить программу для проверки, что больше a3 или (2*a)2 ,- для числа а вводимого с клавиатуры

Составить регулярные выражение для проверки вводимого выражения
Есть строка, не могу составить регулярные выражение для проверки вводимого к математическому примеру &quot;abs(x+3)/(2*a*b)&quot; для...

xmlhttp и asphttp для проверки правильности URL
Народ, может кто использовал xmlhttp или asphttp для проверки правильности (корректности) URL сайта, не кинете кусочек кода? С уважением,...

Регулярное выражение для проверки правильности email
Подскажите, как мне дописать код, чтобы при вводе неправильного e-mail выписывало текст об ошибке, или что-то в этом роде. А то у меня,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru