当前课程知识点:C语言程序设计 > 第5章 选择结构程序设计 > 5.5 switch语句 > switch语句
同学们
大家好
本节我们来学习C语言中的switch语句
if语句只有两个分支可供选择
而实际问题中常常需要用到多分支的选择
例如
学生成绩分类
85分以上为 'A'等
70~84分为'B'等
60^-69分为'C'等
当然这些问题可以用嵌套的if语句来处理
但如果分支较多
则嵌套的if语句层数较多
程序冗长而且可读性降低
C语言提供switch语句直接处理多分支选择
switch语句的一般形式如下
switch(表达式)
{ case 常量1
case 常量1: 语句1
case 常量2: 语句2
case 常量n: 语句n
default: 语句n+1
}
switch下面的花括号内是一个复合语句
它是switch语句的语句体
语句体内包含多个以关键字
case开头的语句行和最多一个以default开头的行
case后面跟一个常量
或常量表达式
它们和default都是起标号的作用
用来标志一个位置
执行switch语句时
先计算switch后面的
表达式的值
然后将它与各case标号比较
如果与某一个case标号中的常量相同
流程就转到此case标号后面的语句
如果没有与switch表达式相匹配的case常量
流程转去执行default标号后面的语句
可以没有default标号
此时如果没有与switch表达式相匹配的case常量
则不执行任何语句
流程转到switch语句的下一个语句
说明
(1) switch后面的
表达式
可以是int
char和枚举型
但不可以为浮点型
如图所示
(2) 在case子句中虽然包含了一个以上执行语句
但可以不必用花括号括起来
会自动顺序执行本case标号后面所有的语句
当然加上花括号也可以
如图所示
(3) 每个case后面
常量表达式值
必须各不相同
否则会出现相互矛盾的现象
如图所示
(4) 每个case后面必须是
常量
或
常量表达式
不能包含变量
如图所示
(5) case后面的
常量表达式
仅起语句标号作用
并不进行条件判断
系统一旦找到入口标号
就从此标号开始执行
不再进行标号判断
如图所示
注意
一般情况下
在执行一个case子句后
应当用break语句使流程跳出switch结构
即终止switch语句的执行
最后一个子句
可不必加break语句
因为流程已到了switch结构的结束处
如图所示
(6) 多个case标号可以共用一组执行语句
如图所示
当a的值是1 2 3时
将b的值加2
当a的值是4 5 6 时
将b的值减2
(7) case子句和default子句如果都带有break子句
那么它们之间顺序的变化不会影响switch语句的功能
8
case子句和default子句如果有的带有break子句
而有的没有带break子句
那么它们之间顺序的变化可能会影响输出的结果
(9) switch语句可以嵌套
如图所示
流程图如图所示
运行结果如图所示
例题
要求按照考试成绩的等级输出百分制分数段
A等为85分以上
B等为70~84分
C等为60-69分
D等为60分以下
成绩的等级由键盘输入
解题思路
这是一个多分支选择问题
我们可以用多条if语句或if语句的嵌套来实现
也可以用switch语句来实现
等级grade定义为字符变量
从键盘输入一个大写字母
赋给变量grade
switch得到grade的值并把它和各case中给定的值'A'
'B'
'C'
'D' 逐一相比较
如果和其中之一相同
称为匹配
则执行该case后面的语句
即printf语句
如果输入的字符与'A'
'B'
'C'
'D'都不相同
就执行default后面的语句
输出输入错误的信息
编写程序如图所示
运行结果如图所示
程序流程图如图所示
我们对程序进行修改
注意在每个case后面的语句中
最后都有一个break语句
作用是使流程转到switch语句的末尾
即右花括号处
修改后编写程序如下
运行结果如下所示
流程图如图所示
可以看到
switch语句的作用是根据表达式的值
使流程跳转到不同的语句
break语句
作用是使流程转到switch语句的末尾
即右花括号处
例题
运输公司对用户计算运输费用
路程越远
每吨每千米运费越低
标准如下
解题思路
设每吨每千米货物的基本运费为p
货物重量为w
距离为s
折扣为d
则总运费f的计算公式为
f=p*w*s* (1一d)
经过仔细分析发现折扣的变化是有规律的
如图所示
从图中可以看到
折扣的变化点都是250的倍数
250
500
1000
2000
3000
利用这一特点
c的值为s/250
c代表250的倍数
当c<1时
表示s<250
无折扣
1<=c<2时
表示250<=s<500
折扣d=2%
2<=c<4时
d=5%
4<=c<8时
d=8%
8<=c<12时
d=10%
c>=12时
d=15%
编写程序如图所示
运行结果如图所示
在本程序中
解此题的关键是找出折扣d与距离s的关系
一般情况下
这类问题都是有一定规律的
要细心观察分析
找出规律问题就变得简单了
如果的确没有什么规律
就不能以这种方式使用switch语句处理
可以用嵌套的if语句
if … else if … else形式
处理
c和s是整型变量
因此c=s/250的结果为整数
当s>=3000时
令c=12
而不使c随s增大
这是为了在switch语句中便于处理
用一个case就可以处理所有s>=3000的情况
本节的内容就讲到这里
同学们再见
-计算思维与计算机
--计算思维与计算机
--计算思维与计算机
--计算思维和计算机
-2.1 程序设计语言的发展及其特点和应用
--程序设计语言的特点及发展
- 2.2 C语言程序的基本结构及编制C语言程序的基本步骤
--C语言程序的结构和编制步骤
-3.1 C语言的数据类型
--C语言的数据类型
--C语言的数据类型
-3.2 常量
--常量
--常量
-3.3 什么是变量
--什么是变量
--什么是变量
-3.4 如何进行算术运算
--如何进行算术运算
--如何进行算术运算
-3.5 赋值运算符和逗号运算符
--赋值运算符和逗号运算符
-3.6 数据类型转换
--数据类型转换
--数据类型转换
-4.1 格式化输出printf
--格式化输出
-4.2 格式化输入scanf及字符数据的非格式化输入输出
--格式化输入
-5.1 关系运算符和关系表达式
--关系运算符和关系表达式
-5.2 逻辑运算符和逻辑表达式
--逻辑运算符和逻辑表达式
-5.3 条件运算符和条件表达式
--条件运算符和条件表达式
-5.4 if语句
--if语句
--if语句
-5.5 switch语句
--switch语句
--switch语句
-6.1 while语句
--while语句
--while语句
--do-while语句
-6.2 for语句
--for语句
--for语句
-6.3 循环的嵌套
--循环的嵌套
--循环的嵌套
-6.4 break语句和continue语句
--break和continue语句
-7.1 一维数组的定义和引用
--一维数组的定义和引用
-7.2 一维数组的赋值
--一维数组的赋值
--一维数组的赋值
-7.3 二维数组的定义和引用
--二维数组的定义和引用
-7.4 二维数组的赋值
--二维数组的赋值
--二维数组的赋值
-7.5 字符串的本质
--字符串的本质
--字符串的本质
-7.6 字符串操作的常用函数
--字符串常用函数
-7.7 字符串数组
--字符串数组
--字符串数组
-8.1 函数概述
--函数概述
--函数概述
-8.2 有参函数
--有参函数
--有参函数
-8.3 函数参数的传递方式
--函数参数的传递方式
-8.4 变量的作用域和生存期
--变量的作用域和生存期
-8.5 变量的存储类型
--变量的存储类型
--变量的存储类型
-8.6 函数的嵌套和递归调用
--函数的嵌套和递归调用
-8.7 函数的作用域与封装
--函数的作用域与封装
-9.1 指针变量的概念(上)
--指针变量的概念(上)
-9.2 指针变量的概念(下)
--指针变量的概念(下)
-9.3 指向一维数组的指针变量
--指向一维数组的指针变量
-9.4 指向二维数组的指针变量(上)
--指向二维数组的指针变量(上)
-9.5 指向二维数组的指针变量(下)
--指向二维数组的指针变量(下)
-9.6 动态内存分配
--动态内存分配
--动态内存分配
-10.1 编译预处理
--编译预处理
-11.1 用户自己建立数据类型
--用户自己建立数据类型
-11.2 定义结构体类型变量
--定义结构体类型变量
-11.3 结构体变量的引用与初始化
-11.4 结构体数组
--结构体数组
--结构体数组
-11.5 指向结构体类型数据的指针
--指向结构体类型数据的指针
-12.1 文件的基本概念和文件指针
--文件的基本概念和文件指针
-12,2 文件的打开和关闭
--文件的打开和关闭
--文件的打开和关闭
-12.3 文本文件读写
--文本文件读写
--文本文件读写
-12.4 二进制文件读写
--二进制文件读写
--二进制文件读写