收藏 分销(赏)

C语言第六章.ppt

上传人:w****g 文档编号:13438629 上传时间:2026-03-15 格式:PPT 页数:94 大小:2.13MB 下载积分:10 金币
下载 相关 举报
C语言第六章.ppt_第1页
第1页 / 共94页
C语言第六章.ppt_第2页
第2页 / 共94页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第6章 循环结构程序设计,6,.1 循环语句概述,6,.2 while语句,6,.3 直到型循环do-while语句,6,.4 break语句与continue语句,6,.5 应用举例,C语言三大结构,1、顺序,2、选择,3、循环,解题步骤:,1、算法,2、变量,3、输入,4、计算处理,5、输出,一 概述,没有循环结构等于没有计算机,例如,求:1+2+3+.+100,求:sinx=x,几乎所有数学函数均需展开成多项式,求其近似值,均离不开,循环结构.,x,3,x,5,x,7,3!,5!,7!,-,当表达式值为真,循环体语句,表达式,语句,非0,0,(a),(b),准备部分,控制部分,工作部分,修改部分,出循环,未结束,结束,准备部分,完成赋初值,(如累加变量清零,累乘变量置1等),设置循环次数,工作部分,反复多次被执行的操作,修改部分,保证循环做有规律的变化,控制部分,可按已设置的循环次数或控制循环条件结束循环,组成 作用,6.1,循环语句概述,求1100的累计和。,根据已有的知识,可以用“1+2+100”来求解,但显然很繁琐。现在换个思路来考虑:,首先设置一个累计器sum,其初值为0,利用sum+=n来计算(n依次取1、2、100),只要解决以下3个问题即可:(1)将n的初值置为1;(2)每执行1次“sum+=n”后,n增1;(3)当n增到101时,停止计算。此时,sum的值就是1100的累计和。,问题:,100,求 sum=,i,i=1,i=1;sum=0;,sum=部分累加和+i (i=1100),sum=sum+i;i+;,.100行,sum=sum+i;i+;,goto 语句及其构成的循环,goto,语句为无条件转向语句,一般形式为:,goto,语句标号;,语句标号的命名规则与变量名相同。,goto语句程序的可读性差、无规律,不符合结构化程序设计原则,不建议使用。,其中“loop:”为语句标号(格式:标号:语句行),其命名遵循标识符命名规则。,goto语句格式:goto 标号,功能为:使系统转向标号所在的语句行执行。,注意,:结构化程序设计方法,主张限制使用goto语句。因为滥用goto语句,将会导致程序结构无规律、可读性差。,4-1 while语句,一般形式:,While(表达式),语句,功能:,当表达式为非0值时,执行while 语句中的内嵌语句。,特点:,判断表达式,后执行语句。,当表达式值为真,循环体语句,表达式,语句,非0,0,(a),(b),while(条件),重复执行的,一条,语句;,不满足,满足,重复执行的语句;,后一语句,;,条件?,复合语句,while 语句的例题,求1+2+100=?,思路:,表达式,i=1,sum=sum+i,i=i+1,真,假,当i=100,i=1,sum=sum+i,i=i+1,程序:,main(),int i,sum=0;,i=1;,while(i=100),sum=sum+i;,i+;,printf(“%d”,sum);,循环体若包含一个以上语句,应用花括号括起来,循环体中应有使循环趋向于结束的语句,例4.main(),int i=0;,while(i=4),printf(“i=%dn”,i);,i+=2;,演示,结果?,例,7.main(),int,i=0;,while(i=4),printf(“i,=%dn”,i);,i+=2;,结果?,while语句的使用要点:,a.用作循环条件的表达式中必须至少包含一个能够改变表达式值的变量,这个变量称为循环变量。,b.在第一次执行测试表达式的值以前,必须通过适当的方式(输入或赋值)给循环变量赋初值。,c.在下一次测试表达式的值以前(即循环体中)必须有能够改变循环变量值的语句(赋值或输入),且循环变量值的改变应保证循环条件最终取假值。,2执行过程,(1)执行循环体语句组。,(2)计算“循环继续条件”表达式。如果“循环继续条件”表达式的值为非 0(真),则转向(1)继续执行;否则,转向(3)。,(3)执行do-while的下一条语句。,do-while循环语句的特点是:先执行循环体语句组,然后再判断循环条件。,do-while,语句实现流程,要反复执行的语句,循环表达式,非0,=0,下一条语句,先循环,后判断,程序:,main(),int i,sum=0;,i=1;,do,sum=sum+i;,i+;,while(i=100);,printf(“%d”,sum);,程序:,main(),int i,sum=0;,i=1;,while(i0);,printf(“sum,=%d”,s,um);,sum-x);,?,当精度达到:第n项eps);,printf(n=%d y=%fn,i-1,y);,编写数列求和程序,:,1+1/2+.+1/n,main(),int i=1;,float eps,y=0,t=1;,scanf(%f,while,(t=eps),t=1.0/i;,y+=t;,i+;,printf(n=%d y=%fn,i,y);,输入精度,:,第,n,项,=,精度 即可,用,while,编写数列求和程序,:,1+1/2+.+1/n,作业,P120 6.2;,一般形式:,While(表达式),语句,功能:,当表达式为非0值时,执行while 语句中的内嵌语句。,特点:,判断表达式,后执行语句。,当表达式值为真,循环体语句,表达式,语句,非0,0,(a),(b),5.3,当型循环,while,语句,5.3,直到型循环,do-while,语句,1一般格式,do,循环体语句组;,while(循环继续条件),;,/*本行的分号不能缺省*/,P,A,真,假,A,直到P为真,for 语句格式:,for(初值表达式,;,循环继续表达式,;,循环变化表达式),一条要反复执行的语句;,三个独立的表达式,for(i=1;,i=10,;i+),sum=sum+i;,6.5 for()循环,循环继续表达式,for 语句格式:,for(初值表达式,;,循环继续表达式,;,循环变化表达式),一条要反复执行的语句;,执行流程:,循环变量初值表达式,一条要反复执行的语句,循环变量变化表达式,下一条语句,不满足,i=10,执行流程:,i=1,sum=sum+i,i+,printf(%d,sum);,不满足,循环结构后面的语句,for(i=1;i=10;i+),sum=sum+i,;,1.用 for 语句实现,#,include,main(),int i,sum=0;,for(i=1;,i=10,;i+),sum=sum+i;,printf(%d,sum);,重复执行的语句,规定重复次数,i=10,;i+),for 语句与while 语句比较,main(),int i,sum=0;i=1;,for(i=1;,i=10,;i+)while(,i0,;i-),sum=sum+i;,printf(%d,sum);,原形:int i,sum=0;for(i=1;i=10;i+)sum=sum+i;,i=10,sum=0;,i=1,;,sum=sum+i,i+,下一条语句,变形1,int,i=1,sum=0;for(;i=10;i+)sum=sum+i;,不管那一种变形,三个表达式的功能缺一不可,且执行流程不得改变。,原形:int i,sum=0;for(i=1;i=10;i+)sum=sum+i;,i=10,sum=0;,i=1,;,sum=sum+i,i+,下一条语句,变形2,int,i=1,sum=0;for(;i=10;),sum=sum+i;,i+;,相当于:while,不管那一种变形,三个表达式的功能缺一不可,且执行流程不得改变。,原形:int i,sum=0;for(i=1;i=10;i+)sum=sum+i;,i10)break;,sum=sum+i;i+,不管那一种变形,三个表达式的功能缺一不可,且执行流程不得改变。,原形:int i,sum=0;for(i=1;i=10;i+)sum=sum+i;,i=10,i=1;,sum=0;,sum=sum+i,i+,下一条语句,变形4,int i,sum;for(i=1,sum=0;i=10;,sum+=i,i+);,无循环体语句,不管那一种变形,三个表达式的功能缺一不可,且执行流程不得改变。,原形:,int i,sum=0;for(i=1;i=10;i+)sum=sum+i;,变形,int,i=1,,sum=0;for(;i=10;i+)sum=sum+i,;变形,int i=1,sum=0;for(;i10)break;,无限循环 sum=sum+i;i+,变形,int i,sum;for(i=1,sum=0;i=10;,sum+=i,i+),;,不管那一种变形,循环变量的初值、判断和变化表达式仍都存在,只是改变了所处的位置。,从键盘输入100个整数,求其中正数之和。,重复步骤:,1,输入一个数,2,对正数求和,共重复,100,次,#include,main(),int i,sum=0,x;,for(i=0;i0),sum=sum+x;,printf(%d,sum);,#include,main(),int i,count=0,x,sum=0;,float aver=0;,for(i=0;i0),sum=sum+x,;count+;,aver=,sum/count;,printf(%f,aver);,从键盘输入,100,个整数,求其中正数的,平均数,从键盘输入10个整数,求出其中的,最大值及最小值,。,#include,main(),int i,count=0,x,max=0,min=0;,for(i=0;imax),max=,x,;,if(xmin),min=,x,;,printf(“max=%d,min=%d,max,min);,(1)循环语句的循环体内,又包含另一个完整的循环结构,称为循环的嵌套。循环嵌套的概念,对所有高级语言都是一样的。,6.4,循环嵌套,不允许:,多重循环,多重循环结构-循环体本身又是一个完整的循环结构,注意:.仅可嵌套,不可交叉;,允许,while,do while,for互相嵌套;,.,while(),.,for (;),.,for(;),while(),.,.,do,.,for(;),.,while();,.,-,例:求,S,=1!+2!+3!+n!,分析:首先要循环n次来累加 i!,for(i=1;i=n;i+),s=s+i!;,如果存在求阶乘的运算,!,,计算完成。,for(i=1;i=n;i+),t=i!;,s=s+t;,for (t=1,j=1;j=i;j+),t=t*j;,例:已知小鸡0.5文钱只,公鸡文钱只,母鸡文钱只,现要求100文钱正好买100只鸡,请给出所有的组合。,组合问题用计算机解,通常采取“凑”的办法,母鸡可能的只数:0100,公鸡可能的只数:0100,小鸡可能的只数:0100,然后对三种鸡所,有的,组合方式,排除不等于100元和100只的那些组合。,hen,cock,chick,main(),int chick,cock,hen;,for(cock=0;cock=100;cock+),for(hen=0;hen=100;hen+),for(chick=0;chick=100;chick+),if(cock+hen+chick=100&,cock*2+hen*3+chick*0.5=100),printf(cock=%d hen=%d,chick=%dn,cock,hen,chick);,运行结果:,cock=0 hen=20 chick=80,cock=5 hen=17 chick=78,cock=10 hen=14 chick=76,cock=15 hen=11 chick=74,cock=20 hen=8 chick=72,cock=25 hen=5 chick=70,cock=30 hen=2 chick=68,运行过程:,cock=0,hen=0 chick=0100 共101次,hen=1 chick=0100 共101次,hen=100 chick=0100 共101次,cock=1,hen=0 chick=0100 共101次,hen=100 chick=0100 共101次,cock=100,hen=0 chick=0100 共101次,hen=100 chick=0100 共101次,101次,101次,101次,100多万次,循环嵌套均是大循环包小循环,绝对不允许循环体交叉!,for(),.,do,.,while(.),for(),.,do,.,while(.),编程,输出下列形式的九九乘法表。,1 2 3 4 5 6 7 8 9,2 4 6 8 10 12 14 16 18,3 6 9 12 15 18 21 24 27,4 8 12 16 20 24 28 32 36,5 10 15 20 25 30 35 40 45,6 12 18 24 30 36 42 48 54,7 14 21 28 35 42 49 56 63,8 16 24 32 40 48 56 64 72,9 18 27 36 45 54 63 72 81,#include,main(),int i,j;,for(i=1;i10;i+),i代表行,for(j=1;j=10);,是,真(非0),continue 流程,for的下一条语句,假(0),表达式1,表达式2,语 句1,表达式,3,否,continue,语 句2,循环体,程序:,for(表1;表2;表3),语句1;,if (.),continue,;,语句2;,for后的下一条语句;,例:读入一行字符(不超过10个),给予输出,if(c=n),break;,/*c=回车 也是结束条件*/,有两个条件决定循环的结束,输入:abc,efgh,123,#include stdio.h,main(),char c;int i=0;,for(i=0;i=10 是结束条件*/,c=getchar();,putchar(c);,#include stdio.h,main(),char c;,int i;,for(i=0;i0 ),printf(“%d ”,x%10);,x=x/10;,假定输入,x=,12345,逆序输出。,从低位开始分割,循环实现要点:(1)找出什么要反复执行,(2)重复到何时结束,假定输入,x=12345 顺序输出,从高位开始分割,12345/,10000,=1,12345%10000=2345,2345/,1000,=2,2345%1000=345,345/,100,=3,345%100=45,45/,10,=4,45%10=5,5/,1,=5,5%1=5,(1),开始如何得到10000,找输入数据的位数,d=1;,for(i=10;x/i0;i=i*10),d+;,(2)每次循环缩小10倍,(3)缩小到 0 结束,良好的源程序书写习惯注释(续),(3)循环结构,在C语言中,循环结构由循环语句for、while和do.while来实现。,作为注释,应在它们的前面说明其功能,在循环条件判断语句行的后面,说明循环继续条件的含义,如下所示。1)for语句,/*功能*/,for(变量初始化;循环条件;变量增值),/*循环继续条件的含义*/,2)while语句,/*功能说明*/,while(循环条件)/*循环继续条件的含义*/,3)do.while语句,/*功能说明*/,do ,while(循环条件);/*循环继续条件的含义*/,如果循环嵌套,还应说明每层循环各控制什么。,1 设有程序段,int k=10;while(k=2)k=k-1;,则下面描述中正确的是_。,A)while循环执行10次,B)循环是无限循环,C)循环体语句一次也不执行,D)循环体语句执行一次,2,语句,while(!E);,中的表达式!,E,等价于,_,。,A)E=0 B)E!=1,C)E!=0 D)E=1,A)1,2,0 B)2,1,0,C)1,2,1 D)2,1,1,3,下面程序段的运行结果是,_,。,a=1;b=2;c=2,t;,while(abc)t=a;a=b;b=t;c-;,printf(“%d,%d,%d”,a,b,c,);,4,下面程序段的运行结果是,_,。,int,n=0;,while(n+=2);,printf(“%d”,n,);,A)2 B)3 C)4 D),有语法错,5,下面程序的功能是在输入的一批正整数中求出最大者,输入,0,结束循环,选择填空。,#include,main(),int,a,max=0;,scanf(“%d”,&a,);,while(_),if(maxa)max=a;,scanf(“%d”,&a,);,printf(“%d”,max,);,A)a=0 B)a C)!a=1 D)!a,6,下面有关,for,循环的正确描述是,_,。,A)for,循环只能用于循环次数已经确定的情况,B)for,循环是先执行循环体语句,后判断表达式,C),在,for,循环中,不能,用,break,语句跳出循环体,D)for,循环的循环体语句中,可以包含多条语句,但必须用花括号括起来,以下程序的输出结果是什么?,#include,main(),int k;,for(k=,1;k=0;k-,),switch(k),case 1:case 4:case 7:s+;break;,case 2:case 3:case 6:break;,case 0:case 5:s+=2;break;,printf(“s=%dn”,s);,答案:s=7,输出10100之间的全部素数。所谓素数n是指,除1和n之外,不能被2(n-1)之间的任何整数整除。,算法设计要点:,(1)显然,只要设计出判断某数n是否是素数的算法,外面再套一个for循环即可。,(2)判断某数n是否是素数的算法:根据素数的定义,用2(n-1)之间的每一个数去整除n,如果都不能被整除,则表示该数是一个素数。,判断一个数是否能被另一个数整除,可通过判断它们整除的余数是否为0来实现。,参考源程序如下:,main()int i,j;for(i=11;i=100;,i+=2,),/*外循环:*/,for(j=2;j=i)/*整数i是素数:输出*/printf(“%6d”,i);,例:用 0.1mm 厚纸对折,问对折多少次后,其厚度超 过地球直径(12742公里),运行结果:n=,37,,,ans=13743.895347,main(),int n=0;float ans;,/*n 对折次数,ans存放对折后的厚度*/,ans=1e-7;,while(ans =12742),n=n+1;,ans=ans*2;,printf(“n=%d,ans=%f n”,n,ans);,例、计算圆周率的级数有很多,比如:,(,1,),1,605年英国数学家瓦里斯把,表示成:,/2=2/,1 2/34/3 4/5 6/5 6/7 8/7 8/9 2n/(2n-1)2n/(2n+1),(2)十七世纪德国数学家莱布尼慈,把,表示成:,/4=,1,-,1,/3+,1,/5-,1,/7+(-,1,),n-,1,1/(2n-1)+,(3),2,/6,=1+1/2,2,+1/3,2,+1/4,2,+1/n,2,+,试根据上述任一个无穷级数设计一个计算,的近似值的程序,要求误差小于,1,0,-6,(,1,),/2=2/,1 2/34/3 4/5 6/5 6/7 8/7 8/9 2n/(2n-1)2n/(2n+1),#include,main(),int k=1,flag=1;float pi,c=1.0,eps;,scanf(“%f”,do,pi=c;,if(k%2=0)c=c*k/(k+1);,else c=c*(k+1)/k;,if(fabs(2*c-2*pi)=eps),flag=0;printf(“PI=%gn”,c*2);,else k+;,while(flag);,#include,main(),int k=1,n,s1=0,s2=0;,do,printf(“请输入一个正整数:”);,scanf(“%d”,while(n=0);,for(k=1;k=n;k+),if(k%2=0)s2=s2+k;,else s1=s1+k;,printf(“奇数之和=%d,偶数之和=%d n”,s1,s2);,例、编程计算1到正整数n之间的奇数之和,以及偶数之和,例、编程输出如下数字:1,1 2 1,1 2 3 2 1,1 2 3 4 3 2 1,1 2 3 4 5 4 3 2 1,main(),int i,j,k;,for(i=1;i=5;i+),for(j=1;j=20-3*i;j+)printf(“”);,for(k=1;k0;k-)printf(“%3d”,k);,printf(“n”);,例4:求 A,B,C,3个正整数(均小于10),使 ABC+BCC=532 成立,运行结果:,a=3 ,b=2 ,c=1,main(),int a,b,c,k,ans=532;,for(a=0;a10;a+),for(b=0;b10;b+),for(c=0;c10;c+),k=(100*a+10*b+c)+(b*100+c*10+c);,if(k,=,ans),printf(“a=%d,b=%d,c=%dn”,a,b,c);,程序举例,3.打印以下图案:,$,$,$,$,$,$,$,分析:分上下两部分考虑,对上半部每一行:$数+空格数=列数(n),行数$数 空格数(单边),$1 1 (n-1)/2,$2 2*2-1=3 (n-3)/2,$3 2*3-1=5 (n-5)/2,$4 2*4-1=7 (n-7)/2,一般地:i 2*i-1 (n-(2*i-1)/2,分析:,对下半部每一行:$数+空格数=列数(n),行数 空格数(单边)$数,$1 1 n-1*2,$2 2 n-2*2,$3 3 n-3*2,$i i n-i*2,$,$,$,#include,main(),int n_blank,n_dollar,i,j,n,m;,scanf(“%d”,m=(n+1)/2;,for(i=1;i=m;i+),n_dollar=2*i 1;,n_blank=(n n_dollar)/2;,for(j=0;j n_blank;j+),putchar();,for(j=0;j n_dollar;j+),putchar($);,putchar(n);,for(i=1;i m;i+),n_blank=i;,n_dollar=n 2*n_blank;,for(j=0;j n_blank;j+),putchar();,for(j=0;j n_dollar;j+),putchar($);,putchar(n);,return 0;,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服