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

评论