版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章
语句结构-循环结构
本章要点●C语言中3个基本循环结构while、do-while、
for的特点和应用。●怎样避免“无限循环”。●循环结构的嵌套。●循环结构中的无条件控制语句(goto、break和
continue)的应用。15.1概述实现循环的语句(三种):用while语句 用do-while语句 用for语句 循环:就是在满足一定条件时重复执行一段程序。被重复执行的语句或模块,称为循环体。注意:设计一个合理的循环结构,要使循环条件由一个状态转变为另一个状态,使循环正常终止。否则,这种循环就变为“无限循环”,或称“死循环”。25.2while循环用while语句实现当型循环:即先判断后执行while语句的一般形式:
while(表达式)语句流程图:表达式语句下一语句假(0)真(非0)当表达式的值为真(非0)时,执行其中的循环体,然后回过头来再判断表达式的值,如此重复;当表达式的值为假(0)时,结束循环。3while语句的一般形式:while(表达式)语句如:intk=1,s=0; while(k<=100)
{s=s+k;k++;}循环控制表达式循环控制变量循环体注意:若循环体包含一条以上的语句,应以复合语句出现;循环前,必须给循环控制变量赋初值;循环体中,必须有改变循环控制变量值的语句存在。(使循环趋向结束的语句)循环体可以为空 4【例5.1】计算分析:这是一个累加求和问题
s=1+2+3s=s+k和的当前值和的新值求和项当前值s=0s=0+1s=1+2s=3+3k=1k=2k=3#include“stdio.h”main(){int
k,s;s=0;k=1;while(k<=3){s=s+k;k++;}printf("s=%d\n",s);}根据N-S图,用while语句写程序s=65#include"stdio.h"main(){
intc=0;
while(c<=255){
printf("%c",c++);if(c%32==0)
printf("c=%d\n",c);/*显示已输出字符个数*/}}【例5.2】用while循环,打印ASCII表全部字符。6【例5.3】读程序#include<stdio.h>voidmain(){int
k,s,n;
printf(“entern:”);
scanf(“%d”,&n);s=0;k=1;while(k<=n){s+=k;k++;}printf(“∑%d=%d\n”,n,s);}entern:515#include<stdio.h>voidmain(){int
k,t,n;
printf(“entern:”);
scanf(“%d”,&n);t=1;k=1;while(k<=n){t*=k;k++;}
printf(“%d!=%d\n”n,t);}entern:5120t=n!#include<stdio.h>voidmain(){int
k,t,n,s;
printf(“entern:”);
scanf(“%d”,&n);t=1;k=1;s=0;while(k<=n){t*=k;s+=t;k++;}
printf(“s=%d\n”,n,s);}s=1!+2!+…+n!entern:51537例5.4:求12+22+32+…….+1002的和。
main(){ longsum=0;
intc=1; while(c<=100) {sum+=c*c; c++; }
printf(“%d,%ld\n”,c,sum);}输出的c=101当c<=100时,反复执行
c=101时,停止循环
注意:缺少了语句c++;c的值在循环中不会变,while中的条件就不会变,就成了无限循环(死循环)!循环之初的c与sum值8#include"stdio.h"main(){ longfa=1,sum=0;
int
n,c=1;
scanf("%d",&n);
while(c<=n)
{
fa=fa*c; sum=sum+fa; c=c+1; }
printf("n=%d\tsum=%ld\n",n,sum);}
例5.5:求1!+2!+3!+…….+n!的和。9
例5.6:键盘输入一个整数m,判断m是不是素数。
main(){
int
m,c=2;
scanf("%d",&m);
while(m%c) c++;
if(c==m)
printf("%disaprimenumber.\n",m); else
printf("%disnotaprimenumber.\n",m);}105.3do-while循环用do-while语句用来实现直到型循环:即先执行后判断条件do-while语句的一般形式:
do语句
while(表达式);注意:分号“;”不可省略!表达式语句下一语句假(0)真(非0)11#include<stdio.h>voidmain(){int
k,s;s=0;k=1;
while(k<=3){s=s+k;k++;}
printf("s=%d\n",s);}用while语句写程序:【例5.7】计算#include<stdio.h>voidmain(){int
k,s;s=0;k=1;do{s=s+k;k++;}
while(k<=3);
printf("s=%d\n",s);}用do-while语句写程序:先判断后执行先执行后判断12
while循环和do_while循环的比较:一般情况下,while循环和do_while循环可以用来处理同一个问题。但while循环可以一次也不执行循环体(循环条件一开始就不满足时),而do_while循环时,至少要执行一次循环体。用do_while循环做的事情,都可以用while循环来做;而用while循环来做的事情,do_while循环不一定能做。所以一般用while循环比较方便。使用do_while循环结构时,特别要注意该结构的最后有一个分号。练习:用do-while改写判断m是不是素数的程序。13
5.4
for循环结构
for循环结构的一般形式是:
for(表达式1;表达式2;表达式3) 语句(循环体)
表达式1也称初始化表达式,用来设定循环控制变量或其他变量的初值,若有多个变量需要初始化时,表达式1要使用逗号表达式。
表达式2也称循环条件表达式,用来决定是否执行循环体。当表达式值为非0时,执行循环体,当表达式的值为0时循环终止。
表达式3也称增量表达式,执行一次循环体后,求解一次表达式3的值,用来改变循环变量的值,修正表达式2。表达式3也可用逗号表达式。14for循环结构的执行过程如图所示。表达式2循环体求解表达式1非00图5.5for循环结构流程图求解表达式315for循环的其它形式:for循环一般形式:for(表达式1;表达式2;表达式3)语句(循环体)表达式1可以移到for语句的前面表达式1;for(;表达式2;表达式3)语句(循环体)表达式3可以移到循环体里面for(表达式1;表达式2;){语句表达式3;}16表达式1省略时,应在for前给循环变量赋初值如:k=1;for(;k<=3;k++)s=s+k;
表达式3省略时循环体内应有使循环条件改变的语句如:for(k=1;k<=3;){s=s+k;k++;}
同时省略表达式1和表达式3,只有表达式2,此时相当于while语句。如:
表达式2一般是关系或逻辑表达式,也可以是算术或字符表达式,只要值不为0就执行循环体。如:for(k=1;k-4;k++)s=s+k;k=1;for(;k<=3;){s=s+k;k++;}k=1;while(k<=3){s=s+k;k++;}说明17例5.8:用for循环求解在100~200范围内“既能被5整除又能被6整除”的数。#include"stdio.h"main(){
inti;
for(i=100;i<=200;i++) if(i%5==0&&i%6==0)
printf("\t%d",i);}18例5.9:用for循环判断整数m是不是素数。
main(){
int
m,c=2;
scanf("%d",&m);
while(m%c) c++;
if(c==m)
printf("%disaprimenumber.\n",m); else
printf("%disnotaprimenumber.\n",m);}#include"stdio.h"main(){
int
m,c=2;
scanf("%d",&m);
for(;m%c;c++);
if(c==m)
printf("%disaprimenumber.\n",m); else
printf("%disnotaprimenumber.\n",m);}19例5.10:用for循环输出Fibonacci数列:
1、1、2、3、5、8…的前20个数。#include"stdio.h"main(){
int
x,y,i;
for(x=1,y=1,i=1;i<=10;i++) { printf("%12d%12d",x,y); if(i%2==0)
printf("\n"); x=y+x; y=x+y; }}20练习:用while和for循环求100以内的奇数、偶数之和。#include<stdio.h>main(){int
ou=0,ji=0,n=1;
while(n<=100){ji+=n;
ou+=n+1;n+=2;}
printf(“ji=%d,ou=%d\n",ou,ji);}用while语句写程序#include<stdio.h>main(){int
ou=0,ji=0;for(n=1;n<=100;n+=2){ji+=n;
ou+=n+1;}
printf(“ji=%d,ou=%d\n",ou,ji);}用for语句写程序21几种循环的比较对比while(表达式)语句do语句while(表达式);for(表达式1;表达式2;表达式3)语句循环控制条件表达式表达式表达式2循环控制变量赋初值在while之前在do-while之前表达式1;也可以在for之前循环控制变量改变值在循环体内在循环体内表达式3;也可以在循环体内22
5.5循环结构的嵌套
自身嵌套:while循环结构的循环体中可以包含while循环;do_while循环结构的循环体中可以包含do_while循环;for循环结构的循环体中可以包含for循环。此外,这几种循环结构之间还可以相互嵌套。一般循环体中的循环称为“内循环”,包含内循环的循环称为“外循环”,当然,这只是指二重循环。另外还有多层嵌套的情况,这属于多重循环。
23循环嵌套的说明嵌套的循环控制变量名不能相同内循环变化快,外循环变化慢如:for(i=1;i<=9;i++){for(j=1;j<=9;j++)
printf(“%d”,i*j);
printf(“\n”);}正确确定循环体24例5.11:用for循环嵌套打印九九乘法表。#include"stdio.h"
main()
{
int
i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
printf("%3d",i*j);
printf("\n");
}
}25例5.12:要付零钱19元,现有1元,2元和5元的纸币10张,请问有几种付法?
#include"stdio.h"main(){
int
x,y,z,i=1;
for(x=0;x<10;x++)
for(y=0;y<=9;y++) { z=10-x-y; if(x+2*y+5*z==19)
printf("%d:\tx=%d\ty=%d\tz=%d\n",i++,x,y,z); }}26例5.13:求50以内的全部勾股数并打印输出。#include"stdio.h"main(){
int
x,y,z,i=1;
for(z=5;z<=50;z++)
for(y=4;y<z;y++)
for(x=3;x<=y;x++)
if(x*x+y*y==z*z) printf("%3d:%3d%3d%3d\n",i++,x,y,z);}27
5.6无条件转向语句
无条件转向语句(或称无条件控制语句)是指当程序执行到该语句时,程序无条件转移到程序的某个地方执行。C语言提供三个无条件控制语句:break语句,continue语句和goto语句。
break语句主要用于循环结构和switch语句结构中。continue语句主要用于循环结构中。结构化程序设计要求少用或尽量不用goto语句。28
1.break语句
break语句由关键字break后加分号“;”组成。它的一般形式是:break;例5.14:求12+22+32+…….+1002的和。#include"stdio.h"main(){ longsum=0;
int
c=1;
while(8) { sum=sum+c*c; c++;
if(c>100)break; }
printf("sum=%ld\n",sum);}29例5.15:求整数m是否是素数。#include"stdio.h"main(){
int
m,c=2;
scanf("%d",&m); for(;;) {
if(m%c==0)break; c++; }
if(c==m)
printf("%disaprimenumber.\n",m); else
printf("%disnotaprimenumber.\n",m);}30例5.16:求200~230之间的全部素数。#include"stdio.h"#include"math.h"
main()
{
int
m,c,k;
for(m=201;m<230;m=m+2)
{
k=(int)sqrt(m);
for(c=2;c<=k;c++)
if(m%c==0)break;
if(c>k)
printf("%disaprimenumber.\n",m);
}
}312.continue语句
一般形式是:continue;
作用:结束本次循环(即跳过循环体中尚未执行的语句)。注意break语句和continue语句的区别:
break语句是跳出整个循环结构,不再在循环结构中做任何事情。而continue语句只是结束本次循环,继续进行循环条件的判断,来决定循环是否继续进行。32对于while或do_while,循环体中执行continue语句后直接进行循环条件的判断来决定循环是否继续;而对于for循环,执行continue语句后,还应执行增量表达式(表达式3)后再进行循环条件的判断来决定循环是否继续。33例5.21:求200~230之间和400~430的全部素数。#include"stdio.h"#include"math.h"main(){
int
m,c,k;
for(m=201;m<430;m+=2) {
if(m>230&&m<400)continue; k=(int)sqrt(m);
for(c=2;c<=k;c++)
if(m%c==0)break;
if(c==k+1)
printf("%disaprimenumber.\n",m); }}343.goto语句一般形式:goto
语句标号;程序中与之对应的应有:语句标号:语句例5.22求1~100间的奇数和。#include"stdio.h"
main()
{
inti=1,sum=0;
loop:sum=sum+i;
i=i+2;
if(i<100)
gotoloop;
printf("sum=%d\n",sum);
}35
5.7应用举例数学上的递推(recurence)方法在程序设计中应用很多。递推方法解题的关键是确定递推公式和初始条件。根据初始条件的不同,递推又可分为“顺推”和“倒推”两种形式:顺推是数列后面的值要根据前面的值才能推算出来。如例5.13求Fibonacci数列属顺推。倒推是数列前面的值要根据后面的值才能推算出来。例5.23“猴子吃桃”问题属倒推。递推方法在程序设计中通过变量的迭代(iterate)方法来实现。36例5.23:猴子吃桃”问题(倒推)。
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上想吃时,发现只剩一个桃子。求第一天共摘了多少桃子。分析:“猴子吃桃”问题成了倒推的问题,设第n天的桃子数为a(n)个,前一天的桃子数为a(n-1)个.则有:a(n)=a(n-1)/2-1
即:a(n-1)=2(a(n)+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现代办公事务处理任务十一拟写洽谈接待计划
- 一背肌二胸肌三膈四腹肌五盆部肌第三节躯干
- 土壤三普分析培训
- 《咨询行业研究》课件
- 团队凝聚力培训
- MBA领导力培训课程
- 《女子体育卫生》课件
- 《电工基本知识》课件
- 《光电发射器件》课件
- 妊娠糖尿病护理知识
- 肌内效贴布贴扎技术
- 普通话培训 省级普通话测试员
- 重大版小学英语五年级上册全册教案
- 第五单元《简易方程》大单元教学解读五年级数学上册人教版
- 凯里市舟溪镇3.19较大爆炸事故
- 药物性肝损伤的药物治疗
- 血液系统疾病总论(血液科)
- Python绘图库Turtle详解(含丰富示例)
- 静脉采血技术静脉采血图片课件
- DLT664-2008-带电设备红外诊断应用规范
- 【课题研究设计与论证报告】深度学习视角下幼儿园自主游戏支持策略的实践研究
评论
0/150
提交评论