C++ 使用函数模板查找任何输入数据类型的中间值
C++ Find the middle value of any inputted data type using function templates?
我遇到了一些障碍,起初它似乎很简单,但现在我似乎无法解决它,任何帮助将不胜感激。
所以问题是:用户输入三个数据类型的值,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
值时也应谨慎,因为某些接近值可能表示为相同的浮点值。
相关文章:
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何计算数据类型的范围,例如int
- C++中数据类型修饰符的顺序
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 特定数据类型的模板类
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 有没有办法提示用户使用哪种数据类型作为模板 c++
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何获取C++字符数据类型的地址
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 构造智能点数据类型以及普通数据类型的通用方法
- 如何使映射键具有两种不同的数据类型?
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- C++ 使用函数模板查找任何输入数据类型的中间值
- 中间变量的数据类型