1、第第4章章 C语言的流程控制语言的流程控制李俊李俊计算机基础教学部计算机基础教学部南京航空航天大学信息科学与技术学院南京航空航天大学信息科学与技术学院 2007.8本章内容本章内容4.1 算法概述算法概述4.2 C语言程序的结构和语句概述语言程序的结构和语句概述4.3 选择结构语句选择结构语句4.4 循环结构语句循环结构语句4.5 控制语句的应用举例控制语句的应用举例l4.1.1 4.1.1 算法及其效率算法及其效率l程序的算法,就是使用程序解决问题的程序的算法,就是使用程序解决问题的计算步骤计算步骤。l程序算法规定了计算机程序的运行步骤,也保证了程序算法规定了计算机程序的运行步骤,也保证了程
2、序的运行可以取得正确的结果。程序的运行可以取得正确的结果。l程序程序 =数据数据 +算法算法l不同的算法效率不同:不同的算法效率不同:l采用优秀的解题方法,合理安排计算步骤,以最少的计算采用优秀的解题方法,合理安排计算步骤,以最少的计算步骤完成计算任务的方法我们称为高效率算法。步骤完成计算任务的方法我们称为高效率算法。l使用了比较笨拙的解题方法,通过较多的运算步骤来实现使用了比较笨拙的解题方法,通过较多的运算步骤来实现同样的计算任务的计算方法我们称为低效率算法。同样的计算任务的计算方法我们称为低效率算法。l为了有效地进行解题,不仅需要保证算法正确,还要为了有效地进行解题,不仅需要保证算法正确,
3、还要考虑算法的质量,选择合适的算法。考虑算法的质量,选择合适的算法。4.1 算法概述算法概述l4.1.2 4.1.2 算法的设计原则算法的设计原则 1.1.符合数学计算规则符合数学计算规则 只有符合数学规则的计算步骤才可以被计算机正确只有符合数学规则的计算步骤才可以被计算机正确执行。执行。2.2.保证结果确定保证结果确定 如果一个算法对同一组数据进行多次计算,竟然获如果一个算法对同一组数据进行多次计算,竟然获 得多个不同的结果,这种算法是不确定的,是无效的。得多个不同的结果,这种算法是不确定的,是无效的。保证算法的确定性,最重要的方面是排除程序中随保证算法的确定性,最重要的方面是排除程序中随
4、机数的产生机数的产生(变量初始化变量初始化)。3.3.程序能够正常结束程序能够正常结束 一个合理的算法应包含有限的操作步骤,而不能是一个合理的算法应包含有限的操作步骤,而不能是无限的。无限的。4.1 算法概述算法概述l4.1.2 4.1.2 算法的设计原则算法的设计原则 4.4.合理的输入合理的输入 一个实际有效的程序中应该含有零个或者多个输入一个实际有效的程序中应该含有零个或者多个输入(一般会在程序的算法中加入一个或者多个输入一般会在程序的算法中加入一个或者多个输入 )。5.5.合理的输出合理的输出 一个有效的程序在设计算法时必须保证程序至少一个有效的程序在设计算法时必须保证程序至少要有一个
5、输出。要有一个输出。4.1 算法概述算法概述l4.1.3 算法的表示工具算法的表示工具 l在实际应用中有四种表示方法来描述算法:在实际应用中有四种表示方法来描述算法:(1)自然语言)自然语言 (2)流程图)流程图 (3)N-S图图 (4)伪代码)伪代码 4.1 算法概述算法概述 自然语言就是人们日自然语言就是人们日常生活中使用的语常生活中使用的语言。言。语法不严谨,语法不严谨,容易造成误解容易造成误解 1973年美国学者年美国学者I.Nassi 和和 B.Shneideman提出提出的一种无流线的流程的一种无流线的流程图图 流程图流程图是目前全球软件开发领域使用最广泛的算是目前全球软件开发领域
6、使用最广泛的算法表示工具,它通过一些严格定义图形的组合来表示法表示工具,它通过一些严格定义图形的组合来表示算法的步骤以及数据变化的走向。用图形表示算法,算法的步骤以及数据变化的走向。用图形表示算法,直观形象,易于理解。直观形象,易于理解。l4.1.3 4.1.3 算法的表示工具算法的表示工具 l流程图符号流程图符号 4.1 算法概述算法概述起止框起止框输入输出框输入输出框判断框判断框流程线流程线处理框处理框连接点连接点注释框注释框4.1 算法概述算法概述l4.1.3 算法的表示工具算法的表示工具 l例:求例:求 的值。的值。求多项式的累乘积问题。求多项式的累乘积问题。定义变量:定义变量:M 累
7、乘积累乘积 N 代表一项的分母代表一项的分母1001.4131211算法算法:M1,N1 MM NN+1 如果如果 N100,转,否则,转转,否则,转 输出输出 M 的值的值 结束结束循环循环N1算法描述:算法描述:自然语言自然语言+伪代码伪代码4.1 算法概述算法概述l4.1.3 算法的表示工具算法的表示工具 处理框处理框流程线流程线判断框判断框用用N-S 图描述图描述用流程图描述用流程图描述 M1 N1 MM NN+1 N100 输出输出 M 的的值值N1开始开始结束结束M1N1MM NN+1输出输出 M 的值的值N100TrueFalseN14.1 算法概述算法概述l4.1.4 结构化程
8、序设计中基本结构的表示结构化程序设计中基本结构的表示 l结构化程序设计结构化程序设计的基本结构有三种的基本结构有三种:顺序结构顺序结构、选择结选择结构构和和循环结构循环结构。1、顺序结构顺序结构:先执行:先执行A操作操作,再执行再执行B操作。操作。AB(a)流程图流程图 (b)N-S图图ABA、B可以是可以是一个简单语句一个简单语句或一个基本结构或一个基本结构4.1 算法概述算法概述l4.1.4 结构化程序设计中基本结构的表示结构化程序设计中基本结构的表示 2、选择结构选择结构:C(Condition)代表一个条件)代表一个条件 C True False A B(a)流程图流程图 (b)N-S
9、图图 True FalseCAB4.1 算法概述算法概述l4.1.4 结构化程序设计中基本结构的表示结构化程序设计中基本结构的表示 3、循环结构循环结构:(1)当(当(while)型循环:)型循环:当条件当条件 C 成立时,反复执成立时,反复执行行 A 操作,直到操作,直到 C 为假时,才停止循环。为假时,才停止循环。CAFalseTrue(a)流程图流程图 (b)N-S图图先判断,后执行,先判断,后执行,有可能循环体一次有可能循环体一次都不执行都不执行 当当 C为真为真 A4.1 算法概述算法概述l4.1.4 结构化程序设计中基本结构的表示结构化程序设计中基本结构的表示 3、循环结构循环结构
10、:(2)直到(直到(until)型循环:)型循环:先执行先执行 A 操作,再判断条操作,再判断条件件 C,若为,若为“假假”重复执行重复执行A,直到,直到 C 为为“真真”停止停止先执行,后判断,先执行,后判断,循环体至少要被执循环体至少要被执行一次行一次 ACFalseTrue A 直到直到 C为真为真(a)流程图流程图 (b)N-S图图4.1 算法概述算法概述l4.1.4 结构化程序设计中基本结构的表示结构化程序设计中基本结构的表示 AB三种结构特点:三种结构特点:单入口、单出口。单入口、单出口。每一部分都可能被执行到。每一部分都可能被执行到。没有死循环。没有死循环。A、B可能是一个更基本
11、的结构可能是一个更基本的结构。ACFalseTrue True FalseCABCAFalseTrueC语言程序是由若干函数构成,而一个函数由语言程序是由若干函数构成,而一个函数由若干语句构成。这些语句组合成三种基本结构若干语句构成。这些语句组合成三种基本结构以实现算法。参考图以实现算法。参考图4-8l计算机程序运行的时候是将一条条的计算机程序运行的时候是将一条条的语句语句翻译翻译成成机器指令机器指令,控制计算机产生计算的结果的。,控制计算机产生计算的结果的。所以所以语句是计算机程序的基本组成单位语句是计算机程序的基本组成单位。l注意注意:在:在C语言程序中,任何执行语句都必须语言程序中,任何
12、执行语句都必须写在函数中,不允许出现不属于函数的独立执写在函数中,不允许出现不属于函数的独立执行语句。行语句。4.2 C语言程序的结构和语句概述语言程序的结构和语句概述语句分类语句分类:(5类类)1.控制语句控制语句:控制语句的执行流程,共:控制语句的执行流程,共9种。种。(1)if()else 条件语句条件语句 (2)switch 多分支选择语句多分支选择语句 (3)while()当型循环语句当型循环语句 (4)do while()直到型循环语句直到型循环语句 (5)for()当型循环语句当型循环语句 (6)continue 结束本次循环语句结束本次循环语句 (7)break 中止执行中止执
13、行switch或循环语句或循环语句 (8)go to 转向语句转向语句 (9)return 从函数中返回语句从函数中返回语句4.2 C语言程序的结构和语句概述语言程序的结构和语句概述语句分类语句分类:(5类类)2.函数调用语句函数调用语句:在函数调用的后面加上一个分号构成:在函数调用的后面加上一个分号构成的一条语句,实现函数定义中规定的功能。的一条语句,实现函数定义中规定的功能。例例:scanf(%d,&i);调用标准库函数调用标准库函数 a=maxx(x1,x2);调用自定义函数调用自定义函数 3.表达式语句表达式语句:在一个表达式的后面加上一个分号构成:在一个表达式的后面加上一个分号构成的
14、一条语句,实现表达式的计算功能。的一条语句,实现表达式的计算功能。例:例:a=b+c /*赋值表达式赋值表达式*/a=b+c;/*赋值表达式语句赋值表达式语句*/4.2 C语言程序的结构和语句概述语言程序的结构和语句概述4.2 C语言程序的结构和语句概述语言程序的结构和语句概述例例:a=1;b=2;c=3;三个简单语句三个简单语句一个一个复合语句复合语句语句分类语句分类:(5类类)4.空语句空语句:;只有一个分号,什么都不做。主要只有一个分号,什么都不做。主要用于作被转向点,或空循环体。用于作被转向点,或空循环体。5.复合语句复合语句:用:用 把多条语句括起来构成复合把多条语句括起来构成复合语
15、句,从语法上看成一条简单语句。语句,从语法上看成一条简单语句。选择结构选择结构 判断给定的条件,根据判断的结果判断给定的条件,根据判断的结果从给定的多组操作中选择一组执行。从给定的多组操作中选择一组执行。4.3.1 if 语句语句if 语句的标准语法格式:语句的标准语法格式:if()语句语句1 else 语句语句2 l方括号中的内容是可选的。方括号中的内容是可选的。l“语句语句1”和和“语句语句2”必须是一条语句。必须是一条语句。4.3 选择结构语句选择结构语句 4.3.1 if 语句语句if 语句有三种使用形式。语句有三种使用形式。4.3 选择结构语句选择结构语句 1.if()语句语句2.i
16、f()语句语句1 else 语句语句2语句语句 表达式表达式假假真真语句语句1 表达式表达式假假真真语句语句2 不平衡不平衡 if 语句语句单选单选平衡平衡 if 语句语句二中选一二中选一l例例4.1 输入三个数字,程序求出并输出其中的最大值。输入三个数字,程序求出并输出其中的最大值。#include main()float a,b,c,t;printf(Please input three numbers:);scanf(%f%f%f,&a,&b,&c);t=a;if(t b)t=b;if(t c)t=c;printf(The Maximum number is:%fn,t);4.3 选择结
17、构语句选择结构语句 两个独立的两个独立的不平衡不平衡 if 语句语句4.3 选择结构语句选择结构语句 两个独立的两个独立的平衡平衡 if 语句语句l例例4.2 输入三个数字,程序求出并输出其中的最大值。输入三个数字,程序求出并输出其中的最大值。#include main()float a,b,c,t;printf(Please input three numbers:);scanf(%f%f%f,&a,&b,&c);if(a b)t=b;else t=a;if(t c)printf(The Maximum number is:%f n,c);else printf(The Maximum nu
18、mber is:%f n,t);4.3.1 if 语句语句 3.组合的组合的if 语句语句4.3 选择结构语句选择结构语句 基本格式:基本格式:if()语句语句1 else if()语句语句2else if()语句语句3 else if()语句语句nelse 语句语句n+1 对程序的一次执行,对程序的一次执行,只可能执行语句只可能执行语句1、语句语句2、语句语句n中的一个语句中的一个语句语句语句1 表达式表达式1假假真真语句语句2表达式表达式2表达式表达式n语句语句n 语句语句n+1假假假假真真真真l例例4.3 输入三个数字,程序求出并输出其中的最大值。输入三个数字,程序求出并输出其中的最大值
19、。#include main()float a,b,c;printf(Please input three numbers:);scanf(%f%f%f,&a,&b,&c);if(a=b&a=c)printf(The Maximum number is:%f n,a);else if(b=a&b=c)printf(The Maximum number is:%f n,b);else printf(The Maximum number is:%f n,c);4.3 选择结构语句选择结构语句 组合组合ifif语句的使用,语句的使用,一条语句一条语句例:输入学生的分数例:输入学生的分数 x,根据成绩
20、的高低,输出不同等级,根据成绩的高低,输出不同等级若若 x 为为:90100分分 则输出则输出A8089分分 则输出则输出B7079分分 则输出则输出C6069分分 则输出则输出D60分以下分以下 则输出则输出E4.3 选择结构语句选择结构语句#include void main()int x;scanf(“%d”,&x);if(x=90)printf(“An”);else if(x=80)printf(“Bn”);else if(x=70)printf(“Cn”);else if(x=60)printf(“Dn”);else printf(“En”);注意注意:条件的写法:条件的写法l例例4
21、.4 输入百分制成绩,将其转换为五分制成绩输出。输入百分制成绩,将其转换为五分制成绩输出。#include main()float score;printf(Please input the score:);scanf(%f,&score);if(score=90)printf(The grade is:A n);else if(score=80)printf(The grade is:B n);else if(score=70)printf(The grade is:C n);else if(score=60)printf(The grade is:D n);else printf(The
22、grade is:E n);4.3 选择结构语句选择结构语句 组合组合ifif语句的使用,语句的使用,注意注意elseelse的作用的作用4.3.2 if 语句的嵌套使用语句的嵌套使用4.3 选择结构语句选择结构语句 if()if()语句语句1 else 语句语句2else if()语句语句3 else 语句语句4内嵌平衡内嵌平衡 if 语句语句内嵌平衡内嵌平衡 if if 语句语句内嵌的内嵌的 if-else 语句为一条语句语句为一条语句嵌套时,嵌套时,else总是总是与它上面与它上面(未曾配对未曾配对的的)最近的最近的 if 配对配对4.3.2 if 语句的嵌套使用语句的嵌套使用4.3 选
23、择结构语句选择结构语句 if()if()语句语句1 else if()语句语句2 else 语句语句3内嵌不平衡内嵌不平衡 if 语句语句内嵌平衡内嵌平衡 if if 语句语句if()if()语句语句1else if()语句语句2 else 语句语句3 加花括加花括号号4.3.2 if 语句的嵌套使用语句的嵌套使用4.3 选择结构语句选择结构语句 if(条件条件1)语句语句1 else if(条件条件2)语句语句2 else if(条件条件3)语句语句3 else 语句语句4缩进书写方式缩进书写方式if(条件条件1)语句语句1else if(条件条件2)语句语句2else if(条件条件3)语
24、句语句3else 语句语句4组合组合if 语句语句l例例4.5 用嵌套的用嵌套的if语句解决数学问题语句解决数学问题#include main()float x,y;printf(Please input x:);scanf(%f,&x);if(x 10)y=-10;/*A*/else if(x=10)y=5;/*B:内嵌内嵌if语句语句*/else y=20;/*C*/printf(y=%f n,y);4.3 选择结构语句选择结构语句 y=-10(x10)if(x=10)if(x10)y=-10;else y=5;else y=20;等价等价4.3.3 条件运算符条件运算符一般形式:一般形式
25、:?:l运算原则:运算原则:当当表达式表达式1为为真真时,执行时,执行表达式表达式2,结果作为整个表达式,结果作为整个表达式的值的值 当当表达式表达式1为为假假时,执行时,执行表达式表达式3,结果作为整个表达式,结果作为整个表达式的值的值4.3 选择结构语句选择结构语句 if(ab)max=a;else max=b;max=(ab)?a:b;4.3.3 条件运算符条件运算符4.3 选择结构语句选择结构语句 运算优先级:运算优先级:比赋值运算符高,比算术、关系、逻辑运比赋值运算符高,比算术、关系、逻辑运算符低算符低 结合性:结合性:自右向左自右向左例如有如下的条件运算符表达式:例如有如下的条件运
26、算符表达式:x=ab?a:cb?a:(cb?c:b);在嵌套使用条件运算符时,应尽量使用括号将相关数在嵌套使用条件运算符时,应尽量使用括号将相关数据括起来,防止出现执行和理解的错误。据括起来,防止出现执行和理解的错误。C语言中唯一的语言中唯一的三目运算符三目运算符4.3.4 switch语句(语句(多分支选择语句,开关语句多分支选择语句,开关语句)switch()case:语句序列语句序列1;case:语句序列语句序列2;case:语句序列语句序列n;default:语句序列语句序列n+1;4.3 选择结构语句选择结构语句 3.当表达式的值当表达式的值与所有常量表达与所有常量表达式的值均不相等
27、式的值均不相等时,就执行时,就执行default后面的语后面的语句句2.当表达式的值当表达式的值与某个常量表达与某个常量表达式的值相等时,式的值相等时,就执行后面相应就执行后面相应的语句的语句1.整型表达式整型表达式或字符型表达式或字符型表达式例:根据五分制考试成绩打印出分数等级例:根据五分制考试成绩打印出分数等级char grade;grade=getchar();/*输入五分制成绩输入五分制成绩*/switch(grade)case A:printf(Excellent n);/*优优*/case B:printf(Good n);/*良良*/case C:printf(Medium n)
28、;/*中中*/case D:printf(Pass n);/*及格及格*/default:printf(Fail n);/*不及格不及格*/4.3 选择结构语句选择结构语句 break;break;break;break;执行完一个执行完一个case后面后面语句后,流程转下一语句后,流程转下一个个case继续执行继续执行。本例中,若本例中,若grade的值的值等于等于A,则将连续,则将连续输出:输出:ExcellentGoodMediumPassFail 加上加上break语句后,语句后,就可以实现执行一就可以实现执行一个个case后,终止后,终止switch语句语句 default后可以后可
29、以不加不加break语句语句 switch语句中多个语句中多个case共用一组执行语句(共用一组执行语句(建建立数据范围分支判断立数据范围分支判断)int x;switch(x)case 2:case 1:printf(Negative n);break;case 0:printf(Zero n);break;case 1:case 2:printf(Positiv n);4.3 选择结构语句选择结构语句 x的值为的值为-2 或或-1时执行同一组时执行同一组语句语句 x的值为的值为1或或2时时执行另外一组执行另外一组语句语句l注意:注意:1在在switch语句中,语句中,default分支可以
30、放在任何位置。但分支可以放在任何位置。但是为了程序书写和阅读方便,一般将是为了程序书写和阅读方便,一般将default分支写在分支写在switch语句的最后一行。语句的最后一行。2每个常量表达式的值都必须互不相同,否则当表达式每个常量表达式的值都必须互不相同,否则当表达式的值与多个常量表达式的值都匹配时,计算机将无法决的值与多个常量表达式的值都匹配时,计算机将无法决定到底该执行哪一个常量表达式后面的语句序列。定到底该执行哪一个常量表达式后面的语句序列。3常量表达式必须是一个确定的字符类型或者整数类型常量表达式必须是一个确定的字符类型或者整数类型的常量数值,而不能是浮点数或者变量表达式。的常量数
31、值,而不能是浮点数或者变量表达式。4switch语句虽然可以模拟组合的语句虽然可以模拟组合的if语句,但是并不是与语句,但是并不是与组合的组合的if语句完全等价。语句完全等价。switch语句只能处理字符类型和语句只能处理字符类型和整数类型的条件判断,而组合的整数类型的条件判断,而组合的if语句不但可以处理字语句不但可以处理字符类型和整数类型的条件判断,还可以对浮点数等其它符类型和整数类型的条件判断,还可以对浮点数等其它的条件进行判断。由此看来,组合的的条件进行判断。由此看来,组合的if语句的功能要远语句的功能要远远大于远大于switch语句。语句。4.3 选择结构语句选择结构语句 l课堂练习
32、:课堂练习:4.3 选择结构语句选择结构语句 i=2;switch(i)case 1:i+;case 2:i+;case 3:i+;case 4:i+;default:i+;Printf(“%dn”,i);输出:?输出:?输出:输出:6l例例4.6:用:用switch语句解决公积金问题。根据输入的收语句解决公积金问题。根据输入的收入金额求出并且输出应该缴纳的公积金。假设公积金入金额求出并且输出应该缴纳的公积金。假设公积金缴纳比例设置如下:缴纳比例设置如下:收入收入 1000 2%比例比例 1000=收入收入 2000 3%比例比例 2000=收入收入 5000 4%比例比例5000=收入收入
33、10000 5%比例比例10000=收入收入 6%比例比例 缴纳总金额:缴纳总金额:fee=in*r%in 收入收入 r 缴纳比例的分子缴纳比例的分子4.3 选择结构语句选择结构语句#include main()int in,temp,r;float fee;printf(Please input your income:);scanf(%d,&in);temp=in/1000;/*按照按照1000为单位进行区间划分为单位进行区间划分*/switch(temp)case 0:r=2;break;case 1:r=3;break;4.3 选择结构语句选择结构语句 case 2:case 3:ca
34、se 4:r=4;break;case 5:case 6:case 7:case 8:case 9:r=5;break;default:r=6;fee=in*r/100.0;printf(The accumulation fund is:%f,fee);4.3 选择结构语句选择结构语句 l只要计算的数据之间存在着规律性的变化,就可只要计算的数据之间存在着规律性的变化,就可以使用循环结构来对其进行迭代计算。以使用循环结构来对其进行迭代计算。l例如:例如:4.4 循环结构语句循环结构语句.)121)1(.7151311(41nn实现形式主要有以下四种:实现形式主要有以下四种:1用用goto语句和标
35、号构成循环语句和标号构成循环2用用while语句构成循环语句构成循环3用用for语句构成循环语句构成循环4用用do-while语句构成循环语句构成循环l4.4.1 goto语句及标号的使用语句及标号的使用 l一般形式一般形式:goto ;l语句标号语句标号:用标识符表示,命名规则与变量名相:用标识符表示,命名规则与变量名相同。其作用是确定流程跳转目标。同。其作用是确定流程跳转目标。lgoto 语句主要用途语句主要用途1.与与 if 语句一起构成循环结构语句一起构成循环结构2.从循环体中跳转到循环体外从循环体中跳转到循环体外4.4 循环结构语句循环结构语句 例例4.7 用用goto语句求解语句求
36、解1到到100的累加和的累加和s。#include main()int i=1,m=0;loop:if(i=100)m+=i;i+;goto loop;/*跳转到标号跳转到标号loop*/printf(The sum from 1 to 100 is:%d,m);4.4 循环结构语句循环结构语句 由于在程序中大量由于在程序中大量使用使用goto跳转命令跳转命令会破坏结构化程序会破坏结构化程序设计的原则设计的原则,该,该命令要限制使用命令要限制使用l4.4.2 while语句语句 l一般形式一般形式:while()4.4 循环结构语句循环结构语句 当表达式为真当表达式为真(非非0)值时,值时,执
37、行执行 while 语句中的内嵌语句语句中的内嵌语句。语句语句 表达式表达式假假真真先判断先判断表达式表达式后执行后执行语句语句例例4.8 用用while语句求解语句求解1到到100的累加和的累加和s。#include main()int i=1,sum=0;while(i=100)/*循环体是一个复合语句循环体是一个复合语句*/sum+=i;i+;printf(The sum from 1 to 100 is:%d n,sum);4.4 循环结构语句循环结构语句 循环体循环体循环体包含一个以循环体包含一个以上的语句时,应该上的语句时,应该用大括号括起来用大括号括起来在循环体内应有在循环体内应
38、有使循环趋于结束使循环趋于结束的语句的语句累加计算中的累加和累加计算中的累加和变量一般初始化为变量一般初始化为0,累乘计算中的累乘积累乘计算中的累乘积变量一般初始化为变量一般初始化为1。l4.4.3 for语句语句 l一般形式一般形式:for(;)l相当于相当于“当型当型”循环循环 首先执行首先执行完成变量的初始化,然后进完成变量的初始化,然后进行行的计算。的计算。如果条件表达式的计算结果为真(非如果条件表达式的计算结果为真(非0值),则执行值),则执行,然后执行,然后执行,修改相关的循环变,修改相关的循环变量,转到量,转到,继续下一次循环;如果,继续下一次循环;如果的计算结果为假(的计算结果
39、为假(0值),则结束循环语句值),则结束循环语句的执行。的执行。4.4 循环结构语句循环结构语句 l4.4.3 for语句语句 4.4 循环结构语句循环结构语句 语句语句 条件表达式条件表达式假假真真修正表达式修正表达式初始化表达式初始化表达式 初始化表达式初始化表达式;while(条件表达式条件表达式)语句语句;修正表达式修正表达式;l4.4.3 for语句语句 lfor语句与语句与while语句的对应举例:语句的对应举例:4.4 循环结构语句循环结构语句 for(i=1;i=100;i+)sum=sum+i;i=1;while(i=100)sum=sum+i;i+;例例4.9 用用for语
40、句求解累加和语句求解累加和s。#include main()int sum=0,i;for(i=1;i=100;i+)sum+=i;printf(The sum from 1 to 100 is:%d n,sum);4.4 循环结构语句循环结构语句 l4.4.3 for语句语句 l注意事项注意事项:1.“初始化表达式初始化表达式”可省略,初始化移至循环体前可省略,初始化移至循环体前 i=1;for(;i=100;i+)sum=sum+i;2.“条件表达式条件表达式”可省略,做可省略,做“永真永真”处理,处理,循环无终止地进行。循环无终止地进行。for(i=1;i+)sum=sum+i;4.4
41、循环结构语句循环结构语句 分号不能省略分号不能省略分号不能省略分号不能省略l4.4.3 for语句语句 l3.“修正表达式修正表达式”可省略,可省略,“修正修正”移至循环体内移至循环体内 for(i=1;i=100;)sum=sum+i;i+;l4.“循环体循环体”可为空,将循环体中应做的工作,放在可为空,将循环体中应做的工作,放在“修正表达式修正表达式”中。中。for(i=1;i=100;sum=sum+i,i+);4.4 循环结构语句循环结构语句 循环变量在循循环变量在循环体内变化环体内变化l4.4.3 for语句语句 l5.三个三个“表达式表达式”和和“语句语句”都可省略,无限循环都可省
42、略,无限循环 for(;);l6.“初始化表达式初始化表达式”和和“修正表达式修正表达式”可以是一个以上的可以是一个以上的表达式表达式 for(sum=0,i=1;i=100;i+,j-)sum=sum+i;for(i=1;i=100;i+,i+)sum=sum+i;4.4 循环结构语句循环结构语句 while(1);l4.4.4 do-while语句语句l一般形式一般形式:do /*循环体循环体*/while();4.4 循环结构语句循环结构语句 先执行指定的内嵌语句,然后先执行指定的内嵌语句,然后判断表达式。判断表达式。语句语句 表达式表达式假假真真先执行语句先执行语句然后再判断表达式然后
43、再判断表达式l4.4.4 do-while语句语句例例4.10 用用do-while语句求解语句求解1到到100的累加和的累加和s。#include main()int i=1,sum=0;do sum+=i;i+;while(i=100);printf(The sum from 1 to 100 is:%d n,sum);4.4 循环结构语句循环结构语句 l4.4.4 do-while语句语句 while 和和 do-while 循环比较循环比较4.4 循环结构语句循环结构语句 main()int i,sum=0;scanf(%d,&i);while(i=5)sum+=i;i+;printf
44、(%d,sum);main()int i,sum=0;scanf(%d,&i);do sum+=i;i+;while(i=10)break;4.4 循环结构语句循环结构语句 当变量当变量i的值等的值等于于10时,跳出时,跳出循环体,不再循环体,不再执行其余几次执行其余几次循环循环l4.4.5 break语句和语句和continue语句语句 lcontinue语句语句 一般形式:一般形式:continue;作用:作用:结束本次循环结束本次循环,即跳过循环体下面未执行的语句,即跳过循环体下面未执行的语句,接着进行下一次是否执行循环的判定。接着进行下一次是否执行循环的判定。for(n=100;n=2
45、00;n+)if(n%3=0)continue;printf(“%d n”,n);4.4 循环结构语句循环结构语句 当当n能被能被3整除时整除时,跳出本次循环,不跳出本次循环,不再执行再执行 printf 语句,语句,但是还要继续循但是还要继续循环环判断判断本程序的功能是打本程序的功能是打印出印出100200之间不之间不能被能被3整除的整数整除的整数l4.4.5 break语句和语句和continue语句语句 break 和和 continue 语句比较语句比较4.4 循环结构语句循环结构语句 for(i=1;i=4;i+)x=i*i;if(x=9)break;printf(%d n,x);p
46、rintf(i=%d n,i);for(i=1;i=4;i+)x=i*i;if(x=9)continue;printf(%d n,x);printf(i=%d n,i);输出:输出:1 4 i=3输出:输出:1 4 16 i=5例例4.11 用循环语句求两个数的最大公约数和最小公倍数。用循环语句求两个数的最大公约数和最小公倍数。#include main()int x,y,i,k;printf(Please input two integers:);scanf(%d%d,&x,&y);k=x=1;i-)/*A行,求最大公约数行,求最大公约数*/if(x%i=0&y%i=0)break;4.4
47、循环结构语句循环结构语句 printf(Greatest Common Divisor:%d n,i);k=xy?x:y;/*取两数中的大数取两数中的大数*/for(i=k;i=x*y;i+)/*B行,求最小公倍数行,求最小公倍数*/if(i%x=0&i%y=0)break;printf(Lowest Common Multiple:%dn,i);4.4 循环结构语句循环结构语句 l4.4.6 4.4.6 循环的嵌套循环的嵌套l嵌套:嵌套:一个循环体内包含另一个完整的循环结构一个循环体内包含另一个完整的循环结构l多层循环:多层循环:内嵌的循环体内又嵌套循环结构内嵌的循环体内又嵌套循环结构l前述
48、的三种循环都可以互相嵌套前述的三种循环都可以互相嵌套 4.4 循环结构语句循环结构语句 三重循环三重循环双重循环双重循环例例4.12 用循环嵌套技术输出用循环嵌套技术输出99乘法表乘法表#include main()int i,j;printf(Multiplication table:n);for(i=1;i=9;i+)/*外循环控制输出的行数外循环控制输出的行数*/for(j=1;j 0,有两个不相等的实数根,有两个不相等的实数根 4b2-4ac 0,有两个共轭的复数根,有两个共轭的复数根4.5 控制语句应用举例控制语句应用举例 bc#include#include main()float
49、 a,b,c,disc,x1,x2,real,image;printf(Please input three real numbers:);scanf(%f%f%f,&a,&b,&c);printf(The equation);if(fabs(a)=1e-7)/*a=0。处理第。处理第1种情况。种情况。*/printf(is not quadratic,solution is%.2fn,-c/b);4.5 控制语句应用举例控制语句应用举例 else /*处理处理2、3、4 三种情况三种情况*/disc=b*b-4*a*c;if(fabs(disc)1e-7)/*disc 0*/x1=(-b+s
50、qrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);printf(has distinct real roots:%.2f and%.2f n,x1,x2);4.5 控制语句应用举例控制语句应用举例 else /*disc 0*/real=-b/(2*a);image=sqrt(-disc)/(2*a);printf(has complex roots:n);printf(%.2f+%.2f i n,real,image);printf(%.2f-%.2f i n,real,image);4.5 控制语句应用举例控制语句应用举例 运行程序四次,结果分别如下:运行程序