《C语言讲义 第4章 循环结构.ppt》由会员分享,可在线阅读,更多相关《C语言讲义 第4章 循环结构.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章 循环结构1课程名称:语言程序设计课型与教法:讲授,通过程序扩展,进行对比学习学时:2课时授课题目:第4章 循环结构教学目的与要求:通过本章的学习使学生了解循环结构的意义和基本实现语句,能正确利用while、do-while、for语句进行循环程序设计教学重点与难点:while、do-while、for语句 第四章 循环结构2【例】有一张厚度为0.1毫米的纸,假设它足够大,重复将其对折,问对折多少次之后,其厚度可以抵达(再对折一次就超过)珠穆朗玛峰的高度?程序如下:main()/*程序名为l3_14.cpp。*/double h=0.1;int n=0;/*n用来累计对折次数*/whil
2、e(h=8848180)h=h*2;n=n+1;printf(对折次数为:%d,此时厚度:%.2fn,n-1,h/2);重复对折一张纸,实质就是厚度乘以2,次数加1。用顺序结构编程为:h=h*2;n=n+1;这样的语句一直重复写到h满足题目要求为止。实际中这类问题,就可用循环结构编程实现。本例中,使用的是循环结构中的while语句。第四章 循环结构循环语句辅助控制语句 循环是指使用一定条件对同一个程序段重复执行若干次。循环结构又称重复结构,可以完成重复性、规律性的操作。第四章 循环结构4l概述C语言有三种类型的循环语句:l while 语句l do while 语句l for 语句循环语句第四
3、章 循环结构5v一般形式:while()v执行流程:while语句循环体:被重复执行的部分expr循环体假(0)真(非0)while第四章 循环结构6v 特点:先判断表达式,后执行循环体v 说明:l 循环体有可能一次也不执行l 循环体可为任意类型语句l 下列情况,可退出while循环u 条件表达式不成立(为零)u 循环体内遇break,return,goto while语句特点和说明第四章 循环结构7用while循环求/*ch4_2.cpp*/#include main()long sum=0;int i=1;while(i=1000)sum+=i;i+;printf(“sum=%ld,sum
4、);循环初值循环终值循环变量增值循环条件循环体例4.2第四章 循环结构8/*ch4_3.cpp*/#include main()int n=0;long t=1;printf(“n n!n”);while(n8)n+;t*=n;printf(%d%ld n,n,t);运行结果:n n!1 1 2 2 3 6 4 24 5 120 6 720 7 5040 8 40320 例4.3 求n!(n=18)第四章 循环结构9v一般形式:do while();v执行流程:do循环体expr假(0)真(非0)whiledowhile语句“;”不能少第四章 循环结构10v 特点:先执行循环体,后判断表达式v
5、 说明:l 至少执行一次循环体l dowhile可转化成while结构expr循环体假(0)真(非0)循环体while循环dowhile语句特点和说明第四章 循环结构11用do-while循环求 例4.4/*ch4_4.cpp*/#include main()int i;long sum=0;i=1;do sum+=i;i+;while(i=1000);printf(“sum=%ld,sum);第四章 循环结构12统计输入的整数的个数(输入-1时结束,-1不计在内)例4.5/*ch4_5.cpp*/#include main()int num;int i=0;do scanf(“%d”,&nu
6、m);i+;while(num!=-1);printf(“整数的个数是%dn,i-1);第四章 循环结构13实验四1.求和s=3+33+333+3333+33333(思考:求和s=a+aa+aaa+.aaaa,最后一项为n个a,其中a是一个数字。例如:3+33+333+3333+33333(此时n=5),n由键盘输入。2.求和 sum=1!+2!+3!+.n!(n是从键盘上面输入的数n20)3.从键盘上面输入若干个字符,当输入字符“$”时结束输入,统计并输出字符串中非数字字符的个数。第四章 循环结构14v 一般形式:for(表达式1;表达式2;表达式3)v 执行流程:expr2循环体假(0)真
7、(非0)forexpr1expr3for语句v 一般应用形式:for(初始化表达式;条件表达式;修正表达式)第四章 循环结构15v 说明:l for语句中expr1,expr2,expr3 类型任意,都可省略,但分号;不可省l for语句可以转换成while结构expr1;while(expr2)expr3;for语句第四章 循环结构16形式:形式:#includemain()int i=0;for(i=0;i10;i+)putchar(a+i);运行结果:abcdefghij形式:形式:#includemain()int i=0;for(;i10;i+)putchar(a+i);形式:形式:
8、#includemain()int i=0;for(;i10;)putchar(a+(i+);形式:形式:#includemain()int i=0;for(;i10;putchar(a+i),i+);例:for语句形式的多样性第四章 循环结构17【例4.6】用for语句实现求1-1000之和#include stdio.hmain()/*程序名为ch4_6.cpp。int i;long sum=0;for(i=1;i=1000;i+)sum+=i;printf(其和是%ldn,sum);第四章 循环结构18课程名称:语言程序设计课型与教法:讲授,通过程序扩展,进行对比学习学时:2课时授课题目
9、:第4章 循环结构基本教材:语言程序设计(高等教育出版社)廖雷主编教学目的与要求:通过本章的学习使学生掌握break、continue、goto语句,能正确利用循环语句、循环嵌套进行循环程序设计教学难点:循环嵌套教学重点:break、continue语句;循环嵌套第四章 循环结构19v 循环的嵌套:循环体本身包含循环语句v 三种循环可互相嵌套,层数不限v 外层循环可包含两个以上内循环,但不能相互交叉(1)while()while().(2)do do while();.while();(3)while()do while();.(4)for(;)do while();while().内循环外循
10、环内循环循环的嵌套第四章 循环结构20i10printf假(0)真(非0)i=1j+j=1j10真(非0)假(0)i+for(i=1;i10;i+)j=1;while(j10)printf(j=9)?%4dn:%4d,i*j);j+;外循环内循环循环的嵌套(图解)第四章 循环结构21【例4.7】打印如下形式的乘法小九九表:1*1=12*1=2 2*2=49*1=9 9*2=18 9*3=27 9*9=81第四章 循环结构22分析:表体共九行,所以首先考虑一个打印九行的算法:for(i=1;i=9;i+)打印第i行其次考虑如何打印第i行。每行都有i个表达式?*?=积,可以写为:for(j=1;j
11、=i;j+)打印第j个表达式打印第j个表达式,可写为:printf(%d*%d=%-3d,i,j,i*j);在写这个语句时,不写换行,只能在第j个表达式输出后写一个语句使之换行。printf(n);综上所述,打印以上形式的乘法小九九表的程序如下:第四章 循环结构23【例4.7】/*程序名为ch4_7.cpp。*/#include stdio.hmain()int i,j;/*i,j 分别控制行和列的输出*/for(i=1;i=9;i+)for(j=1;j=i;j+)printf(%d*%d=%-3d,i,j,i*j);printf(n);/*另起一行*/第四章 循环结构24几种循环的比较1.若
12、循环次数在执行循环体之前已确定,一般用for 若循环次数根据循环体执行情况确定,一般用while或dowhile2.当循环体至少执行一次,用dowhile 若循环体有可能一次也不执行,用while第四章 循环结构25实验51.用for语句求和 s=1+3+5+7+.992.编程输出如下图形:*3.求整数3-100中的素数,并输出素数的个数。为了检查某数是否是素数,采用的方法是,从n=3起直到100止,逐个用i=2n/2去试除n,只要有一个能整除,说明该数不是素数。第四章 循环结构26l概述辅助控制语句:l break 语句l continue 语句l goto 语句辅助控制语句第四章 循环结构
13、27break语句l 功能:在循环语句和switch语句中,终止并跳出循环体或开关体l 说明:l break只能终止并跳出最近一层的结构l break不能用于循环语句和switch语句之外的任何其它语句之中第四章 循环结构28break语句(图解1)exprbreak;假(0)真(非0)whiledobreak;.expr假(0)真(非0)while第四章 循环结构29expr2break;.假(0)真(非0)forexpr1expr3switchexpr语句组1break;语句组2break;语句组nbreak;语句组break;.const 1const 2const ndefaultca
14、se break语句(图解2)第四章 循环结构30设计一程序完成功能:若输入英文字母,则原样输出例#include main()char ch;do ch=getchar();if(ch=Q|ch=q)break;else if(ch=a&ch=A&ch=Z)putchar(ch);while(1);第四章 循环结构31v 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断v 仅用于循环语句中exprcontinue;假(0)真(非0)while真(非0)docontinue;.expr假(0)whileexpr2continue;.假(0)真(非0)forexpr
15、1expr3continue语句第四章 循环结构32求1100之间不能被12整除的数/*ch4_9.cpp*/#include“stdio.h”main()int n;for(n=1;n=100;n+)if(n%12=0)continue;printf(“%5d,n);第四章 循环结构33/*ch4_10.cpp*/#include main()long int f,f1=1,f2=1;int i,n;printf(“please input n:”);scanf(“%d”,&n);printf(“%8ld%8ld”,f1,f2);for(i=3;i=n;i+)if(i%5=1)printf(
16、“n”);f=f1+f2;f1=f2;f2=f;printf(“%8ld”,f);例 fibonacci数列f(n)-+-=)3()1()2()2(1)1(1)(nnfnfnnnf开始输入nf1=f2=1,i=3i=nf=f1+f2;f1=f2;f2=f;i+结束NY第四章 循环结构34/*ch4_11.cpp*/#include main()int n;double v,sum=0.0,t=1.0;for(n=0;n64;n+)sum+=t;t*=2;printf(“sum=%en”,sum);v=sum/1.42e8;printf(“v=%e”,v);例 计算sum=1+2+22+23+2
17、63开始sum=0.0,t=1.0,n=0n1e-6)t=t*n;/*求n!*/e=e+1/t;/*实现求n!的倒数的和*/n+;printf(e=%8.6fn,e);运行结果:e=2.718282第四章 循环结构36综合实训综合实训综合实训综合实训2 2通过本例可以体现这样一个编程思路:凡是遇到求若干个有规律变化的项的乘积,就可在循环体中用求累乘积的编程通式t=t*x来编程实现;求其和,用求累加和的编程通式s=s+x来编程实现,其中t、s分别为累积、累和,初值分别为t=1,s=0,x为变化的项的通式。【例2】百钱百鸡问题。公元前,我国古代数学家张丘建在算经一书中提出了百鸡问题:鸡翁一,值钱五
18、,鸡母一,值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?分析:这是一个有名的不定方程问题。设:cocks:鸡翁数、hens:鸡母数、chicks:鸡雏数,则有:cocks+hens+chicks=1005*cocks+3*hens+chicks/3=100据上述不定方程,很容易得到三个变量的取值条件:cocks:0-19之间的整数。hens:0-33之间的整数。chicks:0-100之间的整数。解题思路:依次取cocks值域中的一个值,然后再在试取hens值域中的每一个值,根据前两者取值,求出chicks后,看是否合乎题意,合乎者为解。第四章 循环结构37综合实训综合实训综合实
19、训综合实训3 3返回本节目录返回本节目录编程如下:/*源程序名为l3_35.cpp。百钱百鸡问题*/#include stdio.h main()int cocks,hens,chicks;for(cocks=1;cocks=19;cocks+)for(hens=1;hens=33;hens+)chicks=100-cocks-hens;if(5*cocks+3*hens+chicks/3.0=100)printf(cocks=%d,hens=%d,chicks=%dn,cocks,hens,chicks);程序运行结果如下:cocks=4,hens=18,chicks=78cocks=8,h
20、ens=11,chicks=81cocks=12,hens=4,chicks=84本例采用的编程算法是穷举法。其基本思想是:对问题的所有可能状态一一测试,直到找到解或全部可能状态都测试过为止。下面例题为另一类型的穷举问题。第四章 循环结构38 【例3】爱因斯坦的阶梯问题。设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;每步跨7阶时,正好到阶梯顶。问共有多少阶梯?问题分析:设阶梯数为:ladders,则题中条件可以改写为:(1)ladders%2=1(2)ladders%3=2(3)ladders%5=4(4)ladders%6=5(5
21、)ladders%7=0由条件(5)知,阶梯数一定为7的倍数。于是可以从7开始,分别对7、17、21、28、35数列进行测试,看哪一个符合题意。由条件(1)又知,阶梯数一定是奇数,因此可把上述数列中的数去掉一半。算法:依次对7、7+14、7+14+14、用条件(2)(3)(4)进行测试,找出符合题意者。综合实训综合实训综合实训综合实训4 4返回本节目录返回本节目录第四章 循环结构39综合实训综合实训综合实训综合实训5 5返回本节目录返回本节目录程序如下:/*程序名为l3_36.cpp。*/#include stdio.h main()int ladders=7;while(ladders%3!=2|ladders%5!=4|ladders%6!=5)ladders+=14;printf(ladders=%dn,ladders);运行结果:ladders=119