简介
程序是一个语句序列,执行程序就是按特定的次序执行程序中的语句。程序中执行点的变迁称为控制流程,当执行到程序中的某一条语句时,也说控制转到了该语句。由于复杂问题的解法可能涉及复杂的执行次序,因此编程语言必须提供表达复杂控制流程的手段,称为编程语言的控制结构,或程序控制结构。
顺序控制结构所谓顺序结构程序就是指按语句出现的先后顺序执行的程序结构,是结构化程序中最简单的结构。编程语言并不提供专门的控制流语句来表达顺序控制结构,而是用程序语句的自然排列顺序来表达。计算机按此顺序逐条执行语句,当一条语 句执行完毕,控制自动转到下一条语句。现实世界中这种顺序处理的情况是非常普遍的,例如我们接受学校教育一般都是先上小 学,再上中学,再上大学;又如我们烧菜一般都是先热油锅,再将蔬菜入锅翻炒,再加盐加 佐料,最后装盘。
选择控制结构选择结构又称为分支结构。当程序执行到控制分支的语句时,首先判断条件,根据条件表达式的值选择相应的语句执行(放弃另一部分语句的执行)。分支结构包括单分支、双分支和多分支三种形式。
单分支结构所有编程语言都提供了条件语句(if 语句),用来实现有条件地执行语句的功能。Python 语言的 if 语句有多种形式,最简单的形式是:
if :
其中是布尔表达式,是由一条或多条语句组成的语句序列。的左端与 if 部分相比必须向右缩进,表明它是 if 部分(不妨理解为条件语句的头 部)的下属,就像躯体是头部的下属一样。
if 语句的语义很容易理解:首先计算 if 后面的条件表达式,如果结果为 True,则控制转 到条件语句体的第一条语句,一旦条件语句体执行完毕,控制即转到 if 语句的下一条语句; 如果结果为 False,则跳过条件语句体,控制直接转到 if 语句的下一条语句。图 1中的流程 图形象地解释了 if 语句的语义,其中菱形框表示条件测试。虽然 if 语句根据条件表达式计算 结果的不同而有两个分支,但我们习惯说这种形式的 if 语句实现的是单分支控制结构,因为 有一个分支什么也不做。注意,无论条件是真是假,最后控制都转到 if 语句的下一条语句, 也就是说这条 if 语句内部虽有两个分支,但总体只有一个出口。
两路分支结构有时我们希望根据条件表达式的不同计算结果(True 或 False),分别执行两个不同的语 句序列,这时可以使用具有两个分支的条件语句形式,即 if-else 语句:
if : else: if-else 语句的语义是:首先计算条件表达式的值,如果结果为 True,则执行 if-语句体;
如果结果为 False,则执行 else-语句体。无论哪种情况,语句体执行完毕之后,控制都转到 if-else 语句的下一条语句。在使用两路分支的 if 语句时要注意:if 部分和 else 部分必须与一对非此即彼的条件相对 应,一个条件为真则另一个条件必为假,反之亦然。
多路分支结构编程语言都都有实现多路分支结构的控制结构。例如,Python 中有语句支持多路分支的条件判断,即 if-elif-else 语句。这条语句在 形式上其实是将嵌套 if-else 语句中的 else 与后续的 if 合并成了一个 elif 子句,形如:
if :
elif :
...
elif :
else:
if-elif-else 语句的语义是:顺序计算每一个条件表达式,找到第一个为 True 的条件,然后执行其下方缩进的语句体,执行完毕再将控制转到整个 if-elif-else 语句的下一条语句;如 果所有条件表达式的计算结果都是 False,则执行在 else 下方缩进的语句体。可见,这种形式 的条件语句实现了 n+1 个分支。另外,else 子句是可选的,但要注意的是,如果省略 else 子 句,则整个语句就可能没有符合条件的分支,从而不执行任何语句体。
循坏控制结构采用循环结构可以实现有规律的重复计算处理。当程序执行到循环控制语句时,根据循环判定条件对一组语句重复执行多次。循环结构可以看成是一个条件判断语句和一个向回转向语句的组合。另外,循环结构的三个要素:循环变量、循环体和循环终止条件. ,循环结构在程序框图中是利用判断框来表示,判断框内写上条件,两个出口分别对应着条件成立和条件不成立时所执行的不同指令,其中一个要指向循环体,然后再从循环体回到判断框的入口处。
三个循环C语言中提供四种循环,即goto循环、while循环、do…while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误,在学习中我们主要学习while、do…while、for三种循环。常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用。这就要清楚三种循环的格式和执行顺序,将每种循环的流程图理解透彻后就会明白如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。
三个循环异同点在学完这三个循环后,应明确它们的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体;而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while 循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。
顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,我们均可广义的把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序。但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。
模块化程序结构C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写。因此常说:C程序=主函数+子函数。 因此,对函数的定义、调用、值的返回等要尤其注重理解和应用,并通过上机调试加以巩固
常见的两种循环结构编辑当型循环:先判断所给条件p是否成立,若p成立,则执行A(步骤);再判断条件p是否成立;若p成立,则又执行A,若此反复,直到某一次条件p不成立时为止。
直到型循环:先执行A,再判断所给条件p是否成立,若p不成立,则再执行A,如此反复,直到p成立,该循环过程结束。