C语言第5章循环结构_第1页
C语言第5章循环结构_第2页
C语言第5章循环结构_第3页
C语言第5章循环结构_第4页
C语言第5章循环结构_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

第5章循环结构问题的提出:对于这样的一类问题:问题1.从键盘输入100个学生的成绩,求总成绩。问题2.求100以内的素数问题3.求1!+2!+3!+…+10!用前面所学知识来解决这些问题是非常麻烦的对于问题1的一个笨办法:设一个变量,每次输入一个学生成绩,累加后再输入下一个学生成绩,如下:

scanf(“%f”,&a);s=s+a;

scanf(“%f”,&a);s=s+a;………….

这样重复100次,然后输出s的值。是否可用一种语句,使这两句话能自动的重复执行100次,以简化书写的麻烦呢?这就是循环语句的任务。5.1goto循环结构概述C语言可实现循环的语句:用goto

和if构成循环while语句do~while语句for语句goto语句及用goto构成循环goto语句一般格式:

goto

语句标号;

….…..标号:语句;

功能:无条件转移语句说明:不能用整数作标号只能出现在goto所在函数内,且唯一只能加在可执行语句前面限制使用goto语句sum=0+1sum=1+2=3sum=3+3=6sum=6+4……sum=4950+100=5050例用if和goto语句构成循环,求#include<stdio.h>main(){int

i,sum=0;i=1;loop:if(i<=100){sum=sum+i; i++;

gotoloop;}

printf("%d",sum);}循环初值终循环值循环变量增值循环条件循环体例用if和goto语句构成循环,求5.2while循环结构一般形式:while(表达式)

循环体语句;执行流程:expr循环体假(0)真(非0)while特点:先判断表达式,后执行循环体说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环:while(1)

循环体;例用while循环求

/*ch5_2.c*/#include<stdio.h>main(){inti,sum=0;i=101;while(i<=100){sum=sum+i;i++;}

printf("%d",sum);}循环初值循环终值循环变量增值循环条件循环体应注意:1、计数器和累加器的初值;2、一次循环后,循环控制变量的变化情况。3、跳出循环时循环控制变量的值应为多少?例显示1~10的平方/*ch5_21.c*/#include<stdio.h>main(){inti=1;while(i<=10){printf("%d*%d=%d\n",i,i,i*i);i++;}}运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100注意:循环控制变量值在循环体内必须有所改变。

例如:请问下例中循环结束时i值为多少?i=1;while(i<=100)

putchar(‘*’);i++;这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,i++;不属于循环语句。i++应该在循环体内改变:{}do

循环体语句;

while(表达式);执行流程:do循环体expr假(0)真(非0)while5.3do…while循环结构一般形式:特点:先执行循环体,后判断表达式说明:至少执行一次循环体do~while可转化成while结构expr循环体假(0)真(非0)循环体While循环例用do~while循环求

#include<stdio.h>main(){inti,sum=0;i=1;do{sum+=i; i++;}while(i<=100);

printf("%d",sum);}例while和do~while比较/*ch5_4.c*/#include<stdio.h>main(){inti,sum=0;

scanf("%d",&i);do{sum+=i; i++;}while(i<=10);

printf("%d",sum);}main(){inti,sum=0;

scanf("%d",&i);while(i<=10){sum+=i; i++;}

printf("%d",sum);}1、跳出循环时循环控制变量的值应为多少?如果输入值为1,10,20时呢?2、输出结果呢?1.while结构与do-while循环结构相类似.2.但要注意区别:前者:先判断表达式,再执行语句。至少要执行0次后者:先执行语句,再判断表达式。至少要执行1次。3.也就是说用两种循环结构处理同一问题时,若二者的循环体部分是一样的,当while后面表达式的第一次的值为“真(非0)”时,两种循环结构得到的结果相同,否则二者的结果不相同。While与do–while循环结构的比较一般形式:for(循环变量赋初值;循环条件;循环变量增(减)值){

循环体语句;}for(expr1;expr2;expr3){

循环体语句;}5.4for循环结构执行流程:循环条件循环体假(0)真(非0)for赋初值循环变量增(减)值例用for循环求

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

printf("%d",sum);}说明:for语句中expr1,expr2,expr3类型任意,都可省略,但分号;不可省无限循环:for(;;)for语句可以转换成while结构expr1;while(expr2){

循环体语句;

expr3;}例:#include<stdio.h>main(){inti=0;for(i=0;i<10;i++)

putchar(‘a’+i);}输出结果:abcdefghij例:#include<stdio.h>main(){inti=0;for(;i<10;i++)

putchar(‘a’+i);}例:#include<stdio.h>main(){inti=0;for(;i<10;)

putchar(‘a’+(i++));}例:#include<stdio.h>main(){inti=0;for(;i<10;putchar(‘a’+i),i++);}逗号表达式

逗号运算符的主要应用就在for语句中。for语句中的表达式1和表达式3可以是逗号表达式,特别是有两个循环变量参与对循环的控制时。表达式1和表达式3为逗号表达式,将使程序显得非常清晰。main(){int

i,j,k=0;

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

printf("%d\n",k);}

5.5辅助控制语句break语句功能:在循环语句和switch语句中,终止并跳出循环体或开关体说明:break只能终止并跳出最近一层的结构break不能用于循环语句和switch语句之外的任何其它语句之中例break举例:输出圆面积,面积大于100时停止main(){

intr;floatarea;for(r=1;r<=10;r++){area=3.14159*r*r;if(area>100) break;

printf("r=%d,area=%.2f\n",r,area);}}例小写字母转换成大写字母,直至输入非字母字符#include<stdio.h>main(){

inti,j;charc;while(1){c=getchar(); if(c>='a'&&c<='z')

putchar(c-'a'+'A'); else break;}}例判断m是否素数读入mk=mi=2当ikm被i整除真假用break结束循环i=i+1ik+1真假输出:m”是素数”输出:m”不是素数”#include<stdio.h>#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("%disaprimenumber\n",m);else

printf("%disnotaprimenumber\n",m);}continue语句功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断仅用于循环语句中例求输入的十个整数中正数的个数及其平均值#include<stdio.h>main(){inti,num=0,a;floatsum=0;for(i=0;i<10;i++){scanf("%d",&a); if(a<=0)continue; num++; sum+=a;}

printf("%d

,%f\n",num,sum);

printf("Meanvalue:%f\n",sum/num);}【源程序】main(){intn=1;n

while(n<=10){if(n==6)continue;printf("%4d",n);n++;}}请问:

跳出循环时循环控制变量的值应为多少?运行结果呢?该程序有何问题?如果有该如何改正?无限循环;运行结果:12345例.阅读程序并回答问题5.6第4-5章实例解析4输入三个实数,判断是否能构成三角形,如能,说明是何种三角形,等边,等腰,直角

#include<stdio.h>main(){doubled,x,y,z;

scanf("%lf,%lf,%lf",&x,&y,&z);if(x+y<=z||z+y<=x||x+z<=y||x<=0||y<=0||z<=0)

printf(“不能构成三角形”);

else{if(x==y&&y==z)

printf(“构成等边三角形”);

if(x==y||y==z||x==z)

printf(“构成等腰三角形”);if((x*x+y*y==z*z)||(x*x==y*y+z*z)||(x*x+z*z==y*y))

printf(“构成直角三角形”);}}#include<stdio.h>#include<math.h>main(){floata,b,c,m,n,x1,x2;

scanf("%f%f%f",&a,&b,&c);n=-b/(2*a);m=b*b-4*a*c;

if(m==0){x1=x2=n;printf("x1=x2=%f\n",x1);}else

if(m>0){x1=n+sqrt(m)/(2*a);x1=n-sqrt(m)/(2*a);

printf("x1=%f,x2=%f\n",x1,x2);}

else

{x1=n;x2=sqrt(fabs(m))/(2*a);

printf("x1=%f+%fi,x2=%f-%fi\n",x1,x2,x1,x2);}}输入:a=1,b=3,c=2输出:x1=-1.00x2=-2.00循环举例:1.显示输入的字符,如果按的是Esc键,则退出循环;如果按的是Enter键,则不做任何处理,继续输入下一个字符。#include“conio.h”main(){ charch;

for(;;){ ch=getch();/*不带回显的字符输入函数*/

if(ch==27)/*Esc键的ACSII码为27*/break;/*退出循环*/if(ch==13)continue;/*按的是Enter:键,跳过字符输出语句*/

putch(ch);/*显示输入的字符*/}}main(){

intn;longt=1,sum=0;//注意累乘器及累加器的初值

for(n=1;n<100;n++){t=t*n;if(n%2==0)continue;sum=sum+t;}

printf("sum=%ld\n",sum);}次数123…9899t1!2!3!…98!99!sum1!-+3!-+99!n234…99100每次循环后,重要变量的变化情况【例】计算1!+3!+5!+…+99!。分析:该题实质上是一个累加求和的问题,而且已知其循环的次数因此可以用for语句来实现;对于累加应有选择地进行,即只对奇数项求和,可以用if语句和continue语句组合来进行选择性地累加。例:求1/99+2/98+…+1main(){floats=0.0;int

i,j;

for(i=1,j=99;i<=j;i++,j--)s=s+(float)i/j;

printf(“result

is:%f”,s);}次数1234…484950i2345…495051j98979695…515049main(){inti=1,n;floatt,x=1,y=2,m,sum=0;

while(i<=30){m=y/x;sum=sum+m;t=y;y=y+x;x=t;i++;}

printf(“\n%ld”,sum);}例.P772/1,3/2,5/3,8/5,/21/13….求该数列的前30项之和例求Fibonacci数列:1,1,2,3,5,8,……的前40个数1534233159710946750255142293524578241578171855377258417711121393832040570288739088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352102334155

main(){longintf1,f2;

inti;f1=1;f2=1;for(i=1;i<20;i++){printf(“%12ld%12ld”,f1,f2);if(i%2==0)printf(“\n”);f1=f1+f2;f2=f2+f1;}

}循环嵌套举例循环嵌套举例问题:输出图形**********分析:一共4行,每行的‘*’数目与行号相同算法:行用i表示,

当i<=4do{输出i个‘*’换行

}Main(){inti,j;for(i=1;i<5;i++){printf("\n");for(j=1;j<=i;j++)

putchar('*');}}打印3至1000之间的全部素数,并求所有素数的个数。例判断m是否素数读入mk=mi=2当ikm被i整除真假用break结束循环i=i+1ik+1真假输出:m”是素数”输出:m”不是素数”#include<stdio.h>#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("%disaprimenumber\n",m);else

printf("%disnotaprimenumber\n",m);}算法:从i=3开始做分别用2,3,4,…√i除i.如果i被某个数整除,i是素数。i++;测试下一个i;

main(){intm,k,i,n=0;for(m=3;m<=1000;m=m+2){k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>k+1)

{

printf(“%d”,m);

温馨提示

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

评论

0/150

提交评论