第六章循环控制_第1页
第六章循环控制_第2页
第六章循环控制_第3页
第六章循环控制_第4页
第六章循环控制_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

第六章循环控制本章重点、难点:

1、while语句及使用该语句进行程序设计2.for语句及使用该语句进行程序设计

3.初步学会利用C语言来解决一些实际的问题

6.1

概述程序经常会重复执行某些相同的操作,如:求:s=1+2+3+4+…+100算法描述:①s=0;i=1;②s+=i;i++;③判断i是否小于等于100

如果i小于等于100,重复②;

否则,结束。此类根据某个条件重复执行相同算法的结构,称为循环。初始化部分。循环体。

循环的条件:循环应在有限次完成。

C语言提供了三类实现循环的语句:

while,dowhile,for

6.2goto语句goto语句格式:

gotoLabel/*Label:同一函数内语句前的标号。*/作用:转移到标号对应的语句上继续执行。无条件转向语句.loop:if(i<=100){sum=sum+i;i++;

goto

loop;}语句标号的命名规则:与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。不能用整数来作标号。例如:

gotolabeL1;

gotol23;

这样写对吗?6.2goto语句注意:结构化程序设计方法主张限制使用goto语句,因为滥用goto语句将使程序流程无规律、可读性差。但也不是绝对禁止使用goto语句。一般来说,可以有两种用途:与if语句一起构成循环结构;

if(……)goto

kk;从循环体中跳转到循环体外,但在C语言中可以用break语句和continue语句跳出本层循环和结束本次循环。goto语句的使用机会已大大减少,只是需要从多层循环的内层循环跳到外层循环外时才用到goto语句。但是这种用法不符合结构化原则,一般不宜采用,只有在不得已时才使用。6.2goto语句举例:

用if和goto

语句构成循环,求1+2+3+…+100main()/*test1.c*/{inti,sum=0;i=1;

ll:if(i<=100) {sum=sum+i; i++;

goto

ll; }

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

6.3while语句⒈while循环(当型循环)格式:

while(expression)

statement;表达式:值非0,表示满足条件;值为0代表不满足条件。语句(复合语句),重复执行部分(循环体)。流程:e?yesstatement;no举例:求1+2+3+…+100#include<stdio.h>/*test2.c*/voidmain(void){ints=0,i=1;

while(i<=100)

{

s=s+i;/*s+=i;*/i++;}

printf(“s=%d\n”,s);}初始化部分循环体条件测试6.3while语句i=1i<=100Sum=sum+ii=i+10非0注意:

1、循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。如果不加花括弧,则while语句的范围只到while后面第一个分号处。2、在循环体中应有使循环趋向结束的语句.6.4do-while语句格式:

do{

statement;}

while

(expression);

流程:statement;e?yesno含有使条件趋假的语句。while循环与do-while循环的区别:while循环先判条件,后执行循环体;do–while循环先执行循环体,后判条件。6.4do-while语句举例:求:30!#include<stdio.h>voidmain(void){floats=1.0;

inti=1;

do{s*=i;i++;}while(i<=30);

printf(“30!=%f”,s);}初始化。循环体。测试条件。?思考题:1.用do-while实现s=1+2+…+1002.用while实现30!。使条件趋假。6.4do-while语句举例:while和do一while循环的比较1)main()/*test3.c*/2)main()/*test4.c*/{intsum=0,i;{intsum=0,i;

scanf(”%d”,&i);scanf(”%d”,&i);

while(i<=10)

do{sum=sum十i;{sum=sum十i;i++;i++;}}while(i<=10);

printf(“%d”,sum);}printf(“%d”,sum);}Sum=0别忘了6.5for语句⒊for循环格式:

for

(e1;e2;e3)

statement;流程:e1e2?yesstatement;e3no使e2趋假。初值表达式。测试表达式。增值表达式。(1)先求解表达式1;(2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步,若为假(0),则结束循环,转到第(5)步。(3)若表达式为真,在执行指定的语句后,求解表达式3。(4)转回上面第(2)步骤继续执行。(5)执行FOR语句下面的一个语句。

for语句的形式如下:

for(循环变量赋初值;循环条件;循环变量增值)语句

6.5for语句for

(e1;e2;e3)在for循环中,e1、e2、e3都可以省略!1.for语句中表达式1可以省略,其后的分号不能省略。执行时,跳过“求解表达式1”这一步,其它不变。

2.如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。

for(i=l;;i++)sum=sum+I它相当于:

i=1;while(1){sum=sum+i;i++;}求解表达式1语句求解表达式33.表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:for(sum=0,i=1;i<=100;){sum=sum十1;i++;}4.可以省略表达式1和表达式3,只有表达式2,即只给循环条件。6.5for语句如:(省略表达式1和表达式3)for(;i<=100;){sum=sum+i;i++;}相当于:while(i<=100){sum=sum+i;i++;}5.三个表达式都可省略,如:

for(;;)语句相当于:

while(1)语句即不设初值,不判断条件(认为表达式2为真),循环变量不增值.。无终止地执行循环体。6.5for语句6.表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其它表达式。如:

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

表达式3也类似,如:

for(sum=0;i<=100;k++)

表达式1和表达式3可以是一个简单的表这式,也可以是包含一个以上的简单表达式,中间用逗号间隔。如:

for(sum=0,i=1;i<=100;i++)sum=sum+i;或

for(i=0,j=100;i<=j;i++,j--)k=i+j;

7.表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零就执行循环体。

如:

for(;(c=getchar())!=‘\n’;)

printf(“%c”,c);

6.5for语句举例:求:s=1+2+3+…+100#include<stdio.h>voidmain(void){

ints,i;

for(s=0,i=1;i<=100;i++)

{s=s+i;

}

printf(“s=%d”,s);}在for循环中,e1、e2、e3都可以省略!e1省略s=0,i=1;e3省略i++;概念:在一个循环的循环体内又包含一个完整的循环称为循环的嵌套。

打印99乘法表。#include<stdio.h>/*test5.c*/voidmain(void){inti,j;for(i=1;i<=9;i++){for(j=1;j<=9;j++){

printf(“%4d“,i*j);}

printf(“\n“);}}外层循环内层循环说明:

⒈内外层循环采用缩进形式。⒉while和do-while和for可以相互嵌套。

⒊执行次数为内层次数和外存次数的乘积。

如何打印乘法表的一半?6.6循环的嵌套①循环的中断:break语句概念:循环体中可以加分支,判断是否继续执行循环,break语句可以提前结束循环。举例:求:s=1+2+3+…+100voidmain(void)/*test13.c*/{

ints,i;

for(s=0,i=1;;i++)

{s=s+i;if(i>??)break;}

printf(“s=%d”,s);}满足条件,则退出循环。6.7循环的中断(break)和继续(continue)voidmain(void)/*test14.c*/{ints=0,i=1;

for(;;

)

{s=s+i;i++;if(i>??)break;}

printf(“s=%d”,s);}用goto语句如何实现?举例:求:r=1—10的圆的面积,如圆面积大于100则中断。for(r=1;r<=10;r++){area=pi*r*r;if(area>100)break;

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

满足条件,则退出循环。②继续循环:continue语句

continue语句的作用是跳过本次循环剩余的循环体内容,执行下次循环。举例:求1—100内的偶数和。

s=0;for(n=1;n<=100;n++){if(n%2!=0)continue;s+=n;}满足条件,跳过循环体,继续循环。6.7循环的中断(break)和继续(continue)如果不使用continue语句,如何来实现?①条件为恒真的循环——无限循环while(1){…}do{…}while(1);for(;;){…}靠条件控制的break语句退出循环。例:程序等待直到输入字母A。for(;;){

ch=getchar();if(ch==’A’)break;}②循环体为空语句的循环——空循环for(i=1;i<=MAX;t++);作用:程序延时。空语句6.7循环的中断(break)和继续(continue)⑶无限循环和空循环输入10个自然数统计其中偶数的个数及偶数值和。算法框图:start定义变量初始化循环?yes输入偶数?yes统计累加nono输出结果end#include<stdio.h>voidmain(void){

inti,ix,iCount=0,iSum=0;

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

scanf(“%d\n”,&ix);

if(ix%2==0){

iSum+=ix;

iCount++;}

}

printf(“Num=%d\nSum=%d”,iCount,iSum);}循环结构分支结构输入负数?do{if(ix<=0)printf(“dateerror”);}while(ix<=0);算法的健壮性6.8循环和分支相互嵌套⒈求100到200之间的所有素数(只能被1和自身整除的数)。对于自然数n,判断其是否为素数有以下三种方法:①判断n是否能被从2到n-1范围内的数整除;②判断n是否能被从2到(int)(n/2)范围的数整除;③判断n是否能被从2到(int)sqrt(n)范围的数整除;在程序设计中,经常要记录一些状态,作为判断的条件。因此需要在程序中设置一些标志,通常标志是整型变量。程序设计中标志技术的使用:如:设置变量iFlag用于记录是否世素数,

iFlag==1是素数;

iFlag==0不是素数。比较一下各种方法的优越性?6.9程序举例s=sqrt(n);iFlag=1;i从2循环到sn%i==0iFlag=0;break;继续循环直到退出iFlag==0?判断某自然数n是否是素数的算法#include<stdio.h>/*test7.c*/#include<math.h>voidmain(void){

intn,j,s,iFlag;

for(n=101;n<200;n+=2){

s=sqrt(n);

iFlag=1;for(j=2;j<=s;j++){if(n%j==0){iFlag=0;break;}}

if(iFlag)printf(“\n%d”,n);

}}0不是素数;1是素数。枚举所有数构造,测试条件假定n是素数。如果n能被2到s的任意数整除,设标志退出循环。如果n是素数,输出n。程序如下:n为枚举变量,枚举初值100,枚举终值999。测试是否满足条件,满足条件输出n。#include<stdio.h>voidmain(void){

intn,a,b,c;

for(n=100;n<=999;n++){

a=n/100;b=n%100/10;c=n%10;

if(a*a*a+b*b*b+c*c*c==n)

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

}}枚举所有三位数构造条件测试条件取n的百位a、十位b、个位c。

⒉求水仙花数(条件:三位数的个、十、百位的立方和等于该数。153==13+53+33)。36人一次搬36块砖,男搬4,女搬2,两个小孩抬一块。要一次搬完。问:男、女、小孩要多少?(要求输出所有的方案)思考题:3.求ex=1+x+x2/2!+…+xn/n!前n+1项之和。迭代次数i:012…n迭代公式t=t*x/i迭代初值exp=1,t=1,(i=1~n)#include<stdio.h>voidmain(void){floatexp,x,t;

inti,n;

scanf(“%f,%d”,&x,&n);t=1.0;

exp=1.0;

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

t*=x/i;

exp+=t;

}

printf(“\n%f”,exp);}迭代初值。迭代公式。迭代过程附加条件:当|t|<10-5,结束运算。if(fabs(t)<1e-5)break;(0,0)yxf(x)ab面积hx迭代求积分的方法①将[a,b]分为n等份,h=(b-a)/n;②求n个梯形面积之和,第i小面积x=x+hf1=f(x)下底s=s+(f0+f1)*h/2f0=f1迭代x初值为as初值为0f0初值为f(a)

次数为n4.用梯形法求定积分#include<stdio.h>/*test10.c*/voidmain(void){floata,b,f0,f1,h,x,s=0.0;

intn,i;

scanf(“%f,%f,%d”,&a,&b,&n);h=(b-a)/n;

x=a;f0=x*x+12.0*x+4.0;

for(i=0;i<n;i++){

x=x+h;f1=x*x+12.0*x+4.0;s=s+(f0+f1)*h/2.0;f0=f1;

}

printf(“%f”,s);}迭代初值。迭代循环程序如下:迭代次数:i=1~n迭代初值:s=0.0,t=a迭代公式:t=t*10+a#include<stdio.h>voidmain(void){floats,t;

inti,a,n;

do{scanf(“%d,

温馨提示

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

评论

0/150

提交评论