#c #validation
Вопрос:
Я попытался создать программу, которая позволяет пользователю вводить 2 значения в виде целых чисел и 2 в виде двойников, чтобы найти максимум из двух, соответственно, используя шаблонные функции в C . Кажется, я не могу получить желаемый результат, когда пытаюсь проверить ошибку, так как она не принимает новые данные после сообщения об ошибке. Вывод обычно равен «0» после повторного ввода нового номера. Я попытался использовать код проверки из этого видео на YouTube: https://www.youtube.com/watch?v=5kqJlkQCukkamp;t=666s
Вот код, с которым я работал:
#include<iostream>
#include<cmath>
using namespace std;
template <typename E>
void errorA(E a) {
if (!std::cin.good())
{
cout << "nnERROR! Faulty input! Try again!n";
//clear stream
cin.clear();
std::cin.ignore(INT_MAX, 'n');
//get input again
cout << "Enter NUMBER again: ";
cin >> a;
}
}
template <typename T>
void maximum(Tamp; a, Tamp; b) {
if (a > b) {
cout << a << " is the maximum of these 2 numbers: " << a << " amp; " << b << endl;
}
else if (b > a) {
cout << b << " is the maximum of the 2 numbers: " << a << " amp; " << b << endl;
}
else if (a == b) {
cout << "Both these numbers: " << a << " amp; " << b << ", are equal! " << endl;
}
}
int main() {
int a, b;
cout << "Please enter 2 integers to find its maximum.n";
cout << "Enter 1st number: ";
cin >> a;
errorA (a);
cout << "Enter 2nd number: ";
cin >> b;
errorA( b);
maximum(a, b);
double c, d;
cout << "nnPlease enter 2 doubles to find its maximum.n";
cout << "Enter 1st number: ";
cin >> c;
errorA(c);
cout << "Enter 2nd number: ";
cin >> d;
errorA(d);
maximum(c, d);
}
Комментарии:
1. ваш
errorA
шаблон должен возвращать новоеa
значение, так как вы не передаете его по ссылке.2. Вы также должны использовать ссылочный параметр
errorA(...)
, как и в случае сmaximum(...)
(где он не нужен и должен быть удален)
Ответ №1:
Внимательно посмотрите на сигнатуру errorA
метода:
void errorA(E a);
Сравните его с вашей максимальной функцией:
void maximum(Tamp; a, Tamp; b);
Вы видите разницу? Это в символе амперсанда ( amp; ) — это делает разницу между передачей по значению и передачей по ссылке (с amp;). errorA
Чтобы работать так, как вы ожидаете, вам нужно передать по ссылке ( void errorA(Eamp; a)
, чтобы значение, введенное в errorA, фактически изменяло переданную переменную, а не ее копию, локальную для функции errorA (что и происходит в настоящее время).
Обратите внимание, что функция maximum на самом деле не нуждалась бы в параметрах передачи по ссылке, так как переменные, переданные в качестве параметров, в ней не изменяются.