C语言中的switch/case语句(分支语句)虽然使得程序结构简单,程序执行效率也较多条if语句(条件语句)高,但由于case 中的表达式只能是常量而大大限制了其用途。针对switch/case语句的缺点,设计了一种新的、很结构化的switch语句使用方法,能满足大部分多种条件选择的编程需求,供广大编程爱好者研究借鉴,不当之外请反馈。
下面,举2个典型的例子说明switch语句的结构化设计:
例1.
在进行评定时通常会将成绩分为几个等级:
0~59分为不合格
60~74分为及格
75~89分为良好
90~100为优秀
本实例中将实现如下功能:输入一个成绩,程序会给出对应的等级。
下面所编写的程序,较好地解决了switch语句中case表达式只能为常量的问题,也算是对C语言程序设计的一种创新。
switch(sel= (num>=90 && num<=100)? 1: //90~100为优秀,作为选择1
(num>=75&& num< 90) ? 2: //75~89分为良好,作为选择2
(num>=60&& num< 75) ? 3: //60~74分为及格,作为选择3
(num>= 0&& num< 60) ? 4: // 0~59分为不合格,作为选择4
0 //其他非法成绩,都作为选择0
)
{ case 1:
printf("等级为优秀!\n"); break;
case 2:
printf("等级为良好!\n"); break;
case 3:
printf("等级为合格。\n"); break;
case 4:
printf("等级为不合格。\n"); break;
default:
printf("非法成绩!\n");
}
从上面的程序结构上看,程序符合结构化的要求,程序功能灵活,可以适应程序多种选择的要求。
这种用法的缺点是代码稍长,但现在计算机系统的内存都足够大,这种缺点可忽略不计。运行效率未做定量测试分析,但从代码的执行顺序上看,代码运行效率不会低于其他方式。
例2.
运输公司对用户计算运费。距离(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% 折扣
下面所编写的程序,较好地解决了switch语句中case表达式只能为常量的问题,也算是对C语言程序设计的一种创新。
switch( sel= ( s < 250) ? 1: //没有折扣
(250 < =s && s < 500 ) ? 2 : //2% 折扣
(500 < =s && s< 1000) ? 3: // 5% 折扣
(1000 < =s && s < 2000) ? 4: // 8%折扣
(2000 < =s && s< 3000) ? 5: //10%折扣
(3000 < =s ) ? 6: //15% 折扣
0
)
{case 1:
discount=0; break;
case 2:
discount=2/100; break;
case 3:
discount=5/100; break;
case4:
discount=8/100; break;
case 5:
discount=10/100; break;
case 6:
discount=15/100; break;
default:
discount=0; break;
}
当然,上面的2个例子是为了说明switch语句的用法,并不一定适合用switch语句来实现。这种结构化的switch语句最适合的是各case分支下所执行的语句比较多且没有规律的情况。其实单就例2来说,更简单且结构化的用法也可以这样写:
discount=( ( s < 250) ? 0: //没有折扣
(250 < =s && s < 500 ) ? 2 : //2% 折扣
(500 < =s && s< 1000) ? 5: // 5% 折扣
(1000 < =s && s < 2000) ? 8: // 8%折扣
(2000 < =s && s< 3000) ?10: //10%折扣
(3000 < =s ) ?15: //15% 折扣
-1
) / 100;
以上是多年来对switch语句使用过程的一种研究改进,对大家能提供一种编程结构的选择,还要根据编程要求来选择使用。