版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章
C语言循环结构程序设计
下一页返回本章要点
while语句、do-while语句、for语句
continue语句、break语句循环的嵌套循循环结构程序设计学习方法建议学习本章内容时,应重点掌握三种循环语句的语法格式及执行过程,并在此基础上理解循环嵌套的应用,要多读程序,理解编程思想,并多上机练习。目录5.1while语句
5.2
do-while语句5.3
for语句
5.4
循环的嵌套
返回上一页5.5
break语句和continue语句5.6
循环结构应用举例
5.7
本章小结
5.1while语句while语句用来实现“当型”循环结构。其一般形式如下:while(表达式)语句while语句的执行过程是:下一页返回
首先计算表达式的值,若结果是“真”(非0)值时,执行while语句中的内嵌语句,即循环体;然后再计算表达式的值,重复上述过程,直到表达式的值为“假”(0)时结束,流程控制转到while语句的下一个语句继续执行
。
while语句中的“表达式”就是循环的条件,其执行流程见图5.1,其特点是:先判断表达式,后执行语句。
表达式语句0非0图5.1while语句执行过程
例5.1】求。
上一页下一页返回【编程思路】(1)定义变量i、sum,并分别赋初值为1和0,用i表示累加数,sum表示累加和。(2)在while语句中,使sum在原有值的基础上加上i的值,加完后再使i值自动增1。(3)用i<=100作为循环的条件,若i的值超过100就停止循环。(4)最后输出累加和sum。【程序代码】#include"stdio.h"main(){inti=1,sum=0;while(i<=100){sum=sum+i;i++;}printf(“sum=%d\n",sum);}运行结果如下:上一页下一页返回【例5.2】求n!,n由键盘输入。【编程思路】求阶乘就是求累乘,即求1*2*3*…n。这里除用于存放累乘积的变量的应置为1外,其执行过程与累加相同。【程序代码】#include"stdio.h"main(){inti=1,n,s=1;printf("Inputn:");scanf("%d",&n);while(i<=n){s*=i;i++;}printf("%d!=%d\n",n,s);}运行结果如下:do-while语句的特点是先执行循环体,然后判断循环条件是否成立。其一般形式为do
语句while(表达式);上一页下一页返回5.2do-while语句do-while语句的执行过程是:先执行一次循环体语句,然后判断表达式,当表达式的值为非0时,返回重新执行循环体语句,如此反复,直到表达式值等于0为止,此时循环结束。可以用图5.2表示其流程。语句0(假)表达式图5.2do-while语句执行过程【例5.3】
用do-while语句改写例5.1的程序。上一页下一页返回【程序代码】#include"stdio.h“main(){inti=1,sum=0;do{sum=sum+i;i++;}while(i<=100);printf(“sum=%d\n",sum);}运行结果如下:for语句的一般形式为:
for(表达式1;表达式2;表达式3)语句For语句的执行过程是:(1)求解表达式1;(2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步;(3)求解表达式3。(4)转回上面第(2)步骤继续执行。(5)循环结束,执行for语句下面的一条语句。可以用图5.3来表示for语句的执行过程。上一页下一页返回5.3for语句非0求解表达式1表达式2语句求解表达式30图5.3for语句执行过程for语句最简单的应用形式也就是最易理解的如下形式:
for(循环变量赋初值;循环条件;循环变量增值)语句【例5.4】用for语句改写例5.1的程序【程序代码】#include"stdio.h"main(){inti,sum=0;for(i=1;i<=100;i++)sum+=i;printf("sum=%d\n",sum);}运行结果如下:
上一页下一页返回说明:有时根据需要可以将for语句中的部分或所有表达式省略,省略“表达式1”时,应在for语句之前给循环变量赋初值。省略“表达式2”时,在循环体中通常要有能使循环结束的语句,否则就成了无限循环了。省略“表达式3”时,通常在循环体中要有使循环变量增值的语句。不管省略几个表达式,分隔符分号“;”是不能省的。如例5.4中的代码可以改写成:
inti=1,sum=0;for(;i<=100;i++)sum+=i;上一页下一页返回
一个循环的循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多重循环。各种语言中关于循环的嵌套的概念都是一样的。三种循环(while循环,do-while循环和for循环)即可以自身嵌套,也可以互相嵌套。
【例5.5】用一元纸币换一分、两分及五分的硬币,要求换到的硬币总数为50枚,问有多少种换法?每种换法中各种硬币分别是多少?【编程思路】设x,y,z分别代表五分、二分、及一分的硬币数目。三变量只有两个是独立的,第三个必须满足z=100–5*x–2*y及x+y+z==50的条件。因此可用双重循环解此问题。其中x可由1到20,y可由0到50。上一页下一页返回5.4循环的嵌套【程序代码】#include"stdio.h"main(){intx,y,z;printf("FIVE\tTWO\tONE\n");for(x=0;x<=20;x++)for(y=0;y<=50;y++){z=100-5*x-2*y;if(x+y+z==50)printf("%3d\t%3d\t%3d\n",x,y,z);}}运行结果如下:上一页下一页返回【例5.6】编写程序,输出下列图形上一页下一页返回【编程思路】((1)图形共有5行,定义i表示行数,即外循环的循环控制变量,其值从1到5递增。(2)每行前空格的数量分别为5、4、3、2、1,如果用i表示行数,则每行前的空格数据与行号i的关系为6-i;(3)每一行“*”的数量分别为1、3、5、7、9,与行号的关系为2*i-1。(4)定义变量j、k表示空格数和“*”数,它们作为内循环的循环控制变量。【程序代码】#include"stdio.h"main(){inti,j,k;for(i=1;i<=5;i++){for(j=1;j<=6-i;j++)printf("");for(k=1;k<=2*i-1;k++)printf("*");printf("\n");}}说明:本程序用双重循环实现,外循环控制行数,内循环控制每行的内容,每行内容均包括三部分,行前空格、一行*、换行。行前空格和每行的*的输出均用内嵌的循环实现。上一页下一页返回break语句的一般形式为:
break;该语句的功能有两个:(1)在switch语句的程序段中,遇到break语句,则退出switch语句,执行后继语句。(2)在循环体中,遇到break语句,则退出包含break语句的那层循环,一般和if语句连用。
【例5.7】判断正整数m是否素数,m由键盘输入。
【编程思路】判断m是否是素数,可以有三种方法:(1)用m依次除以2~m-1之间的所有数,若都不能除尽,则m是素数,否则就不是素数。(2)用m依次除以2~之间的所有数,若都不能除尽,则m是素数,否则就不是素数。上一页下一页返回5.5break语句和continue语句5.5.1break语句
(3)用m依次除以m/2之间的所有数,若都不能除尽,则m是素数,否则就不是素数。 本题采用第(2)种方法,其算法是这样的:
将的值赋给变量k,让m被2到k除,如果m能被2~k之中任何一个整数整除,则提前结束循环,此时i必然小于或等于k,如果m不能被2~k之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环之后判别i的值是否大于等于k+1,若是,则表明未曾被2~k之间任一整数整除过,因此输出“是素数”。【程序代码】#include<stdio.h>#include<math.h>main(){intm,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);}运行结果如下: 上一页下一页返回5.5.2continue语句continue语句的一般形式为:
continue;
该语句只能用在循环体中,执行该语句则结束本次循环,再去判断是否继续下次循环。该语句通常是用于循环体中if语句内,即满足某种条件才结束本次循环。
continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。【例5.8】把100~200之间的不能被3整除的数输出,每行输出10个数。
【编程思路】(1)定义一个循环控制变量和统计输出数量的变量
。(2)循环的初值和终值分别取100和200。(3)用对3取余的运算判断是否能被3整除。【程序代码】#include"stdio.h"main(){intn,s=0;for(n=100;n<=200;n++){if(n%3==0)continue;printf("%d",n);s++;if(s%10==0)printf("\n");}printf("\n");}上一页下一页返回说明:在while语句和do-while语句中,continue语句使得流程直接跳到循环控制条件的测试部分,然后决定循环是否继续进行。在for循环中,遇到continue后,流程跳过循环体中余下的语句,而去对for语句中的“表达式3”求值,然后进行“表达式2”的条件测试,最后根据“表达式2”的值来决定for语句是否执行。上一页下一页返回运行结果如下:5.6循环结构应用举例【例5.9】输出九九表,格式如下:上一页下一页返回【编程思路】(1)用双重循环实现,外循环控制行数,内循环控制列数。(2)定义变量i表示行数,作外循环的循环控制变量,使其从1到9递增。(3)定义j表示列数,作内循环的循环控制变量,从1到i递增。【程序代码】#include<stdio.h>main(){inti,j;for(i=1;i<10;i++){for(j=1;j<=i;j++)printf("%d*%d=%-4d",j,i,i*j);printf("\n");}}上一页下一页返回说明:由于外循环变量i表示行数(1到9),内循环变量j表示列数(1到i),故每一个位置输出的数据应为行号和列号的乘积。【例5.10】用π/4≈1-+-+…公式求π的近似值,直到最后一项的绝对值小于10-6为止。【编程思路】(1)定义一个变量pi用来存放右侧表达式的值及最终要求的π的近似值。(2)定义一个表示每一项的变量t,并赋初值为1。(3)定义一个表示每一项的分母的变量n,其初值为1,其值每次增2。(4)定义一个用来改变每一项符号的变量s其初值定义为1,由于此题的各项的符号是正负相间,故用循环处理此题的过程中,s每次都要变换个符号,再用s乘以各项既可改变各项的符号。(5)循环的条件是fabs(t)>=1e-6,其中fabs是用来求绝对值的函数,但使用前在代码前要用#include对"math.h"头文件进行包含。上一页下一页返回【程序代码】#include"stdio.h"#include"math.h"main(){ints;floatn,t,pi;t=1;pi=0;n=1;s=1;while(fabs(t)>=1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf("pi=%10.6f\n",pi);}运行结果如下:上一页下一页返回【例5.11】求100~200间的全部素数,每行输出10个。【编程思路】(1)定义一个循环控制变量m其取值从101到200,循环增量为2,因为此范围内的素数一定为奇数,定义一个统计素数个数的变量n,初值为0,通过对10取余运算可控制每行输出10个。(2)用每个循环变量除以2到该变量的平方根之间的每一个数,若都除不尽,则该变量所存放的数为素数。(3)平方根的函数为sqrt(),其对应的头文件为"math.h“【程序代码】#include"stdio.h"#include"math.h"main(){intm,k,i,n=0;for(m=101;m<=200;m=m+2){k=sqrt(m);上一页下一页返回for(i=2;i<=k;i++)if(m%i==0)break;if(i>=k+1){printf("%d",m);n=n+1;}if(n%10==0)printf("\n");}printf("\n");}运行结果如下:【例5.12】求Fibonacci数列前20项,这个数列有如下的特点:第1,2两个数为1,1。从第3个数开始,每一个数都是其前面两个数之和。即:F(1)=1(n=1)F(2)=1(n=2)F(n)=F(n-1)+F(n-2)(n≥3)上一页下一页返回【编程思路】(1)本题属于递推问题。即不断地用旧值推算出新值,在程序中表现为不断地用新值取代旧值的过程。(2)定义循环变量n,用来表示数列的项,由于前两项已经给出,所以n从3开始。(3)定义变量f1、f2、fn,每次计算完通项后,那么在计算下一项时,原来的f2就成为新的f1,刚计算出的fn就成为新的f2。(4)为了更清晰地输出数列,每行输出4个数。【程序代码】#include"stdio.h"main(){intf1=1,f2=1,n,fn;printf("%12d%12d",f1,f2);for(n=3;n<=20;n++){fn=f1+f2;f1=f2;f2=fn;printf("%12d",fn);if(n%5==0)printf("\n");}}运行结果如下:上一页下一页返回通过本章
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年度电厂项目拆迁施工及补偿合同
- 2024年度新能源发电项目合作开发与投资合同
- 2024年度车位租赁合同范本
- 二零二四年环保项目代理运营合同
- 二零二四年度品牌管理合同及市场推广
- 2024年度软件开发合同的功能升级与技术支持转让
- 二零二四年度人力资源服务合同协议书范本模板3篇
- 二零二四年城市排水工程管道施工合同
- 2024年度软件开发与维护合同终止协议
- 北京工业大学耿丹学院《乒乓球》2021-2022学年第一学期期末试卷
- 家庭医生签约服务在实施老年高血压患者社区护理管理中应用
- 精干高效企业人力资源管理方法探析
- 著名外企安全培训资料之:LOF危害因素识别
- 高中理科教学仪器配备标准[共121页]
- 最新挡圈标准
- 屋面平瓦(挂瓦条铺瓦)施工方案
- 安德森症状评估量表
- 石化行业安全事故案例分析
- 110KV变电站设计毕业论文.doc
- 二次结构冬季施工方案.doc
- 中国药科大学药物合成习题答案
评论
0/150
提交评论