C语言程序设计第五章分支结构和循环结构.docx
- 文档编号:12855878
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:42
- 大小:179.92KB
C语言程序设计第五章分支结构和循环结构.docx
《C语言程序设计第五章分支结构和循环结构.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第五章分支结构和循环结构.docx(42页珍藏版)》请在冰豆网上搜索。
C语言程序设计第五章分支结构和循环结构
第五章分支结构和循环结构
【学习目标】
本章将详细介绍在C语言中如何进行流程控制。
主要包括分支语句、循环语句、流程跳转语句等。
本章的学习要点包括如下几点:
(1)if分支语句。
(2)switch多分支语句。
(3)while循环语句。
(4)do-while循环语句。
(5)for循环语句。
(6)流程跳转语句。
【学习导航】
本章的在整个课程中的位置如图5-1所示。
数组的使用
分支结构和循环结构
数据输入亀出函数
运算符与表达式
常用数据类型
C皓言概述及开发环境格建
图5-1本章学习导航
任何编程语言中最常见的程序结构就是顺序结构。
顺序结构就是程序从上到下一行一行地执行,中间没有任何判断和跳转。
如图5-2所示。
如果main方法多行代码之间没有任何流程控制,则程序总是从上向下依次执行,排在前面的代码先执行,排在后面的代码后执行。
这意味着:
如果没有流程控制,方法里的语句是一个顺序执行流,从上向下依次执行每条语句。
但是,当我们需要根据不同的情况来有选择的做一些操作时,顺序结构就不能满足要求了,这时
图5-2顺序结构语句的执行流程
候就需要分支结构出马了!
5.1分支结构
迄今为止,我们编写的程序都是按顺序从main方法的第一行执行到最后一行。
但现实
世界中有些情况是在必须满足一定条件下才发生的,比如一个学生能拿奖学金必须满足每门
课程在75分以上。
选择语句的基本功能是使程序在不同的情况下,执行不同的代码。
这样程序就不单只是顺序执行了,可以按照预先定好的逻辑执行不同的流程(比如满足条件A
就执行流程A,满足条件B就执行流程B)。
C语言中有两种选择语句:
if语句和switch语句。
5.1.1if语句
1.简略形式
基本的if语句的语法为:
if(表达式)
{
程序代码块;//如果表达式为真,就执行这段代码
}
if语句的作用是:
当圆括号里的表达式返回值为真,则程序会执行花括号里面的程序代码块。
如果表达式值为假,则不会执行花括号里的程序代码块。
其执行流程可以参考图5-3。
【课堂案例5-1】在学生成绩管理系统中,需要对学生的成绩进行管理,请编写程序来根据学生的成绩给出相应信息:
60分以上为“及格”,否则不显示。
【案例目标】会使用简略if语句
【案例知识要点】简略if语句的写法、表达式的运用。
【案例程序代码】simplelf.c
1#include
2main()
3{
4intscore=65;
5
5if(score>=60)
6{
7printf("
及格\n");
9
10}
}
【案例代码说明】
第4行定义了一个变量score,初始化为65,用来保存学生成绩。
第6行,系统会计算关系表达式“score>=60”的值,返回为true,所以会执行花括号里
的输出语句,程序的输出结果如图5-4:
及格—
图5-4Simple.c程序输出结果
试一试
(一):
如果修改一下程序的第4行,将score的值改为50,再运行。
程序的执行结果是怎样的
呢?
说明:
因为这时系统在计算第6行的表达式的值为false,所以不会执行花括号里的代码。
最终main方法执行完后没有任何输出信息。
试一试
(二):
将程序代码的第7行和第9行的花括号删除,再运行。
程序的执行结果是怎样的呢?
说明:
如果程序代码块只有一条语句,则可以省略{}(但不推荐这种写法,参见下面的【规
则5-1】)。
但if语句或else语句的程序代码块中包含多条语句,则必须放在花括号{}内。
编程规范:
【规则5-1]if、for、do、while语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。
试一试(三):
F面的代码片段会输出什么结果?
1#include
2main()
3{
4
inti=0;
5
if(i!
=0)
6
i=i+5;
7
i=i+10;
8
9}
printf("%d\n",i);
上面的程序并没有任何语法错误,
所以是可以编译成功并执行的。
可能有读者会以为输
出结果是0,因为程序第5行的表达式返回值显然为false。
所以后面的代码是不会执行的。
但是不执行的代码只有第6行,第7行是会执行的。
因为在if后面没写{}的情况下,if的作
用范围只有if后面的第一条语句。
从这个例子可以看出,这种写法存在一定的误导,所以良好的编程规范是:
即使if后面只有一条语句,也要用{}括起来。
【课堂练习】
1.编写程序判断输入的数是不是偶数?
2.编写程序判断输入的年份是不是闰年?
2.完整形式
接下来我们修改一下需求,假设对某个学生成绩进行判断,如果大于等于60则打印“及格”,如果小于60分则打印“不及格”。
要完成这个功能就需要用到if的完整形式。
基
本语法如下:
if(表达式)
{
程序代码块1;//表达式值为真时执行
}
else
{
程序代码块2;//表达式值为假时执行
}
执行流程如图5-5所示。
图5-5完整形式if条件语句的执行流程
【课堂案例5-2】在学生成绩管理系统中,需要对学生的成绩进行管理,请编写程序来根据学生的成绩给出相应信息:
如果大于等于60则打印“及格”,如果小于60分则打印“不及
格”。
【案例目标】会使用完整形式的if语句
【案例知识要点】if完整形式的用法、else的理解
【案例程序代码】fulllf.c
1#in
clude
2ma
in()
3{
4
intscore=65;
5
6
if(score>=60)
7
{
8
printf("
及格\n");
9
}
10
else
11
{
12
printf("
不及格\n");
13
}
14}
【案例代码说明】
第4行定义了一个变量score,初始化为65,用来保存学生成绩。
第6行,系统会计算关系表达式“score>=60”的值,返回为true,所以会执行花括号里的输出语句,程序的输出结果为图5-6左:
修改第4行score的值为55,则第6行的表达式返回false,系统会跳到第10行,执行
else(表示score<60的情况)后花括号里的代码,输出图5-6右。
及格
不及恪
图5-6Fulllf.c程序输出结果
【课堂练习】
1.编写程序testlf1.c,定义一个整型变量score,赋值0〜100之间。
判断score的大小,如果
大于等于80,则输出“优秀”,否则输出“还要努力”。
2.编写程序upperCaseLetter.c,完成如下功能:
判断输入的是否大写字母,是则输出“您输入的是大写字母”,否则输出“不是大写字母”。
3.if语句的嵌套
继续完善【课堂案例5-2】的功能。
要求程序对60分以上的给出更细化的等级,增加“优”的等级,即:
60〜79分为“及格”,80分以上为“优秀”。
立面,或者说只能描述两种情况。
那么如何描述“优”等呢?
显然“优”等是被包含在60
分以上的范围中,所以要对60分以上的范围进行细化,表现在程序中就是在if(score>=60)的{}中再嵌套if语句。
嵌套的if语句格式如下:
if(表达式1)
{
***J
if(表达式2)
{//if语句的嵌套
■■■J
}
else
{
***J
}
"""J
}
else
{
***J
if(表达式2)
{//if语句的嵌套
■■■J
}
else
{
***J
}
"""J
}
嵌套的if语句的使用请看【课堂案例5-3】。
【课堂案例5-3】在学生成绩管理系统中,需要对学生的成绩进行管理,请编写程序来根据
学生的成绩给出相应信息:
成绩小于60分则输出“不及格”,60〜79分输出“及格”,80
分以上输出“优秀”。
【案例目标】会使用嵌套的if语句
【案例知识要点】嵌套if语句的使用、外层if对内层if的影响
【案例程序代码】nestedlf.c
1
#include
2
3
main()
4
{
5
intscore=89;
6
if(score>=60)
7
{
8
if(score>=80)
9
{
10
printf(”
优秀\n");
11
}
12
else
13
{
14
printf("
及格\n");
15
}
16
}
17
else
18
{
19
printf("不及格\n");
20
}
21}
【程序说明】
第8行到第15行的if-else是嵌套在外层的if(score>=60)之中的。
第12行的else对应的分数范围是:
60〜79。
这是嵌套的if语句的累计作用效果。
在这个else前面有两个if。
第一个为第6行的if(score>=60),当执行到这个if后面的{}中的程序代码块时,说明分数是>=60的;然后系统计算第8行的if(score>=80),如果返回值为假(即执行第12行的else部分),则说明当前的分数是在>=60的基础上<80,所以其范围就是60〜79。
【课堂练习】
编写程序nestedlf2.java,定义一个描述学生成绩的整型变量score,赋值0〜100之间。
根据成绩给出相应等级:
60分以下为“不及格”,60〜69分为“及格”,70〜79分为“良”,80分以上为“优秀”。
(你可以修改score的值来观察各种不同的输出)
4.缩排的if-else形式
如果需要测试的条件很多,那么会需要嵌套很多层,这样就导致代码的可读性差。
可以
使用缩排的if-else写法解决这个问题。
其格式如下:
if(表达式1){
***J
}
elseif(表达式2)
{〃当不满足表达式1但满足表达式2时执行下面的代码
***J
}
elseif(表达式3){
//当不满足表达式1且不满足表达式2,但满足表达式3时执行下面的代码
}
很显然,对于缩排的if-else,前面的if对后面的作用效果是累加的。
使用缩排的if-else格式完成上面的【课堂练习】代码如下:
【程序代码】Testlf2.java
1
#include
2
main()
3
{
4
intscore=111;
5
if(score<0||score>100)
6
{
7
printf(”
错误的分数\n");
8
}
9
elseif(score<
60)
10
{
11
printf("
不及格\n");
12
}
13
elseif(score<
70)
14
{
15
printf("
及格\n");
16
}
17
elseif(score<
80)
18
{
19
printf("
良好\n");
20
}
21
else
22
{
23
printf("
优秀\n");
24
}
25
}
【程序说明】
第11行代码执行的前提是:
第5行的表达式返回值为false,那么这时0<=score<=100;并且第9行的表达式返回值为true,这时分数为0<=score<60(其中score>=0是前一个if累加作用的效果);这与输出“不及格”是相符的。
第15行代码执行的前提可以照前面思路来分析。
首先是第5行的表达式值为false,
那么0<=score<=100;然后是第9行的表达式值也为false,表示score>=60。
二者累加的效果为60<=score<=100;接下来第13行的表达式为true,那么60<=score<70,所以输出“及格”。
试一试(四):
请分析什么情况下会执行第19行代码?
什么情况下会执行23行代码。
【课堂练习】
1.根据某人的应纳税所得额编程,计算个人所得税。
税率表如下:
级数
全月应纳税所得额
税率%
速算扣除法(元)
1
不超过500元的
5
0
2
超过500兀至2000兀的部分
10
25
3
超过2000元至5000元的部分
15
125
4
超过5000元至20000元的部分
20
375
5
超过20000元的部分
25
1375
计算公式是:
应纳个人所得税税额=应纳税所得额X适用税率-速算扣除数
例:
王某当月应纳税所得额6400元。
则应纳个人所得税税额=6400X20%-375=905元。
2.编写程序实现如下功能:
接收键盘输入的两个数及一个运算符,计算结果并输出。
例
如:
输入:
10+20输出:
30
输入:
20-10输出:
10
5.1.2switch多分支语句
上一节介绍了if语句,其可以通过嵌套来实现多分支。
但是如果需要处理问题的分支比较多,用嵌套的if会使得程序变得冗长,可读性差。
这时可以使用C语言中实现多分支
的另外一种选择语句:
switch语句。
其格式如下:
switch(判断表达式)
{
case表达式1:
程序代码块1;//判断表达式和表达式1匹配时执行
break;
case表达式2:
程序代码块2;//判断表达式和表达式2匹配时执行
break;
default:
执行流程如图5-7所示。
图5-7switch条件语句的执行流程
【课堂案例5-3】编写程序实现计算器的功能:
能根据指定的运算符对两个操作数进行“+”、
”、“*”、“/”四种操作。
【案例目标】学会使用swicth语句
【案例知识要点】swicth语句的结构、表达式的使用、break关键字
【案例程序代码】calSwicth.c
1
#include
2
3
main()
4
{
5
inti,j;//i
表示第一个操作数,j表示第二个操作数
6
charope;//ope
表示操作付
7
printf("请按
a+b格式输入\n”);
8
scanf("%d%c%d",&i,&ope,&j);
9
switch(ope)//swicth开始
10
{
11
case'+':
12
printf("
和是%d\n",i+j);
13
break;
14
case'-':
15
printf("
差是%d\n",i-j);
16
break;
17
case'*':
18
printf("
积是%d\n",i*j);
19
break;
20
case'/':
21
printf("
商是%.2f\n",(float)i/j);
22
break;
23
default:
24
printf("
请使用+、-、*、/四种运算符!
");
25
}//swicth
结束
26
printf("swicth
语句执行完毕...\n");
27
}
【程序说明】
第9行()里的ope是switch语句的判断表达式,它不是任意类型都可以。
合法的判断表达式主要有两类:
1基本类型表达式:
如果是基本类型表达式,则其返回值必须和int类型兼容。
也就是说,表达式的类型只
能是byte、short、char、以及int。
2枚举类型表达式
第11、14、17、20行是四个case表达式,case表达式也是有要求的。
有以下两点:
1在类型方面和判断表达式相同。
2不能有两个相同的case表达式。
请看下面的代码片段:
1...
2case'+':
3printf("你按了加号”);
4break;
5case'+':
6
printf
(“尔再次按了加号”);
7
break;
8
把这段代码放入完整的程序后会编译出错,原因是第2行和第5行定义了两个相同的
case。
第23行是default部分。
这一部分执行的前提是:
前面所有列出的case都和第9行的
判断表达式不匹配。
最后详细说明calSwitch类的执行流程。
首先计算第9行判断表达式(假定用户输入的操作符是’+'),返回值为字符’+',然后执行第11行,把case关键字后面的表达式的值('+')与判断表达式的值进行比较,两者相互匹配,那么就执行当前这个case
后面的代码块。
先是第12行:
printf(”和是%d\n",i+j);
输出16,然后再执行第13行:
break;
break关键字的意思是跳出整个switch语句,继续往下执行。
在本程序中,switch语句包含的行数是从第9行到第25行。
所谓跳出switch语句是指程序跳转到第26行,
执行:
printf("swicth语句执行完毕...\n");
试一试(四):
执行calSwicth.exe,观察程序输出什么?
【说明】程序的输出为第24行的打印结果:
请使用+、-、*、/四种运算符!
这是因为第11、14、17、20行四个case表达式的值(分别为’+'、’-'、’*'、'/')
都不能匹配第9行的判断表达式的值('#'),这时程序会执行default分支。
试一试(五)
1+2,那么程序的输出是什
对程序calSwitch.c稍作修改,将第13行注释,并且输入
么呢?
【说明】程序输出如图5-8所示:
第3行输出是两个数的和,是第12行的打印信息。
第4行输出是两个数的差,是第15行的打印信息。
图5-8修改后的calSwitch.exe执行结果
这个例子揭示了switch语句执行流程的另一个特点,就是当switch的判断表达式和某个case表达式匹配,就从
这个case子句开始执行,如果没有break语句,就会继续往下执行其他case子句,并且
不再判断case表达式的值是否匹配判断表达式。
swicth语句的编程规则:
【规则5-1】每个case语句的结尾不要忘了加break语句,否则将导致多个分支重叠(除
非有意使多个分支重叠)。
【规则5-2】不要忘记最后的default分支。
即使程序真的不需要default处理,也应该
保留语句default:
break;
在一般情况下,应该在每个case子句的末尾加上break语句,以便及时退出整个switch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
5-4】。
语句。
但在某些情况下,可能有多个case表达式都匹配switch的判断表达式,这时就可以在这些case子句后不加break语句。
具体用法请看【课堂案例
【课堂案例5-4】编写程序如下功能:
输入月份,输出2014年该月有多少天。
【案例目标】学会使用swicth语句
【案例知识要点】swicth语句的结构、多case匹配的写法
【案例程序代码】printDays.c
#include
main()
{
intmonth;
intday;
printf("请输入一个月份:
”);
scanf("%d",&month);
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
day=31;
break;
case4:
case6:
case9:
case11:
day=30;
break;
case2:
day=28;
break;
default:
day=-1;
}
if(day==_1)
{
printf("输入的月份无效!
\n");
}
else
{
printf("2014年%d月有%d天\n”,month,day);
}
}
【程序说明】
因为1、3、5、7、8、10、12都是大月,所以代码的12-18行分别列出了这几种情况,匹配其中任意一种得到的天数都是31天。
代码20-23行列出了小月的情况。
5.2循环语句
考虑学生管理系统中的这样一个功能需求:
在控制台打印出某班所有学生的c语言课
程的成绩。
假如这个班有40名同学,那么“打印某个学生的C语言成绩”这件事情就要重
复做40次。
如何用高效的方式来完成这个需求呢?
C语言提供了循环语句。
循环语句有三
图5-9while循环语句的执行流程
种,分别为while语句、do-while语句和for循环语句。
5.2.1while循环语句
while循环是最基本的循环语句。
格式如下:
while(循环条件){
循环体;迭代语句;
}
当循环条件的值为true时,就执行循环体和迭代语句,这个过程是重复的;否则终止循环。
具体的流程参见图5-9。
F面用【课堂案例5-5】来说明while的用法。
【课堂案例5-5】在学生管理系统中,要求提供这样的功能:
查看全班所有学生某门课程的成绩;
【案例学习目标】学会使用while语句
【案例知识要点】while语句的写法、表达式的使用、计数器的使用
为了简化问题,在这个程序中,假定这个班只有20个人。
并且学生的成绩恰好是70
89这20个整型数。
【程序代码】whileTest.c
1#include
2
2main()
3{
4intsNum=1;//sNum用来统计学生的人数
5intscore=70;//第1个学生的分数为70
7
6while(sNum<=20)
7{
8printf("第%d个同学的成绩为:
%d\n",sNum,score);
9score=score+1;
10sNum=sNum+1;
11}
12}
【程序输出】
90123456789
是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 第五 分支 结构 循环