题目
运输公司对用户计算运费,距离(s)越远,每千米运费越低,标准如表5-5所示。表5-5 运输费用计算表里程s(单位:千米)折扣率s<2500250≤s<5002%500≤s<10005%1000≤s<20008%2000≤s<300010%3000≤s15%设每千米每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f计算公式为:f=p*w*s*(1-d)。
运输公司对用户计算运费,距离(s)越远,每千米运费越低,标准如表5-5所示。表5-5 运输费用计算表里程s(单位:千米)折扣率s<2500250≤s<5002%500≤s<10005%1000≤s<20008%2000≤s<300010%3000≤s15%设每千米每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f计算公式为:f=p*w*s*(1-d)。
题目解答
答案
参考代码如下:#include int main(){ int c,s; float p,w,d,f; printf("Please enter price,weight,distance:"); /*提示输入数据*/ scanf("%f,%f,%d",&p,&w,&s); /*输入单价、重量、距离*/ if(s>=3000) c=12; /*3000km以上为同一折扣*/ else c=s/250; /*3000km以下各段折扣不同,c的值不相同*/ switch(c) { case 0:d=0;break; /*c=0,代表250km以下,折扣d=0*/ case 1:d=2;break; /*c=1,代表250km~500km,折扣d=2%*/ case 2: case 3:d=5;break; /*c=2和3,代表500km~1000km,折扣d=5%*/ case 4: case 5: case 6: case 7:d=8;break; /*c=4~7,代表1000km~2000km,折扣d=8%*/ case 8: case 9: case 10: case 11:d=10;break; /*c=8~11,代表2000km~3000km,折扣d=10%*/ case 12:d=15;break; /*c=12,代表3000km以上,折扣d=15%*/ } f=p*w*s*(1-d/100.0); /*计算总运费*/ printf("freight=%10.2f\n",f); /*输出总运费,取两位小数*/ return 0;}
解析
考查要点:本题主要考查条件判断与分段处理能力,需要根据不同的距离区间应用对应的折扣率,并正确代入公式计算总运费。
解题核心思路:
- 区间划分:将距离
s划分为多个区间,每个区间对应不同的折扣率d。 - 计算折扣率:通过整数除法将
s映射到对应的区间编号c,再通过switch语句确定d的值。 - 公式应用:将
d代入总运费公式f = p * w * s * (1 - d/100.0)完成计算。
破题关键点:
- 整数除法简化区间判断:通过
s/250快速确定区间编号c,避免多层if-else嵌套。 - 特殊区间处理:
s ≥ 3000单独处理,统一折扣率15%。
输入数据处理
- 输入变量:从用户输入中获取单价
p、重量w、距离s。 - 区间编号计算:
- 若
s ≥ 3000,直接设c = 12(对应最高折扣)。 - 否则,通过
c = s / 250将s映射到不同区间编号c。
- 若
折扣率确定
通过switch(c)语句根据c的值选择对应的折扣率d:
c = 0:s < 250,折扣0%。c = 1:250 ≤ s < 500,折扣2%。c = 2或3:500 ≤ s < 1000,折扣5%。c = 4~7:1000 ≤ s < 2000,折扣8%。c = 8~11:2000 ≤ s < 3000,折扣10%。c = 12:s ≥ 3000,折扣15%。
总运费计算
将d代入公式:
$f = p \times w \times s \times (1 - \frac{d}{100.0})$
并输出结果,保留两位小数。