循环控制熟练掌握forwhiledowhile三种循环结构掌握循环的嵌套课件_第1页
循环控制熟练掌握forwhiledowhile三种循环结构掌握循环的嵌套课件_第2页
循环控制熟练掌握forwhiledowhile三种循环结构掌握循环的嵌套课件_第3页
循环控制熟练掌握forwhiledowhile三种循环结构掌握循环的嵌套课件_第4页
循环控制熟练掌握forwhiledowhile三种循环结构掌握循环的嵌套课件_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章循环控制熟练掌握for、while、do_while三种循环结构掌握循环的嵌套学习要点学习建议难点循环的嵌套break和continue语句的正确使用上机编程,设计简单的循环结构,注意设计错误并调试1a第六章循环控制熟练掌握for、while、do_while第六章循环控制6.1概述6.2goto语句以及用goto语句构成循环(略)6.3while语句6.4do-while语句6.5for语句(重点!!)6.6循环的嵌套(重点!)6.7几种循环的比较(略)6.8break语句和continue语句6.9程序举例2a第六章循环控制6.1概述2a6.1循环概述一般需要使用循环的情况是:有重复的操作(循环体);

循环次数可以控制例有60个学生,将成绩在80分以上者的学号和成绩打印出来.什么是循环?为什么要使用循环?n表示学生学号,ni代表第i个学生的学号;g表示学生的成绩,gi代表第i个学生的成绩S1:i=1S2:如果gi

>=80,则打印ni

、gi

S3:i=i+1S4:如果i<=60,返回S2,否则,算法结束循环体循环条件循环控制变量i3a6.1循环概述一般需要使用循环的情况是:什么是循环?循环体循6.1循环概述当型循环直到型循环在C语言中可以用下列语句实现循环.goto和if结合whilefordo-while[return]4a6.1循环概述当型循环直到型循环在C语言中可以用下列语句实现6.2goto语句以及用goto语句构成循环注意:结构化程序设计方法,主张限制使用goto语句。无条件转向语句格式:goto语句标号;例:gotoloop1;用途:(1)与if语句一起构成循环结构;(2)从多层循环的内层循环跳到外层循环5a6.2goto语句以及用goto语句构成循环注意:结构化6.2goto语句以及用goto语句构成循环例6.1求#include<stdio.h>voidmain(){inti=1,sum=0;

/*初始化循环控制变量i和累计器sum*/

printf(“sum=%d\n”,sum);}[return]loop:if(i<=100){sum=sum+i;i++;gotoloop;}6a6.2goto语句以及用goto语句构成循环例6.1求#6.3while语句实现当型循环,一般形式如下:

while(表达式){语句组}表达式语句组真假7a6.3while语句实现当型循环,一般形式如下:表[例6.2]用while语句求循环体内如果有一个以上的语句,则必须用{}构成复合语句;[return]#include<stdio.h>voidmain()

{inti=1,sum=0;/*初始化循环控制变量i和累计器sum*/

while(i<=100){ sum=sum+i; i++; } /*循环控制变量i增1*/

printf(“sum=%d\n”,sum);

}

要有修改循环变量、使循环趋于结束的语句.8a[例6.2]用while语句求循环体内如果有一个以上的语句§6.4用do-while语句实现循环一般形式如下:

do 循环体语句while(表达式);

循环体语句表达式yesno9a§6.4用do-while语句实现循环一般形式如下:[例6.3]用do-while语句求

#include<stdio.h>voidmain()

{inti=1,sum=0;

do

{

sum=sum+i; /*累加*/

i++;

}while(i<=100);/*循环继续条件:i<=100*/

printf(“sum=%d\n”,sum);

} 10a[例6.3]用do-while语句求

10awhile语句和用do-while语句的比较:在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是否相同呢?11awhile语句和用do-while语句的比较:11a#include<stdio.h>voidmain(){ intsum=0,i; scanf(“%d”,&i);

while(i<=10){ sum=sum+i; i++;} printf(“sum=%d\n”,sum);}#include<stdio.h>voidmain(){ intsum=0,i; scanf(“%d”,&i);

do{sum=sum+i; i++;}while(i<=10);printf(“sum=%d\n”,sum);}

[return]i=1时,sum=55;i=1时,sum=55;

while语句和用do-while语句的比较:i=1i=11时,sum=0;i=11时,sum=11;i=1112a#include<stdio.h>#include<st§6.5用for语句实现循环for语句的一般形式

for(表达式1;表达式2;表达式3)语句循环变量赋初值循环终止条件循环变量增量for语句最简单的应用形式,也就是最易理解的形式.13a§6.5用for语句实现循环for语句的一般形式fo执行过程如图所示。(1)求解“变量赋初值”表达式。(2)求解“循环继续条件”表达式。如果其值非0,执行(3);否则,转至(4)。(3)执行循环体语句组,并求解“循环变量增值”表达式,然后转向(2)。(4)执行for语句的下一条语句。§6.5for语句求表达式1表达式2?语句表达式3yesnofor(表达式1;表达式2;表达式3)语句循环变量赋初值循环终止条件循环变量增量14a执行过程如图所示。§6.5for语句求表达式1表达式2?语

[例]求1~100的累计和。

#include<stdio.h>voidmain()

{inti,sum=0;printf("sum=%d\n",sum);

} §6.5for语句[例]求1~100的累计和。

#include<stdio.h>voidmain()

{inti,sum=0;i=1;

do

{

sum=sum+i; i++;

}while(i<=100);printf(“sum=%d\n”,sum);

} for(i=1;i<=100;i++)sum=sum+i;15a[例]求1~100的累计和。

#include<std

[例]求1~100的累计和。

#include<stdio.h>voidmain()

{inti,sum=0;

for(i=1;i<=100;i++)

sum=sum+i;/*实现累加*/

printf("sum=%d\n",sum);

} §6.5for语句for循环执行流程:i=1i++----i=2∵i<=100

∴sum=1+2=3………i++----i=101∵

i>100

退出循环∵

i<=100

∴sum=0+1=116a[例]求1~100的累计和。

#include<std#include<stdio.h>voidmain(){ inti,sum=0; /*将累加器sum初始化为0*/

for(;i<=100;i++){ sum=sum+i;} /*实现累加*/

printf("sum=%d\n",sum);} for语句应用说明:

for(i=1;i<=100;i++)sum=sum+i;

表达式1可以省略,此时应在循环前初始化,分号不能省略

i=1;循环变量赋初值循环终止条件循环变量增量17a#include<stdio.h>for语句应用说明:f#include<stdio.h>voidmain(){ inti,sum=0; i=1;

for(;i<=100;){ sum=sum+i; /*实现累加*/

} printf("sum=%d\n",sum);}

for(i=1;i<=100;i++)sum=sum+i; 表达式3可以省略,此时应在循环体内进行处理

i++;18a#include<stdio.h>for(i=1;i<#include<stdio.h>voidmain(){ inti,sum=0;

for(i=1;;i++){

sum=sum+i; /*实现累加*/

} printf("sum=%d\n",sum);}

for(i=1;i<=100;i++)

sum=sum+i;

表达式2可以省略,但必须在循环体中补偿循环控制功能,否则构成死循环if(i>100)break;/*break语句的功能是退出它所在的循环*/19a#include<stdio.h>for(i=1;i<表达式1和表达式3可以是和初值、增量无关的逗号表达式for(表达式1;表达式2;表达式3)语句循环变量赋初值循环终止条件循环变量增量sum=0;for(i=1;i<=100;i++)sum=sum+i; for(i=1,sum=0;i<=100;sum=sum+i,i++);求表达式1表达式2语句表达式3yesno20a表达式1和表达式3可以是和初值、for(表达式1;表达式2;表达式1和表达式3可以是和初值、增量无关的逗号表达式for(表达式1;表达式2;表达式3)语句循环变量赋初值循环终止条件循环变量增量sum=0;for(i=1;i<=100;i++)sum=sum+i; for(i=1,sum=0;i<=100;sum=sum+i,i++);for(i=1,sum=0;i<=100;sum=sum+i++); for(i=1,sum=0;i<=100;i++,sum=sum+i);

21a表达式1和表达式3可以是和初值、增量无关的逗号表达式for(以下程序的输出结果(!!)main(){intn;for(n=1;n<=5;n+=2)printf(“n=%d\n”,n);}main(){intn;for(n=1;n<=5;n+=2);printf(“n=%d\n”,n);}运行结果n=1n=3n=5运行结果n=722a以下程序的输出结果(!!)main()main()运行结果运for语句和while语句是可以互换的.表达式1;while(表达式2){

语句组;

表达式3;}for(表达式1;表达式2;表达式3){

语句组;}§6.5for语句[return]显然,用for语句简单、方便。

23afor语句和while语句是可以互换的.§6.5for语§6.6循环的嵌套(多重循环)一个循环体内可以包含另一个完整的循环结构,称为循环的嵌套。(1)

while()(2)for(;;)(3)do{…{…{…do{…}while()for(;;){}while(){}…{…}…}}}while()

24a§6.6循环的嵌套(多重循环)一个循环体内可以包含另一个1×1=12×1=22×2=49×1=99×2=189×3=279×9=81......循环的嵌套(多重循环)输出第9行(用for如何实现?):for(i=1;i<=9;i++)printf(“9×%d=%d”,i,9*i)输出第n行(用for如何实现?):for(i=1;i<=n;i++)printf(“%d×%d=%d”,n,i,n*i)例:编程,输出下图的九九乘法表。25a1×1=12×1=22×2=49×1=99×2=189×3=1×1=12×1=22×2=49×1=99×2=189×3=279×9=81......循环的嵌套(多重循环)输出乘法表(如何实现?):for(n=1;n<=9;n++){for(i=1;i<=n;i++)

printf(“%d×%d=%d”,n,i,n*i);

printf(“\n”);}输出第n行:for(i=1;i<=n;i++)printf(“%d×%d=%d”,n,i,n*i);for(9次){}

for(n次){}问题1:外循环、内循环的循环次数是多少?26a1×1=12×1=22×2=49×1=99×2=189×3=循环的嵌套例:打印九九表#include"stdio.h"voidmain(){inti,n;for(n=1;n<=9;n++){for(i=1;i<=n;i++)printf("%d×%d=%d",n,i,i*n);printf("\n");}}for(9次){}

for(n次){}1×1=12×1=22×2=49×1=99×2=189×3=279×9=81......27a循环的嵌套例:打印九九表for(9次)for(n次****************************************************************循环的嵌套分析:行的控制i:1~8‘*’的个数j与当前行的关系

j=2*i-1‘*’前面的空格k与行的关系:开始时,第一行有7个空格每多一行,少一个空格k=8-iwhile(i<=8){for(k=1;k<=8-i;k++)

输出空格;

for(j=1;j<=(2*i-1);j++)

输出*;i++;}28a*循环的嵌套分析:行的控制i:1~828a#include<stdio.h>main(){inti,j,k;i=1;while(i<=8){

for(k=1;k<=8-i;k++)

printf(“”);

for(j=1;j<=(2*i-1);j++)

printf(“*”);printf(“\n”);i++;}}循环的嵌套[return]****************************************************************29a#include<stdio.h>循环的嵌套[return]

§6.7几种循环的比较

(2)for语句的功能更强,凡用while循环能完成的,用for循环都能实现。

(1)四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。[return]30a§6.7几种循环的比较(1)四种循环都可以用来处理同一问题为了使循环控制更加灵活,C语言提供了break语句和continue语句。1.一般格式:break;

continue;§6.8break和continue2.功能(1)break:强行结束循环,转向执行循环语句的下一条语句。(2)continue:结束本次循环。即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判断。31a为了使循环控制更加灵活,C语言提供了break语句和contbreak语句用来从循环体里退出,中止循环continue用来跳过剩下的语句,回到循环开始表达式1表达式2循环的下一个语句语句语句breaknyyn表达式1表达式2循环的下一个语句语句语句continuenyynbreak语句和continue语句32abreak语句用来从循环体里退出,中止循环表达式1表达式2循3.说明(1)break能用于循环语句和switch语句中,continue只能用于循环语句中。§6.8break和continue(2)循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关。33a3.说明§6.8break和continue(2)循环嵌例:计算r=1,2,..10的圆面积,只到面积大于100为止;#include<stdio.h>voidmain(){intr;floatarea;

for(r=1;r<=10;r++){ area=r*r*3.14;

if(area>100.0)

printf(“Areais%f\n”,area);} }

break;34a例:计算r=1,2,..10的圆面积,只到面积大于100为止把100~200之间的不能被3整除的打印出来.§6.8break和continuevoidmain(){intn;for(n=100;n<=200;n++){}}if(n%3==0)

printf(“不能被3整除的数是:%d\n”,n);[return]continue;35a把100~200之间的不能被3整除的打印出来.§6.8br§6.9程序举例[例6.6]用/41-1/3+1/5-1/7+…的公式求的近似值,直到最后一项的绝对值小于10—6为止t=1,pi=0,n=1,s=1当|t|10-6pi=pi+tn=n+2s=-s;t=s/npi=pi*4输出pi#include<stdio.h>#include<math.h>main(){ints;floatn,t,pi;t=1;pi=0;n=1.0;s=1;while(fabs(t)>=1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf(“pi=%10.6f\n”,pi);}[下一个例程]36a§6.9程序举例[例6.6]用/41-1/3+1/5-P1296.1输入两个正整数m和n,求其最大公约数和最小公倍数。例:m=4,n=6,其最大公约数为i=2最小公倍数4*6/2=12。试探法[下一个例程]37aP1296.1输入两个正整数m和n,求其最大公约数和最#include<stdio.h>voidmain(){intm,n,i;printf("pleaseinputtwointegersn,m\n");scanf("%d,%d",&n,&m);

}if(n<m){i=m;m=n;n=i;}for(i=m;i>=1;i--)if((m%i==0)&&(n%i==0))break;printf(“最大公约数是:%d.\n",i);printf(“最小公倍数是:%d.\n",

m*n/i);[下一张]38a#include<stdio.h>if(n<m){i#include<stdio.h>voidmain(){intm,n,k,i,leap=1;printf("pleaseinputtwointegersn,m\n");scanf("%d,%d",&n,&m);

}if(n<m){k=m;m=n;n=k;}for(i=m;(i>=1)&&leap;i--)if((m%i==0)&&(n%i==0))leap=0;i++;

[下一张]printf(“最大公约数是:%d.\n",i);printf(“最小公倍数是:%d.\n",

m*n/i);39a#include<stdio.h>if(n<m){例6.10译密码。输入若干字符,若为字母字符则将它们变成其后的第四个字母,A-->E,w-->a.非字母字符不变.思路:1.建立循环,循环控制条件是什么?40a例6.10译密码。输入若干字符,若为字母字符则将它们变成其例6.10译密码。输入若干字符,若为字母字符则将它们变成其后的第四个字母,A-->E,w-->a.非字母字符不变.思路:1.建立循环,循环结束以输入回车符为准while((c=getchar())!=’\n’){循环体。。。。}对比:while(c=getchar()!=’\n’)while((c=getchar())!=’\n’)41a例6.10译密码。输入若干字符,若为字母字符则将它们变成其例6.10译密码。输入若干字符,若为字母字符则将它们变成其后的第四个字母,A-->E,w-->a.非字母字符不变.思路:2.判断输入是否是字母

‘a’‘b’……..’z’98……..122‘A’‘B’…….’Z’6566…….90if((c>=‘a’&&c<=‘z’)||(c>=‘A’&&c<=‘Z’))42a例6.10译密码。输入若干字符,若为字母字符则将它们变成其例6.10译密码。输入若干字符,若为字母字符则将它们变成其后的第四个字母,A-->E,w-->a.非字母字符不变.思路:4.若变换后超出z时,要轮回.

(如何判断是否要轮回?如何轮回?)ab……..…z{98……..122123AB…….Z[6566…….90913.变成其后的第四个字母??c=c+4;

if((c>‘Z’&&c<=‘Z’+4)||(c>‘z’))c=c-26;例:W:87,Z:90,W-->A,则:‘W’+4-2643a例6.10译密码。输入若干字符,若为字母字符则将它们变成其例6.10译密码。输入若干字符,若为字母字符则将它们变成其后的第四个字母,A-->E,W-->A.非字母字符不变.思路:3.变成其后的第四个字母c=c+4;4.若变换后超出z时,要轮回.if((c>’Z’&&c<=‘Z’+4)||(c>’z’))c=c-26例:W:87,Z:90,W-->A,则:‘W’+4-262.判断输入是否是字母

if((c>=’a’&&c<=’z’)||(c>=’A’&&c<=’Z’))1.建立循环,循环结束以输入回车符为准while((c=getchar())!=’\n’)44a例6.10译密码。输入若干字符,若为字母字符则将它们变成其#include<stdio.h>voidmain(){charc;while((c=getchar())!=’\n’)

{

if((c>=’a’&&c<=’z’)||(c>=’A’&&c<=’Z’))

{c=c+4;

if((c>’Z’&&c<=’Z’+4)||(c>’z’))c=c-26;}printf(“%c”,c);

}}abdEgWefhIkA45a#include<stdio.h>abdEgW45a例6.8判断m是否素数。素数:只能被1和其自已整除的数算法思想:让m被2到除,如果m能被2~k之中任何一个整数整除,则说明m不是素数,提前结束循环,此时i必然小于或等于k;如果m不能被2~k之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2~k之间任一整数整除过,因此输出“是素数”。

46a例6.8判断m是否素数。46a例6.8判断m是否素数。算法思想:让m被2到除,如果m能被2~k之中任何一个整数整除,则说明m不是素数,提前结束循环,此时i必然小于或等于k;如果m不能被2~k之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2~k之间任一整数整除过,因此输出“是素数”。

如图所示:47a例6.8判断m是否素数。47a#include<stdio.h>#include<math.h>voidmain(){intm,i,k;scanf("%d",&m);

}if(i>k)printf("%d是素数\n",m);elseprintf("%d不是素数\n",m);k=sqrt(m);for(i=2;i<=k;i++) if(m%i==0) break;运行结果:

17↙17是素数

[演示例题6-8]48a#include<stdio.h>if(i>k)prin循环的嵌套例6.9把100~200之间的素数打印出来.算法设计要点:

显然,只要设计出判断某数m是否是素数的算法,外面再套一个for循环即可。49a循环的嵌套例6.9把100~200之间的素数打印出来.算法#include<stdio.h>#include<math.h>main(){ inti,m,k,n=0;printf(“100-200间的素数有:\n”);for(m=101;m<=200;m=m+2){

k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>k){printf(“%d”,m);n++;}

if(n%10==0)printf(“\n”);

}}例6.9把100~200之间的素数打印出来.问题:(1)为什么循环中是m=m+2(2)变量n的作用?(3)做什么用的?50a#include<stdio.h>例6.9把100~20#include<stdio.h>#include<math.h>main(){ inti,m,k,n=0;printf(“100-200间的素数有:\n”);for(m=101;m<=200;m=m+2){

k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>k){printf(“%d”,m);n++;}

if(n%10==0)printf(“\n”);

}}例6.9把100~200之间的素数打印出来.运行结果:

100-200间的素数有:

10110310710911312713113713914915115716316717317918119119319719951a#include<stdio.h>例6.9把100~20本章要点本章介绍的三种循环语句一般可实现同一问题的求解,但有不同的特点。while,for

属于“先判断,后执行循环”,而do---while语句则“先执行循环,后判断”。if和goto语句也能构成循环结构,但效率不如循环语句,且会破坏结构化程序,通常不使用该方法构成循环结构break和continue能改变循环的执行流程,注意两者的区别。52a本章要点本章介绍的三种循环语句一般可实现同一问题的求解,但有第六章循环控制熟练掌握for、while、do_while三种循环结构掌握循环的嵌套学习要点学习建议难点循环的嵌套break和continue语句的正确使用上机编程,设计简单的循环结构,注意设计错误并调试53a第六章循环控制熟练掌握for、while、do_while第六章循环控制6.1概述6.2goto语句以及用goto语句构成循环(略)6.3while语句6.4do-while语句6.5for语句(重点!!)6.6循环的嵌套(重点!)6.7几种循环的比较(略)6.8break语句和continue语句6.9程序举例54a第六章循环控制6.1概述2a6.1循环概述一般需要使用循环的情况是:有重复的操作(循环体);

循环次数可以控制例有60个学生,将成绩在80分以上者的学号和成绩打印出来.什么是循环?为什么要使用循环?n表示学生学号,ni代表第i个学生的学号;g表示学生的成绩,gi代表第i个学生的成绩S1:i=1S2:如果gi

>=80,则打印ni

、gi

S3:i=i+1S4:如果i<=60,返回S2,否则,算法结束循环体循环条件循环控制变量i55a6.1循环概述一般需要使用循环的情况是:什么是循环?循环体循6.1循环概述当型循环直到型循环在C语言中可以用下列语句实现循环.goto和if结合whilefordo-while[return]56a6.1循环概述当型循环直到型循环在C语言中可以用下列语句实现6.2goto语句以及用goto语句构成循环注意:结构化程序设计方法,主张限制使用goto语句。无条件转向语句格式:goto语句标号;例:gotoloop1;用途:(1)与if语句一起构成循环结构;(2)从多层循环的内层循环跳到外层循环57a6.2goto语句以及用goto语句构成循环注意:结构化6.2goto语句以及用goto语句构成循环例6.1求#include<stdio.h>voidmain(){inti=1,sum=0;

/*初始化循环控制变量i和累计器sum*/

printf(“sum=%d\n”,sum);}[return]loop:if(i<=100){sum=sum+i;i++;gotoloop;}58a6.2goto语句以及用goto语句构成循环例6.1求#6.3while语句实现当型循环,一般形式如下:

while(表达式){语句组}表达式语句组真假59a6.3while语句实现当型循环,一般形式如下:表[例6.2]用while语句求循环体内如果有一个以上的语句,则必须用{}构成复合语句;[return]#include<stdio.h>voidmain()

{inti=1,sum=0;/*初始化循环控制变量i和累计器sum*/

while(i<=100){ sum=sum+i; i++; } /*循环控制变量i增1*/

printf(“sum=%d\n”,sum);

}

要有修改循环变量、使循环趋于结束的语句.60a[例6.2]用while语句求循环体内如果有一个以上的语句§6.4用do-while语句实现循环一般形式如下:

do 循环体语句while(表达式);

循环体语句表达式yesno61a§6.4用do-while语句实现循环一般形式如下:[例6.3]用do-while语句求

#include<stdio.h>voidmain()

{inti=1,sum=0;

do

{

sum=sum+i; /*累加*/

i++;

}while(i<=100);/*循环继续条件:i<=100*/

printf(“sum=%d\n”,sum);

} 62a[例6.3]用do-while语句求

10awhile语句和用do-while语句的比较:在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是否相同呢?63awhile语句和用do-while语句的比较:11a#include<stdio.h>voidmain(){ intsum=0,i; scanf(“%d”,&i);

while(i<=10){ sum=sum+i; i++;} printf(“sum=%d\n”,sum);}#include<stdio.h>voidmain(){ intsum=0,i; scanf(“%d”,&i);

do{sum=sum+i; i++;}while(i<=10);printf(“sum=%d\n”,sum);}

[return]i=1时,sum=55;i=1时,sum=55;

while语句和用do-while语句的比较:i=1i=11时,sum=0;i=11时,sum=11;i=1164a#include<stdio.h>#include<st§6.5用for语句实现循环for语句的一般形式

for(表达式1;表达式2;表达式3)语句循环变量赋初值循环终止条件循环变量增量for语句最简单的应用形式,也就是最易理解的形式.65a§6.5用for语句实现循环for语句的一般形式fo执行过程如图所示。(1)求解“变量赋初值”表达式。(2)求解“循环继续条件”表达式。如果其值非0,执行(3);否则,转至(4)。(3)执行循环体语句组,并求解“循环变量增值”表达式,然后转向(2)。(4)执行for语句的下一条语句。§6.5for语句求表达式1表达式2?语句表达式3yesnofor(表达式1;表达式2;表达式3)语句循环变量赋初值循环终止条件循环变量增量66a执行过程如图所示。§6.5for语句求表达式1表达式2?语

[例]求1~100的累计和。

#include<stdio.h>voidmain()

{inti,sum=0;printf("sum=%d\n",sum);

} §6.5for语句[例]求1~100的累计和。

#include<stdio.h>voidmain()

{inti,sum=0;i=1;

do

{

sum=sum+i; i++;

}while(i<=100);printf(“sum=%d\n”,sum);

} for(i=1;i<=100;i++)sum=sum+i;67a[例]求1~100的累计和。

#include<std

[例]求1~100的累计和。

#include<stdio.h>voidmain()

{inti,sum=0;

for(i=1;i<=100;i++)

sum=sum+i;/*实现累加*/

printf("sum=%d\n",sum);

} §6.5for语句for循环执行流程:i=1i++----i=2∵i<=100

∴sum=1+2=3………i++----i=101∵

i>100

退出循环∵

i<=100

∴sum=0+1=168a[例]求1~100的累计和。

#include<std#include<stdio.h>voidmain(){ inti,sum=0; /*将累加器sum初始化为0*/

for(;i<=100;i++){ sum=sum+i;} /*实现累加*/

printf("sum=%d\n",sum);} for语句应用说明:

for(i=1;i<=100;i++)sum=sum+i;

表达式1可以省略,此时应在循环前初始化,分号不能省略

i=1;循环变量赋初值循环终止条件循环变量增量69a#include<stdio.h>for语句应用说明:f#include<stdio.h>voidmain(){ inti,sum=0; i=1;

for(;i<=100;){ sum=sum+i; /*实现累加*/

} printf("sum=%d\n",sum);}

for(i=1;i<=100;i++)sum=sum+i; 表达式3可以省略,此时应在循环体内进行处理

i++;70a#include<stdio.h>for(i=1;i<#include<stdio.h>voidmain(){ inti,sum=0;

for(i=1;;i++){

sum=sum+i; /*实现累加*/

} printf("sum=%d\n",sum);}

for(i=1;i<=100;i++)

sum=sum+i;

表达式2可以省略,但必须在循环体中补偿循环控制功能,否则构成死循环if(i>100)break;/*break语句的功能是退出它所在的循环*/71a#include<stdio.h>for(i=1;i<表达式1和表达式3可以是和初值、增量无关的逗号表达式for(表达式1;表达式2;表达式3)语句循环变量赋初值循环终止条件循环变量增量sum=0;for(i=1;i<=100;i++)sum=sum+i; for(i=1,sum=0;i<=100;sum=sum+i,i++);求表达式1表达式2语句表达式3yesno72a表达式1和表达式3可以是和初值、for(表达式1;表达式2;表达式1和表达式3可以是和初值、增量无关的逗号表达式for(表达式1;表达式2;表达式3)语句循环变量赋初值循环终止条件循环变量增量sum=0;for(i=1;i<=100;i++)sum=sum+i; for(i=1,sum=0;i<=100;sum=sum+i,i++);for(i=1,sum=0;i<=100;sum=sum+i++); for(i=1,sum=0;i<=100;i++,sum=sum+i);

73a表达式1和表达式3可以是和初值、增量无关的逗号表达式for(以下程序的输出结果(!!)main(){intn;for(n=1;n<=5;n+=2)printf(“n=%d\n”,n);}main(){intn;for(n=1;n<=5;n+=2);printf(“n=%d\n”,n);}运行结果n=1n=3n=5运行结果n=774a以下程序的输出结果(!!)main()main()运行结果运for语句和while语句是可以互换的.表达式1;while(表达式2){

语句组;

表达式3;}for(表达式1;表达式2;表达式3){

语句组;}§6.5for语句[return]显然,用for语句简单、方便。

75afor语句和while语句是可以互换的.§6.5for语§6.6循环的嵌套(多重循环)一个循环体内可以包含另一个完整的循环结构,称为循环的嵌套。(1)

while()(2)for(;;)(3)do{…{…{…do{…}while()for(;;){}while(){}…{…}…}}}while()

76a§6.6循环的嵌套(多重循环)一个循环体内可以包含另一个1×1=12×1=22×2=49×1=99×2=189×3=279×9=81......循环的嵌套(多重循环)输出第9行(用for如何实现?):for(i=1;i<=9;i++)printf(“9×%d=%d”,i,9*i)输出第n行(用for如何实现?):for(i=1;i<=n;i++)printf(“%d×%d=%d”,n,i,n*i)例:编程,输出下图的九九乘法表。77a1×1=12×1=22×2=49×1=99×2=189×3=1×1=12×1=22×2=49×1=99×2=189×3=279×9=81......循环的嵌套(多重循环)输出乘法表(如何实现?):for(n=1;n<=9;n++){for(i=1;i<=n;i++)

printf(“%d×%d=%d”,n,i,n*i);

printf(“\n”);}输出第n行:for(i=1;i<=n;i++)printf(“%d×%d=%d”,n,i,n*i);for(9次){}

for(n次){}问题1:外循环、内循环的循环次数是多少?78a1×1=12×1=22×2=49×1=99×2=189×3=循环的嵌套例:打印九九表#include"stdio.h"voidmain(){inti,n;for(n=1;n<=9;n++){for(i=1;i<=n;i++)printf("%d×%d=%d",n,i,i*n);printf("\n");}}for(9次){}

for(n次){}1×1=12×1=22×2=49×1=99×2=189×3=279×9=81......79a循环的嵌套例:打印九九表for(9次)for(n次****************************************************************循环的嵌套分析:行的控制i:1~8‘*’的个数j与当前行的关系

j=2*i-1‘*’前面的空格k与行的关系:开始时,第一行有7个空格每多一行,少一个空格k=8-iwhile(i<=8){for(k=1;k<=8-i;k++)

输出空格;

for(j=1;j<=(2*i-1);j++)

输出*;i++;}80a*循环的嵌套分析:行的控制i:1~828a#include<stdio.h>main(){inti,j,k;i=1;while(i<=8){

for(k=1;k<=8-i;k++)

printf(“”);

for(j=1;j<=(2*i-1);j++)

printf(“*”);printf(“\n”);i++;}}循环的嵌套[return]****************************************************************81a#include<stdio.h>循环的嵌套[return]

§6.7几种循环的比较

(2)for语句的功能更强,凡用while循环能完成的,用for循环都能实现。

(1)四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。[return]82a§6.7几种循环的比较(1)四种循环都可以用来处理同一问题为了使循环控制更加灵活,C语言提供了break语句和continue语句。1.一般格式:break;

continue;§6.8break和continue2.功能(1)break:强行结束循环,转向执行循环语句的下一条语句。(2)continue:结束本次循环。即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判断。83a为了使循环控制更加灵活,C语言提供了break语句和contbreak语句用来从循环体里退出,中止循环continue用来跳过剩下的语句,回到循环开始表达式1表达式2循环的下一个语句语句语句breaknyyn表达式1表达式2循环的下一个语句语句语句continuenyynbreak语句和continue语句84abreak语句用来从循环体里退出,中止循环表达式1表达式2循3.说明(1)break能用于循环语句和switch语句中,continue只能用于循环语句中。§6.8break和continue(2)循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关。85a3.说明§6.8break和continue(2)循环嵌例:计算r=1,2,..10的圆面积,只到面积大于100为止;#include<stdio.h>voidmain(){intr;floatarea;

for(r=1;r<=10;r++){ area=r*r*3.14;

if(area>100.0)

printf(“Areais%f\n”,area);} }

break;86a例:计算r=1,2,..10的圆面积,只到面积大于100为止把100~200之间的不能被3整除的打印出来.§6.8break和continuevoidmain(){intn;for(n=100;n<=200;n++){}}if(n%3==0)

printf(“不能被3整除的数是:%d\n”,n);[return]continue;87a把100~200之间的不能被3整除的打印出来.§6.8br§6.9程序举例[例6.6]用/41-1/3+1/5-1/7+…的公式求的近似值,直到最后一项的绝对值小于10—6为止t=1,pi=0,n=1,s=1当|t|10-6pi=pi+tn=n+2s=-s;t=s/npi=pi*4输出pi#include<stdio.h>#include<math.h>main(){ints;floatn,t,pi;t=1;pi=0;n=1.0;s=1;while(fabs(t)>=1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf(“pi=%10.6f\n”,pi);}[下一个例程]88a§6.9程序举例[例6.6]用/41-1/3+1/5-P1296.1输入两个正整数m和n,求其最大公约数和最小公倍数。例:m=4,n=6,其最大公约数为i=2最小公倍数4*6/2=12。试探法[下一个例程]89aP1296.1输入两个正整数m和n,求其最大公约数和最#include<stdio.h>voidmain(){intm,n,i;printf("pleaseinputtwointegersn,m\n");scanf("%d,%d",&n,&m);

}if(n<m){i=m;m=n;n=i;}for(i=m;i>=1;i--)if((m%i==0)&&(n%i==0))break;printf(“最大公约数是:%d.\n",i);printf(“最小公倍数是:%d.\n",

m*n/i);[下一张]90a#include<stdio.h>if(n<m){i#include<stdio.h>voidmain(){intm,n,k,i,leap=1;printf("pleaseinputtwointegersn,m\n");scanf("%d,%d",&n,&m);

}if(n<m){k=m;m=n;n=k;}for(i=m;(i>=1)&&leap;i--)if((m%i==0)&&(n%i==0))leap=0;i++;

[下一张]printf(“最大公约数是:%d.\n",i);printf(“最小公倍数是:%d.\n",

m*n/i);91a#include<stdio.h>if(n<m){例6.10译密码。输入若干字符,若为字母字符则将它们变成其后的第四个字母,A-->E,w-->a.非字母字符不变.思路:1.建立循环,循环控制条件是什么?92a例6.10译密码。输入若干字符,若为字母字符则将它们变成其例6.10译密码。输入若干字符,若为字母字符则将它们变成其后的第四个字母,A-->E,w-->a.非字母字符不变.思路:1.建立循环,循环结束以输入回车符为准while((c=getchar())!=’\n’){循环体。。。。}对比:while(c=getchar()!=’\n’)while((c=getchar())!=’\n’)93a例6.10译密码。输入若干字符,若为字母字符则将它们变成其例6.10译密码。输入若干字符,若为字母字符则将它们变成其后的第四个字母,A-->E,w-->a.非字母字符不变.思路:2.判断输入是否是字母

‘a’‘b’……..’z’98……..122‘A’‘B’…….’Z’6566…….90if((c>=‘a’&&c<=‘z’)||(c>=‘A’&&c<=‘Z’))94a例6.10译密码。输入若干字符,若为字母字符则将它们变成其例6.10译密码。输入若干字符,若为字母字符则将它们变成其后的第四个字母,A-->E,w-->a.非字母字符不变.思路:4.若变换后超出z时,要轮回.

(如何判断是否要轮回?如何轮回?)ab……..…z{98……..122123AB…….Z[6566…….90913.变成其后的第四个字母??c=c+4;

if((c>‘Z’&&c<=‘Z’+4)||(c>‘z’))c=c-26;例:W:87,Z:90,W-->A,则:‘W’+4-26

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论