简介
在程序设计时常有这样的要求:当指定的条件为“真”时,反复执行a块;反之,即条件为“假”时就不执行a块,如图所示。1
这种循环结构也称“当型结构"或“WHILE型结构",即“当条件为“真”时执行a块”,先判断后执行。称B块为循环体。
另外,也可以先执行后判断,如图,这也是一种循环结构,称“直到型循环结构’’或“UNTIL型结构",即反复执行a块,直到指定的条件为“真”时不再执行。
“直到型循环结构’’可以理解为由“当型循环结构”派生的结构,相当于在当型循环结构前再加一个a块,即先执行一次a块再进入当型循环,如图所示。
“当型循环”是在条件为“假”时结束,而“直到型循环”是在条件为“真”时结束。若把“直到型"改为“当型”,除增加一个a块外,还要对直到型中的条件取“反”。
注意,任何循环结构都应当在重复有限次时终止,否则不符合结构化程序对循环结构的要求。
迭代结构当条件成立的时候,执行循环体的代码,当条件不成立的时候,跳出循环,执行循环结构后面的代码。 循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构 。循环结构可以看成是一个条件判断语句和一个向回转向语句的组合。另外,循环结构的三个要素:循环变量、循环体和循环终止条件。循环结构在程序框图中是利用判断框来表示,判断框内写上条件,两个出口分别对应着条件成立和条件不成立时所执行的不同指令,其中一个要指向循环体,然后再从循环体回到判断框的入口处。
结构简介循环结构可以看成是一个条件判断语句和一个向回转向语句的组合。另外,循环结构的三个要素:循环变量、循环体和循环终止条件. ,循环结构在程序框图中是利用判断框来表示,判断框内写上条件,两个出口分别对应着条件成立和条件不成立时所执行的不同指令,其中一个要指向循环体,然后再从循环体回到判断框的入口处.
常见的两种迭代结构①当型循环:先判断所给条件p是否成立,若p成立,则执行A(步骤);再判断条件p是否成立;若p成立,则又执行A,若此反复,直到某一次条件p不成立时为止。
②直到型循环:先执行A,再判断所给条件p是否成立,若p不成立,则再执行A,如此反复,直到p成立,该循环过程结束。
结构设计实现循环结构可以用条件语句或循环语句实现。
在程序设计过程中,循环的设计对整个算法起至关重要的作用。不能认为,只要能编循环程序,就已经掌握了循环程序设计方法,还应更深入地研究它,才能设计出好的循环程序。
典型的WHILE循环:其中只有两个被标识的部分:条件cond和循环体body。执行循环的机理很简单,只要cond为“真”便反复执行body。它可被执行零次或多次。
循环的结构和机理并不令人感兴趣,使人们感兴趣的是怎样才能把循环的各部分与欲求解的问题联系起来,并确信此循环可以解决给定的问题。
考察循环结束,不难发现,由于循环不再进行,循环结束便应该与问题的解相吻合。循环结束的唯一理由是cond变为假。通常,并不能预先知道循环中迭代的次数。所以cond为假,实际上是所能得到的唯一信息,即必须不断地改变计算状态才能终止循环。结论是,应该在迭代中解决问题,除非cond为真。
以上描述形成一种印象:有某种东西必须在迭代过程中保持不变。这种不变的东西称作循环不变式。在cond首次及以后各次被检验时,循环不变式必须出现。尤其重要的是在con&最后一次被检验时,循环不变式必须为真(不变式的运行结果值恰好与问题的解相吻合)。换言之,循环结束时,不变式为真,而cond条件值为假。
现在,可以详细地描述设计正确循环的步骤了。不变式的建立是循环设计过程的中心。
循环设计规范步骤第一步:精确定义计算目标,即如何识别成功的终结。
第二步:建立一个循环不变式,它是普遍情形,而成功的终结只是它的一种特殊情形。
第三步:设计这样一个循环,只有达到成功的终结状态时它才结束。要确保循环的执行不会毁坏不变式。
第四步:将程序数据初始化,使条件cond在循环执行前为真。
按循环设计规范的步骤做。
第一步:当C=A*B时,为成功的终结。
第二步:C=A*B的普遍情形是C=A*D,其中D是一个变量。成功的终结是D=B。
第三步;当D=B时结束的循环具有D≠B这个循环条件。由于C和D有关。所以保留关系C=A*D。这个不变式的循环体必须改变C和D两者的值(注意A是常数)。这里欲用C来逐次累加加数A,以使C增大,同时D亦逐步增大。自然,把D看作是加数A加C中去的个数计数器。现在可将该循环用伪代码一一结构化汉语记为;
(1)当 D≠B时,反复做:
① c←c+A
②D←D十1
为了确保循环体的执行不毁坏不变式,可将循环体想像为一个黑箱,其输入和输出在不同时间是同一变量。下面给出代数式证明。
假设:Cn=A*D(下标O与n将分别表示旧与新)
求证;Cn=A*Do
证明:∴Cn=Co十A
Dn=Do+1
∵Cn=Co+A=A*Do十A=A*(Do+1)=A*D。
第四步:算法中包含c和D,为将其初始化,又使不变式c=A木D为真,可选择C=0,D=0,或者C=A,D=1(因为B为正整数)。
整个伪代码可写成:
用加法仿真正整数乘法的算法
MULT(A,B;C) ·
(1)C←A
(2)D←1
(3)当 D≠B时,反复做;
①c←c+A
②D←D+1
(4)[返回]
C语言中的循环语句三个循环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程序=主函数+子函数。 因此,对函数的定义、调用、值的返回等要尤其注重理解和应用,并通过上机调试加以巩固。