循环结构的程序设计PPT课件_第1页
循环结构的程序设计PPT课件_第2页
循环结构的程序设计PPT课件_第3页
循环结构的程序设计PPT课件_第4页
循环结构的程序设计PPT课件_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

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

文档简介

循环结构的程序设计,.,1,第6章循环结构的程序设计,本章要点循环语句的执行流程不同形式的循环控制多重循环问题简单算法设计,.,2,第6章循环结构的程序设计,循环的基本概念while语句for语句do_while语句转移语句循环应用,.,3,6.1循环的基本概念,提出问题提问:从键盘上输入10个整数并求和,怎么编程?回答:在程序中写10个scanf语句,还可以写%d%d提问:从键盘上输入500个整数并求和,怎么编程?回答:这个,嗯?不会让我写500个以上问题的实质是:将scanf函数重复执行N遍。我们可以引出一个概念“循环”,简单而言:循环就是不断反复地执行同一段程序。,?,.,4,6.1循环的基本概念,循环反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。C语言中控制循环的语句:whilefordo_while,.,5,第6章循环结构的程序设计,循环的基本概念while语句for语句do_while语句转移语句循环应用,.,6,6.2while语句,while语句格式while(表达式)语句;说明:语句可是简单语句,也可是复合语句。while语句的执行流程,.,7,6.2while语句,执行语句,成立,不成立,执行while循环之后的语句,while(表达式)语句;,.,8,6.2while语句,例:从键盘输入10个整数,求这10个整数之和程序主体:,输入num,成立,不成立,输出结果total,计数器count=0,累加器total=0,total+=num,count=count+1,开始,结束,while(count10),count+;,scanf(%d,total+=num;,.,9,6.2while语句,#includemain()intcount,num,total;/*count:计数器,num:输入的整数*/count=0;total=0;/*total:存放累加和*/,while(count10)/*循环控制条件*/printf(EntertheNo.%d=,count);/*循环体*/scanf(%d,printf(Total=%dn,total);,.,10,6.2while语句,例:求110的阶乘n!程序主体:while(i1时,.,11,6.2while语句,#includemain()longs=1;/*s:存放累积结果*/inti=1;/*i:计数器,同时是累积的对象*/,while(i=10)/*循环控制条件*/*循环体*/s*=i;/*计算累积和*/i+;,printf(“10!=%dn,s);,以求10!为例,.,12,6.2while语句,比较total=0;count=0;while(count10)total+=num;count+;,s=1;i=1;while(i=10)s*=i;i+;,10个数相加,10个数相乘,.,13,6.2while语句,例:分析程序运行结果,#includemain()intn=0;while(n3)printf(“nis%dn”,n);n+;,结果:程序将不停的打印“nis0”,直至终止程序无法正常终止的程序,称为“死循环”。结论:while语句循环体中,一定要有能够对循环控制条件产生影响的语句,避免出现“死循环”现象。,.,14,6.2while语句,例:求1413的最后三位数。问题分析:,14的13次方已经超出了计算机所能表示的整数范围,乘法规律:乘积的最后三位的值只与乘数和被乘数的后三位有关,C语言中最长的整数是:,无符号长整型数:04294967295,10位,1410=289254654976,12位,问题被简化为求三位数乘法,.,15,6.2while语句,main()inti=1,x,y,a=1;printf(InputXandY:);scanf(%d*%d,InputXandY:14*133digitsis:144InputXandY:15*123digitsis:625,.,16,6.2while语句,如何一次输入多个字符或数值例:将从键盘输入的一行字符(回车结束)复制到标准输出(显示器)。回顾字符输入输出函数:getchar():调用时,等待用户按键,输入的字符存入键盘缓冲区,直到用户按回车为止(回车也在缓冲区)。输入回车后,getchar从输入流每次读一个字符,作为其返回值。其它未读的字符保留在缓冲区,待下一个getchar调用。,.,17,6.2while语句,#includemain()charch;ch=getchar();while(ch!=n)putchar(ch);ch=getchar();,ab13cdeab13cde,putchar(ch=getchar();,putchar(getchar();,.,18,6.2while语句,#includemain()charch;while(ch=getchar()!=n)putchar(ch);,一段更简洁的程序,.,19,6.2while语句,例:输入若干整数,竖排输出,当输入为0时程序结束。如:输入13-63560输出:13-6356scanf():调用时,等待用户输入,输入的内容存入键盘缓冲区,直到用户按回车为止(回车不在缓冲区)。输入回车后,scanf从输入流每次按格式读一个单元,作为其返回值。其它未读的内容保留在缓冲区,待下一个scanf调用。,.,20,6.2while语句,#includemain()intx;scanf(“%d”,scanf()把缓冲区的内容全部读完以后,才再次等待用户从键盘输入,输入:13-63560输出:13-6356,输入:13-635607输出:13-6356,输入:13-6,.,21,6.2while语句,循环嵌套在循环体中,又包含有循环语句。whilewhile,.,22,6.2while语句,例:输出下三角形乘法九九表。123456789-12436948121651015202561218243036714212835424981624324048566491827364554637281假设:行号为i,列号为j则第i行中一共要输出i个乘积,每一项为i*j。,(1=i=9),(1=j=i),i=6j=5i*j,屏幕上的字符只能从上到下逐行显示,同一行内,只能从左到右逐字显示。,.,23,6.2while语句,显示要求屏幕上的字符只能从上到下逐行显示,同一行内,只能从左到右逐字显示。伪代码(Pseudocode)while(控制显示n行)while(控制显示一行中的m个字符)输出一个需要的字符;列计数器j+;行数计数器i+;,.,24,#includemain()inti=1,j;/*i:行计数器j:列计数器*/while(i=9)/*控制打印表头*/printf(%4d,i+);printf(n-n);i=1;while(i=9)j=1;/*列计数器置1*/while(j=i)/*嵌套的二重循环,输出第i行*/printf(%4d,i*j);j+;/*列计数器+1*/printf(n);/*一行输出结束后,输出n*/i+;/*行计数器+1*/,外层循环体执行1次,内层循环要完整执行1次,.,25,第6章循环结构的程序设计,循环的基本概念while语句for语句do_while语句转移语句循环应用,.,26,6.3for语句,for语句格式for(表达式1;表达式2;表达式3)语句;说明:语句可是简单语句,也可是复合语句。for语句的执行流程,.,27,6.3for语句,循环初始条件,循环控制条件,执行语句,成立,不成立,执行for循环之后的语句,执行表达式3,执行表达式1,循环体,for(表达式1;表达式2;表达式3)语句;,for语句等价于下列语句:表达式1;while(表达式2)语句;表达式3;,.,28,6.3for语句,#includemain()longn=1;inti;,i=1;while(i=10)n*=i;i+;,printf(“10!=%dn,n);,for(i=1;i=10;i+)n*=i;,for语句最常用的形式:for(初值;控制条件;增量)语句;,.,29,例:用for语句实现打印乘法九九表#includemain()inti,j;for(i=1;i=9;i+)printf(%4d,i);printf(n-n);for(i=1;i=9;i+)for(j=1;j=3)为求出第N项的值,请编写程序。根据递推通项公式,可用递推法编写程序,计算第N项的值。,.,33,6.3for语句,递推法由初始的已知条件开始,先计算出第(N-1)步的结果,再利用已知的前(N-1)项结果,按递推公式(或遵照递推规则),推出第N步结果。递推法是程序设计中最常用的方法之一,使用递推法必须有明确的递推初始值和递推规则(递推公式)。,.,34,6.3for语句,程序主体f=f2=1;for(i=3;i=n;i+)f1=f2;f2=f;f=f1+f2;,向前传递前两项f1=f2f2=f,成立,不成立,初始化:f=f2=1,计算f=f1+f2,递推项:i=3,i+,数列对应关系:f1,f2,f,递推计算,f1=f2=1;for(i=3;i=n;i+)f=f1+f2;f1=f2;f2=f;,.,35,#includemain()longf1,f2,f;inti;for(;)printf(Inputn=?);scanf(%d,.,36,6.3for语句,语句中的逗号(,)运算逗号(,)运算常见的三种用途是:在变量说明表中用来分隔变量,起分隔符的作用,如:inti,j,k,m3,*p;在函数的参数表中分隔参数。如:printf(n=%d,x=%dn,n,x);在语句中使用。其形式是:表达式n1,表达式n2;用逗号分隔开的表达式从左到右进行计算,结果的类型和值是最右边表达式的类型和值。,.,37,6.3for语句,例:输出下列字符串:azbycxdwevfugthsirjqkplomn分析:奇数位上的字符从a开始逐次递增,偶数位上的字符从z开始逐次递减。#includemain()chari,j;/*i:奇位字符j:偶位字符*/for(i=a,j=z;ij;i+,j-)printf(%c%c,i,j);/*输出两个字符*/printf(n);,azbycxdwevfugthsirjqkplomn,.,38,第6章循环结构的程序设计,循环的基本概念while语句for语句do_while语句转移语句循环应用,.,39,6.4do_while语句,do_while语句格式do语句while(表达式);do_while语句的执行流程,.,40,6.4do_while语句,执行语句,成立,不成立,执行while子句之后的语句,循环控制条件,循环体,后判断,do语句while(表达式);,.,41,6.4do_while语句,do_while语句的特点do-while与while和for的最大区别:do-while语句先执行循环体然后再判断循环控制条件,while和for先判断条件,之后再执行循环体。使用do-while构成的循环,循环体部分至少要执行一次;使用while和for构成的循环,循环体部分有可能一次也不会执行。,.,42,6.4do_while语句,#includemain()longn=1;inti;,i=1;while(i=10)n*=i;i+;,printf(“10!=%dn,n);,for(i=1;i0),公差为d(d0)。则该数列满足条件:a+(a+d)+(a+2*d)+(a+3*d)=4*a+6*d=26a*(a+d)*(a+2*d)*(a+3*d)=880可以推出,首项a和公差d的取值范围为:1=a=51=d=3可以使用穷举的方法,在首项a和公差d的取值范围内进行判断。,.,59,6.5.3goto语句,main()inta,x,y,d,i;for(a=1;a=5;+a)/*在a的范围内穷举*/for(d=1;d=3;+d)/*在d的范围内穷举*/x=a+(a+d)+(a+2*d)+(a+3*d);/*前四项的和*/y=a*(a+d)*(a+2*d)*(a+3*d);/*前四项的积*/if(x=26,.,60,6.5.3goto语句,main()inta,x,y,d,i,flag=1;/*flag:标志变量*/for(a=1;a=5/*控制退出二重循环*/,通过增加标志变量可以有效地控制循环,.,61,6.5.4return语句,格式格式1:return;格式2:return(表达式);功能return语句使程序从被调用函数中返回到调用函数的调用处继续运行;如果return后跟一表达式,则该表达式的值会从被调用函数中带回到调用它的函数,称为返回值。,.,62,第6章循环结构的程序设计,循环的基本概念while语句for语句do_while语句转移语句循环应用,.,63,程序设计的一般步骤分析题意,明确问题的性质数值问题/非数值问题建立问题的描述模型数学模型/过程模型设计/确定算法数学问题:数值分析非数学问题:数据结构/算法分析与设计一般方法:穷举/递推/递归/.编程调试分析运行结果,.,64,6.6循环应用,穷举法,.,65,例:百钱百鸡问题中国古代数学家张丘建在他的算经中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?问题分析与算法设计设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程:x+y+z=1005x+3y+z/3=100取值范围:0=x,y,z=100可以采用穷举法求解。,将变量x、y、z的所有取值可能代入方程进行计算,.,66,main()intx,y,z,j=0;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if(x+y+z=100运行结果:1:cock=0hen=25chicken=752:cock=3hen=20chicken=777:cock=12hen=4chicken=84,.,67,丢失重要条件:z应该能够被3整除。main()intx,y,z,j=0;for(x=0;x=20;x+)for(y=0;y=33;y+)for(z=0;z=100;z+)if(z%3=0运行程序,正确的结果:1:cock=0hen=25chicken=752:cock=4hen=18chicken=783:cock=8hen=11chicken=814:cock=12hen=4chicken=84,z+=3),.,68,优化程序:for(x=0;x=20;x+)for(y=0;y=33;y+)for(z=0;z=100;z+)if(z%3=0,.,69,例:新娘和新郎问题:三对情侣参加婚礼,三个新郎为A、B、C,三个新娘为X、Y、Z。有人不知道谁和谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的:说他将和结婚;说她的未婚夫是;说他将和结婚。这人听后知道他们在开玩笑,全是假话。请编程找出谁将和谁结婚。问题分析与算法设计:设:a、b、c三人用1、2、3表示,将x和a结婚表示为x=1,将y不与a结婚表示为y!=1。则:x!=1A不与X结婚x!=3X的未婚夫不是Cz!=3C不与Z结婚题意还隐含:x!=y且x!=z且y!=z,.,70,main()intx,y,z;for(x=1;x=3;x+)/*穷举X的全部可能配偶*/for(y=1;ym10的整数,.,72,main()intx,y,m,flag;/*flag:标志变量*/for(x=0,flag=1;flag;x+)/*穷举x*/y=100+x;/*计算y*/for(m=10;m*my;m+);if(m*m=y)/*判断y是否为一个数的平方*/for(;m*my+68;m+);if(m*m=y+68)/*判断y+68*/printf(%dn,x);flag=0;/*flag置0,结束循环*/,穷举x、m、n,.,73,main()inty,m,flag;/*flag:标志变量*/for(y=101,flag=1;flag;y+)/*穷举y*/for(m=10;m*my;m+);if(m*m=y)/*判断y是否为一个数的平方*/for(;m*my+68;m+);if(m*m=y+68)/*判断y+68*/printf(“%dn”,y-100);flag=0;/*flag置0,结束循环*/,穷举y、m、n,.,74,main()intm,n,flag;/*flag:标志变量*/for(m=10,flag=1;flag;m+)/*通过穷举m,直接构造平方数y*/for(n=10;n*nm*m+68;n+);/*判断m*m+68是否为平方数*/if(n*n=m*m+68)printf(”%dn”,m*m-100);flag=0;/*flag置0,结束循环*/,穷举m、n,.,75,6.6循环应用,穷举法的关键判断问题是否适合使用穷举法明确穷举的终止条件穷举的对象(变量)的范围注意效率减少尝试次数,.,76,求555555的约数中最大的三位数求不超过n的最大素数求首项大于0的等差数列:前四项和为26,前四项的积为880从键盘上任意输入一个正整数,要求判断该正整数是否是另一个整数的平方。百钱百鸡新娘和新郎其它排列组合问题亲密数、黑色星期五、求各位数字之和等于5且能被5整除的整数、马戏团观众人数、求等于其各位数字的阶乘之和的正整数、求满足条件的等差数列、乒乓球比赛对阵方案,.,77,6.6循环应用,图形问题,.,78,例:在一行中输出m个*号。例如,输入m=4,输出的图形如下:*,基本语句:输出一个*号:ptintf(“*”);或putchar(*);基本算法:1.输入m2.重复输出m个*;3.输出一个n,scanf(“%d”,.,79,例:输出边长为m的正方型例如,输入m=4,输出如下图形:*算法分析与设计:1.输入m,2.重复输出m行,每行输出m个*;加细1:1.输入m;2.for(i=1;i=m;i+)输出一行中的m个*;,.,80,加细2:1.输入m;2.for(i=1;i=m;i+)输出m个*;换新行;加细3:1.输入m;2.for(i=1;i=m;i+)for(j=1;j=m;j+)printf(“*”);printf(“n”);,.,81,整理,得到程序如下:main()intm,i,j;scanf(“%d”,j+)/*输出一行中的m个*号*/printf(“*”);printf(“n”);分析方法逐步求精法对于比较复杂问题,不可能一下得到程序,可以先将简单的部分明确出来,再逐步对复杂部分进行细化,一步一步推出完整程序。,.,82,例:输出边长为m的平行四边形例如,输入m=4,输出如下图形:*,算法分析与设计:在正方型每行*号的前面先多输出若干个空格。对于第i行,1=i=m,则应先输出个空格。,m-i,.,83,main()intm,i,j;scanf(“%d”,j+)/*输出一行中的m个*号*/printf(“*”);printf(“n”);,关键在于找出每行要输出的空格和*的个数,.,84,j=i,i+j=m+1,*,*,j=1i个*,j=1i-1个,*,*,j=1m-i+1个*,j=1m-i个,j=1m-i+1个*,j=1i个*,j=m-i+1,.,85,例:输出m行用*组成的等腰三角形例如,输入m=4,输出如下图形:,*,j=1m-i,j=12i-1*(“n”),i=1m,i个*,i-1个*,.,86,例:输出边长为m的菱形例如,输入m=4,输出如下图形:,*,j=1m-i,j=12i-1*,i=1m,j=1m-i,j=12i-1*,i=m-11,i=1234321,.,87,例:输出边长为m的空心菱形例如,输入m=4,输出如下图形:,*,j=1m-i,j=1或2i-1*其它,i=1m,j=1m-i,j=1或2i-1*其它,i=m-11,.,88,打印图形小结main()intm,i,j;scanf(“%d”,*,特殊情况特殊处理,.,89,*,*,.,90,例:打印数字魔方。例如,输入m=5,输出的图形如下:1234523451345124512351234基本算法:重复打印m行。第i行的第一个数字为i,之后依次递增,但以m为模:aij=(i+j-2)%m+1,.,91,main()inti,j,m;printf(EnterM:);scanf(%d,.,92,例:输出数字阵列:12345678910111213141516算法分析与设计:设法找到数字的分布规律,用循环的方式自动生成。阵列中数字按行的顺序依次是1,2,16。,.,93,#defineN4main()inti,j,k=1;for(i=0;i(m+1)/2,C.i(m+1)/2j=(m+1)/2,B.i(m+1)/2,A.i=(m+1)/2j=(m+1)/2,将图形分为四个区:,11111

温馨提示

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

评论

0/150

提交评论