正文

[023] 开关语句2006-02-20 22:01:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/10309.html

分享到:

形式:    switch(表达式)    {case 常量表达式1:语句1      case 常量表达式2:语句2      …      case 常量表达式n:语句n      default :语句n+1    }(1) switch后面括弧内的“表达式”, ANSI标准允许它为任何类型。(2) 当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。(3) 每一个case的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。(4) 各个case和default的出现次序不影响执行结果。(5) 执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。在执行Switch语句时,根据Switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。例如,下面的例子:要求按照考试成绩的等级打印出百分制分数段------------------------------------#include <stdio.h>int main(){    char grade;    scanf("%c",&grade);    switch(grade)    {    case 'A' : printf("85~100\n");    case 'B' : printf("70~84\n");    case 'C' : printf("60~69\n");    case 'D' : printf("< 60\n");    default  : printf("error\n");    }    return 0;}------------------------------------若grade的值等于‘A’,则将连续输出:  85~100  70~84  60~69  < 60  error因此,应该在执行一个case分支后,使流程跳出Switch结构,即终止Switch语句的执行。可以用一个break语句来达到此目的。将上面的Switch结构改写如下:------------------------------------#include <stdio.h>int main(){    char grade;    scanf("%c",&grade);    switch(grade)    {    case 'A' : printf("85~100\n"); break ; // 有两(多)条语句,可以不加花括号    case 'B' : printf("70~84\n");  break ;    case 'C' : printf("60~69\n");  break ;    case 'D' : printf("< 60\n");    break ;    default  : printf("error\n");   break ; //default 分支可以不加break语句    }    return 0;}------------------------------------   最后一个分支(default)可以不加break语句。 如果grade的值为‘b’,则只输出“70~84”。        在case后面中虽然包含一个以上执行语句,但可以不必用花括弧括起来,会自动顺序执行本case后面所有的执行语句。当然加上花括弧也可以。(6) 多个case可以共用一组执行语句,如:    …    case 'a'∶    case 'b'∶    case 'c'∶ printf(">60 \ n");break;    …grade的值为‘a’、‘b’或‘c’时都执行同一组语句。 ★ 这最后一条感觉在开关语句中挺有用,以前学Pascal的时候也有开关语句,好像从来就没用过这样的形式, 或许用过也忘了(汗)。这样如果某些情况要作同样的处理时就可以顺序的放在一起,在最后一个kiss (^_^)中作处理就行了。 如: 指定月份打印该月天数------------------------------------#include <stdio.h>int main(){    int i;    printf("input month :");    scanf("%d", &i);    switch (i)    {    case 1 :     case 3 :    case 5 :    case 7 :    case 8 :    case 10:    case 12: printf("31 days\n"); break;    case 4 :     case 6 :    case 9 :    case 11: printf("30 days\n"); break;    case 2 : printf("28 or 29 days\n"); break;    default: printf("error!\n");    }    return 0;}------------------------------------ 练练:<1> 运输公司对用户计算运费。路程(S)越远,每公里运费越低。标准如下:  s<250km             没有折扣  250≤S<500       2%折扣  500≤S<1000     5%折扣  1000≤S<2000   8%折扣  2000≤S<3000   10%折扣  3000≤S                15%折扣  设每公里每吨货物的基本运费为P(Price的缩写),货物重为w(weight的缩写),距离为S,折扣为d(discount的缩写),则总运费f(freight的缩写)的计算公式为    f=P*w*S*(1-d)分析: S各域的边界值均为250的倍数, 这样如果用开关语句实现可以设一变量c , 使c=s/250 这样c就可以做为switch中的"表达式"以控制分支,此时标准如下:   c<1             没有折扣  1≤c<2       2%折扣  2≤c<4      5%折扣  4≤c<8      8%折扣  8≤c<12   10%折扣  12≤c  为了便于在switch语句中处理,当 3000≤s 时,令 c=12  而不使c随s增大,这样用一条case语句便可处理所有3000≤s   的情况。------------------------------------#include <stdio.h>int 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);    printf("freight =%15.4f\n", f);    return 0;}------------------------------------<2> 企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提成10% ;利润高于10万元,低于20万元(100000≤200000)时,其中10万元按10%提成,高于10万元的部分,可提成7.5% ;200000≤400000时,其中20万元仍按上述办法提成(下同),高于20万元的部分按5%提成;400000≤600000时,高于40万元的部分按3%提成;600000〈I≤1000000时,高于60万的部分按1.5%提成;I>1000000时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数。 算法描述:    根据branch确定奖金值    0     奖金=i*0.1    1     奖金=bon1+(i-105)*0.075    2     奖金=bon2+(i-2*105)*0.05    3         4     奖金=bon4+(i-4*105)*0.03    5      6     奖金=bon6+(i-6*105)*0.015    7     8       9     10    奖金=bon10+(i-106)*0.01    输出奖金------------------------------------ #include <stdio.h>int main(){    long i;    double bonus, bon1, bon2, bon4, bon6, bon10;    int c;    bon1  = 100000 * 0.1;          /*利润为10万元时的奖金*/    bon2  = bon1 + 100000 * 0.075; /*利润为20万元时的奖金*/    bon4  = bon2 + 200000 * 0.05;  /*利润为40万元时的奖金*/    bon6  = bon4 + 200000 * 0.03;  /*利润为60万元时的奖金*/    bon10 = bon6 + 400000 * 0.015; /*利润为100万元时的奖金*/    printf("请输入利润i:");    scanf("%ld", &i);              /* 长整型 */    c = i / 100000;    if(c > 10) c = 10;    switch(c)    {     case 0 : bonus = 1*0.1                        ; break;    case 1 : bonus = bon1  + (i - 100000)  * 0.075; break;    case 2 :    case 3 : bonus = bon2  + (i - 200000)  * 0.05;  break;    case 4 :    case 5 : bonus = bon4  + (i - 400000)  * 0.03;  break;    case 6 :    case 7 :    case 8 :    case 9 : bonus = bon6  + (i - 600000)  * 0.015; break;    case 10: bonus = bon10 + (i - 1000000) * 0.01;    }    printf("奖金是%10.2f\n", bonus);    return 0;}------------------------------------ 用if语句实现如下:------------------------------------ #include <stdio.h>int main(){    long i;    double bonus, bon1, bon2, bon4, bon6, bon10;    bon1  = 100000 * 0.1;                  /*利润为10万元时的奖金*/    bon2  = bon1 + 100000 * 0.075;         /*利润为20万元时的奖金*/    bon4  = bon2 + 200000 * 0.05;          /*利润为40万元时的奖金*/    bon6  = bon4 + 200000 * 0.03;          /*利润为60万元时的奖金*/    bon10 = bon6 + 400000 * 0.015;         /*利润为100万元时的奖金*/    printf("请输入利润i:");    scanf("%ld",&i);    if(i <= 100000)        bonus = i * 0.1;                      /*利润在10万元以内按0.1提成奖金*/    else  if(i <= 200000)        bonus = bon1 + (i - 100000) * 0.075;  /*利润在10万至20万元时的奖金*/    else  if(i <= 400000)        bonus = bon2 + (i - 200000) * 0.05;   /*利润在20万至40万元时的奖金*/    else  if(i <= 600000)        bonus = bon4 + (i - 400000) * 0.03;   /*利润在40万至60万元时的奖金*/    else  if(i <= 1000000)        bonus = bon6 + (i - 600000) * 0.015;  /*利润在60万至100万元时的奖金*/    else        bonus = bon10 + (i - 1000000) * 0.01; /*利润在100万元以上时的奖金*/    printf("奖金是%10.2f\n",bonus); return 0;}------------------------------------  

阅读(4603) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册