C语言 为什么执行不正确?

dkqlctbz  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(155)

//查找电费合计的代码...

/* 
   Upto 100 Units - Rs 5 pu
   upto 200 units - Rs 5.5 pu
   upto 500 units - Rs 6.5 pu
   above 500 units - Rs 7 pu
*/

#include<stdio.h>
int
main ()
{
  int a;
  float b=0.0;
  printf ("Enter Your Consumption in Units: ");
  scanf ("%d", &a);
  if (a > 0)
    b=b+(a*5);
  if (a > 100)
    b=b+((a-100)*5.5);
  if (a > 200)
    b=b+((a - 200) * 6.5);
  if (a>500)
    b=b+((a - 500) * 7);
  printf("\n Your Bill is Rs. %f",b);
  return 0;
}

在输入750时,期望的答案是4750,但显示的是12650。此外,除了在每个if语句中使用and和运算符之外,还有什么更聪明的方法可以做到这一点?

ccgok5k5

ccgok5k51#

如果a等于750,则所有if语句都将为真,因此您的代码将计算750 x 5 +(750-100)x 5.5 +(750-200)x 6.5 +(750-500)x 7,这不是您想要的结果。
您可以更改if语句的顺序reduce a,使其等于到目前为止支付的金额。
为了保持代码的精神,它可以如下所示:

if (a>500)
  {
    b=b+((a - 500) * 7);
    a = 500;
  }

  if (a > 200)
  {
    b=b+((a - 200) * 6.5);
    a = 200;
  }

  if (a > 100)
  {
    b=b+((a-100)*5.5);
    a = 100;
  }
  
  b=b+(a*5);

更“通用”和更易于维护的方法可能是:

struct price_range
{
    unsigned limit;
    double price;
};

const struct price_range pr[] =
{
    {  0, 5.0},
    {100, 5.5},
    {200, 6.5},
    {500, 7.0}
};    

double calculate_price(unsigned amount)
{
    size_t i = sizeof pr / sizeof pr[0];
    double p = 0;    
    do
    {
        --i;
        if (amount > pr[i].limit)
        {
            p += (amount - pr[i].limit) * pr[i].price;
            amount = pr[i].limit;
        }
    } while (i > 0);
    return p;
}

相关问题