第六章 循环结构程序设计 概述 while 语句 do-while 语句 for 语句 循环的嵌套 几种循环的比较 第六章 循环结构程序设计 概述 while 语句 do-while 语句 for 语句 循环的嵌套 几种循环的比较 goto语句、break语句和continue语句
while语句、 for语句、do-while语句。 C提供三种基本的循环语句: while语句、 for语句、do-while语句。 一、while循环语句 while语句用来实现“当型”循环。while循环的一般形式为: while(表达式) 语句; while循环表示当表达式为真时, 便执行语句(循环体)。直到表达式为假才结束循环。并继续执行循环程序外的后续语句。 语句; 表达式 假(0) 真(非0)
例:输入一个正整数n,求2n i=1,p=1 输入n 当i<=n p=p*2 i++ 输出p #include<stdio.h> main( ) { int n, i=1 ; long p=1 ; printf(“input data n:”); scanf(“%d”,&n); while( i<=n ) { p=p*2; i++; } printf(“p=%ld”,p); i=1,p=1 输入n 当i<=n p=p*2 i++ 输出p
注意: while循环总是在循环开始前,检验表达式,即先判断, 后执行这就意味着循环可能一次也不执行就退出。 2. 语句可以是语句体, 语句体必须用“{”和“}”括起来, 构成复合语句。 3. 循环体中应有使循环趋向于结束的语句。否则将出现 死循环。 如: while (1) printf(“why?”); 4. while的循环体可以是空语句。 例如: while((putchar(getchar())!='\n') ; 这个循环的功能是:把用户输入的一行字符,逐个地 显示出来,直到按回车键为止。
二、do-while 循环 { 语句;} while(表达式); do-while语句用来实现“直到型”循环。 先执行,后判断。 它先执行循环中的语句,然后再判断表达式是否为真, 如果为 真则继续循环; 如果为假, 则终止循环。因此, do-while循环至 少要执行一次循环语句。 当有许多语句参加循环时, 要用“{”和“}”把它们括起来。而 且一般最好将do-while语句的循环体用“{”和“}”括起来。 假(0) 真(非0) 表达式 语句
while和do-while循环的比较 例如: 求 s=1+2+3+4…+100 #include<stdio.h> #include<stdio.h> main() main() {int sum=0,i=1; {int sum=0,i=1; while(i<=100) do {sum=sum+i; {sum=sum+i; i++; i++; } }while(i<=100) printf("%d",sum); printf("%d",sum); } }
for循环语句的执行过程: 三、 for循环语句 求解表达式1 for循环是C中使用最灵活的循环语句。 for语句的一般形式为: 假(0) 真(非0) 语句 求解表达式1 表达式2 求解表达式3 for 语句的 下一条语句 三、 for循环语句 for循环是C中使用最灵活的循环语句。 for语句的一般形式为: for(表达式1; 表过式2; 表达式3) 语句; for循环语句的执行过程:
说明: sum=0; for(i=1; i<=100; i++) sum += i; 100 例如: 求∑ i i=1 1. 表达式1一般总是一个赋值表达式, 它用来给循环控 制变量赋初值; 2. 表达式2一般是关系表达式或逻辑表达式, 它决定什 么时候退出循环; 3. 表达式3往往是定义循环控制变量每循环一次后按什 么方式增值。 100 例如: 求∑ i i=1 sum=0; for(i=1; i<=100; i++) sum += i; 上例中先给 i 赋初值1, 判断 i 是否小于等于100, 若是则 执行语句,之后 i 值增加1。再重新判断, 直到条件为假, 即 i>100时, 结束循环。
注意: for(; i<=100 ; ) { sum+=i; i++; } 参加循环的语句括起来。 2. for循环中的“表达式1”、“表达式2”和“表达式3”都 是可选项, 即可以缺省, 但";"不能缺省。 省略表达式1, 表示不对循环控制变量赋初值。 省略表达式2, 则不做其它处理时便成为死循环。 省略表达式3, 则不对循环控制变量进行操作, 这时可 在语句体中加入修改循环控制变量的语句,来保证循环正 常结束。如上例可写为: i=1;sum=0; for(; i<=100 ; ) { sum+=i; i++; }
3. 若for语句中的三个表达式都省略,即: for(;;) 语句 无休止执行循环体 等价于 while ( 1 ) 语句 4. for语句中表达式1也可是与循环控制变量无关的表达 式;表达式1和表达式3可为简单表达式,也可为逗号表 达式。 例1:for(sum=0, i=1; i<=100; i++) sum += i; 例2:for(i=0, j=100 ; i<=j ; i++,j--)k=i+j; 例3:for(i=1;i<=100;i++,i++) sum=sum+i; 等价于 for(i=1;i<=100;i=i+2) sum=sum+i;
5. for语句中表达式2也可为数值表达式或字符表达式, 只要其值非0,就执行循环体。 例:for( s=0 ;(c=getchar())!=‘\n’;s+=c); 功能是:不断输入字符,将其ASCII码值相加,直到输入 回车换行为止。 6. for语句是使用最广泛且最灵活的一种循环语句,既可 用于循环次数确定的情况,也可用于循环次数不定而 只给出循环条件的情况。for语句与下面的while语句 等价: 表达式1 ; while (表达式2) { 语句 表达式3 ; }
7.for语句也可与while,do-while语句相互嵌套,构成 多重循环。以下形式都合法的嵌套。 (1)for(){… while() {…} … } (2)do{ for() }while(); (3)while(){ … for() {…} } (4)for(){ for(){
四、几种转移语句 (一).goto语句 goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某 一语句行的前面,标号后加冒号 (:),如: label: i++; loop: while(x<7); 语句标号起标识语句的作用,与goto 语句配合使用。如: goto label; goto loop;
关于goto语句的说明 1、C语言不限制程序中使用标号的次数,但各标号不得重名。 2、goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。 3、goto语句通常与条件语句配合使用。可用来实现条件转移、构成循环、跳出循环体等功能。 4、但是,在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
(二) break语句 1.形式: break ; 2.功能:1)用于开关语句switch中, 可使程序 跳出switch 而执行switch以后的语句; 2)用于do-while、for、while循环语句 中时,可从循环体中跳出,而执行循环后面的语句, 通常break语句总是与if语句联在一起。 即满足条 件时便跳出循环。 3. 注意: i)break语句对if-else的条件语句不起作用。 ii)在多层循环中, 一个break语句只向外跳一层。
(三) continue 语句 1. 形式:continue; 2. 功能:结束本次循环,即跳过循环体中剩余的语句而接着 进行下一次是否执行循环的判定。 continue语句只用在for、while、do-while等循环体中, 常与if条件语句一起使用, 用来加速循环。 例:把100~200之间不能被3整除的数输出 #include<stdio.h> main( ) { int n; for(n=100;n<=200;n++) { if( n % 3 = =0 ) continue ; printf(“%d”,n); }
综合举例 1.用 公式求的值,直到 最后一项的绝对值 小于10-4为止。 T=1,pi=0,n=1,s=1 |t|>=10-4 pi=pi+t n=n+2 s=-s t=s/n pi=pi*4 输出pi
#include “math.h” main() {int s; float n,t,pi; t=1;pi=0;n=1.0;s=1; while ((fabs(t)>=1e-4) {pi=pi+t; n=n+2; s=-s; t=s/n; } pi=pi*4; printf(“pi=%10.6f\n”,pi);
2. 判断 m是否素数 我们采用的算法是: 让m被2到k= 除,如果m能被2k中的任何一个整数整 除,则提前结束循环,此时i〈=k. 如果m不能被2k之间的任一整数整除,则在i〉=k+1时 终止循环。 循环之后如i>=k+1则m是素数,否则不是素数。
#include "math.h" main() { int m,i,k; scanf("%d",&m); k=sqrt(m); for (i=2;i<=k;i++) if (m%i==0) break; if (i>=K+1) printf("%d is a prime number\n",m); else printf("%d is not a primenumber\n",m); }
3. 求100到200之间的全部素数 #include "math.h" main() { int m,i,k; for (m=101,m<=200,m=m+2) /*scanf("%d",&m);*/ {k=sqrt(m); for (i=2;i<=k;i++) if (m%i==0) break; if (i>=K+1) printf("%d is a prime number\n",m); else printf("%d is not a primenumber\n",m); }
4.用牛顿迭代法求 sqrt(x)的近似值sn。该近似值要求 满足 |sn+1-sn|<10-6 牛顿迭代公式: 算法分析: 1)确定循环体: s=0.5*(s+x/s) 2) 循环初值: 读入x,s初值 1 3)循环控制条件: 需要保留前一次循环的s值,因此, 设两个s,S1和S2。当fabs(S2-S1)<1.0e-4时进行循环 4) 循环体改为:s1=s2; s2=0.5*(s2+x/s2); 5)循环初值改为: 读入x,s1、s2初值 1
#include "stdio.h" #include "math.h" main() { float x,s1=1,s2=1; scanf("%f",&x); s2=0.5*(s1+x/s1); while (fabs(s2-s1)>=1.0e-6) { s1=s2; } printf("\n sqrt(%f)=%f\n",x,s2);