正文

[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;
}

------------------------------------

 

阅读(3383) | 评论(0)


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

评论

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