但求过程001 发表于 6 天前

程序求助

运输公司对用户计算运费。

路程(s)越远,每公里运费越低。标准如下:
   s<250km                     没有折扣
   250≤s<500                2%折扣
   500≤s<1000            5%折扣
   1000≤s<2000      8%折扣
   2000≤s<3000      10%折扣
   3000≤s                            15%折扣
设每公里每吨货物的基本运费为p,货物重为w,距离为s,
折扣为d,则总运费f的计算公式为:
f=p*w*s*(1-d)


程序如下,请帮忙看下是否正确~~

#include <stdio.h>

void main()
{
        double p=10,w=5,s,d,f;
        while(1)
        {
                scanf("%lf",&s);
                if(s>0)break;
                else
                {
                        printf("请输入大于0的数\n");
                        while(getchar()!='\n');
                }
        }
       
        if(s>0 && s<250)
        {
                f=p*w*s;
                printf("运费=%lf\n",f);
        }
        else if(s>=250 && s<500)
        {
                d=0.02;
                f=p*w*s*(1-d);
                printf("运费=%lf\n",f);
        }
        else if(s>=500 && s<1000)
        {
                d=0.05;
                f=p*w*s*(1-d);
                printf("运费=%lf\n",f);
        }
        else if(s>=1000 && s<2000)
        {
                d=0.08;
                f=p*w*s*(1-d);
                printf("运费=%lf\n",f);
        }
        else if(s>=2000 && s<3000)
        {
                d=0.1;
                f=p*w*s*(1-d);
                printf("运费=%lf\n",f);
        }
        else
        {
                d=0.15;
                f=p*w*s*(1-d);
                printf("运费=%lf\n",f);
        }
}

FishC 发表于 6 天前

鱼油的程序基本正确,但存在一些可以改进的地方。主要问题是缺少 s >= 3000 的情况,并且条件判断可以简化。以下是修正后的程序:


#include <stdio.h>

int main()
{
    double p = 10, w = 5, s, d, f;

    // 输入路程s,确保s > 0
    while (1)
    {
      printf("请输入路程s(公里):");
      scanf("%lf", &s);
      if (s > 0)
            break;
      else
      {
            printf("请输入大于0的数\n");
            while (getchar() != '\n'); // 清除输入缓冲区
      }
    }

    // 根据路程确定折扣
    if (s < 250)
      d = 0;
    else if (s < 500)
      d = 0.02;
    else if (s < 1000)
      d = 0.05;
    else if (s < 2000)
      d = 0.08;
    else if (s < 3000)
      d = 0.10;
    else
      d = 0.15;

    // 计算运费
    f = p * w * s * (1 - d);
    printf("运费 = %lf\n", f);

    return 0;
}


主要修改点:
1. 将 void main() 改为标准写法 int main(),并添加了 return 0。
2. 简化了条件判断,直接利用 if-else if 的顺序结构,使代码更清晰。
3. 补充了 s >= 3000 时折扣为 0.15 的情况。
4. 统一在最后计算运费,避免重复代码。
5. 增加了输入提示,用户体验更好。

这样修改后,程序逻辑更完整,且易于维护。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

但求过程001 发表于 6 天前

FishC 发表于 2026-1-1 23:39
鱼油的程序基本正确,但存在一些可以改进的地方。主要问题是缺少 s >= 3000 的情况,并且条件判断可以简化 ...

好的,感谢答复~~

FishC 发表于 6 天前

但求过程001 发表于 2026-01-01 23:45
FishC 发表于 2026-1-1 23:39
鱼油的程序基本正确, ...

不客气!很高兴能帮到你~

程序的关键点在于 if-else if 结构的逻辑顺序和所有情况的覆盖。你原来的思路是对的,主要是补全条件和调整结构。

以后写类似的分段函数或阶梯折扣问题时,都可以参考这种“依次判断、简化条件”的写法。

如果还有其它问题,随时再来问。编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 程序求助