C语言程序设计第五章分支结构和循环结构.docx

上传人:b****0 文档编号:12855878 上传时间:2023-04-22 格式:DOCX 页数:42 大小:179.92KB
下载 相关 举报
C语言程序设计第五章分支结构和循环结构.docx_第1页
第1页 / 共42页
C语言程序设计第五章分支结构和循环结构.docx_第2页
第2页 / 共42页
C语言程序设计第五章分支结构和循环结构.docx_第3页
第3页 / 共42页
C语言程序设计第五章分支结构和循环结构.docx_第4页
第4页 / 共42页
C语言程序设计第五章分支结构和循环结构.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

C语言程序设计第五章分支结构和循环结构.docx

《C语言程序设计第五章分支结构和循环结构.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第五章分支结构和循环结构.docx(42页珍藏版)》请在冰豆网上搜索。

C语言程序设计第五章分支结构和循环结构.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1