形式:
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;
}
------------------------------------
评论