您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > 循环结构的程序设计.ppt
第六章循环控制(4学时)Loops第2页6.1循环的概念提出问题提问:从键盘上输入10个整数并求和,怎么编程?回答:在程序中写入10个scanf()语句。提问:从键盘上输入500个整数并求和,怎么编程?回答:这个,嗯……???不会让我写500个......老师:让我们换一个角度来看待这些问题,以上问题的实质是:将scanf函数重复执行N遍。学生:对!好象是这么回事......老师:我们可以引出一个概念“循环”,简单而言:循环就是不断反复地执行同一段程序。学生:这就是我们今天要学的新东西?6.1循环的基本概念例:求1+2+3+4+5+6+7+8+9+10?sum=1+2+3+4+5+6+7+8+9+10如果求1+2+3++100呢?或者求1+2+3++n(n为某一任意指定的数)呢?计算机的操作是一步一步执行的步骤分解原则:计算机的操作是一步一步执行的,步步分解。分解1:sum=0;sum+=1;sum+=2;……sum+=n;1,2,3…n可以用一计数变量i表示分解2:sum=0;i=1;sum+=i;i++;sum+=i;i++;……sum+=i;i++;其中i=n循环结构例6-1:sum=1+2+3+……+n变量初始化sum=0每步执行语句(累加)•循环三要素–变量赋初值sum=0;i=1;–循环语句sum+=i;i++;–循环条件i=n•循环两概念反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。–循环变量:在循环中表示循环增量的变量。i–步长语句:在循环语句中循环变量的变化语句。i++•C中循环的实现方法–goto和if–while–do-while–forgoto语句及goto语句构成的循环1、形式:goto语句标号;3、功能:4、循环构成:无条件转到由语句标号指定的语句去执行。语句标号定义与变量一样。2、说明:与if语句一起。main(){inti=1,sum=0;loop:if(i=100){sum+=i;i++;gotoloop;}printf(“%d”,sum);}注意:尽量不用6.2用while语句设计循环结构1、形式:注意:只包含了两个要初始化应放在while前面.流程如图:循环条件循环语句0非0循环体变量初始化While(循环条件)循环语句;2、功能:3、框图:当循环条件表达式值为非0时执行while中内嵌的循环语句(循环体)•例6-2:sum=1+2+3+……+n分解:sum=0;i=1;sum+=i;i++;sum+=i;i++;……sum+=i;i++;其中i=n0非0初始化循环语句结束条件i=nSum+=i;i++;Sum=0;i=1;main(){intn,i,sum;scanf(“%d”,&n);sum=0;i=1;while(i=n){sum+=i;i++;}printf(“sum=%d”,n,sum);}sum=0;i=1;当i=100sum+=i;i++;while语句-实例例1:分析程序的运行结果#includestdio.hmain(){intn=0;while(n3)printf(”nis%d\n”,n);n++;printf(”That\’sallthisprogramdoes.\n”);}结果:程序将不停的打印“nis0”,直至终止程序无法正常终止的程序,称为“死循环”。结论:while语句循环体中,一定要有能够对循环控制条件产生影响的语句。避免出现“死循环”现象。{}例C3_5103.C:从键盘中读入一系列字符,直到输入字母a时才停止。ch!=’a’?显示ch成立不成立ch=读入一个字符ch=读入下一个字符开始结束while(ch!=’a’){}ch=getchar();putchar(ch);ch=getchar();分析:由于不知道要输入的字符数量,只知停止条件是输入字母a,则只能将循环控制条件设为ch!='a'。程序主体:while语句-实例#includestdio.hmain(){charch;ch=getchar();while(ch!='a'){putchar(ch);ch=getchar();}}while语句-实例例C3_5104.C:对输入的行和字符进行计数。分析:\n作为行结束标记的,DOS中有[CTRL+Z]作为文件结束标记#defineEOF-1#includestdio.hmain(){intc,nl=0,nc=0;while((c=getchar())!=EOF){++nc;if(c=='\n')++nl;}printf(chars=%d,lines=%d\n,nc,nl);}定义文件结束标记nl行计数器nc字符计数器进行字符计数如果找到\n,则行计数while语句-实例循环嵌套在循环体中,又包含有循环语句,构成循环嵌套。例C3_5107.C:输出下三角形乘法九九表。123456789---------------------------------------12436948121651015202561218243036714212835424981624324048566491827364554637281假设:行号为i,列号为ji=6j=5i*j(1=i=9)(1=j=i)则:第i行中一共要输出i个乘积while语句-实例#includestdio.hmain(){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次while语句-实例while使用注意1.while(0){....}由于循环的条件表达式恒等于0,循环体永远也不会执行,是编程者的错误。2.while(1){....}由于循环的条件表达式恒等于1,所以不可能通过循环控制条件来结束循环体的执行,称为“死循环”。3.为了保证循环正常运行,应该特别注意:–循环控制条件–控制条件的初始状态(初始值)–循环体内部对控制条件的影响while语句-实例注意4、循环体如果包含一个以上语句,应该用复合语句({语句组})5、循环语句,最少只执行0次。6.3do-while语句设计循环结构do循环语句while(循环条件);循环条件循环语句0非0循环体一般形式:变量初始化循环条件循环语句NS结构图:流程图:变量初始化例题6-3s=1+1/2+1/3+……+1/isum=0;i=1;当i=nsum+=1/i;i++;Do_whilesum=0;i=1;当i=nwhilesum+=1/i;i++;main(){intn,i;floatsum;scanf(“%d”,&n);sum=0;i=1;while(i=n){sum+=(float)(1/i);i++;}printf(“sum=%d”,sum);}main(){intn,i,sum;scanf(“%d”,&n);sum=0;i=1;x=1.0;do{sum+=1/i;i++;}while(i=n);printf(“sum=%d”,sum);}例题6-4s=n!=1*2*3*……*(n-1)*ns=1;i=1;当i=ns*=i;i++;Do_whiles=1;i=1;当i=nwhiles*=i;i++;main(){intn,i,s;scanf(“%d”,&n);s=i=1;while(i=n){s*=i;i++;}printf(“s=%d”,s);}main(){intn,i,s;scanf(“%d”,&n);s=i=1;do{s*=i;i++;}while(i=n);printf(“s=%d”,s);}例6-5:Π/4=1-1/3+1/5-……+(-1)n+1(1/(2*n-1))a.累加变量初值sum=0b.循环做(i从1到n)若i为奇数:sum+=1/当前项值(2*i-1)否则:sum-=1/当前项值(2*i-1)sum=0;i=1;main(){intn,i;floatsum;scanf(“%d”,&n);printf(“Π=%d”,sum);}while(i=n){if(i%2)sum+=1/(float)(2*i-1);elsesum-=1/(float)(2*i-1);i++;}sum=0;i=1;当i=nif(i%2)sum+=1/(float)(2*i-1);elsesum-=1/(float)(2*i-1);i++;读入整数n打印sumsum=(i%2)?sum+1/(2*i-1):sum-1/(2*i-1);注意1、do-while先执行一次循环体,即使条件一开始就不成立。2、一般情况下,while与do-while处理同一问题时,结果相同。while与do–while区别1、结构相反2、while中的循环语句最少执行0次。do-while中的循环语句最少执行1次。例6—9求10个数中的最大值。从键盘上输入第一个数,并假定它是最大值存放在变量max中。以后每输入一个数便与max进行比较,若输入的数较大,则最大值是新输入的数,把它存放到max。当全部10个数输入完毕,最大值也确定了,即max中的值。while结构:当i=10max=x;i=2;读入整数x;if(xmax)max=x;i++;读入整数x打印maxmain(){intx,i,max;scanf(“%d”,&x);max=x;i=2;while(i=10){scanf(“%d”,&x);max=(xmax)?x:max;i++;}printf(“max=%d”,max);}Do_while结构直到i=10max=x;i=2;读入x;if(xmax)max=x;i++;读入整数x打印maxmain(){intx,i,max;scanf(“%d”,&x);max=x;i=2;do{scanf(“%d”,&x);max=(xmax)?x:max;i++;}while(i=10);printf(“max=%d”,max);}6.8程序举例第一类题:求和类1、n!=1*2*3……*n2、s=1-3+5-……+(-1)n+1(2*n-1)3、s=2/1+3/2+5/3+8/5+……(前n项)4、s=1+1/2!+1/3!+……+1/n!5、S=a+aa+aaa+……+aa…a(n个a)sum=0(或者1);i=1;……while(i=n){x=……sum+=x;i++;……}程序框架:X—分项的值当i=nx=……sum+=x;i++;……sum=0(或者1);i=1;NS结构图为:例:s=1+1/2!+1/3!+……+1/n!1、累加变量初值sum=0,X0=12、i从1到n循环做求第i项值:Xi=Xi-1/i累加:sum+=Xix=1.0;main(){intn,i,sum;floatx;scanf(“%d”,&n);sum=0;i=1;while(i=n){x=sum+=x;i++;}printf(“sum=%d”,sum);}当i=nsum=0;i=1;x=……sum+=x;i++;读入整数n打印sumx/i;x=1.0;x/i;第二类题:分离各个位(%,/)(1)求一正整数x为几位数。(x=24365)(2)求一正整数x各个位之和。如:x=24365,则个位之和sum=2+4+3+6+5(3)求倒序数?如:x=24365,倒序数re_x=56342(4)在3位数中找一个满足下列要求的正整数n:其各位数字的立方和恰好等于它本身。例如,371=33+73+13当x!
本文标题:循环结构的程序设计.ppt
链接地址:https://www.777doc.com/doc-5660364 .html