C++ 使用函数模板查找任何输入数据类型的中间值

C++ Find the middle value of any inputted data type using function templates?

本文关键字:数据类型 中间 输入 任何 函数模板 查找 C++      更新时间:2023-10-16

我遇到了一些障碍,起初它似乎很简单,但现在我似乎无法解决它,任何帮助将不胜感激。

所以问题是:用户输入三个数据类型的值,int,float或char。 然后,程序必须返回中间值。

这是我到目前为止所拥有的:

该练习要求我使用函数模板,而不是数组。

头文件:

#ifndef MIDTEMP_H
#define MIDTEMP_H
template <class T>
T doMiddle(T param, T param2, T param3)
{
   if ((param<param2 && param>param3) || (param<param3 && param>param2) || (param == param2 == param3))
    {
       return param;
    }
   else if ((param2<param && param2>param3) || (param2<param3 && param2>param) || (param2 == param == param3))
    {
      return param2;
    }
   else if ((param3<param2 && param3>param) || (param3<param && param3>param2) || (param3 == param2 == param))
    {
      return param3;
    }
   else if (param == param2 && param < param3)
    {
      return param;
    }
}
#endif

现在这是将测试我的标头函数的代码:

#include<iostream>
#include "Middle.h"
using std::cin;
using std::cout;
using std::endl;
int main()
{
cout << "Please enter 3 integers. IF input is incorrect please input until correct." << endl;
cout << endl;
int a, b, c;
while (!(cin >> a >> b >> c))
{
    cin.clear();
    cin.ignore();
}
cout << "The Middle is: " << doMiddle(a, b, c) << endl;
cout << endl;
//=======================================================
cout << "Please enter 3 floating point values.  IF input is incorrect please input until correct." << endl;
cout << endl;
float d, e, f;
while (!(cin >> d >> e >> f))
{
    cin.clear();
    cin.ignore();
}
cout << "The Middle is: " << doMiddle(d, e, f) << endl;
cout << endl;
//=======================================================
cout << "Please enter 3 characters. IF input is incorrect please input until correct." << endl;
cout << endl;
char g, h, j;
while (!(cin >> g >> h >> j))
{
    cin.clear();
    cin.ignore();
}
cout << "The Middle is: " << doMiddle(g, h, j) << endl;
cout<<endl;
return 0;
}

所以它工作得很好,但让我们说我这样做(来自cmd):

请输入 3 个整数。如果输入不正确,请输入直到正确。

53.262中间是:2

请输入 3 个浮点值。 如果输入不正确,请输入直到

9,099.0中间为:-1.#IND

请输入 3 个字符。如果输入不正确,请输入直到正确。

rrr中间是:r

为什么它返回 -1.#IND 值,是否有其他方法可以在没有那些荒谬的 if 语句的情况下做到这一点?

template<class T>
T doMiddle(T t1, T t2, T t3){
  T arr[]={t1,t2,t3};
  using std::begin; using std::end;
  std::nth_element( begin(arr), begin(arr)+1, end(arr) );
  return arr[1];
}

会做这个伎俩。 为什么要重新发明轮子?

您的函数会打印-1.#IND因为如果所有检查都失败,您的模板函数不会返回值(如果所有值都相同,则会发生)。

当输入的所有值都相同时,(param == param2 == param3)将始终计算为 false,因为param == param2计算值为 bool 并且 bool(例如 true)不等于 9.0(来自您的示例)。

然后,模板方法退出而不返回,打印时会从堆栈中取出垃圾。

你的平等检查实际上应该是第一个这样的:

if ((param == param2) && (param2 == param3))
    return param;

然后你继续检查中间值,不要忘记在最后else的情况下返回一些东西。

说到检查,如果只有 2 个值相等,您的逻辑就有缺陷。在直接比较float值时也应谨慎,因为某些接近值可能表示为相同的浮点值。