1、2022-12-24程序设计基础 张杰敏1第3章 控制流学习目标学习目标 建立结构化程序设计的概念建立结构化程序设计的概念 应用各种选择和循环语句,实现选择和循环结构应用各种选择和循环语句,实现选择和循环结构 通过顺序、选择和循环实现结构化程序设计通过顺序、选择和循环实现结构化程序设计 正确使用正确使用breakbreak、continuecontinue等语句等语句 认识认识gotogoto语句对结构化程序设计的影响语句对结构化程序设计的影响 学习分析问题的方法,并通过算法解决问题学习分析问题的方法,并通过算法解决问题2022-12-24程序设计基础 张杰敏2程序中的语句通常是按照次序一条接
2、一条地顺序执行,称之为顺序结构。顺序结构是绝大多数程序设计语言的基本框架,程序设计语言的各种语句在基本框架下组成程序或程序的集合。有时需要改变顺序执行的流程,以有选择地执行程序的不同部分,构造选择结构;或者重复执行程序的某一部分,构造循环结构。程序设计语言中选择和循环机制的设置,使得程序的计算足够灵活和有效。3.1 程序的结构化设计2022-12-24程序设计基础 张杰敏3 Boehm和Jacopini的研究工作证明,任何程序都可依靠三种基本结构的组合实现,它们就是顺序结构、选择结构和循环结构。选择结构又称分支结构。由这三种基本结构组成的程序称为结构化程序 3.1 程序的结构化设计2022-1
3、2-24程序设计基础 张杰敏4程序包含两方面内容:1数据描述:定义数据类型及数据结构2操作描述:说明操作及操作步骤,即算法。3.1 程序的结构化设计2022-12-24程序设计基础 张杰敏53.2 语句与复合语句 在C语言中,每一个语句必需以“;”结束,它是语句终结符支持信息和示例 C语句分为5类:表达式语句、控制流语句、函数调用语句、空语句和复合语句 一对花括号 把一组说明和语句组合在一起就构成一个复合语句,在语法上等价于单个语句,复合语句结束时,右花括弧“”之外不能有“;”空语句只有一个“;”,在if、for或 while、do这样的控制流语句中常会发生 2022-12-24程序设计基础
4、张杰敏63.3 if-else3.3 if-else选择语句选择语句 分支结构(选择结构)实现不同动作间的选择 if语句的一般语法形式如下:if (表达式)语句1 else 语句2elseelse是可选的是可选的,缺省缺省elseelse部部分,形成单分支结构分,形成单分支结构 语句可以是单语语句可以是单语句或复合语句,句或复合语句,意味着可以嵌套意味着可以嵌套if else if else 2022-12-24程序设计基础 张杰敏73.3 if-else3.3 if-else选择语句选择语句 执行if语句时,首先计算表达式的值,如果表达式的值非0、即其值为真,执行语句1;如果表达式的值为0、
5、即其值为假,执行语句2。2022-12-24程序设计基础 张杰敏8【例3-2】在一次百分制测验中设定:当一名学生的成绩大于、等于在一次百分制测验中设定:当一名学生的成绩大于、等于60分分时,为时,为“Passed”。成绩小于。成绩小于60分时,为分时,为“Failed”。成绩大于。成绩大于100分、或分、或者小于者小于0分时,视为分时,视为“Error”成绩。成绩。void main()int grade;printf(Input grade(0-100):);scanf(%d,&grade);if (grade 100)|(grade=60)printf(Passedn);elseprint
6、f(Failed n);2022-12-24程序设计基础 张杰敏9运行结果:2022-12-24程序设计基础 张杰敏10在在C程序中经常使用如下语句结构:程序中经常使用如下语句结构:if (表达式表达式1)语句语句1else if (表达式表达式2)语句语句2else if (表达式表达式3)语句语句3else if (表达式表达式n)语句语句nelse语句语句n+1 这种嵌套的这种嵌套的if-elae语句构成的序列可用于处理多向选择的问题。语句构成的序列可用于处理多向选择的问题。各个表达式依次求值,一旦某个表达式为各个表达式依次求值,一旦某个表达式为“真真”,就执行与之相关的,就执行与之相关
7、的语句,从而终止整个语句序列的执行。如果所有表达式值为语句,从而终止整个语句序列的执行。如果所有表达式值为“假假”,就执行最后一个就执行最后一个else的语句的语句n+1。2022-12-24程序设计基础 张杰敏113.4 switch3.4 switch多分支语句多分支语句 switch语句是一种多分支选择语句,常用来实现多分支的程序结构。其一般语法形式为:switch (表达式)case 常量表达式1:语句序列1 case 常量表达式2:语句序列2 case 常量表达式n:语句序列n default:语句序列n+1 case标号是唯一的default部分是任选的 2022-12-24程序设
8、计基础 张杰敏12【例3-7】按照学生考试成绩的等级打印出百分制分数段按照学生考试成绩的等级打印出百分制分数段。#include void main()char grade;printf(Input grade(AD,F):);scanf(%c,&grade);switch(grade)case a:case A:printf(90100n);break;case b:case B:printf(8089n);break;case c:case C:printf(7079n);break;case d:case D:printf(6069n);break;case f:case F:print
9、f(60n);break;default:printf(errorn);break;2022-12-24程序设计基础 张杰敏13运行结果:运行结果:2022-12-24程序设计基础 张杰敏14良好习惯:为了使控制流程跳出switch结构,可以使用break语句,最后一个分支default部分可以不加break语句 例成绩分级:switch(grade)case A:printf(“90100n”);break;case B:printf(“8089n”);break;case C:printf(“7079n”);break;case D:printf(“6069n”);break;case F
10、:printf(“60n”);break;default:printf(“errorn”);break;2022-12-24程序设计基础 张杰敏153.5 3.5 whilewhile与与forfor循环语句循环语句 实现行为的重复是我们使用计算机的一个重要原因实现行为的重复是我们使用计算机的一个重要原因C语语言的言的while、for和和do while语句都提供实现行为重复的功语句都提供实现行为重复的功能,称为循环语句能,称为循环语句 While循环语句的一般语法形式为:循环语句的一般语法形式为:while(表达式表达式)语句语句 while 语句的特点是:先判断表达式,后执行语句对程语句
11、的特点是:先判断表达式,后执行语句对程序合理的精简可以节省空间、提高运行效率。但任何情况序合理的精简可以节省空间、提高运行效率。但任何情况下都不应为了精简程序而以损失程序的可读性为代价,程下都不应为了精简程序而以损失程序的可读性为代价,程序的可读性在任何时候都至关重要序的可读性在任何时候都至关重要 首先求表达式的值。值不等于首先求表达式的值。值不等于 0 0,执行,执行while while 的内嵌语的内嵌语句;之后再次求该表达式的值,直到值变为句;之后再次求该表达式的值,直到值变为0 0,此时程序,此时程序从从whilewhile语句的下一个语句接着执行语句的下一个语句接着执行 2022-1
12、2-24程序设计基础 张杰敏163.5 while3.5 while与与forfor循环语句循环语句 while语句的一般语法形式为:语句的一般语法形式为:while(表达式表达式)语句语句 while为逻辑控制循环语句,通过测试表达式的布尔值决为逻辑控制循环语句,通过测试表达式的布尔值决定重复执行循环体与否。定重复执行循环体与否。while的循环体即的循环体即while的语句部的语句部分。分。while执行时,首先求表达式的值。如果其值不等于执行时,首先求表达式的值。如果其值不等于 0(布尔(布尔“真真”),那么执行),那么执行while 的循环体。之后,再的循环体。之后,再次求该表达式的值
13、。这一周期性过程一直重复进行,直到次求该表达式的值。这一周期性过程一直重复进行,直到该表达式的值变为该表达式的值变为0(布尔(布尔“假假”)。此时程序的控制流)。此时程序的控制流程转向程转向while语句的下一条语句接着执行。语句的下一条语句接着执行。while 语句的语句的特点是:先测试表达式值,后执行循环体。其循环体可被特点是:先测试表达式值,后执行循环体。其循环体可被重复执行重复执行0次、次、1次或多次。次或多次。2022-12-24程序设计基础 张杰敏17【例3-8】参加某次百分制测验的学生为参加某次百分制测验的学生为10名,测验结果设定:名,测验结果设定:当学生的成绩大于、等于当学生
14、的成绩大于、等于60分时,为分时,为“Passed”。成绩小于。成绩小于60分时,为分时,为“Failed”。成绩大于。成绩大于100分、或者小于分、或者小于0分时,视分时,视为为“Error”成绩。成绩。#include#define N 10 void main()int grade,n=N;while(n-)printf(Input grade(0-100):);scanf(%d,&grade);if (grade 100)|(grade=60)printf(Passedn);else printf(Failed n);2022-12-24程序设计基础 张杰敏18运行结果:运行结果:20
15、22-12-24程序设计基础 张杰敏19for语句是语句是while 语句的扩展,一般语法形式为:语句的扩展,一般语法形式为:for (表达式表达式1;表达式表达式2;表达式表达式3)语句语句for 语句的执行流程为:语句的执行流程为:计算表达式计算表达式1的值;的值;计算表达式计算表达式2的值,若表达式的值,若表达式2的值非的值非0(真),那么执行(真),那么执行for的内的内嵌嵌 语句,计算表达式语句,计算表达式3的值。若表达式的值。若表达式2的值为的值为0,结束,结束for循环,执循环,执行行for 语句的下一条语句。语句的下一条语句。返回到步骤返回到步骤 for循环语句也是先测试循环条
16、件,再执行循环体循环语句也是先测试循环条件,再执行循环体 应避免陷入无限循环应避免陷入无限循环break语句可用于从语句可用于从while、for和和do.while循环语句中立即强制性退出循环语句中立即强制性退出 forfor语句的三个表达式中语句的三个表达式中任何一个都可以省略,但任何一个都可以省略,但分号必须保留分号必须保留 2022-12-24程序设计基础 张杰敏20【例例3-12】for语句实现字符计数语句实现字符计数。#include /*统计输入的字符数;统计输入的字符数;第第2个版本个版本*/void main()double nc;/*说明说明double型变量型变量nc,用
17、于存放计数值用于存放计数值*/for(nc=0;getchar()!=EOF;+nc);printf(%.0fn,nc);2022-12-24程序设计基础 张杰敏21运行结果:运行结果:2022-12-24程序设计基础 张杰敏223.6 do-while3.6 do-while循环语句循环语句 do-while循环语句的一般语法形式:循环语句的一般语法形式:do 语句语句 while (表达式表达式)如果表达式的值为真,那么就再次执行语句,当表达式的如果表达式的值为真,那么就再次执行语句,当表达式的值变成假时,就终止循环的执行值变成假时,就终止循环的执行 do-while循环语句则是先执行循环
18、体,再测试循环终止条循环语句则是先执行循环体,再测试循环终止条件,因此至少要被执行一次件,因此至少要被执行一次 如果循环语句的内嵌语句包含另一个循环语句,就形成多如果循环语句的内嵌语句包含另一个循环语句,就形成多重循环结构,称为循环的嵌套重循环结构,称为循环的嵌套。演示演示可以是任何语句,包括复合语句可以是任何语句,包括复合语句2022-12-24程序设计基础 张杰敏233.6 goto语句 C语言提供了goto语句,它跳转的语句位置由标号标记 标号是一个标识符,其后要跟一个冒号,命名标号时应尽量区别于变量 标号可以用在任何语句的前面,但要与相应的goto语句位于同一函数中 多数现代的编程方法
19、都认为goto语句是不良结构,比如在结构化程序设计中就不允许使用goto语句 2022-12-24程序设计基础 张杰敏243.7 break语句与continue语句 break语句可以立即终止switch语句的执行,将控制流程转移到switch的下一条语句一样 break语句可用于从for、while与do-while语句中提前退出来 break语句不能用于循环语句或switch语句之外的任何其它语句 continue语句用于使其所在的for、while或do-while语句结束本次循环,开始下一次循环 continue语句只能用于循环语句,不能用于switch语句 使用得当,continu
20、e语句有时可以简化循环中某些复杂部分的处理 2022-12-24程序设计基础 张杰敏253.8 编程指导 程序中反映了控制流的花括弧的位置非常重要,是良好编程习惯的重要体现,如果循环体是单语句,语法上不需要用花括弧。作为一种良好的编程习惯,我们建议无论是否必须,总是用花括弧将循环体括起来 控制结构体的缩进格式,可提高程序的可读性 太多层次的嵌套使程序难以理解。一般地说,应尽量避免3层以上的嵌套 无关的计算放到for语句的初始化或增量部分会使程序很难读,是一种很不好的程序设计风格 最好为switch语句提供default选项,这样不会忽略没有明确测试的情况 2022-12-24程序设计基础 张杰敏26本章小结