Программа рассчитывает влезет ли параллелепипед в окружность. Все данные вводятся корректно, только положительные, но проблема в том, что если ввести букву, то код начинает баговать и вести себя не адекватно, вопрос, как сделать так, чтобы нельзя было вводить символы?
```
#include
#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++
Как запретить ввод символов? С++
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
double real(const char* msg) {
double value;
while (true) {
try {
cout << msg;
cin >> value;
if (value <= 0) throw exception("");
break;
} catch (...) {
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cerr << "\a";
}
}
cin.ignore(cin.rdbuf()->in_avail());
return value;
}
double diagonal(const double a, const double b) {
return sqrt(a * a + b * b);
}
int main() {
system("chcp 1251 > nul");
constexpr auto pi = 3.1415926535897932;
const auto l = real("Длина окружности: ");
const auto d = l / pi;
const auto a = real("Длина параллелепипеда: ");
const auto b = real("Ширина параллелепипеда: ");
const auto c = real("Высота параллелепипеда: ");
const auto yes = "Войдёт.";
if (diagonal(a, b) < d) cout << yes;
else if (diagonal(a, c) < d) cout << yes;
else if (diagonal(c, b) < d) cout << yes;
else cout << "Не войдёт.";
puts("");
system("pause > nul");
}
#include <cmath>
#include <cstdlib>
using namespace std;
double real(const char* msg) {
double value;
while (true) {
try {
cout << msg;
cin >> value;
if (value <= 0) throw exception("");
break;
} catch (...) {
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cerr << "\a";
}
}
cin.ignore(cin.rdbuf()->in_avail());
return value;
}
double diagonal(const double a, const double b) {
return sqrt(a * a + b * b);
}
int main() {
system("chcp 1251 > nul");
constexpr auto pi = 3.1415926535897932;
const auto l = real("Длина окружности: ");
const auto d = l / pi;
const auto a = real("Длина параллелепипеда: ");
const auto b = real("Ширина параллелепипеда: ");
const auto c = real("Высота параллелепипеда: ");
const auto yes = "Войдёт.";
if (diagonal(a, b) < d) cout << yes;
else if (diagonal(a, c) < d) cout << yes;
else if (diagonal(c, b) < d) cout << yes;
else cout << "Не войдёт.";
puts("");
system("pause > nul");
}
Попробуй так:
float a;
scanf("%f%[0123456789]",&a);
Будут приниматься на ввод только цифры. Другое будет игнорироваться.
float a;
scanf("%f%[0123456789]",&a);
Будут приниматься на ввод только цифры. Другое будет игнорироваться.
cin >> D;
if (!cin) {
cerr << "retard" << endl;
return 1;
}
и так после каждого cin-а
if (!cin) {
cerr << "retard" << endl;
return 1;
}
и так после каждого cin-а
можно завести функцию и вводить с ее помощью
double read(const string &s) {
double res;
do {
cout << s << '\n';
cin >> res;
if (! cin.fail())
return res;
cin.clear();
cin.ignore(255,'\n');
cout << "Неверный ввод\n";
} while (true);
}
double read(const string &s) {
double res;
do {
cout << s << '\n';
cin >> res;
if (! cin.fail())
return res;
cin.clear();
cin.ignore(255,'\n');
cout << "Неверный ввод\n";
} while (true);
}
Просто вводи нежнее и все будет хорошо.
Написать функцию, которая вводит с std::cin строку, проверяет ее на валидность и потом возвращает результат. И использовать ее для ввода всех данных. Кстати, если вы не пишете под микроконтроллер или GPU, в обычной программе стоит всегда использовать double вместо float.
Похожие вопросы
- Как через регулярный выражения запретить ввод букв?
- Помогите добавить ввод чисел в массив матрицы на языке Си
- Как узнать количество символов в UTF8 массиве?(Си)
- Ввести с клавиатуры символ и преобразовать его в символ верхнего регистра. Как сделать без библиотеки string?
- C++. Как сделать ввод переменной (размера) на основе которой будет ввод массива?
- Перегрузка операторов ввода-вывода для файловых потоков
- Как удалить повторные вхождения каждого символа?
- Отображение символов UTF8 в консоли Windows. (Си)
- Ошибка с русскими символами в языке C++ программе xcode. Пропадает если указать большее количество элементов в строке.
- Сравнение элементов массива типа char с символом типа char