鱼C论坛

 找回密码
 立即注册
查看: 2999|回复: 7

[技术交流] 小甲鱼课件里面例题解法我有不同意见,大家来讨论一下

[复制链接]
发表于 2012-4-12 22:10:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目是  运输公司对用户计算运费。
路程 (s)越远,每公里运费越低。标准如下:
s<250KM  没有折扣
250<=s<500   2%折扣
500<=s<1000  5%折扣
1000<=s<200  8%折扣
2000<=s<3000  10%折扣
3000<=s     15%折扣
设 每公里每吨火舞的基本运费为P,货重为W,距离为是s,折扣为d,则总运费F的计算公公式为
f=p*w*s(1-d)


小甲鱼的解法是
#include <stdio.h>
{
int c,s;
float p,w,d,f;
scanf("%f,%f,%d,&p,&w,&s");
if(s>3000)
{
c=12;
}
else
{
c=s/250;
}
switch(c)
{
case 0:
    d=0;
   break;
case 1:
   d=2
  break;
case 2:
case 3:
     d=5;
     break;
case 4
case 5
case 6
case 7
    d=8;
  break;
case 8:
case 9:
case 10:
case 11:
   d= 10
  break;
case 12:
  b=15;
break;
case 12:
d= 15;
break;
}
f=p*w*s(1-d/100)
printf("freiqht=%15.4f\n",f)
}






*********************************************
我的写法是:

#include <stdio.h>

void main()
{
        double f,p,w,s,d,zhe;
        scanf("%lf",&s);
   

       
        if(s<250) d=0;
        else if(250<=s<500) {printf(" f=p*w*s*(1-0.02)");}
        else if(500<=s<1000) {printf(" f=p*w*s*(1-0.05)");}
        else if(1000<=s<2000) {printf(" f=p*w*s*(1-0.08)");}
        else if(2000<=s<3000) {printf(" f=p*w*s*(1-0.1)");}
        else if(3000<=s) {printf(" f=p*w*s*(1-0.15)");}

}

求大神分析,同僚讨论。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-12 22:19:12 | 显示全部楼层
不好意思 小甲鱼的原文 我打错了 再发一次

#include <stdio.h>
void main()
{
        int c,s;
        float p,w,d,f;
        scanf("%f,%f,%d,&p,&w,&s");
        if(s>3000)
        {
                c=12;
        }
        else
        {
                c=s/250;
        }
        switch(c)
        {
        case 0:
                d=0;
                break;
        case 1:
                d=2;
                        break;
        case 2:
        case 3:
                d=5;
                break;
        case 4:
        case 5:
        case 6:
        case 7:
                        d=8;
                        break;
        case 8:
        case 9:
        case 10:
        case 11:
                d= 10;
                        break;
        case 12:
                d=15;
                break;

        }
        f=p*w*s*(1-d/100.0);
        printf("freiqht=%15.4f\n",f);}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-12 22:35:32 | 显示全部楼层
if(250<=s<500)
这个等价于if(1)
因为
无论s是多少,表达式250<=s的值要么为0(假)要么为1(真),而0或1都,500,所以
表达式250<=s<500的值是1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-13 10:49:15 | 显示全部楼层
250<=s<500   
不能这样输入哦,就像光老师所说的那样,系统会先判断250<=s,在用这个值和<500判断,但是这个结果永远是真(1);
应该是  s >= 250 &&  s < 500,这样才有效!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-13 14:18:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-13 14:18:43 | 显示全部楼层
lazioprocn2000 发表于 2012-4-13 11:44
如果发现太太有错,一定是我看错;如果我没看错,一定是我害太太犯错;如果太太不认错,她就没有错!

94 ...

此话怎讲?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-13 14:24:46 | 显示全部楼层
抽空玩玩 发表于 2012-4-13 14:18
是不是说明,只要你说的那个地方改进了,那么我的这种方法 比小甲鱼的正确吗?

这个,不好说。相对于这道题,用 if else 确实要好些,但是 switch 也有switch的好处。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-13 14:27:08 | 显示全部楼层
湮汐 发表于 2012-4-13 14:24
这个,不好说。相对于这道题,用 if else 确实要好些,但是 switch 也有switch的好处。

这就行了,我是个新手,才看了几天视频,只是碰到这个题目不知道什么是什么,什么为什么, 纯粹是解除心中的茫然,并不是要争谁对谁错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 17:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表