2020/1/29C语言程序设计主讲:杨雪青E-mail:yangxueqing@ncwu.edu.cn华北水利水电学院计算中心2020/1/29一、几种循环的比较C语言中,三种循环结构都可以用来处理同一个问题,但在具体使用时存在一些细微的差别。如果不考虑可读性,一般情况下它们可以相互代替。循环变量初始化:while和do-while循环,循环变量初始化应该在while和do-while语句之前完成;而for循环,循环变量的初始化可以在表达式1中完成。循环条件:while和do-while循环只在while后面指定循环条件;而for循环可以在表达式2中指定。循环变量修改使循环趋向结束:while和do-while循环要在循环体内包含使循环趋于结束的操作;for循环可以在表达式3中完成。for循环可以省略循环体,将部分操作放到表达式2,表达式3中,for语句功能强大。while和for循环先测试表达式,后执行循环体,而do-while是先执行循环体,再判断表达式。(所以while,for循环是典型的当型循环,而do-while循环可以看作是直到型循环)。第五讲循环结构程序设计(二)2020/1/29一、几种循环的比较三种基本循环结构一般可以相互替代,不能说哪种更加优越。具体使用哪一种结构依赖于程序的可读性和程序设计者个人程序设计的风格(偏好)。我们应当尽量选择恰当的循环结构,使程序更加容易理解。(尽管for循环功能强大,但是并不是在任何场合都可以不分条件使)。例:将50-100之间的能被3整除的数输出(用三种循环结构实现)第五讲循环结构程序设计(二)/*用while语句实现*/main(){inti=50;while(i=100){if(i%3==0)printf(“%4d”,n);i++;}}2020/1/29二、循环的嵌套所谓循环的嵌套是指一个循环体内又包含了另一个完整的循环结构。C语言允许循环结构嵌套多层。循环的嵌套结构又称为多重循环。第五讲循环结构程序设计(二)do循环体1for(表达式1;表达式2;表达式3)循环体2while条件2020/1/29二、循环的嵌套2.循环嵌套的执行过程例.写出下列程序的执行结果*********************#includestdio.hmain(){inti,j;for(i=1;i=6;i++){for(j=1;j=i;j++)printf(*);printf(\n);}}第五讲循环结构程序设计(二)2020/1/29例计算并输出10以内(包括10)所有自然数的阶乘值。即计算1!,2!,3!,4!,5!,6!,7!,8!,9!,10!。采用的方法是,对于10以内的每一个自然数分别求它们的阶乘值。其流程图如图4.7所示。显然,这是一个二重循环结构。FORN=1TO10S=1.0FORK=1TONS=S*K输出S第五讲循环结构程序设计(二)2020/1/29相应的C程序如下:#includestdio.hmain(){intn,k;doubles;for(n=1;n<=10;n=n+1){s=1.0;for(k=1;k<=n;k=k+1)s=s*k;printf(%2d!=%16.7f\n,n,s);}}第五讲循环结构程序设计(二)2020/1/29例百钱买百鸡:公元5世纪末,我国古代数学家张建丘在《算经》中提出了“问题”;“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”此题用代数方法是无法求解的。因为有3个未知数,只有2个方程式。设公鸡x只,母鸡y只,小鸡z只,可以列出方程:x+y+z=100①5x+3y+z/3=100②由于无法直接用代数方法解,可以用“穷举法”来解此问题。分析一下x,y,z的可能取值范围:公鸡最多能买20只,故0≤x<20;母鸡最多能买33只,所以0≤y<33;在x,y确定后,自然就得出z=100-x-y。第九讲循环结构程序设计(三)2020/1/29百钱买百鸡问题程序#includestdio.hmain(){intx,y,z;printf(\ncockhenchick\n);for(x=0;x=19;x++)for(y=0;y=32;y++){z=100-x-y;if((5*x+3*y+z/3==100)&&(z%3==0))printf(%5d,%5d,%5d\n,x,y,z);}}第九讲循环结构程序设计(三)2020/1/29例:有一个数列,前两个数是1,1,第三个数是前两个数之和,以后每个数都是其前两个数之和,此数列的前几个数为1,1,2,3,5,8…要求输出前20个数。数列称为Fibonacii,斐波那契数列第九讲循环结构程序设计(三)递推过程:1123581321…(第1次)f1f2+f1f2(第2次)(第3次)f1f2+f1f2f1f2+f1f22020/1/29第九讲循环结构程序设计(三)#includestdio.hmain(){intf1=1,f2=1,i;printf(%8d%8d,f1,f2);for(i=1;i10;i++){f1=f1+f2;f2=f2+f1;printf(%8d%8d,f1,f2);}}斐波那契数列问题程序2020/1/29三、循环控制语句1、break语句C语言中的break语句有以下两个功能:(1)跳出switch结构;(2)退出当前循环结构,包括while结构、do…while结构和for循环结构。2、continue语句continue语句的功能是结束本次循环的执行,但不退出循环结构。下面举两个例子来说明continue语句的使用。第五讲循环结构程序设计(二)2020/1/29sumsum222要求:sum=1+2+3+…直到大于100,输出第七讲循环结构程序设计(一)#includestdio.hmain(){inti,sum=0;for(i=1;i=10;i++){sum=sum+i*i;if(sum=100)break;}printf(i=%d,sum=%d,i,sum);}2020/1/29例:输入一个整数n,判断它是否为素数。#includestdio.hmain(){intn,k,i,flag=0;printf(\ninputn:);scanf(%d,&n);k=n/2;for(i=2;i=k;i++)if(n%i==0){printf(“\n%disnotaprimenumber”,n);flag=1;break;}if(flag==0)printf(\n%disaprimenumber,n);}第五讲循环结构程序设计(二)2020/1/29例输出100~200之间所有能被7或9整除的自然数。第五讲循环结构程序设计(二)相应的C程序如下:#includestdio.hmain(){intn;for(n=100;n<=200;n=n+1){if(n%7!=0)&&(n%9!=0))continue;/*结束本次循环,继续进行下次循环*/printf(%d\n,n);}}2020/1/29第五讲循环结构程序设计(二)实际上,上述程序等价于#includestdio.hmain(){intn;for(n=100;n<=200;n=n+1){if(n%7==0)||(n%9==0))printf(%d\n,n);}}2020/1/29例:输出100~200之间的所有素数。?第五讲循环结构程序设计(二)2020/1/29四、循环结构程序设计举例1、密码问题在报文通信中,为使报文保密,发报人往往要按一定规律将其加密,收报人再按约定的规律将其解密(即将其译回原文)。最简单的加密算法是将报文中的每一个英文字母换成其后的第k个字母,例如k=3时,字母a转换为d,b转换为e,z转换为c等。第五讲循环结构程序设计(二)2020/1/29例从键盘输入一行字符,将其中的英文字母进行加密输出(非英文字母不用加密)。C程序如下:#includestdio.hmain(){charc;intk;printf(inputk:);scanf(%d,&k);scanf(%c,&c);/*吃掉上次输入的回车符*/c=getchar();while(c!='\n'){if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){c=c+k;if(c>'z'||(c>'Z'&&c<='Z'+k))c=c-26;}printf(%c,c);c=getchar();}}2020/1/29解密算法C程序如下:#includestdio.hmain(){charc;intk;printf(inputk:);scanf(%d,&k);scanf(%c,&c);/*吃掉上次输入的回车符*/c=getchar();while(c!='\n'){if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){c=c-k;if((c‘a'&&c=‘a‘-k)||(c‘A'))c=c+26;}printf(%c,c);c=getchar();}}2020/1/29四、循环结构程序设计举例2、梯形法求定积分设定积分为由微积分的知识可以知道,该积分值的几何意义是在区间[a,b]内的曲线f(x)下的面积,如图4.12所示。baxxfSd)(Y0Xaxixi+1bf(x)h定积分几何意义2020/1/29梯形法求定积分的基本思想是:首先将积分区间[a,b]n等分,得到n个子区间[xi,xi+1](i=0,1,2,…,n-1),每一个子区间的长度为h=(b-a)/n,如图4.12所示,其中xi=a+i×h。然后在每一个子区间上用梯形的面积来近似代替该子区间上小长条的面积。最后将所有小长条的面积近似值Si累加就可得到积分值的近似值。即S==)]()([21iiixfxfhSbaxxfd)()]()([2110iniixfxfh)()]()([211niixfhbfafh2020/1/29其流程图如图4.13所示。输入等分数n给a,b赋值h=(b–a)/nS=h[f(a)+f(b)]/2i=1,P=0当inX=a+i*hP=P+f(x)S=S+P*h输出S图4.13梯形法求定积分2020/1/29例4.18用梯形法求积分dx即a=0,b=1,f(x)=。102exS2ex2020/1/29相应的C程序如下:#includestdio.h#includemath.hmain(){intn,k;doublea=0.0,b=1.0,h,s,p,x;printf(inputn:);scanf(%d,&n);/*输入等分数*/h=(b-a)/n;s=h*(exp(-a*a)+exp(-b*b))/2;p=0.0;for(k=1;k<n;k=k+1){x=a+k*h;p=p+exp(-x*x);}s=s+p*h;printf(s=%11.7f\n,s);}2020/1/29作业:P1134.07,4.09第三讲选择结构程序设计