如何根据传入的数量使用多个重载获得不同的答案?

时间:2019-04-16 05:58:18

标签: c++

编写具有3个重载的函数GetVolume()。如果传入一个值,请找到以该值为半径的球体的体积。如果传入两个值,请找到圆柱体的体积,并以其值为半径和高度。如果传入三个值,请找到一个盒子的体积,并以三个值作为其长度,宽度和高度。

#include <iostream>
#include <cmath>

using namespace std;

double PI = 3.14;
double GetVolume(double r)
{
    cout << "Sphere's volume is: ";
    return ((4 * PI * pow (r , 3.0))/3);
}

double GetVolume(double r, double h)
{
    cout << "Cylinder's volume is: ";
    return (PI * pow (r, 2) * h);
}

double GetVolume(double l, double h, double w)
{
    cout << "Box's volume is: ";
    return (w * l * h);
}

int main()
{

    double num = 0, num1 = 0, num2 = 0, num3 = 0;
        double ans1, ans2, ans3;

        cout << "Please enter 1, 2, or 3 numbers depending on whether you want the volume of a sphere, cylinder, or a box." << endl;

        cin >> num1, num2, num3;

        ans1 = GetVolume(num1);
        ans2 = GetVolume(num1, num2);
        ans3 = GetVolume(num1, num2, num3);

        cout << ans1 << ans2 << ans3 << endl;

        system("pause");


    return 0;
}

我无法弄清楚为什么我无法使用getvolume函数基于cin插入的数字来显示三个不同的结果,我在最上面附加了我的问题必须回答五部分作业中的第三部分。抱歉,如果这还不够,我会尽力提供更多信息。

4 个答案:

答案 0 :(得分:3)

您仅从这一行的标准输入中读取一个数字

cin >> num1, num2, num3;

此处的逗号为operator,,它计算多个表达式并丢弃除最后一个表达式之外的所有表达式。如果您想读取多个数字,则需要链接>>

cin >> num1 >> num2 >> num3;

但是,您似乎想知道输入了多少个数字,可以通过查看operator>>返回的值来进行测试。

if (!(cin >> num1)) {
    cout << "no numbers entered";
} else if (!(cin >> num2)) {
    cout << GetVolume(num1);
} else if (!(cin >> num3)) {
    cout << GetVolume(num1, num2);
} else {
    cout << GetVolume(num1, num2, num3);
}

答案 1 :(得分:1)

您可能想了解有关c ++中的逗号运算符的信息。 https://en.cppreference.com/w/cpp/language/operator_other

基本上在该行中,

num = GetVolume(num1), GetVolume(num1,num2), GetVolume(num1, num2, num3);

GetVolume(num1)得到评估。然后将结果丢弃。

然后评估GetVolume(num1,num2)。结果,丢弃

最后GetVolume(num1, num2, num3)得到评估,其结果由operator =的RHS上的(Expr,Expr,Expr)返回。

然后将该返回值分配给num。这就是为什么您只看到一个答案的原因。

类似地,您的cin >> num1, num2, num3;仅接受一次输入,即num3。

可能的解决方法

int ans1, ans2, ans3;
cin >> num1 >> num2 >> num3;
ans1 = GetVolume(num1);
ans2 = GetVolume(num1, num2);
ans3 = GetVolume(num1, num2, num3);

其他问题

  1. 您从函数中返回类型double,但将它们存储在int中。这具有很大的精度损失。我相信您想改为存储一个double。

  2. 您的cout和以下代码似乎不一致。也许您希望自己先输入一个。测试它是1,2还是3。然后采取相应措施。

答案 2 :(得分:0)

您可以像下面那样声明类和重载restore headeronly函数

GetVolume

上面的代码将给出输出double PI = 3.14; class calculateVolume { public: double GetVolume(double r) { cout << "Sphere's volume is: "; return ((4 * PI * pow (r , 3.0))/3); } double GetVolume(double r, double h) { cout << "Cylinder's volume is: "; return (PI * pow (r, 2) * h); } double GetVolume(double l, double h, double w) { cout << "Box's volume is: "; return (w * l * h); } } int main() { calculateVolume volObject; cout<<volObject.GetVolume(5); return 0; }

这只是工作片段,您可以根据需要调整代码

答案 3 :(得分:0)

answer扩展为Caleth,如果OP的问题(除逗号运算符之外)是如何根据用户输入的数字选择特定功能,我们可能会读整行使用std::getline从输入流中提取,然后使用std::stringstream,一次提取一个数字。

using std::cout;
cout << "Please enter 1, 2, or 3 numbers depending on whether you want"
        "the volume of a sphere, cylinder, or a box.\n";

std::string line;
while ( std::getline(std::cin, line) )
{
    if (line.empty())
        continue;

    std::istringstream ss {line};
    double num_1, num_2, num_3;
    if ( !(ss >> num_1) )
    {
        cout << "No number in input.\n";
        continue;
    }
    else if ( !(ss >> num_2) )
    {
        cout << "Sphere's volume is: " << GetVolume(num_1) << '\n';  
    }
    else if ( !(ss >> num_3) )
    {
        cout << "Cylinder's volume is: " << GetVolume(num_1, num_2) << '\n';  
    }
    else  // Other numbers in the line will be ignored.
    {
        cout <<  "Box's volume is: " << GetVolume(num_1, num_2, num_3) << '\n';  
    }
}

实时示例HERE