1、第4章 结构化程序设计4.1 顺序结构4.2 选择结构4.3 循环结构第4章 结构化程序设计4.1 顺 序 结 构第4章 结构化程序设计顺序结构是最简单的程序结构,结构中各语句按自上而下的顺序依次执行,如图4-1所示。在结构化程序设计中,由于三种基本结构都遵循“单入口、单出口”的原则,因此无论程序中包含了什么样的结构,程序的总流程都是按照顺序结构执行的。程序的执行始终是按照语句自上而下的顺序,在执行过程中不会有任何跳转或变化,这就是典型的顺序结构的程序执行方式。第4章 结构化程序设计4.2 选 择 结 构第4章 结构化程序设计在现实生活中,我们往往需要通过对给定条件的判断,决定下一步行为。在程
2、序设计中,也会遇到相同的情况。当程序执行到某个阶段,出现了可选的不同处理方案,此时就需要根据对某一特定条件的判断,选择其中的一个分支来执行。选择结构按照程序分支的多少可以分为单分支、双分支和多分支三种形式;根据使用的关键字不同,可以分为if语句和switch语句。4.2.1 if语句if语句是最常用的一种选择结构,其基本形式包括单分支选择结构、双分支选择结构以及多分支选择结构。1单分支选择结构if 语句的单分支选择结构的基本格式为或者第4章 结构化程序设计程序的控制流程进入单分支选择结构时,首先需要对圆括号中的表达式进行判断,该表达式即单分支选择结构是否执行的条件。如果条件成立,即表达式的值非
3、0,则执行选择结构中的语句;如果条件不成立,即表达式的值为0,则不执行选择结构中的语句,直接执行选择结构后的语句。其结构如图4-2所示。需要注意的是,如果选择结构中必须包含多条语句,则需要用“”和“”括起,形成复合语句。复合语句在程序执行的过程中作为完整的个体,即花括号中的语句全部执行,或者一条也不执行。第4章 结构化程序设计2.双分支选择结构if语句的双分支选择结构的基本格式为或者程序的控制流程进入双分支选择结构时,首先需要对圆括号中的表达式进行判断,该表达式即双分支选择结构是否执行的条件。如果条件成立,即表达式的值非0,则执行选择结构中的语句;如果条件不成立,即表达式的值为0,则不执行选择
4、结构中的语句,直接执行选择结构后的语句。其结构如图4-3所示。第4章 结构化程序设计3多分支选择结构if 语句的多分支选择结构的基本格式为程序的控制流程进入多分支选择结构时,按照条件表达式出现的顺序进行判断,首先判断表达式1的条件是否成立,如果成立,则执行该条件控制的语句后结束选择结构;如果表达式1的条件不成立,则对表达式2进行条件判断,依此类推,按序进行;若所有的条件均不成立,则执行else后的内嵌语句。若其中有一条判断表达式成立,则其后的判断表达式将不再执行,因此符合多选一的原则。其结构如图4-4所示。第4章 结构化程序设计4.2.2 if语句的嵌套if语句中若包含一个或多个if语句,则称
5、为if语句的嵌套。其基本格式为关于if语句的几点说明:(1)if语句先对(表达式)求解,根据结果的逻辑值(真或假)选择相应的语句执行。(2)ifelse是一个完整的语句,else是if语句的一部分,但else前后的内嵌语句都要加分号。(3)else语句不能单独使用,并且总是与上面的、最近的、未配对的if语句进行匹配。(4)if语句可以嵌套,但必须是一条if语句完整地包含另一条if语句,即两个分支结构可以嵌套但不能有交叉。第4章 结构化程序设计4.2.3 条件运算符对于二选一的情况,在程序设计中会经常出现。C语言优化了这个过程,定义了条件运算符来实现,其基本格式为条件运算符是C语言的运算符之一,
6、它是一个三元运算符,因为需要三个操作数。条件运算符的执行过程为从条件运算符的执行过程中可以看出,它与双分支选择结构基本一致,但是它比if.else 语法更加简便。4.2.4 switch语句除了if语句之外,C语言还为选择结构定义了switch语句,即多路判断语句,用于处理多分支的问题。其基本格式为第4章 结构化程序设计在基本格式中,需要注意:(1)语句部分可以是一条语句,也可以是多条语句;在swicth语句的格式中,即使是多条语句,也不强制使用花括号,这一点与if语句的语法不同。(2)语句后的break表示停止、中断,即结束对switch语句的执行。break语句可根据需要添加。(3)def
7、ault语句部分指缺省状况,如果switch语句中的所有分支都没有执行到,则执行default语句部分,该部分出现与否,可以根据需要而定。(4)switch(表达式)中的表达式的值只能是整型值。(5)case之后的常量可以是整型常量,也可以是整型常量表达式,并且不能出现两个case之后的常量表达式的值相同的状况。(6)如果switch(表达式)中表达式的值与任意一个case后的常量的值不匹配,而且该语句也没有提供default部分,则不执行switch中的任何语句。switch语句的执行过程是:(1)计算switch(表达式)语句中表达式的值。(2)将该表达式的值依次与case 后的整型常量表
8、达式的值进行比较。(3)如果某个case后的整型常量表达式的值与该表达式的值相等,则执行该case后的语句。执行完毕,若没有遇到break语第4章 结构化程序设计句,则继续执行switch结构内的后续语句;若遇到break语句,则结束switch结构的执行。(4)如果switch(表达式)语句中表达式的值与任何一个case后的整型常量表达式的值都不相等,若语句中包含default部分,则执行default后的语句;若语句中没有default部分,则结束switch结构的执行。关于switch语句的几点说明:(1)switch后括号内的表达式和case后的常量表达式均有确定的整型值。(2)swi
9、tch语句用花括号限定一个复合语句,其中可以包含若干条case语句和最多一条default语句。case和default分支中可以是一条也可以是多条语句,此处不必用花括号限定。多个case分支也可以共用一组执行语句。(3)每一个case分支的整型常量表达式的值必须互不相同。(4)当表达式的值与某一个case分支的整型常量表达式的值相等时,控制流程就从此case语句进入,顺序执行后面的语句。若所有case分支的整型常量表达式的值都与switch后表达式的值不匹配,则执行default分支语句;若没有default分支语句,则不执行任何操作。(5)break语句的作用是结束switch结构语句的执
10、行。(6)case和default的出现次序不影响执行结果。第4章 结构化程序设计4.3 循 环 结 构第4章 结构化程序设计循环结构是结构化程序设计中一种很重要的结构,其特点是在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了三种循环结构,分别是while型循环结构、dowhile型循环结构以及for型循环结构。在这三种结构中,以for型循环结构的使用最为灵活、使用频率最高。4.3.1 while型与do.while型循环1while型循环使用关键字while构成的循环结构,称作while型循环结构,也称作当型循环结构。其
11、基本格式为while型循环的处理过程为:先判断表达式是否成立(即对表达式求解),如果表达式成立(值为非0),则执行循环体中的语句;执行完后,再次对表达式求解,只要表达式的值为非0,则循环体即被反复执行;直到表达式的值等于0(即循环条件不成立),才结束循环结构的执行。其结构如图4-5所示。第4章 结构化程序设计2do.while型循环do.while型循环结构是在循环体执行结束之后才对循环条件进行判断,因此也称作直到型循环。其基本格式为do.while型循环的处理过程为:首先执行循环体中的语句,然后求解while表达式的值,只要表达式的值为非0(即循环条件成立),循环体将被反复执行,直到表达式的
12、值等于0(循环条件不成立),控制流程才结束循环结构的执行,其结构如图4-6所示。while型循环与do.while型循环在格式和用法上有如下区别:(1)while型循环先判断条件,后执行循环体语句;do.while型循环先执行循环体语句,后判断条件。第4章 结构化程序设计(2)若循环条件表达式的初始值为真,则两种循环语句的执行结果相同。若循环条件表达式的初始值为假,while语句不执行循环体中的语句,而dowhile语句则执行一次循环体中的语句。(3)while语句中,while(表达式)后接语句;dowhile语句中,while(表达式)后接“;”。(4)while语句适合解决“当型”循环问
13、题;dowhile语句则更适合解决“直到型”循环问题。4.3.2 for型循环使用关键字for建立的循环结构是C语言中功能最强大、使用最广泛的一种循环结构。其基本格式为或者其中,表达式1通常用于循环控制变量的初始化,一般是赋值表达式;表达式2通常是循环条件,一般为关系表达式或逻辑表达式;表达式3通常用于更新循环控制变量的值,使循环条件能够不成立,从而结束循环,一般多为自增或自减表达式。这三个表达式可以是单一的表达式,也可以是使用逗号分隔的逗号表达式。第4章 结构化程序设计其执行过程为:(1)执行表达式1,完成循环控制变量的初始化,使其能够参与表达式2的条件判断。(2)计算表达式2的值,即判断循
14、环条件是否成立。如果表达式2的值为假(0),即循环条件不成立,则不执行循环体;如果表达式2的值为真(非0),即循环条件成立,则执行循环体中的语句。(3)计算表达式3的值,即更新循环控制变量的值。(4)控制流程转回第(2)步,依次重复执行,直到循环条件(即表达式2的值为假)不成立。在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。循环体可能被多次执行,也可能一次都不执行,其结构如图4-7所示。第4章 结构化程序设计for语句的书写非常灵活,只要遵循for型循环结构的求值顺序,循环功能的实现将不受影响。在书写时,可以:(1)在表达式1、3的位置书写与循环控制无关的表达式
15、。(2)将循环体内或外的语句添加到表达式1、3的位置,形成逗号表达式。(3)任意省略表达式1、2、3和循环体内的语句(相应位置的分号不能省)。三种循环语句的比较:(1)使用while型和do.while型循环,循环变量的初始化应在进入while和do.while语句之前完成;在for型循环中可由表达式1实现。(2)使用while型和do.while型循环,循环体内应包含使循环趋于结束的语句;在for型循环中可由表达式3实现。(3)使用while型和do.while型循环,while后面的括号内应说明循环结束的条件;在for型循环中可由表达式2说明。(4)一般情况下,三种循环可以互相代替。whi
16、le语句更适合处理“当”型循环;do.while语句更适合处理“直到”型循环;for语句书写灵活、功能最强,适合处理各种循环问题。使用循环结构处理问题时,通常需要考虑如下几个关键点:(1)进入循环结构前需要对循环控制变量赋初值。(2)循环条件表达式可以是任意类型,但是结果只能是0(假)和非0(真)两种情况。(3)循环结构中应该有使循环趋于结束的语句,避免出现死循环。(4)当循环体包含一条以上的语句时,应该用花括号限定,以复合语句的形式出现。第4章 结构化程序设计4.3.3 循环结构的嵌套一个循环结构内包含另一个完整的循环结构,称为循环结构的嵌套。内嵌的循环体中还可以继续嵌套循环,这就是多层循环
17、嵌套。与选择结构嵌套的要求相同,循环嵌套必须是一个循环结构包含另一个完整的循环结构,即两个循环结构可以嵌套但不可以交叉。4.3.4 break语句与continue语句break语句不但可以使用在switch选择结构中,而且可以用在三种循环结构中,执行break语句可以结束其所在的选择结构或者循环结构的执行。与break语句相比,continue语句只能出现在循环结构中,执行continue语句可以提前结束本次循环,即循环体内continue语句后的语句将不再执行,而直接进入下一次循环的判断执行。continue语句与break语句的区别在于:(1)continue语句只结束本次循环;break语句则结束整个循环。(2)continue语句只限于循环结构;break语句则可用于循环结构和switch选择结构。