




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章循环结构程序设计本章的学习重点和难点循环的概念循环的基本语句结构和流程循环在常用算法中的应用引言循环结构是程序的三大算法结构之一,是相对比较难理解和运用的结构,很多问题常常要以它作为基础来的解决,因此,是否能掌握好循环结构是非常关键的学习循环时首先,弄清楚循环的概念,以及具体循环语句结构的流程(可以利用单步调试工具)第二步应学会根据已有的算法流程图结构,去套用书中循环语句结构来解决问题第三步,学会自己分析问题,将问题中的某些重复性工作,抽取出来,找出其中的规律,画出流程图,最后用某种适合的循环语句实现第四步,通过学习,积累经典算法,学会将这些算法融会贯通,运用到实际问题的解决*引例循环结构就是这样一种专门用于实现有规律的重复性操作的算法结构,是程序基本的三大算法结构之一。循环——重复地执行某些操作。计算机语言中的循环就是指在指定的条件下,重复执行一组语句;这组被重复执行的语句就称为循环体,而指定的条件就称作循环条件
*引例要求输出显示6行星号分析:要求重复6次输出一行由16个星号所构成的字符串,因此,循环条件就是输出的行数<6,重复执行的循环体就是printf("****************\n");#include<stdio.h>intmain(){inti=0; //定义计数器变量i来记录目前已输出的行数while
(i<6)
//当输出行数未达到6行,反复执行下面语句
{
printf("****************\n");i++; //每输出一行信息,计数器i累加1
} //返回到while行return0;}*引例要求输出n行星号分析:要求输出的16个星号的行数由用户决定
#include<stdio.h>intmain(){inti=0,n; //定义变量n记录用户输入的指定行数
scanf("%d",&n);
//接收用户输入的行数while
(i<n)
//当输出行数未达到n行,反复执行下面语句
{
printf("****************\n");i++; //每输出一行信息,计数器i累加1
} //返回到while行return0;}循环结构当型循环用while语句实现循环用do-while语句实现循环用for语句实现循环循环的嵌套跳转语句:break和continue语句当型循环格式1while型while(循环条件)
循环体True循环条件循环体False要求输出显示n行星号#include<stdio.h>intmain(){inti=0,n;
scanf("%d",&n);
while
(i<n)
{
printf("****************\n");i++;
} //返回到while行return0;}当型循环“循环体”可以由若干条语句构成;“循环条件”通常是一个关系或逻辑表达式,其值为True或False。两种格式的while循环都表示:仅当循环条件成立,即为真“True”时,重复执行循环体,否则循环条件不成立,即为假“False”时,结束循环格式1是每一次进入循环,先判断循环条件是否为“True”,后决定是否进入执行循环体;格式2是先执行一次循环体,后进行判别循环条件是否为真“True”,以决定是否再次进入执行循环体。格式1的循环有可能一次也没进入循环体执行,格式2是不管循环条件是否为真,至少执行一次循环体*例题6-2求1+2+3+…+n求多项数据之和,整个累加过程一直在重复执行sum=sum+i,其中累加项i的变化规律为:
i=i+1,i的初值为1,终值为n,即当i的值<=n进行累加操作sum+i→sum开始结束FalseTrue0→sum1→ii≤n输出求和结果sumi+1→i输入n*例题6-2求1+2+3…+n程序代码设计:循环条件:当i的值<=n进行累加;循环体:sum=sum+i,i=i+1#include<stdio.h>intmain(){ inti=1,sum=0,n;
scanf("%d",&n);
while(i<=n)
{
sum=sum+i;
i++;
}
printf("%d",sum); return0;}sum+i→sum开始结束FalseTrue0→sum1→ii≤n输出求和结果sumi+1→i输入n例6-2用while循环求1+2+3…+n
#include<stdio.h>intmain(){
inti=1,sum=
0,n;
scanf("%d",&n);
while(i<=n)
{
sum=sum+i;i++;
}
printf("%d",sum);return0;}循环初值循环终值循环变量增值循环条件循环体inti=2,sum=
1,n;scanf("%d",&n);while(i<=n){sum=sum+i;i++;}改写inti=0,sum=
0,n;scanf("%d",&n);while(i<n){i++;sum=sum+i;}改写例6-5用do-while循环求1+2+3…+n
#include<stdio.h>intmain(){inti=1,sum=
0,n;
scanf("%d",&n);
do
{
sum=sum+i;i++;
}while(i<=n);
printf("%d",sum);return0;}#include<stdio.h>intmain(){inti=1,sum=
0,n;
scanf("%d",&n);
while(i<=n)
{
sum=sum+i;i++;
}
printf("%d",sum);return0;}当型循环在循环体中,至少要有一条语句使得循环条件趋向于假“False”,即使循环语句在有限的时间内执行完毕,否则将会出现“死循环”程序运行时出现“死循环”,按break中止(中断)程序运行,然后进行调试将循环条件中影响循环次数的变量,称为循环控制变量[演示]*例6-20采用欧几里德算法求解两个自然数的最大公约数的程序
算法分析:“欧几里德算法”①输入两个自然数m、n②求m除以n的余数r③m←n④n←r⑤若r≠0,则转②,否则转⑥⑥输出m和n的最大公约数mFalse输入两个自然数m,nr=m%nm=nn=rr
0输出最大公约数m开始结束True*例6-20设计采用欧几里德算法求解两个自然数的最大公约数的程序程序代码设计:输入的数据M和N要求是自然数,所以在程序中应加入对数据的合法性进行检验的部分考虑到程序的应用范围,数据类型可选用整型根据算法流程图可知这是一个循环结构:循环条件是r<>0,
r是循环控制变量,循环体是
r=m%n;m=n;n=r;False输入两个自然数m,nr=m%nm=nn=rr
0输出最大公约数m开始结束True*例6-20#include<stdio.h>intmain(){
intn,m,r;scanf(“%d,%d”,&m,&n);
do
//求最大公约数
{r=m%n;m=n;n=r;
}while(r!=0)printf(“GCD=%d\n",m);
return0;}while(r!=0)
Nor=m%n;m=n;n=r;*例6-20最大公约数和最小公倍数
若已知整数x和y的最大公约数是k,则它们的
最小公倍数是x*y/k
求两个整数最大公约数的两种方法。
(1)辗转相除法(欧几里德算法)
(2)相减法
1.最大公约数和最小公倍数(2)相减法。递推公式如下:两个数中从大数中减去小数,所得的差若与小数相等,则该数为最大公约数。若不等,对所得的差和小数,继续从大数中减去小数,……,直到两个数相等为止。当型循环例6-19验证谷角猜想。对于任意一个自然数n,若n为偶数,则将其除以2;若n为奇数,则将其乘以3,然后再加1。如此经过有限次运算后,总可以得到自然数1。
分析:由于不能确定要多少步才能结束运算,因此本题中采用当型while循环语句实现。使用变量n存放该正整数,每次重新计算出的新值仍然存放在n中。当n未达到1时继续执行运算,当n等于1时结束循环。
例6-19代码: intn; printf(“请输入一个正整数:”); scanf(“%d”,&n); printf(“%d”,n); if(n>0) while(n!=1) { if(n%2==1)n=n*3+1;elsen=n/2; printf(“->%d”,n);} elseprintf(“输入数据错误\n”);*例题设计一个小程序,能够实现接收若干的专家的考评打分,输入-1表示打分结束,最后计算出平均考评分
分析:要求出专家的平均考评分Average,所以先得求出专家的考评总分Total,然后再除以考评分个数Num。而考评总分的计算,就是要将每个专家的考评打分Mark依次累加专家的打分并非一次性给出,而是在程序运行时,由用户依次输入,因此要进行考评总分的计算,必须先接收一个用户输入的专家打分,只要该专家打分不为-1(表示结束输入),就进行累加这个考评打分,然后再继续接收下一个用户输入的专家打分……重复若干次,直到用户输入的数据为-1为止
*例题设计一个小程序,能够实现接收若干的专家的考评打分,输入-1表示打分结束,最后计算出平均考评分
界面设计:由于要接收的数据无法预知其个数,所以采用输入函数scanf,结合循环实现输入一个专家打分Mark总分累加Total=Total+Mark输出平均考评分Average开始结束FalseTrue总考评分清零Total=0Mark<>-1输入下一个专家打分MarkAverage=Total/Num考评分个数清零Num=0考评分个数累加Num=Num+1*例题设计一个小程序,能够实现接收若干的专家的考评打分,输入-1表示打分结束,最后计算出平均考评分
程序代码设计:根据算法流程图可知这是一个循环结构:循环条件是专家打分Mark-1,Mark是循环控制变量,循环体是Total=Total+Mark;Num=Num+1;输入下一个专家打分Mark,于是,可以套用上述循环语句格式1输入一个专家打分Mark总分累加Total=Total+Mark输出平均考评分Average开始结束FalseTrue总考评分清零Total=0Mark
-1输入下一个专家打分MarkAverage=Total/Num考评分个数清零Num=0考评分个数累加Num=Num+1*例题main(){intnum;floataverage,mark,total;total=0.0;num=0;printf("请输入一个专家考评分:");scanf("%d",&mark);
while(mark!=-1)
{total=total+mark;num=num+1;
printf("请输入一个专家考评分:");scanf("%d",&mark);}average=total/num;printf("%d位专家的平均考评分为:%.2f",num,average);}scanf("%d",&mark);if(mark!=-1){do
{ total=total+mark;num=num+1;
printf("请输入一个专家考评分:");scanf("%d",&mark);
}while(mark!=-1);average=total/num;;printf("%d位专家的平均考评分为:%.2f",num,average);}else
printf("请输入正确的专家考评分");练习:从键盘输入各学生成绩,并对成绩不及格(60分以下)的学生人数进行计数,直到输入的成绩为负为止,最后输出成绩不及格的学生人数。计数count=0输出count输入成绩grade输入成绩gradecount=count+1当grade>=0.0grade<60.0YesNo#include<stdio.h>intmain(){intcount=0;floatgrade;
scanf("%f",&grade);
while(grade>=0.0){
if(grade<60.0)count+=1;
scanf("%f",&grade);
}printf("count=%d\n",count);return0;}for循环结构语句格式
for(初始动作;条件;每轮的动作)
{
循环体 }初始动作——通常通过赋值表达式完成某些变量(循环控制变量)的初始值设定条件——循环条件,当条件为真,执行循环体,条件为假,结束for循环每轮动作——通常用于改变循环控制变量的值循环体——可以由多条语句构成,仅当循环体只有一条语句构成时,大括号可以省略。格式
for(初始动作;条件;每轮的动作)
{
循环体 }初始动作、条件、每轮的动作都是表达式For循环语句执行流程:(1)执行初始动作
(2)如果条件值为非0,就重复执行(3)循环体和(4)每轮的动作,直到条件值为0时止。for循环结构语句for循环结构语句的执行流程图初始动作循环体每轮的动作满足条件?falsetrueintc=0,i;for(i=2;i<=18;i+=3) c++;
for循环结构语句for(初始动作;条件;每轮的动作)
{ 循环体 }第几次循环ci0215283114145176200123456<=18i=i+3上述for的循环次数
=(18-2)/3+1=6循环次数的计算公式
(终值-初值)/步长+1for循环结构语句循环次数的计算公式(终值-初值)/步长+1当循环变量在循环体内改变(被重新赋值),则会影响和改变循环次数,此时循环次数计算公式无效intc=0,i;
for(i=2;i<=18;i+=3)
{c=c++;
i=i+2;
}第几次循环ci021429314419012347121722<=18i=i+3for循环结构语句初始动作是在真正进入for循环执行循环体之前就计算确定。条件和每轮的动作表达式中所包含的变量在循环体内被改变,会影响循环次数,即每次执行完循环体,都重新计算。intc=18,i;
for(i=2;i<=c;i+=3) c++;第几次循环ci02152831141451762018192021222324for循环等价于:初始动作;while(条件) { 循环体; 每轮的动作; }725238262692729阅读程序,写出下列循环的运行次数,并给出执行结果。(注意输出格式)main(){ inta=2,b=10,c=1,i; for(i=c;i<=2*b;i+=a) { a=a+2; i=i+1; c=2*c; if(a>=10)break; b=b–3; } printf(“i=%d,a=%d,b=%d,c=%d\n”,i,a,b,c);}第几次循环aicb0211011422762674413*例题for循环实现:要求输出显示6行星号分析:循环体:Print"****************",循环变量i表示输出行,从1变化到6,即循环变量i的初值为1,终值为6,步长为1,循环次数为6#include<stdio.h>intmain(){inti; for(i=0;i<6;i++)
printf("****************\n");return0;}对比for循环和while循环,很明显for循环更适合、更方便的实现能预知循环次数(重复操作次数)的问题
例题求1+2+3…+n分析:求多项数据之和,首先得设置一个累加器sum,存放累加结果。根据一般人们求和的步骤,多个数据累加的过程如下:sum0=0sum1=sum0+1sum2=sum1+2sum3=sum2+3………………sumn=sumn-1+n归纳:求多项数据之和,整个累加过程一直在重复执行sum=sum+i,一共重复n次,其中累加项i的变化规律为:i=i+1,i的初值为1,终值为n,即当i的值超过n结束累加操作例题求1+2+3…+n程序代码设计:循环体是sum=sum+i,而累加项i的变化恰好与累加次数一致,所以可以利用累加项i来控制循环次数,即将i兼用做循环变量,初值为1,终值为n,循环改变量1#include<stdio.h>intmain(){intsum,i,n;scanf("%d",&n);for(i=1,sum=0;i<=n;i++)
sum=sum+i;//累加printf("1+...+%d=%d",n,sum);return0;}求1~n之间所有的偶数之和intsum=0,i=1,n;scanf("%d",&n);for(;i<=n;) {
sum=sum+i;//累加
i++; }
#include<stdio.h>intmain(){intsum,i,n;scanf("%d",&n);
for(i=1,sum=0;i<=n;i++)
sum=sum+i;//累加printf("1+...+%d=%d",n,sum);return0;}例题求1~n之间所有的偶数之和思路1:循环变量i,初值为1,终值为n,循环控制变量的改变量为1;循环体:当i是偶数,则累加sum=sum+iif(i%2==0)
sum=sum+i;//偶数累加#include<stdio.h>intmain(){intsum,i,n;scanf("%d",&n);
for(i=1,sum=0;i<=n;i++)
sum=sum+i;//累加printf("1+...+%d=%d",n,sum);return0;}例题8-5求1~n之间所有的偶数之和思路2:设置累加项i初值为2,i的变化规律为i=i+2,即循环控制变量的改变量为2;循环体:累加sum=sum+ifor(i=2,sum=0;i<=n;i+=2)若求1*2*3…*n,即n!例题从用户输入的连续的一串字符信息中,分类统计大写、小写字母、数字字符和非数字字母的数量分析[逐步求精]:对输入的每一个字符都要进行分类判断,并进行统计,一共要重复进行字符串长度次。因此,循环体就是针对于一个字符的分类判断统计,而循环次数就是字符串长设置循环控制变量i,控制分类判断统计字符,表示从字符串的第一个字符,依次判断统计到最后一个字符。for(;(i=getchar())!='\n';)//输入一串字符,回车结束//对每个字符进行分类判断和统计?例题从用户输入的连续的一串字符信息中,分类统计大写、小写字母、数字字符和非数字字母的数量程序代码设计:若i表示输入的一个字符,如何判断?统计?分类统计则可以通过分别设置三个计数器,进行累加if多分支结构语句实现分类判断if(i>='A'&&i<='Z'||i>='a'&&i<='z') ch=ch+1; //字母计数器ch+1elseif(i>='0'&&i<='9') digital=digital+1; //数字计数器digital+1else other=other+1; //其他字符计数器other+1例题从用户输入的连续的一串字符信息中,分类统计大写、小写字母、数字字符和非数字字母的数量程序代码设计:chari;intch=0,other=0,digital=0;for(;(i=getchar())!='\n';)
if(i>='A'&&i<='Z'||i>='a'&&i<='z') ch=ch+1; //字母计数器ch+1
elseif(i>='0'&&i<='9') digital=digital+1; //数字计数器digital+1
else other=other+1; //其他字符计数器other+1printf("char=%d,digital=%d,others=%d\n",ch,digital,other);
选择循环语句的Tipsfor中每一个表达式都是可以省略的 for(;条件;)==while(条件)如果有固定次数(或知道变化的范围),用for循环如果必须执行一次,用do-while循环其他情况用while循环死循环永远不会退出的循环为死循环for(;;) {}while(1) {}do
{ }while(1);一般情况下,要极力避免死循环绝大多数程序不需要死循环。如果出现,往往都是bug。时间过长的循环会造成“假死”效果,也要考虑解决。嵌套循环循环的嵌套:一个循环体内包含了另一个完整的循环结构。嵌套循环的跳转禁止:从外层跳入内层跳入同层的另一循环向上跳转循环嵌套 for(i=1;i<=9;i++) { for(j=1;j<=9;j++) printf("%d*%d=%d\t",i,j,i*j);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学习如何开展数据库开发的敏捷实践试题及答案
- 学校课程体系管理制度
- 学校食堂品质管理制度
- 公司消防治安管理制度
- 工厂整形物料管理制度
- 公路试验检测管理制度
- 分租仓库安全管理制度
- 农药仓库使用管理制度
- 了解公路工程多种施工方法试题及答案
- 公司食堂餐卡管理制度
- 医美整形医院渠道合作协议样本
- 《术前肠道准备》课件
- RTO蓄热焚烧系统操作规程
- CONSORT2010流程图(FlowDiagram)【模板】文档
- 篮球比赛分组循环积分表
- 高中英语词汇3500词(必背)-excel版
- 人音版 音乐六年级上册 《七色光之歌》课件
- 五年级下册美术教学设计及教学反思-第14课 桥|苏少版
- 海外政策手册(2):国别研究沙特经济转型与中沙合作机遇
- 办公用品采购管理制度及流程
- 《洪水影响评价技术导则》
评论
0/150
提交评论