C++ 如何使用3个重载函数(参数的差异是int、long、float)编写一个程序,同时只要求输入一个条目?

C++ 如何使用3个重载函数(参数的差异是int、long、float)编写一个程序,同时只要求输入一个条目?,c++,overloading,C++,Overloading,我必须写一个程序,输入两个数字,然后程序计算平均值。我想写我的程序,如果我输入两个十进制数,程序将调用float函数,如果我输入两个整数,它将调用integer函数,输入两个长数,它将调用long函数 我遇到的主要问题是选择变量类型。因为如果我对变量使用long类型,但是用户输入的两个数字是十进制的,那么程序调用long函数,平均值作为long变量输出 以下是我到目前为止得到的信息: #include <iostream> int average(int, int); long a

我必须写一个程序,输入两个数字,然后程序计算平均值。我想写我的程序,如果我输入两个十进制数,程序将调用float函数,如果我输入两个整数,它将调用integer函数,输入两个长数,它将调用long函数

我遇到的主要问题是选择变量类型。因为如果我对变量使用long类型,但是用户输入的两个数字是十进制的,那么程序调用long函数,平均值作为long变量输出

以下是我到目前为止得到的信息:

#include <iostream>

int average(int, int);
long average(long, long);
float average(float, float);

int main()
{
        //The variables
        //      The problem with them is that if I use
        //      a type, let's say int, but the input
        //      is a float, then it won't work
         x;
         y;
         averag;

        std::cout << "Here is a number: ";
        std::cin >> x;  
        std::cout << "\nHere is another one: ";
        std::cin >> y;

        //The function in call
        averag = average(x, y);

        std::cout << "\n\nHere is the average: ";
        std::cout << averag;
        return 0;
}

//The definition of the int function
int average(int x, int y)
{
        int x;
        int y;
        int average;
        average = (x + y) / 2;
        return average;
}

// The definition of the short function
short average(short x, short y)
{
        short x;
        short y;
        short average;
        average = (x + y) / 2;
        return average;
}

// The definition of the float function
float average(float x, float y)
{
        float x;
        float y;
        float average;
        average = (x + y) / 2;
        return average;
}

//I think i'm not grasping the scopes in which I can define a variable
//and where I must define the parameters within the functions
#包括
int平均值(int,int);
长平均(长,长);
浮动平均值(浮动,浮动);
int main()
{
//变量
//问题是如果我使用
//一个类型,比如int,但是输入
//如果是一个浮点数,那么它就不起作用了
x;
Y
平均值;
std::cout>x;
std::cout>y;
//调用中的函数
averag=平均值(x,y);

std::cout我会让用户先输入类型(例如“输入F表示浮点,输入I表示整数…”等)然后使用该输入作为条件,将输入读入适当类型的变量,并调用重载的
average
函数。

是的,在函数范围中定义变量的方式是错误的。您的参数定义变量,在函数中定义变量只会再次定义它们。我不是mos不熟悉C++,但我认为它会“阴影”参数变量,并且你的计算将不起作用。
对于主要问题,我同意sje397的回答,让用户输入他们希望首先执行的平均值类型。如果用户输入5和4,则双平均值将不同于长平均值。

我将以字符串形式输入值,然后使用连续调用推断类型:

std::string x,y;
std::cin >> x >> y;
try {
  short averag = average(boost::lexical_cast<short>(x), boost::lexical_cast<short>(y));
  std::cout << averag << "\n";
  return;
} catch(boost::bad_lexical_cast&) {}
try {
  int averag = average(boost::lexical_cast<int>(x), boost::lexical_cast<int>(y));
  std::cout << averag << "\n";
  return;
} catch(boost::bad_lexical_cast&) {}
try {
  float averag = average(boost::lexical_cast<float>(x), boost::lexical_cast<float>(y));
  std::cout << averag << "\n";
  return;
} catch(boost::bad_lexical_cast&) {}

std::cout << "Oops\n";
std::字符串x,y;
标准:cin>>x>>y;
试一试{
short averag=average(boost::lexical_cast(x),boost::lexical_cast(y));

std::cout您可以询问用户希望执行哪种计算。 缺点:

  • 暴露了用户不感兴趣的程序内部(用户希望计算两个数字的平均值)

  • 您不能信任该用户。如果您的程序运行良好且未崩溃(例如,如果用户在选择整数计算后键入十进制数),则可能会产生错误的结果


  • 我每次读取输入,看看这个值是一个十进制数,一个短整数(小于9位数)还是一个长整数。然后你必须考虑一些情况(例如一个输入是十进制,另一个是长整数)。并执行计算。它的级别相当低,但无论如何我都会将其重构为函数。

    您似乎对重载函数何时得到解决感到困惑。编译器会在编译程序时(而不是在运行时)确定要调用哪个函数。