【问题标题】:Get Wrong answer in c++在 C++ 中得到错误的答案
【发布时间】:2016-10-23 21:02:02
【问题描述】:
double getcircleArea(int radius, double pi);

double getcircleArea(int radius = 1, double pi = 3.14)
{
    return radius*radius*pi;
}

int main()
    {
        printf("area:%d\n", getcircleArea());
        printf("area:%d\n", getcircleArea(10));
        printf("area:%d\n", getcircleArea(15, 3.14159));
        system("pause");
        return 0;
    }

只是一个简单的例子。

我得到结果:

地区:1374389535 面积:0 地区:-1408749273

我想要的是... 面积:3.14 面积:314 地区:706.85775

【问题讨论】:

  • 一些有问题的事情 - >> double getcircleArea(int radius = 1, double pi = 3.14) ??并且不要在printf 中将double 传递给%d。在函数调用中传递 2 个参数。
  • %d 是整数。 %f 是双倍的。
  • @immibis 将 pi 作为参数传递仍然没有意义。
  • 打开编译器警告,它应该会告诉您格式说明符与纯英语类型不匹配的情况。如果没有,请切换编译器。
  • @Bernhard:如果您的程序打印出针对 pi 的不同近似值(例如 "if您使用 22/7,您的答案将是 X,但实际值是 Y"),但即使在这种不寻常的情况下,pi_approximation 也是一个更好的标识符。

标签: c++


【解决方案1】:

不要使用printf

std::cout << "area: " << getcircleArea() << "\n";

无需记住晦涩的 % 代码即可工作(“%d?我虽然它的意思是 'double'!”)

【讨论】:

  • 记住晦涩的格式说明符并不比记住晦涩的格式函数(设置字段宽度等)难,但完全缺乏类型安全是避免使用 printf 的更好理由。
【解决方案2】:

%d 使用整数格式打印值。如果你想打印浮点数,你应该使用 %f。

【讨论】:

    【解决方案3】:

    %d 用于int 数据类型。将%lf 用于double

    #include <iostream>
    using namespace std;
    
    double getcircleArea(int radius = 1, double pi = 3.14){
        return (radius*radius*pi);
    }
    
    int main(){  
            printf("area:%lf\n", getcircleArea()); // %d --> %lf
            printf("area:%lf\n", getcircleArea(10));  // %d --> %lf
            printf("area:%lf\n", getcircleArea(15, 3.14159));  // %d --> %lf
            system("pause")
      return 0;
     }
    

    【讨论】:

    • 没有 %lf。使用 %f 表示双精度,使用 %Lf 表示长双精度。 Printf 使用 ... 可变参数,浮点数作为双精度传递。
    • @AndrewL 在 C++ 中,只需使用 cout,但当您使用 C 中的 printf() 时,它是 C++ 的子集。所以我没有看到任何问题。您可以在 C++ 中使用 C 中的所有方法。
    • @hyde C++ 使用 C99 版本的 printf,其中 %lf 表示 double
    • @AndrewL。我确定。你能在这里分享链接吗?
    【解决方案4】:

    您的printf() 格式不正确。您提供了一个 %d 占位符,它代表十进制或以 10 为底的数字,但您应该为其提供一个 %f 占位符来表示浮点数。

    printf("Area: %f\n", getcircleArea(10, 3.14));
    

    Hereprintf() 函数的一个很好的参考,并提供了所有可用的说明符字符。

    您也可以像这样使用标准命名空间中的cout

    std::cout << "Area: " << getcircleArea(10, 3.14);
    

    我还建议不要将 PI 作为参数传递,因为 math.h 中有一个更精确的常数值。您可以通过以下方式访问它:

    M_PI
    

    或者,正如@M.M 建议的那样,您可以通过查找 -1 的反余弦来获得 PI,它会返回 PI,如下所示:

    double PI = acos(-1.0);
    

    或者您可以将其设置为常量,如下所示:

    const long double PI = 3.141592653589793238L;
    const double PI = 3.141592653589793;
    const float PI = 3.1415927;
    

    【讨论】:

      【解决方案5】:

      请尝试此代码。如果您没有在代码中创建和使用对象,那么 OOP 的整个目的就会被破坏。所以请按照以下代码创建和使用对象。

         #include <iostream>
         using namespace std;
      
         class overloading
         {
          public: 
          int getcircleArea()
          {
           cout<<"area is "<< 0 <<"\n";
          }
          double getcircleArea(int radius)
          {
           cout<<"area is "<< radius*radius*3.14<<"\n";
          }
          double getcircleArea(int radius, float pi)
          {
           cout<<"area is "<< radius*radius*pi<<"\n";
          }
         };
      
      int main()
      {
          overloading overload1;
      
          overload1.getcircleArea();
          overload1.getcircleArea(10);
          overload1.getcircleArea(15, 3.14159);
      
          return 0;
      }
      

      注意:看起来您正在练习函数重载概念。在您的代码中,您已经声明了一个函数:

       double getcircleArea(int radius = 1, double pi = 3.14)
       {
       return radius*radius*pi; 
       }
      

      .....您正在mainprogram 中将其他值解析为该函数,如下所示:

        printf("area:%d\n", getcircleArea(15, 3.14159))
      

      我不会向你推荐这种编程方式!!

      【讨论】:

      • 好!继续 ! :)
      【解决方案6】:

      当您将半径的平方乘以 PI 的值时,它会变成双精度值。因此,要打印双精度值,请在 print 函数中使用 %lf。您也可以使用 %f 代替 %lf。

      printf("area: %lf\n", getcircleArea(10, 3.14));
      

      在使用 c++ 时,我建议您使用 cout 而不是 print,因为您不需要 "%d""%f" 等格式说明符。使用 Court 时,代码应如下所示。

      cout<<"area: "<<getcircleArea(10,3.14)<<endl;
      

      【讨论】:

        猜你喜欢
        • 2017-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 2019-05-06
        • 2022-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多