【问题标题】:My formula for total and area is not calculating我的总面积和面积公式没有计算
【发布时间】:2018-06-16 17:06:17
【问题描述】:

所以在我正在做的项目中,我有一个以原点为中心的圆,我需要通过它切割一条垂直线。我正在尝试计算圆的较小比例的面积;我的输入是半径和左右手的比例。现在我只是想确保它正确地进行我的计算,并且它正在正确地计算比率,但它根本不计算比率区域。请帮忙

int main(){
float radius, left, right, total;
float ratio;
float ratioArea = ratio*pi*pow(radius, 2);

scanf("%d%d%d", &radius, &left, &right);

if(left == right)
{
    printf("left and right are equal");
}

// do area calculations with righthand side
else if(left > right)
{
    ratio = right / (right+left);
    ratioArea = ratio * pi * pow(radius, 2);

    printf("ratio= %.6f, area = %f\n", ratio, ratioArea);

}

// do area calculations with lefthand side
else if(left < right)
{   
    ratio = left / (left + right);
    ratioArea = ratio*pi*pow(radius, 2);

    printf("ratio = %.6f, area = %f\n", ratio, ratioArea);
}


return 0;

}

【问题讨论】:

  • scanf 中,%d 格式适用于int,但您使用的是float,它应该有%f
  • 启用所有编译器警告并节省时间。 scanf("%d%d%d", &amp;radius, &amp;left, &amp;right); 将使用启用良好的编译器发出警告。
  • 旁白:使用pow 对数字求平方是低效的——最好使用radius * radius
  • @WeatherVane 请注意,pow(some_float,2) 将产生 double 精度计算,而 some_float*some_float 仍然是 float。即使将pow(some_double, 2)some_double*some_double 进行比较,也可以使用优化编译器生成相同的代码。你的想法还是很谨慎的。

标签: c syntax decimal formula calculation


【解决方案1】:

第一个问题在这里:

scanf("%d%d%d", &radius, &left, &right);

%d 读取一个整数并采用int *,而不是float *。您需要%f 才能扫描float

你还需要检查scanf是否成功:

if (scanf("%f%f%f", &radius, &left, &right) != 3) {
    // handle error here
    exit(EXIT_FAILURE);
}

scanf 返回成功扫描的项目数。如果返回值不是 3,则至少有一个变量没有设置。


第二个(大部分是无害的)问题:

float radius, left, right, total;
float ratio;
float ratioArea = ratio*pi*pow(radius, 2);

您正在根据ratioradius 的值初始化ratioArea,此时它们尚未初始化。我很确定这段代码有未定义的行为。

只需删除初始化并改为执行float ratioArea;;您已经在下面使用它的每个分支中设置了ratioArea

【讨论】:

  • OP的初始float ratioArea = ratio*pi*pow(radius, 2);也很有趣。
  • 谢谢。我修复了我设置面积公式的位置并且有效,但我认为主要问题是scanf。我知道这很明显,例如 %f 而不是 %d,我多次检查所有参数,看看我是否在任何地方都这样做过,并完全掩盖了它,哈哈。
猜你喜欢
  • 1970-01-01
  • 2011-08-12
  • 2010-12-22
  • 1970-01-01
  • 2018-01-09
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多