Программа не позволяет вводить отрицательные числа, теперь нужно через регулярные выражения запретить вводить букв.
#include
#include
using namespace std;
int main()
{
setlocale(LC_ALL, "");
float L, D, a, b, c, x, y, z,PI = 3.14;
ret:
cout << "Длина окружности: ";
cin >> D;
cout << "Длина параллелепипеда: ";
cin >> x;
cout << "Ширина параллелепипеда: ";
cin >> y;
cout << "Высота параллелепипеда: ";
cin >> z;
if ((D <= 0) || (x <= 0) || (y <= 0) || (z <= 0)) {
cout << "Введены не коректные данные, введите их заново." << endl;
goto ret;
}
else {
L = D * PI; //Длина окружности
a = sqrt(x * x + y * y);
b = sqrt(x * x + z * z);
c = sqrt(y * y + z * z);
if ((L > a) || (L > b) || (L > c)) {
cout << "Влезет." << endl;
}
else {
cout << "Не влезет." << endl;
}
}
system("pause");
return 0;
}
C/C++
Как через регулярный выражения запретить ввод букв?
А не проще просто исключения кидать, чем трахаться с регулярными выражениями? Вроде, они даже стандартом не предусмотрены
Алексей Гудков
А как в исключение добавить буквы?
Не проще от обратного: разрешить только ввод цифр?
Преобразование вводимого текста в числа происходит в cin.
Если что-то пойдет не так, можно будет узнать об этом при помощи метода cin.fail() и своевременно отреагировать. Например, так:
if (cin.fail())
{
cin.clear(); // Очистить флаг ошибки
cin.ignore(1000, '\n'); // Пропустить введенные данные, которые вызвали ошибку: пропустить до 1000 символов или до конца строки
cout << "Введены некорректные данные, введите их заново." << endl;
goto ret;
}
Но делать это лучше сразу после каждого ввода, где возможна ошибка.
Для вашей программы я сделал специальную функцию input, которая повторно запрашивает ввод, если ввели что-то неправильно:
https://pastebin.com/wvRsbvCf
Предлагаю хорошенько протестировать ее.
Если что-то пойдет не так, можно будет узнать об этом при помощи метода cin.fail() и своевременно отреагировать. Например, так:
if (cin.fail())
{
cin.clear(); // Очистить флаг ошибки
cin.ignore(1000, '\n'); // Пропустить введенные данные, которые вызвали ошибку: пропустить до 1000 символов или до конца строки
cout << "Введены некорректные данные, введите их заново." << endl;
goto ret;
}
Но делать это лучше сразу после каждого ввода, где возможна ошибка.
Для вашей программы я сделал специальную функцию input, которая повторно запрашивает ввод, если ввели что-то неправильно:
https://pastebin.com/wvRsbvCf
Предлагаю хорошенько протестировать ее.
Arnjuk Berliner
этот cin работает так же странно, как и некоторые функции класса string
Уже писал, блин:
scanf("%f%[0123456789]",&a);
scanf("%f%[0123456789]",&a);
int x=-1, y= -1, z= -1;
while (x<0)
{
cout << "Введите не отрицательный Х= ";
if (cin >> x)
{
if (x>(-1) && cin.get()=='\n' ) { cin.unget(); cin.clear(); cin.ignore(32767,'\n'); break; }
}
x= -1; cout<<"Ошибка ввода" << endl;
cin.clear(); cin.ignore(32767,'\n');
}
while (y<0)
{
cout << "Введите не отрицательный Y= ";
if (cin >> y)
{
if (y>(-1) && cin.get()=='\n' ) { cin.unget(); cin.clear(); cin.ignore(32767,'\n'); break; }
}
y= -1; cout<<"Ошибка ввода" << endl;
cin.clear(); cin.ignore(32767,'\n');
}
while (z<0)
{
cout << "Введите не отрицательный Z= ";
if (cin >> z)
{
if (z>(-1) && cin.get()=='\n' ) { cin.unget(); cin.clear(); cin.ignore(32767,'\n'); break; }
}
z= -1; cout<<"Ошибка ввода" << endl;
cin.clear(); cin.ignore(32767,'\n');
}
cout << endl;
cout << "X= " << x << endl;
cout << "Y= " << y << endl;
cout << "Z= " << z << endl;
while (x<0)
{
cout << "Введите не отрицательный Х= ";
if (cin >> x)
{
if (x>(-1) && cin.get()=='\n' ) { cin.unget(); cin.clear(); cin.ignore(32767,'\n'); break; }
}
x= -1; cout<<"Ошибка ввода" << endl;
cin.clear(); cin.ignore(32767,'\n');
}
while (y<0)
{
cout << "Введите не отрицательный Y= ";
if (cin >> y)
{
if (y>(-1) && cin.get()=='\n' ) { cin.unget(); cin.clear(); cin.ignore(32767,'\n'); break; }
}
y= -1; cout<<"Ошибка ввода" << endl;
cin.clear(); cin.ignore(32767,'\n');
}
while (z<0)
{
cout << "Введите не отрицательный Z= ";
if (cin >> z)
{
if (z>(-1) && cin.get()=='\n' ) { cin.unget(); cin.clear(); cin.ignore(32767,'\n'); break; }
}
z= -1; cout<<"Ошибка ввода" << endl;
cin.clear(); cin.ignore(32767,'\n');
}
cout << endl;
cout << "X= " << x << endl;
cout << "Y= " << y << endl;
cout << "Z= " << z << endl;
Азат Латипов
если, например, при вводе 123abc то не будет присвоено 123, а посчитает тоже за ошибку
Азат Латипов
только нужно для double переделать )))))))))))
Азат Латипов
int сменишь на double
Азат Латипов
Кстати, заметил у тебя один ЛОГИЧЕСКИЙ косячок. Вводить нужно длину окружности и вычислять диаметр, чтобы понять войдёт коробка в трубу одной диагональю плоскости или нет
Азат Латипов
а у тебя вводится диаметр и сравнивается длина окружности с размерами коробки. А нужно искать диаметр и сравнивать с диагоналями

Азат Латипов
хотя и у себя косячки заметил...
Похожие вопросы
- Как запретить ввод символов? С++
- Помогите добавить ввод чисел в массив матрицы на языке Си
- C++ Самая частая буква
- C++. Как сделать ввод переменной (размера) на основе которой будет ввод массива?
- Перегрузка операторов ввода-вывода для файловых потоков
- Определить встречается ли в последовательности группа букв 'one', определить последнее вхождение этой группы
- Слова с прописной буквы с++
- Помогите с выражением в С++
- Выбрать из текста слова, в которых имеются удвоенные согласные буквы
- Почему в С++ в отличии от других языков команда ввода-вывода использует << вместо стандартных ();?