当前位置:文档之家› 第五章 循环结构程序设计

第五章 循环结构程序设计

第五章循环结构程序设计循环结构是结构化程序设计的三种基本结构之一,也是最重要、最常用的一种基本结构。

其特点是:在给定条件成立时,反复执行某程序段,直到给定条件不成立时为止。

给定的条件称为循环条件,反复执行的程序段称为循环体。

根据开始或结束循环的条件不同,在C 语言中可以用如下语句实现循环:1. 用goto语句和if语句构成循环。

2. 用while循环语句。

3. 用do-while循环语句。

4. 用for循环语句。

5.1 语句标号、goto语句及用goto语句构成的循环1.语句标号语句标号就是给程序中的某一个语句定义的标识符,标号可以是任意合法的标识符,但在语句标号和它所标识的语句之间必须加一个冒号作为分隔符。

C程序中的任何一个可执行语句之前都可以加上语句标号。

例如:stop:printf(“END\n”);通常,语句标号只是用作goto 语句的转向目标。

如:goto stop;如果程序中没有用goto语句改变程序的执行顺序,也就没有必要出现语句标号。

2.goto语句goto语句称为无条件转向语句,goto语句的一般形式为:goto 语句标号;goto语句的作用是把程序的执行转移到语句标号所在的位置,但这个语句标号必须与此goto语句在同一个函数之内。

goto语句不符合结构化程序设计的原则,因为无条件转向使得程序的结构没有规律、可读性差。

对于初学者来说应尽量避免使用goto语句,但如果使用goto语句能够大大地提高程序的执行效率,也可以使用。

3.用goto语句构成的循环结构goto语句通常与if语句配合构成条件转移语句,用来实现构成循环或跳出循环等功能。

例5.1统计从键盘输入的一行字符的个数。

#include <stdio.h>main(){int n= 0;char ch;printf("input a string\n");loop: ch= getchar();n++;if(ch!='\n') /*字符'\n'是结束从键盘输入字符串的标志*/goto loop;n=n-1; /*不要统计字符'\n'*/printf("%d",n);}当用户从键盘上输入一个字符后,先执行n++进行计数,然后判断该字符是否为'\n'字符,若该字符不是'\n'字符,则转移至loop构成循环;否则不执行goto语句,程序在输出n的值后结束。

例5.2 从键盘输入一组数据,以0作为结束输入数据的标志,求这组数据之和。

#include <stdio.h>main(){int number, sum=0;loop: scanf("%d", &number);sum+=number;if(number!=0)goto loop;printf("The total sum is %d\n", sum);}5.2 while语句和用while语句构成的循环由while语句构成的循环也称”当”循环,while循环的一般形式如下:while(表达式)循环体语句while语句的执行过程是:先计算while后一对圆括号中的表达式的值,当表达式的值为非0时,便执行循环体语句,之后再计算该表达式的值,由此构成循环,直到有一次求得表达式的值为0时才结束循环,并继续执行循环体语句之外的后续语句。

如图5.1所示。

例如,用while语句改写例5.1的程序,统计从键盘输入的一行字符的个数。

#include <stdio.h>main(){int n=0; char ch;printf("input a string:\n");ch= getchar();while(ch!='\n'){n++;ch= getchar();}printf("%d",n);}图5.1 while循环流程图说明:(1)while语句中的表达式一般是关系表达式或逻辑表达式,但也可以是其它合法的C表达式,只要表达式的值为真(非0)即可继续循环。

(2)循环体语句可以是一条简单的可执行语句;也可以是由多个语句用{}括起来后构成的复合语句。

(3)应该注意在循环体语句中包含能够使循环趋于结束的操作,以避免出现死循环。

例5.3编写程序,求1+2+3+…+100的值。

这是一个求100个数的累加和问题。

所加的加数从1变化到100,因此我们可以在循环体中设计一个整型变量i,使它的初值为1,每循环一次使i的值增1,一直循环到i的值超过100为止,用这个办法就解决了所需的加数问题。

要解决求累加和的问题,还要再设计一个变量sum用来存放这100个数的和值,先求0+1的和并将其放在sum中,然后把sum中的数加上2再存放在sum中,依次类推。

在这里,sum累加的过程要放在循环体中,由计算机来判断所加的数是否已经超过100。

程序流程图如图5.2所示。

main(){int i, sum;i=1; sum=0;while(i<=100){sum= sum + i ;i++;}printf("sum=%d\n", sum);}程序运行结果为:sum=50505.3 do-while 语句用do-while 语句构成的循环由do-while 语句构成的循环称为”直到型”循环,do-while 语句的一般形式为:do循环体语句while(表达式);do-while 语句的执行过程是:先执行循环体语句,再求表达式的值,若表达式的值为非0,则再执行循环体语句,由此构成循环,直到表达式的值为0时结束循环。

如图5.3所示。

do-while 语句和while 语句的区别在于do-while 是先执行循环体语句,后判断循环条件,因此do-while 至少要执行一次循环体;而while 是先判断后执行,如果条件不满足,则一次循环体语句也不执行。

while 语句和do-while 语句一般都可以相互替代。

例如,我们可以用do-while 语句改写例5.3的程序,求1+2+3+…+100的值。

main()图5.2 例5.3程序流程图图{ int i, sum;i=1;sum=0; do { sum= sum + i ;i++; } while(i<=100) ; printf("sum=%d\n", sum);}程序运行结果为: sum=5050说明:(1) do-while 语句在while(表达式)后一定要有一个分号,它是do-while 语句的结束标志。

(2) 图5.4右图为用N-S 流程图描述的直到型循环结构,其循环结束条件的描述方法与C 语言的do-while 语句的循环条件的判断方法稍有不同,编程时应作适当地转换。

如上例中的“直到i>100”时结束循环和程序中的“ i<=100”时继续执行循环是同一个概念的不同表述形式。

5.4 for 语句和用for 语句构成的循环for 语句是C语言提供的功能更强,使用更广泛的一种循环语句。

其一般形式为:for (表达式1;表达式2;表达式3)循环体语句for 循环的执行过程是:(1) 计算”表达式1”。

(2) 计算”表达式2”;若其值为非零,转至步骤(3);若其值为零,则转至步骤(5)。

(3) 执行一次循环体语句。

(4) 计算”表达式3”;然后转向步骤(2),构成循环。

(5) 结束循环,执行for 循环之后的语句。

如图5.5所示。

图5.4 用do-while 语句实现例5.3的程序流程图图5.5 for循环语句的流程图根据for循环的执行过程,通常用“表达式1”来给循环变量(即用来控制循环次数的变量)赋初值或做一些进入循环之前的初始工作;用“表达式2”来作为判断循环是否结束的条件;用“表达式3”来修改循环变量的值,使得循环能够趋于结束。

从语法上来讲,for语句中的三个表达式都可以是任意合法的C表达式,各表达式之间用”;”隔开,并且这三个表达式都是任选项,都可以省略。

例如我们可以用f or循环语句将例5.3 的程序改写为如下几种形式,它们都能正确地求出1+2+3+…+100的值。

main() /*程序1 */{int i, sum;for (i=1,sum=0; i<=100; i++)sum= sum + i ;printf(“sum=%d\n”, sum);}main() /*程序2 */{int i=1, sum=0;for ( ; i<=100; i++)sum= sum + i ;printf(“sum=%d\n”, sum);}main() /*程序3 */{int i=1, sum=0;for ( ; i<=100; ){sum= sum + i;i++ ;}printf(“sum=%d\n”, sum);}main() /*程序4 */{int i=1, sum=0;for ( ; ; ){sum= sum + i++ ;if(i>100)goto pend;}pend: printf(“sum=%d\n”, sum);}说明:(1) for语句中的表达式可以部分或全部省略,但两个”;”不可省略。

如果“表达式2”被省略了,程序会因为缺少条件判断而陷入死循环,虽然可以在循环体内使用goto语句或break语句跳出循环,但实际编程时最好还是不要采用这种形式的for语句。

(2) 循环体语句可以是一条语句,也可以是用{}括起来的复合语句,甚至还可以是只有一个分号的空语句,例如上例中的for语句也可以改写成如下形式:for (i=1; i<=100; sum= sum + i++ );(3)表达式1和表达式3都可以是逗号表达式,这种用法经常出现在有2个循环变量变化的情形。

如:for (i=1,sum=0; i<=100; sum= sum + i,i++ );for (i=1,j=10; i<=j; i++,j-- )s=i+j;(4) 注意在循环体语句之前不能有分号,如果将上例中的for语句写成如下两种形式:for (i=1; i<=100; i++ );for (i=1; i<=100; i++ )或sum= sum + i;;sum= sum + i;则循环体语句是只有一个分号的空语句。

而语句sum= sum + i;则成为循环结构之外的一条语句,只是在退出for循环之后才被执行了一次。

(5)while循环和do-while循环常称为条件循环,即根据条件来决定是否继续执行循环。

相关主题