C语言循环控制_第1页
C语言循环控制_第2页
C语言循环控制_第3页
C语言循环控制_第4页
C语言循环控制_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

程序的结构:

顺序结构选择结构循环结构第6章循环结构OUTLINE

C语言的三种循环语句

while语句

do…while语句

for语句

与循环语句相关的程序控制语句即:

break、continue、goto语句本章学习注意事项

各循环语句的执行过程循环的初始条件循环何时终止,如何控制?if与goto构成的循环请先看下面一段程序:main(){ints=0,i=1;

loop:if(i<100){s=s+i;i=i+1;

goto

loop;}

printf(“s=%d\n”,s);}loop:语句标号goto

loop:无条件转向语句if与goto构成了循环

格式:

goto

语句标号;

功能:将程序控制转移到“语句标号”标识的语句执行。

无条件转向语句:goto语句标号:

用标识符表示

用来标识语句,它出现在语句的前面,用冒号(:)与语句分开,使用格式为:

语句标号:语句;p1:printf(“hello!”);

printf(“world!”);

….

gotop1;2a:printf(“thisisabook!”);

goto2a;

×

语句标号仅对goto语句有意义,通常只给goto语句要转去的语句加标号。

格式:

语句标号:if(表达式)

{语句;

goto

语句标号;}

执行过程:当if中的表达式为真时,执行循环体,为假时跳出循环,执行循环体下面的语句。

用if和goto语句构成循环循环体说明:goto语句容易造成程序不清晰,不利于实现结构化程序设计,因此,最好不用在程序中使用它。while语句实现当型循环

格式:

while(表达式)

{循环体;}

执行过程:先求解表达式的值。判断表达式的值,为真则执行循环体。再判断表达式的值,重复上述工作。当表达式的

值为假时退出循环。

执行过程用流程图表示为:循环体表达式flasetrue

循环控制的实现。考察下列各例,总结控制循环执行的方式。例6-1`、main(){

inti=1,sum=0;

while(i<=100){sum+=i;i++;}}i不仅参与运算,还要控制循环。注意:循环体用{}括起来;

初始值:i=1,sum=0;

循环条件:i<=100

循环控制:i++;循环控制方式之一:计数法这后面没有分号将内嵌语句用大括号括起来形成复合语句。#include<stdio.h>main(){charc;

c=getchar();

while(c!=‘\n’){switch(c-’2’){case0:case1:putchar(c+4);case2:putchar(c+4);break;case3:putchar(c+3);default:putchar(c+2);break;}

c=getchar();}}例2while((c=getchar())!=‘\n’)表达更为简洁。循环控制方式之二:标志法

只要满足一定条件,需要多少次就运行多少次。

初始值:无;

循环条件:(c=getchar())!=‘\n’

循环控制:输入的字符while((c=getchar())!=‘\n’)while(c=getchar()!=‘\n’)×#include<stdio.h>main(){charc;

while((c=getchar())!=‘\n’){switch(c-’2’){case0:case1:putchar(c+4);case2:putchar(c+4);break;case3:putchar(c+3);default:putchar(c+2);break;}}}Example6.1-Programmain()/*计算y=xn*/{

intcount,n; floatx,y;

printf("Enterthevaluesofxandn:");

scanf("%f%d",&x,&n); y=1.0; count=1; /*Initialization*/ /*LoopBegins*/ while(count<=n) /*Testing*/ { y=y*x; count++; /*Incrementing*/ } /*EndofLoop*/

printf("\nx=%f;n=%d;xtopowern=%f\n",x,n,y);}while循环控制语句:例例:编程计算1+2+22+23+...+264voidmain(){doublesum=0,p=1;

inti=1;

while(i<=64){sum+=p;p*=2;i++;}printf(“%.7le\n”,sum);

getch();}◆

1.下面程序执行的结果是()。voidmain(){

intn=0;while(n=0)n=n-1;

printf(“n=%d\n”,n);}(A)n=0 (B)while构成无限循环(C)n=1 (D)n=-1课堂练习:while语句答案:(A)◆

2.下面程序执行的结果是()。voidmain(){

intn=0;while(n==0)n=n-1;

printf(“n=%d\n”,n);}(A)n=0 (B)while构成无限循环(C)n=1 (D)n=-1课堂练习:while语句答案:(D)课堂练习:while语句◆

3.下面程序执行的结果是()。voidmain(){

intn=1;while(n=1)n=n-1;

printf(“n=%d\n”,n);}(A)n=0 (B)while构成无限循环(C)n=1 (D)n=-1答案:(B)课堂练习:while语句◆

4.下面程序执行的结果是()。voidmain(){

intn=1;while(n=n-1)n=n-1;

printf(“n=%d\n”,n);}(A)n=0 (B)while构成无限循环(C)n=1 (D)n=-1答案:(A)课堂练习:while语句◆5.下面程序执行的结果是()。voidmain(){

intn=2;while(n=n-1)n=n-1;

printf(“n=%d\n”,n);}(A)n=0 (B)while构成无限循环(C)n=1 (D)n=-1答案:(B)◆6.写出下面程序运行的结果。voidmain(){

intnum=18,bin=0;

while(num){bin=num%2;num=num/2;

printf(“%d”,bin);}}课堂练习:while语句答案:01001◆7.写出下面程序运行的结果。voidmain(){

intnum=123,sum=0;

while(num){sum=sum+num%10;num=num/10;}

printf(“sum=%d”,sum);}课堂练习:while语句答案:sum=6dowhile循环直到型循环

格式:

do{循环体;}while(表达式);

执行过程:先执行循环体。再求解表达式的值,判断,为真则执行循环体,否则退出循环。

执行过程用流程图表示为:循环体语句表达式flasetrue例1_2main(){

inti=1,sum=0;do{sum+=i;i++;}while(i<=100);}采用的是什么循环结束控制方法?计数法

应用例:main(){int

i,flag;i=0;flag=0;do{i++;if(i%3==2&&i%5==3&&i%7==2)flag=1;}while(flag!=1);

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

采用的是什么循环结束控制方法?标志法调试下列程序,并指出是实现的什么功能。main(){intk,num;k=1;num=26;do{k*=num%10;num/=10;}while(num);printf("k=%d\n",k);}

while与do..while:

while:先判定表达式,后执行循环;

do…while:先执行循环,再判断表达式;

即:do…while语句的循环体至少会被执行一次。inti=0;while(i){…}inti=0;do{…}while(i);执行0次执行1次除循环体一次都不执行的情况外,while与

do…while可以互相转换。for语句步长型循环

格式:

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

{循环体;}

执行过程:执行表达式1(初始化表达式);判断表达式2,为真则执行循环体,否则退出循环;执行表达式3(修正表达式);再判断表达式2,…

重复上述过程,直到表达式2值为假。

执行过程用流程图表示为:求解表达式1表达式2flasetrue循环体语句求解表达式3for语句的下一语句for语句一般说来,for语句的格式可以理解为如下形式:for(初始化表达式;条件表达式;修正表达式)

{循环体语句}例如:求1——100的和

inti,sum=0;

for(i=1;i<=100;i++){sum=sum+i;}sum=sum+iTFi<=100i=1i++由for语句流程图可以看出,可以有以下几种省略形式:

表达式1省略,但不能省略分号。但给循环变量赋初值应在for语句前完成。例如:

i=1;for(;i<=100;i++){…}

表达式3省略,但不能省略分号。但要将表达式3包含到循环体中。例如:

…for(i=1;i<=100;){…

i++;}

表达式1、3省略,但不能省略分号。但要将在for语句前赋初值,并将表达式3包含到循环体中。此时相当于while循环。例如:

i=1;for(;i<=100;){…

i++;}

表达式2省略,但不能省略分号。但要在循环体中控制循环的结束。例如:

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

if(i>100)break;

…}

表达式1、2、3省略,但不能省略分号。但要在循环体中控制循环的结束。此时,相当于while(1)语句。例如:

i=1;for(;;){…

if(i>100)break;

i++;

…}

表达式1、3可以是一个简单的表达式,也可以是逗号表达式。如:

sum=0;for(i=1;i<100;i++)可以写为:

for(sum=0,i=1;i<100;i++)◆1.写出下面程序运行的结果。voidmain(){charch;

for(ch=‘A’;ch<‘G’;ch=ch+1){

printf(“%c”,ch);}}课堂练习:for语句答案:ABCDEF◆2.写出下面程序运行的结果。voidmain(){charch=‘a’;intn;

for(n=1;n<=5;n=n+1){if(n%2==0)ch=ch+33;elsech=ch–32;

printf(“%c”,ch);}}课堂练习:for语句答案:AbBcC◆3.写出下面程序运行的结果。voidmain(){

inta=2,i,sum=0,temp=0;for(i=1;i<=4;i=i+1){temp=temp*10+a;sum=sum+temp;}

printf(“sum=%d”,sum);}课堂练习:for语句答案:sum=2468◆4.写出下面程序运行的结果。voidmain(){

inti,f1=1,f2=1,f3,sum=0;for(i=1;i<=4;i=i+1){f3=f1+f2;sum=sum+f3;f1=f2;f2=f3;}

printf(“sum=%d”,sum);}课堂练习:for语句答案:sum=18◆5.写出下面程序运行的结果。voidmain(){

inti,f1=1,f2=1,sum=0;for(i=1;i<=3;i=i+1){sum=sum+f1+f2;f1=f1+f2;f2=f2+f1;}

printf(“sum=%d”,sum);}课堂练习:for语句答案:sum=20break语句跳出循环体或switch结构注意:只跳出本层次循环Example6.5Theprogramreadsalistofpositivevaluesandcalculatestheiraverage.main(){

intm; floatx,sum,average;

printf("Thisprogramcomputestheaverageofasetof numbers\n");

printf("Entervaluesoneafteranother\n");

printf("EnteraNEGATIVEnumberattheend.\n\n"); sum=0;

for(m=1;m<=1000;++m) {

scanf("%f",&x);

if(x<0)

break; sum+=x; } average=sum/(float)(m-1);

printf("\n");

printf("Numberofvalues=%d\n",m-1);

printf("Sum =%f\n",sum);

printf("Average =%f\n",average);}continue语句

格式:

continue;

功能:结束本次循环,接着进行下一次循环。Example6.7Theprogramevaluatesthesquarerootofaseriesofnumberandprintstheresults.Theprocessstopswhenthenumber9999istypedin.#include<math.h>main(){

intcount,negative; doublenumber,sqroot;

printf("Enter9999toSTOP\n"); count=0; negative=0;

while(count<=100) {

printf("Enteranumber:");

scanf("%lf",&number);

if(number==9999)

break; /*EXITFROMTHELOOP*/

if(number<0) {

printf("Numberisnegative\n\n"); negative++;

continue; /*SKIPRESTOFTHELOOP*/ }

sqroot=sqrt(number);

printf("Number=%lf\nSquareroot=%lf\n\n",number,sqroot); count++; }

printf("Numberofitemsdone=%d\n",count);

printf("\n\nNegativeitems=%d\n",negative);

printf("ENDOFDATA\n");}break、continue例1main(){

inti;

for(i=1;;i++){if(i==5)break;

printf(“%d”,i*i);}

printf(“*”);}结果:14916*break、continue例2main(){

intn;

for(n=100;n<=200;n++){if(n%3==0)continue;

printf(“%d”,n);}}输出100—200间所有不能被3整除的数break、continue例3#include<stdio.h>main(){int

a,b;

for(a=1,b=1;a<=100;a++){if(b>=20)break;if(b%3==1){b+=3;continue;}b-=5;}

printf(“%d\n”,a);}A)7B)8C)9D)10答案:Bbreak、continue例4main(){intk=0;charc=‘A’;do{switch(c++){case‘A’:k++;break;case‘B’:k--;case‘C’:k+=2;break;case‘D’:k=k%2;continue;case‘E’:k=k*10;break;default:k=k/3;}k++;}while(c<‘G’);

printf(“k=%d\n”,k);}k=3B)k=4C)k=2D)k=0答案:Bbreak、continue例5main(){int

i,j,x=0;for(i=0;i<2;i++){x++;

for(j=0;j<=3;j++){if(j%2)continue;x++;}x++;}printf(“x=%d\n”,x);}x=4B)x=8C)x=6D)x=12答案:B

#include<math.h>

#include<stdio.h>

main(){intm,k,i;

scanf(“%d”,&m);k=(int)sqrt(m);for(i=2;i<=k;i++)if(m%i==0)

break;

if(i>=k+1)

printf("%disaprimenumber!\n",m);

else

printf("%disnotaprimenumber!\n",m);

}例:判断m是否为素数读入mk=sqrt(m)I=2当I<=km被I整除真假用break结束循环I=I+1I>=k+1真假输出是素数输出不是素数

和break语句对比:

breakcontinue环境可用在循环语句与switch语句只能用在循环语句功能跳出当前整个循环语句与switch语句跳出本次循环,继续下一次循环均不能控制if…goto构成的循环在多重循环中,break用于跳出本层循环。循环语句嵌套及应用循环嵌套:例1#include<stdio.h>main(){int

i,j,x=0,y=0;

for(i=0;i<2;i++){x++;for(j=0;j<=3;j++){if(j%2)x=x+2;y++;}x++;}

printf(“x=%d,y=%d”,x,y);}外层循环内层循环结果:x=12,y=8Program6_2Aprogramtoprintthemultiplicationtablefrom1×1to12×10asshownbelowisgiven:

12345678910246810121416182036912151821242730481216202428323640510152025303540455061218243036424854607142128354249566370816243240485664728091827364554637281901020304050607080901001122334455667788991101224364860728496108120#defineCOLMAX10#defineROWMAX12main(){

introw,column,y; row=1;

printf("MULTIPLICATIONTABLE\n");

printf("------------------------------------------\n"); do /*........OUTERLOOPBEGINGS..........*/ { column=1; do /*..........INNERLOOPBEGINS..........*/ { y=row*column; printf("%4d",y); column=column+1; }

while(column<=COLMAX);/*INNERLOOPENDS*/

printf("\n"); row=row+1; }

while(row<=ROWMAX);/*...OUTERLOOPSENDS...*/

printf("------------------------------------------\n");}6_2B#defineCOLMAX10#defineROWMAX12main(){

introw,column,y;row=1;

printf("MULTIPLICATIONTABLE\n");

printf("------------------------------------------\n");

while(row<=ROWMAX)/*........OUTERLOOPBEGINGS..........*/{column=1;

while(column<=COLMAX){y=row*column;printf("%4d",y);column=column+1;}/*INNERLOOPENDS*/

printf("\n");row=row+1;}printf("------------------------------------------\n");}用for来实现呢?

例:请看下面一段程序。(循环的嵌套)main(){int

i,j;

for(i=5;i;i--){for(j=0;j<4;j++)

printf(“*”);

printf(“\n”);}}main(){int

i,j;

for(i=5;i;i--){for(j=0;j<i;j++)

printf(“*”);

printf(“\n”);}}****

****

****

****

*********

****

***

**

*思考:main(){int

i,j;

for(i=5;i;i--){for(j=0;j<4;j++)

{if(j%2==0)break;

printf(“*”);}

printf(“\n”);}}无输出main(){int

i,j;

for(i=5;i;i--){for(j=0;j<4;j++)

{if(j%2==0)continue;

printf(“*”);}

printf(“\n”);}}**

**

**

**

*******************************************例.

输出下列图形#include<stdio.h>voidmain(){inti,j,k;

for(i=1;i<=5;i++)/*菱形图的第一至第五行*/{ for(j=1;j<=5-i;j++)/*空格数5-i个*/

printf("");

for(k=1;k<=2*i-1;

温馨提示

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

评论

0/150

提交评论