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