yz95
荣誉会员
荣誉会员
  • 铜币29枚
  • 威望1点
  • 贡献值0点
  • 社区居民
阅读:903回复:0

C语言“switch语句”的使用技巧[转载](新手要读读)

楼主#
更多 发布于:2001-09-24 21:49
steve
 C语言作为国际上流行的计算机语言已经和正在被广大
的计算机用户使用。凡是使用过的人都会有同样的感觉——C语
言的使用灵活这个特点既是优点又是缺点,因为对精通C语言的
用户来讲,灵活就意味着编程可以无拘无束,甚至随心所欲;
但对初学者或者是尚未摸着规律的用户来说,有时候就会觉得C
程序设计有点象雾里看花,摸不着头脑。因为灵活就意味着没有
一个标准。而实际上,C语言和其它计算机语言一样,只要你真
正掌握了该语言的每一个语句的特点,理解、运用就不难掌握了。
下面就C语言中switch语句的使用特点谈谈自己的体会。

switch语句的格式如下:

       switch(表达式)
    {case  常量表达式1:语句1
     case  常量表达式2:语句2
     case  常量表达式3:语句3

     case  常量表达式n:语句n
     default  :语句n+1
   }

        从表面上看来,switch语句与PASCAL语言中的case语句
以及FOXBASE中的do case语句非常类似,只是关键字有所不同:
一个是switch;而另一个是case或do case。但如果仔细阅读过
教材或有关参考书的话,就绝不会有此想法。从语句的功能上来
看,PASCAL和case语句或FOXBASE的do case语句中的常量表达式
是用来与case后面的表达式比较以确定执行哪一个语句,一旦执
行了某一语句,则会自动地结束这一case后的语句;而C的switch
语句则不然。首先,switch语句中的常量表达式只是起到一个入
口作用,一旦执行了相应的语句后,只要没有强迫中断语句
(break),它就会一直按顺序继续执行下去,也就是会执行其它
case后面的语句,直到遇到“}”符号才停止。乍看觉得有点不可
事议,但若仔细回味且切身编程体会,那么就会感司到C的switch
语句的独到之处。接下来就几个具体例子来剖析:switch语句的
特点以及区别于其它语言中的相应语句的妙处。

----第一个例子:根据输入的百分制成绩,然后给出‘A’~‘E’
相应的等级符(90-100为‘A’、80-89为‘B’、70-79为‘B’、
60-69为‘C’、0-59为‘E’)。主要的处理程序段如下:(temp、
score、grade皆为整型变量)
temp=score/10;
    switch(temp)
       {case9:grade=‘A’;
        case8:grade=‘B’;
        case7:grade=‘C’;
        case6:grade=‘D’;
        case5:grade=‘E’;
        }
   printf(“thegradeis%c”,grade);

        仔细阅读这段程序(根据C语言的特点),就会发现有很
多错误。首先,对100分和低于50分的情况没有考虑;其次,C语
言的switch特点是顺序执行,那么这段程序不输入的分数如何,
最后的输出都将是‘E’。因此,修改这段程序,可以得到一个正
确答案是:

    temp=score/10;
    switch(temp)
     {case10:
      case9:grade=‘A’;break;
      case8:grade=‘B’;break;
      case7:grade=‘C’;break;
      case6:grade=‘D’;break;
      case5:
      case4:
      case3:
      case2:
      case1:
      case0:grade=‘E’;
     }
    printf(“thegradeis%c,grade”);

        但这么一个结果还不算是一个好的C程序,因为它只是
能得到正确的解,没有真正用到C的特点。如果将C的特点运用到
这段程序中,则程序将优化成如下:

    grade=‘A’;
    temp=score/10;
    switch(temp)
      {case0:
       case1:
       case2:
       case3:
       case4:
       case5:grade++;
       case6:grade++;
       case7:grade++;
       case8:grade++;
       case9:
   case10:
  }
     printf(“thegradeis%c,grade”);

        从这段程序中,我们可以体会到前面所说的该语句的特点。

----第二个例子:运输公司对用户计算运费。距离(s)越远,每
公里运费越低。具体标准如下:

       s<250  (km)            没有折扣
      250<=s<500  (km)        2%折扣
      500<=s<1000(km)        5%折扣
      1000<=s<2000(km)        8%折扣
      2000<=s<3000(km)        10%折扣
      3000<=s     (km)        15%折扣

        设每公里每吨货物的基本运费为p,货物重为w,距离为
s,折扣为d,则总运费计算公式为:

        f=p*w*s*(1-d)

        分析此问题,折扣的变化是有规律的:折扣的“变化点”
都是250的倍数(250,500,1000,2000,3000)。利用这一特点
,可以再设一变量c,它代表250的倍数。当c<1时,无折扣;
1<=c<2时,折扣为d=2%;2<=c<4时,d=5%;4<=c<8时,d=8%;
8<=c<12时,d=10%;c>=12时,d=15%。所以可以有如下没有错误
的程序段:

   scanf(“%f,%f,%d”,&p,&w,&s);
   if(s>=3000)c=12
   elsec=s/250
   switch(c)
    {case0:d=0;break;
     case1:d=2;break;
     case2:
     case3:d=5;break;
     case4:
     case5:
     case6:
     case7:d=8;break;
     case8:
     case9:
     case10:
     case11:d=10;break;
     case12:d=15;
        }
    f=p*w*s*(1-d/100.0);
    printf(“freight%15.f”,f);

        如同前一个题目,这个程序段也完全可以利用switch特
点,改进优化得到如下程序段:

    d=0
   scanf(“%f,%f,%k”,&p,&w,&s);
   if(s>=3000)c=12
   elsec=s/250
   switch(c)
    {case12:d+=5;
     case11:
     case10:
     case9:
     case8:d+=2;
     case7:
     case6:
     case5:
     case4:d+=3;
     case3:
     case2:d+=3;
     case1:d+=2;
     case0:
        }
    f=p*w*s*(1-d/100.0);
    printf(“freight%15.4f”,f);

        从上面两个例子分析,使我们可以比较清楚地看见C语
言中switch语句与其它语言中相应语句的区别。尽管在学习和教
计算机语言的过程中,我们始终认为语言是相通的,这样便于学
习一门新的语言。但是真正要把某一门计算机语言学好,非得掌
握它的特点。

        这里仅仅是自己在编程实践过程中的一点体会,有错误
的地方恳请批评指正。


中国计算机世界出版服务公司版权所有

--
★再见!

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]
[ 2002-11-20 11:02:56 Admin 修改 ]
嘿嘿,YZ95!
游客

返回顶部