C语言6-循环结构程序设计(update)课件_第1页
C语言6-循环结构程序设计(update)课件_第2页
C语言6-循环结构程序设计(update)课件_第3页
C语言6-循环结构程序设计(update)课件_第4页
C语言6-循环结构程序设计(update)课件_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计

计算机学院1第六章循环结构的程序设计6.1循环的基本概念6.2用while语句设计循环结构程序6.3用do_while语句设计循环结构程序6.4用for语句设计循环结构程序6.5Break语句及continue语句6.6几种循环语句的比较6.7循环的嵌套26.1循环的基本概念求S=1+2+3+......+100S=0;S=S+1;S=S+2;......S=S+100;S=0S=S+i(i=1,2,...,100)s=0i=1i≤100s=s+ii=i+1

yn36.1循环的基本概念重复作某件事的现象称为“循环”;循环结构就是在满足循环条件时,重复执行某程序段,直到循环条件不满足为止,重复执行的程序称为循环体;循环结构有“当型”和“直到型”两种形式;46.2用while语句设计循环结构程序while语句:形式:while(表达式K){循环体S(由若干语句组成)}功能:先判断条件,当条件为真时反复执行循环体,条件为假则退出循环。KS

Y

N56.2用while语句设计循环结构程序while语句说明:while语句构成的循环属于“当型”循环;表达式是控制循环的条件,可以是任何类型的表达式;while语句的特点是:先判断,后执行,有可能循环一次也不执行;66.2用while语句设计循环结构程序求和:1+2+3+…..+100=?main(){inti,s;i=1;s=0;while(i<=100){s=s+i;i++;}printf(“s=%d\n”,s);}问题:是否可以1、去掉while语句的{}2、去掉i++;3、将i++;移到s=s+i;之前7while语句-实例例1:从键盘输入10个整数,求这10个整数之和。count≤10?count=count+1成立不成立输出结果total计数器count=0累加器total=0输入numtotal+=num开始结束while(count<=10){}count=count+1;scanf("%d",&num);total=total+num;程序主体8while语句-实例

#include<stdio.h>main(){intcount,num,total;/*count:计数器,num:输入的整数*/

count=total=0;/*total:存放累加和*/

while(count<=10)/*循环控制条件*/

{

count=count+1;/*循环体*/

printf("EntertheNo.%d=",count);scanf("%d",&num);total=total+num;/*计算累加和*/

}

printf("Total=%d\n",total);}9while语句-实例例2:求1到10的阶乘n!。i<=10?n=n*i成立不成立计数器i=1累积器n=1输入结果i=i+1开始结束while(i<=10){}n=n*i;printf("%d",n);i=i+1;程序主体递推公式:f(n)=1 当n=1时f(n)=f(n-1)*n当n>1时10while语句-实例3循环嵌套:在循环体中,又包含有循环语句。

例3:输出下三角形乘法九九表。123456789---------------------------------------12436948121651015202561218243036714212835424981624324048566491827364554637281假设:行号为i,列号为ji=6j=5i*j(1<=i<=9)(1<=j<=i)

则:第i行中一共要输出i个乘积。11while语句-实例

#include<stdio.h>main(){inti=1,j;/*i:行计数器j:列计数器*/

while(i<=9)/*控制打印表头*/

printf("%4d",i++);

printf("\n------------------------------------\n");i=1;while(i<=9){j=1;/*列计数器置1*/

while(j<=i)/*嵌套的二重循环。输出第i行*/ {printf("%4d",i*j);j++;/*列计数器+1*/}

printf("\n");/*一行输出结束后,输出\n*/i++;/*行计数器+1*/}}外层循环体每执行1次,内层循环要完成由内循环条件所决定的次数12while语句使用注意1.while(0){....}由于循环的条件表达式恒等于0,循环体永远也不会执行,是编程者的错误。2.while(1){....}由于循环的条件表达式恒等于1,所以不可能通过循环控制条件来结束循环体的执行,称为“死循环”。3.为了保证循环正常运行,应该特别注意:循环控制条件

控制条件的初始状态(初始值)循环体内部对控制条件的影响136.3用do_while语句设计循环结构程序do_while语句形式:

do{循环体S}while(K);先执行循环体,当条件为真时反复执行循环体,条件为假则退出循环。KS

N146.3用do_while语句设计循环结构程序do_while语句说明:do_while语句构成“直到型”循环结构;do_while语句的特点是先执行后判断,循环体至少执行一次;重复执行循环体,直到表达式为假时退出循环;156.3用do_while语句设计循环结构程序求积:n!=1*2*3*….*nmain()/*求n!*/{inti,n,s;scanf(“%d”,&n);i=1;s=1;do{s=s*i;i++;}while(i<=n);printf(“%d!=%d\n”,n,s);};doubles;%f16用do_while语句设计循环结构

main(){ints=0,x;scanf("%d",&x);

while(x<=10)

{s=s+x;x++;}

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

main(){ints=0,x;scanf("%d",&x);do

{s=s+x;x++;}

while(x<=10);

printf("s=%d\n",s);}输入:12输出:s=12循环至少执行一次循环没有被执行输入:12输出:s=0while及dowhile的比较176.4用for语句设计循环结构程序

for语句:形式:for(k1;k2;k3){S(循环体)}功能:ki--表达式

k1--用来确定循环变量的初值

k2--确定循环控制条件

k3--确定循环变量的增量先计算k1,当k2为真时执行循环体并计算k3,然后再判断k2,直到k2为假时退出循环。k2S

Y

N计算K1计算k3186.4用for语句设计循环结构程序计算1*2*…*100=?main(){inti;doubles=1;for(i=1;i<=100;i++)s=s*i;printf(“s=%f\n”,s);}循环变量初值循环条件循环变量步长循环体中,如有多条语句要用{}括起来。19for语句中的三个表达式(表达式1,表达式2和表达式3)中的任意一个都可省略,但是分号不能省略。for(n=0;;n++)

缺表达式2,

造成死循环,不可使用!

(除非循环体中有使循环退出的条件)for(n=0;n<100;)

缺表达式3,n增量应在循环体内进行for(;;)

三个表达式都缺省,死循环(同2)for(;n<100;)缺表达式1和表达式3不要用

for语句的其它几种变化形式for(;n<100;n++)

缺表达式1,n应在循环之前赋初值分号始终不能缺!20for语句-实例输出图形*****使用嵌套循环完成main(){inti,j,n;scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n+i-1;j++)printf("%s",j==n-i+1||j==n+i-1?"*":"");printf("\n");}}外循环对行内循环对列216.5Break语句及continue语句break语句:形式:break;(用于循环或switch语句中)功能:终止执行所在的循环(或switch)语句continue语句:形式:continue;(只能用于循环体中)功能:结束本次循环.(不是结束整个循环)226.5Break语句及continue语句

main()/*求1--13中不能被3整除的数*/{inti;for(i=1;i<=13;i++){if(i%3==0)continue;printf(“%d,”,i);}}

输出?1,2,4,5,7,8,10,11,13,1,2,若把continue;换成break;则输出

break;236.6几种循环语句的比较三种循环语句可以处理同一问题;for和while循环语句:先判断,后执行(可能不执行循环)。do_while循环语句:先执行,后判断(至少执行一次循环)for语句用于循环次数确定的情况,while、do_while用于循环次数不确定的情况;do_while语句更适合首次循环肯定执行的情况;24while、do_while语句只能表达循环控制条件,而for语句有3个表达式,不仅能控制循环,而且能控制循环变量的初值及其变化,功能更强。其中for语句中的三个表达式都可省掉(不采用)或部分省掉。通常表达式2不可少,否则循环中必须有使循环退出的条件如果省掉第一、二表达式,分号不可少6.6几种循环语句的比较25循环体可放入表达式3for(i=1;i<=10;printf(“%5d”,i),i++);因为循环体在表达式2之后,表达式3之前执行,如果将循环体语句放入表达式3,循环体语句及原来的表达式3构成逗号表达式,作为循环语句新的表达式3,而for语句就无循环体语句了。语法上循环结构必须要有循环体语句,否则会出现语法错误。

为解决这个问题,在for语句后加一空语句,作为循环体语句用以解决语法的要求。空语句6.6几种循环语句的比较266.7循环的嵌套循环嵌套:循环语句的循环体中又出现循环语句。

main()/*2重循环*/{inti;for(i=1;i<=2;i++)/*外循环*/{printf(“i=%d,j=”,i);for(j=1;j<=3;j++)/*内循环*/printf(“%d,”,j);printf(“\n”);}}输出?外循环的每一次循环(i),均对应整个内循环(j=1,2,3)i=1,j=1,i=2,j=1,2,3,2,3,27嵌套结构规则外循环内循环交叉循环外循环入口内循环出口内循环出口外循环出口外循环出口1.在嵌套的循环中外循环及内循环变量不可同名。2.外循环及内循环不可交叉。286.8应用实例main()/*求10到12中的素数*/{inti,j,k;scanf(“%d”,&k);j=1;/*标志,j=1素数,j=0非素数*/for(i=2;i<k;i++)/*检测k是否素数*/if(k%i==0){j=0;break;}if(j==1)printf(“%dyes\n”,k);elseprintf(“%dno\n”,k);}

输入10输出输入11输出输入12输出for(k=10;k<13;k++)/*外循环提供要检测的数k*/{}内循环10no11yes12no输出:10no11yes12no296.8应用实例求Fibonacci数列{1,1,2,3,5,8......}的前20项递推公式:f1=1,f2=1fi=fi-1+fi-2(i=3,4,…20)main(){longf1,f2,f;inti;f1=f2=1;printf("%12ld%12ld\n",f1,f2);for(i=3;i<=20;i++){f=f1+f2;f1=f2;f2=f;/*为下一项做准备*/printf("%12ld",f);if(i%2==0)printf(“\n”);/*每行2个数*/}}306.8应用实例f1,f2f1f2f1.....

main(){longf1,f2;inti;f1=f2=1;for(i=1;i<=10;i++){printf("%12ld%12ld\n",f1,f2);f1=f1+f2;f2=f2+f1;/*一次产生两个数*/}}316.8应用实例main(){inti,j,k,a,t=0;for(i=1;i<=9;i++)for(j=1;j<=9;j++)for(k=1;k<=9;k++)for(a=1;a<=9;a++){if(i==j||i==k||i==a)continue;if(j==k||j==a||k==a)continue;if(i+j+k+a!=12)continue;printf(“%d,%d,%d,%d”,i,j,k,a);t++;if(t%6==0)printf(“\n”);/*每行6个排列*/}}从1到9中选出4个互不相同的数构成排列,并使它们的和等于12,输出所有这样的排列.如1,2,3,6循环94次判断8*94=52488次326.8应用实例main(){inti,j,k,a,t=0;for(i=1;i<=6;i++)for(j=1;j<=6;j++)for(k=1;k<=6;k++)for(a=1;a<=6;a++){if(i==j||i==k||i==a)continue;if(j==k||j==a||k==a)continue;if(i+j+k+a!=12)continue;printf(“%d,%d,%d,%d”,i,j,k,a);if(t%6==0)printf(“\n”);}}

4个数中任意3个数的和最小值为6,所以4个数均不超过6循环64次判断8*64=10368次336.8应用实例main(){inti,j,k,a,t=0;for(i=1;i<=6;i++)for(j=1;j<=6;j++){if(i==j)continue;for(k=1;k<=6;k++){a=12-i-j-k;if(a<=0||a>6||i==k||i==a)continue;if(j==k||j==a||k==a)continue;printf(“%d,%d,%d,%d”,i,j,k,a);t++;if(t%6==0)printf(“\n”);}}}

循环63次,判断8*63+62=1764次若i,j,k确定,则a=12-i-j-k.取消a循环。另外,i==j?判断及k循环无关,应放在j循环中346.8应用实例main(){inti=1;

floats=0,t=1;while(t>=1e-6){s+=t;i++;t=1/i;/*下一个累加项*/}printf(”s=%f\n",s);}float1.0/i输出:1计算s=1+1/2+1/3+...1/n(1/i≥10-6i=1,2,...n)35*****************************************打印如右图所示的图形6.8应用实例36main(){inti,j,n;scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n-i;j++)printf("");for(j=1;j<=2*i-1;j++)printf("*");printf("\n");}

打印上半三角for(i=n-1;i>=1;i--){for(j=1;j<=n-i;j++)printf("");for(j=1;j<=2*i-1;j++)printf("*");printf("\n");}打印下半三角}*****************************************37小结用while语句设计循环结构程序用do_while语句设计循环结构程序用for语句设计循环结构程序break语句和continue语句循环的嵌套38TheEnd39典型数值问题-例1例1:怎样存钱利最大假设银行整存整取存款不同期限的月息利率分别为:0.63%期限=一年0.66%期限=二年0.69%期限=三年0.75%期限=五年0.84%期限=八年利息=本金×月息利率×12×存款年限 现在某人手中有2000元,请通过计算选择一种存钱方案,使得钱存入银行20年后得到的利息最多(假定银行对超过存款期限的那部分时间不付利息)。40典型数值问题-例1问题分析及算法设计为了得到最多的利息,存入银行的钱应在到期时马上转存。由于存款的利率不同,所以不同的存款方法(年限组合)得到的利息也是不一样的。设2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,则到期时应得的本利合计:2000*(1+r1)i1*(1+r2)i2*(1+r3)i3*(1+r5)i5*(1+r8)i8根据题意还可得到以下限制条件:0<=i8<=20<=i5<=(20-8*i8)/50<=i3<=(20-8*i8-5*i5)/30<=i2<=(20-8*i8-5*i5-3*i3)/20<=i1=20-8*i8-5*i5-3*i3-2*i2可用穷举所有的i8、i5、i3、i2和i1的组合。41典型数值问题-例1#include<math.h>main(){inti8,i5,i3,i2,i1,n8,n5,n3,n2,n1;floatmax=0,term;for(i8=0;i8<3;i8++)/*穷举全部可能的存款方式*/

for(i5=0;i5<=(20-8*i8)/5;i5++) for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++) for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++){i1=20-8*i8-5*i5-3*i3-2*i2; term=2000.0*pow(1+0.0063*12,(double)i1) *pow(1+0.0066*12,(double)i2) *pow(1+0.0069*12,(double)i3) *pow(1+0.0075*12,(double)i5) *pow(1+0.0084*12,(double)i8);

if(term>max){/*记录可能的年限组合*/

max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8; } }printf("%d,%d,%d,%d,%d\n",n8,n5,n3,n2,n1);printf("Total:%.2f\n",max);}42典型数值问题-例2例1:从键盘上任意输入一个正整数,要求判断该正整数是否是另一个整数的平方。问题分析及算法设计设:输入的正整数为i,若i满足:i==m*m(整数m>0)则i为整数的平方。 可以采用试探的方法: 令m从1开始逐步增加进行试探。m*m<i?m=m+1成立不成立输入一个整数i输出m和i开始结束设试探初值m=1m*m==i?成立不成立43典型数值问题-例2scanf(”%d”,&i);m=1;while(m*m<i){

m++;}if(m*m==i)

printf(”%d%d”,m,i);m*m<i?m=m+1成立不成立输入一个整数i输出m和i开始结束设试探初值m=1m*m==i?成立不成立{inti,m;}44典型数值问题-例2#include”stdio.h”intmain(){

inti,m;

scanf(”%d”,&i); m=1; while(m*m<i) m++; if(m*m==i)

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

return0;}for(m=1;m*m<i;m++);如果采用for语句该如何修改?

for语句的循环体是什么?循环体为空语句45典型数值问题-例3一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但及前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。问题分析及算法设计按照题目的要求造出一个前两位数(i)相同、后两位数(j)相同且相互间又不同的整数。 0

<

i<=9 0<=j<=9 i!=j 1100*i+11*j=m*m(m为整数>=31)46典型数值问题-例30

<

i<=90<=j<=9i!=j1100*i+11*j=m*m(m为整数>=31)i<=9?j=0成立不成立i=1k=1100*i+11*ji!=j?成立不成立k是平方?成立不成立输出:k,i,jj++j<=9?成立不成立i++结束for(i=1;i<=9;i++){}for(j=0;j<=9;j++){}if(i!=j){}k=1100*i+11*j;判断k是否平方;47典型数值问题-例3

#include”stdio.h"voidmain(){inti,j,k,m;for(i=1;i<=9;i++)/*i:车号前二位的取值*/

for(j=0;j<=9;j++)/*j:车号后二位的取值*/

if(i!=j){/*判断两位数字是否相异*/

k=i*1100+j*11;

for(m=31;m*m<k;m++)

; /*判断是否为整数的平方*/

if(m*m==k)printf("Lorry_No.is%d.\n",k); }}运行结果:Lorry_No.is7744.48典型数值问题-例4设有一个数X,当X加上100后得到的数Y是一个正整数的平方,然后用Y再加上68,又是另外一个正整数的平方,你能算出X为多少吗?问题分析及算法设计根据题目直接列方程: y=x+100 y=m*m ① y+68=n*n ②

取值范围:x>0;n>m>10的整数采用穷举法求解。49voidmain(

){intx,y,m,flag;

/*flag:标志变量*/for(x=0,flag=1;flag;x++)

/*穷举x*/{y=100+x;

/*计算y*/for(m=1;m*m<y;m++);if(m*m==y)

/*判断y是否为一个数的平方*/{for(;m*m<y+68;m++);if(m*m==y+68)

/*判断y+68*/{printf("%d\n",x);flag=0;

/*flag置0,结束循环*/}}}}典型数值问题-例450例:百钱百鸡问题中国古代数学家张丘建在他的《算经》中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?

设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程: x+y+z=100① 5x+3y+z/3=100②

取值范围:0<=x,y,z<=100

可以采用穷举法求解。将变量x、y、z的所有取值可能代入方程进行计算典型数值问题-例551穷举法基本思路 当x=0,y=0,z=0时:是否满足方程

z=1时:是否满足方程

z=2时:是否满足方程

......

z=100时:是否满足方程 当x=0,y=1,z=0时:是否满足方程

z=1时:是否满足方程

......

z=100时:是否满足方程 当x=0,y=2,z=0时:是否满足方程

...... 当x=100,y=100,z=100时:......z<=100满足方程?YN输出z++z=0y<=100y++y=0x<=100x++x=0开始结束典型数值问题-例552程序z<=100满足方程?YN输出z++z=0y<=100y++y=0x<=100x++x=0开始结束#include<stdio.h>voidmain(){intx,y,z,j=0;for(x=0;x<=100;x++)for(y=0;y<=100;y++)for(z=0;z<=100;z++)if(x+y+z==100&&5*x+3*y+z/3==100) printf("..",++j,x,y,z);}典型数值问题-例553丢失重要条件:z应该能够被3整除。 #include<stdio.h>voidmain(){intx,y,z,j=0;for(x=0;x<=20;x++)for(y=0;y<=33;y++)for(z=0;z<=100;z++) if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100) printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);}运行程序,正确的结果:1:cock=0hen=25chicken=752:cock=4hen=18chicken=783:cock=8hen=11chicken=814:cock=12hen=4chicken=84z+=3)型数值问题-例554优化程序:for(x=0;x<=20;x++)for(y=0;y<=33;y++)for(z=0;z<=100;z++)if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);再优化:for(x=0;x<=20;x++)for(y=0;y<=(100-5*x)/3;y++){z=100-x-y;if(z%3==0&&5*x+3*y+z/3==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);}型数值问题-例555趣味程序:新娘和新郎问题 三对情侣参加婚礼,三个新郎为A、B、C,三个新娘为X、Y、Z。有人不知道谁和谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的:A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚。这人听后知道他们在开玩笑,全是假话。请编程找出谁将和谁结婚。问题分析及算法设计 设:a、b、c三人用1、2、3表示,将x和a结婚表示为x=1,将y不及a结婚表示为y!=1。则:

x!=1A不及X结婚

x!=3X的未婚夫不是C

z!=3C不及Z结婚 题意还隐含:x!=y且x!=z且y!=z56趣味程序:新娘和新郎程序及说明voidmain(){intx,y,z;for(x=1;x<=3;x++)/*穷举X的全部可能配偶*/

for(y=1;y<=3;y++)/*穷举Y的全部可能配偶*/

for(z=1;z<=3;z++)/*穷举Z的全部可能配偶*/

if(x!=1&&x!=3&&z!=3&&x!=y&&x!=z&&y!=z){

printf("Xwillmarryto%c.\n",'A'+x-1);

printf("Ywillmarryto%c.\n",'A'+y-1);printf("Zwillmarryto%c.\n",'A'+z-1);}}57典型数值问题-穷举法的关键数学模型适宜进行穷举的数学模型决定程序是否正确穷举的范围明确的穷举终止条件决定穷举的效率,范围过大,则效率太低。58例4:打印数字魔方。 例如,输入m=5,输出的图形如下:

12345 23451 34512 45123 51234

基本算法:重复打印m行。第i

行的第一个数字为i,之后依次递增,但以m为模:aij=(i+j-2)%m+1

输出项aij与行i、列j的关系典型非数值(图型)问题-例459main(){inti,j,m;printf("EnterM:");scanf("%d",&m);for(i=1;i<=m;i++)/*

控制打印m行*/

{for(j=1;j<=m;j++)/*打印行中的数字*/

printf("%d",(i+j-2)%m+1);printf("\n");}}典型非数值(图型)问题-例460例5:输出数字阵列:

1234 5678 9

温馨提示

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

评论

0/150

提交评论