СПРОСИ ПРОФИ
👍
0
👎 09

Проверка корректности ввода C++

Подскажите, пожалуйста, как можно проверить три вещественных числа, введенных с клавиатуры, на то, являются ли они числами. То есть программа должна работать так: пользователь вводит три числа (a, b, c), если хотя бы одно из этих чисел будет являться не числом (строкой, буквой, пробелом, переходом на другую строку), в конце выводится сообщение об ошибке (например, «а» должно быть числом! «b» должно быть числом!), после чего программа либо закрывается (если введены корректные данные), либо запрашивает ввести числа заново. Заранее спасибо!

👍
0
👎 0

1. Прочесть строку с предположительным числом.
2. Создать из этой строки объект типа std::stringstream.
3. Попытаться вытащить из него дробное число с помощью оператора >>.
4. Проверить флаг ошибки созданного объекта типа std::stringstream (метод good).

👍
0
👎 0

Разные есть способы. Лично я предпочитаю использовать функцию форматированного ввода, scanf() например. Внимательно изучите её описание – и кодируйте.

👍
0
👎 0

Вопрос про C++, а не Си

👍
+1
👎 1

Автор вопроса не указывал запрета на использование библиотеки функций ввода-вывода Си, в программе на C++ они столь же хорошо работают.

👍
0
👎 0

static const std::regex doubleRegex{ R"([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)" };
if (! std::regex_match(input, doubleRegex)){std::cout<<«Должно быть числом»<<endl;}

👍
0
👎 0

Числа считываете в виде строк(переменную типа string). Далее проверяете каждый символ, что он цифра, точка(только одна и не исключением первого и последнего символов), знак минус(только нулевой символ). Если все условия выполнены, то число, если нет, просите ввести новое. Желательно для проверки числа написать функцию, что бы исключить дублирование кода.

👍
0
👎 0

Еще один вариант с обработкой exception и методами класса std::string

const int NUMBER_COUNT = 3;
string str;
bool correctData = false;
while (!correctData) {
cout<<«Input a, b, c:»;
getline(cin, str);
double number[NUMBER_COUNT];
int i;
size_t sz;
try {
for (i= 0; i<NUMBER_COUNT; i++){
string numberStr = str.substr(0,str.find(" ",0));
str.erase(0,numberStr.length()+1);
number[i] = stod(numberStr,&sz);
if(numberStr.length() != sz){throw invalid_argument(numberStr);}
}
correctData = true;
} catch (invalid_argument e) {
cout<<«Invalid data in number "<<i+1<<» "<<e.what()<< endl;
}
}

  #8   06 окт 2021 00:43   Ответить
👍
0
👎 0

нужно считывать эти параметры не как числа, а как строки. Делать проверку строки на наличие других символов и уже только на этом основании дальше строить логику.

👍
0
👎 0

Написать программу, присвоив необходимые типы соответствующих переменных.

Задайте свой вопрос по программированию
профессионалам

Сейчас онлайн 75 репетиторов по программированию
Получите ответ профи быстро и бесплатно

Другие вопросы на эту тему:

👍
0
👎 01

При запуске программы в Делфи возникает ошибка "First chance exception at $7573C6E3. Exception class EVariantTypeCastError with message 'Could not convert variant of type (Null) into type (String)'. Process P_K_K.exe (2280)"   1 ответ

При запуске программы в Делфи возникает ошибка "First chance exception at $7573C6E3. Exception class EVariantTypeCastError with message 'Could not convert variant of type (Null) into type (String)'. Process P_K_K.exe (2280)", Вот в этой стоке ( DM.Stanke.FieldByName('ID_oshebke').AsInteger:=StrToInt(DM.Prog_oshebke.FieldValues['ID_oshebke']);) данные беру из Аксесса и Тудаже их записываю, на модуле все подключенно, проверила несколько раз.
👍
0
👎 07

Visual BASIC   7 ответов

Пожалуйста, помогите решить задачу ((
Задание:
Задание для контрольной работы содержит задачу.

В задаче необходимо составить программу на алгоритмическом языке Visual BASIC.

Причем, программа должны быть записаны в двух вариантах: в первом варианте необходимо использовать оператор условного перехода
IF ...Go To, а во втором — оператор цикла For... To... Step, Next. Для облегчения решения задачи по ней даны Краткие методические…
  17 июн 2013 17:22  
ASK.PROFI.RU © 2020-2024