HELLO,大家好,又是我,clive。两天没有更新博客了,一直在忙开学的事情。好了,让我们进入正题,今天我们来讲一下switch的用法。
用switch语句实现多分支选择结构
首先我们来看一道例题
1.要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为7084分,C等为6069分,D等为60分以下。成绩的等级由键盘输入。
代码如下
#include<stdio.h>
int main()
{
char grade
scanf("%c,&grade)
printf(Your score: )
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("enter data error!\n");
}
return 0;
}
运行如下:
等级 grade定义为字符变量,从键盘输入一个大写字母,赋给变量 grade, switch得到 gradel的值并把它和各case中给定的值(A,B,C"D之一)相比较,如果和其中之一相同(称为匹配),则执行该case后面的语句(即 printf语句)。如果输入的字符与A,B,C,D都不相同,就执行 default后面的语句,注意在每个case后面后的语句中,最后都有一个 break语句,它的作用是使流程转到 switchi语句的末尾(即右花括号处)。
干货来了
(1)括号内的"表达式",其值的类型应为整数类型(包括字符型)。
(2)花括号内是一个复合语句,内包含多个以关键字case开头的语句行和最多一个以 default开头的行。case后面跟一个常量(或常量表达式),它们和 default都是起标号作用,用来标志一个位置。执行switch语句时,先计算 switch后面的"表达式"的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与 switch表达式相匹配的case常量,流程转去执行 default标号后面的语句。
(3)可以没有 default标号,此时如果没有与 switch表达式相匹配的case常量,则不执行任何语句。
(4)各个case标号出现次序不影响执行结果。
(5)每一个case常量必须互不相同;否则就会出现互相矛盾的现象。
(6)case标号只起标记的作用。在执行 switch语句时,根据 switch表达式的值找到匹配的入口标号,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断。因此,一般情况下,在执行一个case子句后,应当用 break语句使流程跳出 switchs结构。最后一个case子句(今为 default子句)中可不加 break语句。
(7)在case子句中虽然包含了ー个以上执行语句,但可以不必用花括号括起来,会自动顺序执行本case标号后面所有的语句。当然加上花括号也可以。
(8)多个case标号可以共用一组执行语句。
干货说完,我们来实践一下
2.用 switchi语句处理菜单命令。在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个A或a字符,就会执行A操作,输入ー个B或b字符,就会执行B操作。
#include <stdio.h>
int main()
{
void action1(int;int),action2(int,int);//函数声明
char ch;
int a=15,b=23;
ch=getchar();
switch(ch)
{
case'a';
case'A': action1(a,b);break;//调用 action1函数,执行A操作
case'b';
case'B'; action2(a,b); break;//调用 action2函数,执行B操作
.
.
.
default: putchar('\a');//如果输入其他字符,发出警告
}
return O;
}
void action1(int x,int y)是执行加法的函数,即{printf(“x+y=%d\n”,x+y);
void action2(int x,int y)是执行乘法的函数,即{printf("xy=%d\n",xy);
代码如下:
#include <stdio.h>
int main()
{
int c,s;
float p,w,d,f;
printf("please enter price,weight,discount:");//提示输入的数据
scanf("%f,%f,%d",&p,&w&s);//输入单价、重量、距离
if(s>=3000)
c=15;//3000km以上为同一折扣
else c=s/250;//3000km以下各段折扣不同,c的值不相同
switch(c)
{
case 0:d=0;break;//c=0,代表250km以下折扣d=0
case 1:d=2;break;//c=1,代表250~500km以下折扣d=2%
case 2:
case 3:d=5;break;//c=2和3,代表500~1000km折扣d=5%
case 4:
case 5:
case 6:
case 7:d=8;break;//c=4~7,代表1000~2000km.折扣d=8%
case 8:
case 9:
case 10:
case 11:d=10;break;//c=8~11,代表2000~3000km折扣d=10%
case 12:d=15;break;//c12,代表3000km以上,折扣d=15%
}
f=p*w*s*(1-d/100);//计算总运费
printf("freight=%10.2f\n",f);//计算总运费,取两位小数
return 0;
}
今天就先讲这两道例题吧,明天接着讲关于switch的习题。