周程序控制结构循环结构_第1页
周程序控制结构循环结构_第2页
周程序控制结构循环结构_第3页
周程序控制结构循环结构_第4页
周程序控制结构循环结构_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

关于周程序控制结构循环结构第1页,讲稿共54页,2023年5月2日,星期三2引例:编程计算1*2*3*4*5可以这样实现:intproduct;product=1*2*3*4*5;如果问题变为:求1*2*3*…*10000?该问题无法用一个赋值语句实现!典型的循环结构程序第2页,讲稿共54页,2023年5月2日,星期三3一、循环概述第3页,讲稿共54页,2023年5月2日,星期三4循环结构在很多实际问题中会遇到有规律性的重复运算,因此在程序中就需要将某些语句重复执行。一组被重复执行的语句称为循环体;每重复一次,都必须作出是继续还是停止循环的决定,这个决定所依据的条件称为循环条件;循环:在给定条件成立时,反复执行某程序段,直到条件不成立为止。

第4页,讲稿共54页,2023年5月2日,星期三5循环结构入口noPAyes出口循环条件循环体第5页,讲稿共54页,2023年5月2日,星期三6循环结构需要解决的两个问题2.控制循环结构的结构描述条件表示描述方法逻辑表达式关系表达式1.控制循环结构执行的条件表示

while语句do-while语句实现循环结构的语句可使用c中的任意表达式for语句第6页,讲稿共54页,2023年5月2日,星期三7while语句第7页,讲稿共54页,2023年5月2日,星期三8while语句:while(表达式)语句;计算表达式的值;当表达式的值为非0时,反复执行while中的语句;当表达式的值为0时,while循环结束。功能:while语句用来实现“当型”循环。执行流程:第8页,讲稿共54页,2023年5月2日,星期三9while语句执行流程:0非0表达式=?循环体外语句循环体语句循环入口循环结束!开始下一次循环特点:先判断,后执行;若条件不成立,则有可能一次也不执行。适合的情况:知道控制循环的条件为某个逻辑表达式的值,而且在循环中该表达式的值会被改变。第9页,讲稿共54页,2023年5月2日,星期三10例1.编程计算1+2+3+…+10000#include<stdio.h>voidmain(){inti=1,sum=0;while(i<=10000)/*循环结构*/{sum+=i;

i++;}printf(“sum=%d\n”,sum);

}sum

=sum+i;i=i+1;第10页,讲稿共54页,2023年5月2日,星期三11#include<stdio.h>#definen10000voidmain(){inti=1,sum=0;while(i<=n){sum+=i;

i++;}printf(“sum=%d\n”,sum);

}例1.编程计算1+2+3+…+10000第11页,讲稿共54页,2023年5月2日,星期三12#include<stdio.h>voidmain(){inti=1,sum=0,n;printf(“请输入n的值:\n”);scanf(“%d”,&n);while(i<=n){sum+=i;

i++;}printf(“sum=%d\n”,sum);

}第12页,讲稿共54页,2023年5月2日,星期三13do-while语句第13页,讲稿共54页,2023年5月2日,星期三14do-while语句:do{语句;}while(表达式);执行语句;计算表达式的值;当表达式的值为非0时,再次执行do中的语句;当表达式的值为0时,do-while循环结束。执行流程:第14页,讲稿共54页,2023年5月2日,星期三15真(非0)表达式=?语句循环体外语句0do-while语句执行流程:循环结束!开始下一次循环特点:先执行,后判断;循环至少执行一次语句。第15页,讲稿共54页,2023年5月2日,星期三16#include<stdio.h>voidmain(){

inti=0,sum=0;

do{

i++;

sum+=i;

}while(i<10000);

printf("sum=%d\n",sum);}inti=1,sum=0;while(i<=10000){sum+=i;i++;}例2.用do-while语句实现1+2+3+…+10000第16页,讲稿共54页,2023年5月2日,星期三17例3.求满足1+2+3+…+n<500

中最大的N,并求其和,编写程序实现。分析本题还是一个累加求和的问题,当累加和sum500时反复执行循环,否则结束循环步骤定义变量:sum,n;sum和n分别赋初值;

n=0;sum=0;当sum<500时反复执行循环,

否则结束循环。语句为:While(sum<500)

{++n;sum+=n;}第17页,讲稿共54页,2023年5月2日,星期三18#include<stdio.h>voidmain(){intn=0,sum=0;

while(sum<500){++n;sum+=n;}printf("n=%d,sum=%d\n",n-1,sum-n);}Why?为什么不是n,sum?结果n=31,sum=496程序1+2+3+…+n<500第18页,讲稿共54页,2023年5月2日,星期三19例4

.输入两个正整数m、n,求其最大公约数和最小公倍数。分析最大公约数——辗转相除法:两个整数m和n(m>=n);设r表示m除以n的余数;

即:r=m%n;如果,r==0则n中的值为m和n的最大公约数;否则执行:m=n;n=r;转回“如果”处,继续执行。最小公倍数——m和n的乘积除以最大公约数第19页,讲稿共54页,2023年5月2日,星期三20#include<stdio.h>voidmain(){intm,n,GCD,LCM,r,p;

scanf(“%d,%d”,&m,&n);/*(m>n)*/

r=m%n;p=m*n;while(r){m=n;n=r;r=m%n;}GCD=n;LCM=p/GCD;

printf(“thegreatestcommondivision=%d\n”,GCD);

printf(“theleasecommonmultiple=%d\n”,LCM);}while(r!=0)第20页,讲稿共54页,2023年5月2日,星期三21例5.用户输入多个字符,要求按以下规律进行翻译:将用户输入的每一个英文字母变为它后面的字母输出,如:将A变成B,B变成C,…,Z变成A。用户输入的非字母的字符原样输出。

‘!’作为用户输入结束的标志。分析读入第一个字符;当其不是“!”时,进入循环;判断其是否为字母,如果是则将其翻译成该字母的后继;如果读入的字符不是字母,原样输出;再读入下一个字符,返回2步;当输入字符为“!”时结束。第21页,讲稿共54页,2023年5月2日,星期三22#include<stdio.h>voidmain(){charch;scanf

("%c",&ch);while(ch!='!’)

{

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

{if(ch=='z')ch='a'; elseif(ch=='Z')ch='A'; elsech=ch+1; } printf

("%c",ch); scanf

("%c",&ch);

} printf

("字符串结束\n");}第22页,讲稿共54页,2023年5月2日,星期三23思考:给定一个小于等于230的正整数,要求:求出它是几位数;分别正向打印出每一位数字;逆序打印出各位数字;第23页,讲稿共54页,2023年5月2日,星期三24分析:变量:正整数m—小于等于230的正整数;输入:正整数m的值;输出:几位数、正向输出各位数字、逆向输出各位数字;解决问题:变量定义:m为无符号长整型;num:位数;a:某一位数字;求解过程:while(m!=0){……}第24页,讲稿共54页,2023年5月2日,星期三25求解方法:求出它是几位数;用num描述正整数m的位数,初值为0当m>0时,开始统计m的位数while(m>0)因为m>0,m至少有一位,num++;然后把m的个位去除;m=m/10;再判断m是否仍然>0;回到循环头部当循环结束时,即:m==0;结果:num的值即为m的位数;第25页,讲稿共54页,2023年5月2日,星期三26求解方法:分别正向打印出每一位数字;首先应求出m的位数num;然后从最高位开始输出;最高位为:m/10num-1;除了最高位以外,其他的部分为:m%10num-1;循环直到最后一位输出结束。第26页,讲稿共54页,2023年5月2日,星期三27求解方法:3.逆序打印出各位数字;从最低位开始输出;最低位为:m/10;除去最低位,其它的部分为:m%10;循环,直到最高位输出结束。第27页,讲稿共54页,2023年5月2日,星期三28for语句第28页,讲稿共54页,2023年5月2日,星期三29for语句:for(表达式1;表达式2;表达式3)

语句;表达式1:一般为赋值表达式,给控制变量赋初值;表达式2:关系表达式或逻辑表达式,循环控制条件;表达式3:一般为赋值表达式,给控制变量增量/减量;语句:循环体,当有多条语句时,必须使用复合语句。第29页,讲稿共54页,2023年5月2日,星期三300真(非0)表达式2=?语句;循环体外语句表达式1;for语句执行流程:for(表达式1;表达式2;表达式3)语句;表达式3;循环结束!开始下一次循环第30页,讲稿共54页,2023年5月2日,星期三31for语句:首先计算表达式1的值,给循环变量赋初值;再测试表达式2的值,若其值非0,则执行循环体语句;然后计算表达式3的值,修改循环变量的值;回到表达式2处。直到表达式2的值为0(假),则退出循环。执行流程:for(表达式1;表达式2;表达式3)

语句;第31页,讲稿共54页,2023年5月2日,星期三32表达式1表达式2循环体语句表达式3假真当表达式2成立时,执行循环体当表达式2不成立时,退出循环对循环变量赋初值修改循环变量的值返回循环头部第32页,讲稿共54页,2023年5月2日,星期三33for语句:for语句很好地体现了正确表达循环结构应该注意的三个问题:循环控制变量的初始化循环的条件循环控制变量的更新for语句适合的情况——已知循环次数第33页,讲稿共54页,2023年5月2日,星期三34例6.用for语句计算1+2+...+10#include<stdio.h>voidmain(){inti,sum=0;

for(i=1;i<=10;i++)sum+=i;

printf(“%d”,sum);

}i=1i<=10sum+=ii++假真第34页,讲稿共54页,2023年5月2日,星期三35例6与用while、do-while实现差异?#include<stdio.h>voidmain(){inti,sum=0;

for(i=1;i<=10;i++)sum+=i;

printf(“%d”,sum);

}inti=1,sum=0;while(i<=10){sum+=i;

i++;

}

inti=0,sum=0;

do{

i++;

sum+=i;}

while(i<10);第35页,讲稿共54页,2023年5月2日,星期三36for语句的三个表达式都是可以省略的,但分号“;”绝对不能省略。for语句有以下几种格式:(1)for(;;)语句;(2)for(;表达式2;表达式3)语句;(3)for(表达式1;表达式2;)语句;(4)for(i=1,j=n;i<j;i++,j--)语句;注意:第36页,讲稿共54页,2023年5月2日,星期三37for(;;)

该语句是一个死循环,一般用条件表达式加break语句在循环体内适当位置,一旦条件满足时,用break语句跳出for循环。for(;表达式2;表达式3)

使用条件是:循环控制变量的初值不是已知常量,而是在前面通过计算得到。

例如:

i=m-n;

⋯⋯

for(;i<k;i++)语句;第37页,讲稿共54页,2023年5月2日,星期三38for(表达式1;表达式2;)语句

一般当循环控制变量非规则变化,而且循环体中有更新控制变量的语句时使用。例如:

for(i=1;i<=100;)

{

⋯⋯

i=i*2+1;

⋯⋯}for(i=1,j=n;i<j;i++,j--)语句;

在for语句中,表达式1、表达式3都可以有一项或多项,如本例中,表达式1同时为i和j赋初值,表达式3同时改变i和j的值。当有不止一项时,各项之间用逗号“,”分隔。

第38页,讲稿共54页,2023年5月2日,星期三39循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多重循环。循环1循环2第39页,讲稿共54页,2023年5月2日,星期三40for(){…

while()

{…}

}Do{

for()

{…}

}while()while(){

for(){…}

…}for(){

for(){…}

}以下四种均为合法的嵌套循环结构第40页,讲稿共54页,2023年5月2日,星期三41三种循环语句for、while、do-while可以互相嵌套自由组合。但要注意的是,各循环必须完整,相互之间绝不允许交叉。如下面这种形式是不允许的:

do

{

......

for(;;)

{

......

}while();}

注意:第41页,讲稿共54页,2023年5月2日,星期三4298765432198765432181726354453627189645648403224168494235282114736302418126252015105161284963421例7.打印乘法“九九表”第42页,讲稿共54页,2023年5月2日,星期三43分析:定义变量i,j,m;i表示行,从1变化到9;j表示列,从1变化到9;m=i*j;表示表中的值;i取初值1;j从1变化到i;计算出每一个m=i*j,输出m,但不换行。输出换行;

i做一次变化,如果i≤9,则,转回步骤6;否则循环结束。第43页,讲稿共54页,2023年5月2日,星期三44#include<stdio.h>voidmain(){inti,j,m;

printf(“*”);

for(i=1;i<=9;i++)printf(“%4d”,i);

printf(“\n”);

for(i=1;i<=9;i++){printf(“%d”,i);

for(j=1;j<=i;j++){m=i*j;

printf(“%4d”,m);}printf(“\n”);}}程序:输出第一行内循环外循环第44页,讲稿共54页,2023年5月2日,星期三45主程序开始定义三个整型变量※

1234567891

12

243

3694

4812165

5101520256

61218243036

for(j=1;j<=i;j++){m=i*j;

printf(“%4d”,m);}7

71421283542498

8162432404856649

91827364554637281输出一个*号,不换行ij

printf(“\n”);}}计算出每一列的值并输出之依次输出每一行执行结果:voidmain(){inti,j,m;printf(“*”);for(j=1;j<=9;j++)printf(“%4d”,j);printf(“\n”);for(i=1;i<=9;i++){printf(“%d”;i);不换行连续地输出1、2、…、9换行输出输出每一行的行号开始循环输出每一行(外循环)第45页,讲稿共54页,2023年5月2日,星期三46循环结构小结同一个问题,往往既可以用while语句解决,也可以用do-while或者for语句来解决,但在实际应用中,应根据具体情况来选用不同的循环语句。选用的一般原则是:如果循环次数在执行循环体之前就已确定,一般用for语句。如果循环次数是由循环体的执行情况确定的,一般用while语句或者do-while语句;当循环体至少执行一次时,用do-while语句,反之,如果循环体可能一次也不执行,则选用while语句。第46页,讲稿共54页,2023年5月2日,星期三47break语句:用于循环语句和switch语句中,作用是

跳出它所在的循环语句或switch语句。格式:while(条件1){…;if(条件2)break;……}执行过程:每次执行到if语句时,计算条件2的值;如果条件2的值非零,则跳出循环语句;否则,执行if语句的下一条语句。第47页,讲稿共54页,2023年5月2日,星期三48例7.一球从100米高度自由落下,每次落地

后反弹回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?

floath=100.0,sum=0.0;

intn;

for(n=1;;n++){

sum+=h;

h=h/2;//落地后反弹跳回原高度的一半

if(n==10)break;//终止执行本循环

sum+=h;

}

printf(“共经过%f米,第10次反弹%f米\n",sum,h);第48页,讲稿共54页,2023年5月2日,星期三49Continue语句:continue语句类似于break语句,但不是退出循环,而是跳过循环体下部未执行的语句,回到循环头部(while处)接着

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论