C语言循环结构_第1页
C语言循环结构_第2页
C语言循环结构_第3页
C语言循环结构_第4页
C语言循环结构_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

*第1页循环语句概述问题:求1~100的累计和。依据已有的学问,可以用“1+2+……+100”来求解,但明显很繁琐。现在换个思路来考虑:首先设置一个累计器sum,其初值为0,利用sum=sum+i来计算(i依次取1、2、……、100),只要解决以下3个问题即可:

(1)将i的初值置为1;

(2)每执行1次“sum=sum+i”后,i增1;

(3)当n增到101时,停止计算。此时,sum的值就是1~100的累计和。

*第2页依据已有的学问,单独实现每一步都不难。但是,由于须要常常运用这种重复计算结构(称为循环结构),C语言供应了循环语句来实现,以简化、并规范循环结构程序设计。在C语言中,可用以下语句实现循环:(1)用for语句。(2)用do-while语句。(3)用while语句。*第3页§5.1for语句

循环的意思就是让程序重复地执行某些语句。C语言供应的循环结构有三种:for语句、while语句和do_while语句。for语句既可以用于循环次数已知的状况,也可用于循环次数预先不知道的状况。for语句的一般形式为:

for(<初始表达式>);<条件表达式>;<循环表达式>)

<循环体语句>*第4页功能:先计算<初始表达式>的值,然后推断<条件表达式>的值,若该值为“假”,则退出循环,执行循环体下面的语句;若该值为“真”,则执行<循环体语句>,然后计算<循环表达式>的值,再推断<条件表达式>的值,重复以上的操作。for语句的流程图如图:一般状况下,<循环体语句>是由一对花括括起来的复合语句。*第5页for循环语句留意:①<初始表达式>可以省略,但须保留分号(;),同时在for之前必需给循环变量赋值,如:i=1;for(;i<=100;i++)sum=sum+i;②<条件表达式>一般不行省略,否则为无限循环。如:for(i=1;;i++)sum=sum+i;相当于条件总为真,程序会始终不停的执行直到“数据溢出”。*第6页③<循环表达式>亦可省略,但在循环语句体中必需有语句来修改循环变量,以使条件表达式的值在某一时刻为0,从而能正常结束循环。如:for(sum=0,i=1;i<=100;){sum=sum+i;i++;}④三个表达式均省略,即for(;;),为无限循环,程序中要避开这种状况的发生。⑤条件表达式可以是关系表达式、数值表达式。只要表达式的值0。就执行循环语句。如:for(i=0;(c=getchar())!=‘\n’;i+=c);*第7页⑥初始表达式、循环表达式可以是逗号表达式如:for(sum=0,i=1;i<=100;i++,i++)相当于:sum=0;for(i=1;i<=100;i=i+2)⑦for循环也可以嵌套,执行时是由外向里,逐层进行,先执行外层循环,再进入内层循环;退出时相反,由里向外逐层退出,先退出内层循环,然后退到上一层循环。【例5-2】随意从键盘输入两个整数a、b(a<b),求它们之间的几何级数的和,数学表达式为。*第8页这个问题与例5-1类似,只是所求级数和的初值和终值不一样,是由键盘随意输入的,为避开计算机错误,要求初值a要小于终值b。算法流程图如右图:*第9页/*exam5_2.c求几何级数的和*/#include<stdio.h>main(){ inti,j,a,b,sum=0; printf("Pleaseinputtwonumber:\n"); scanf("a=%d,b=%d",&a,&b); i=a;j=b; if(a>b) {i=b;j=a;} for(;i<=j;i++) sum=sum+i; printf("sum=%d\n",sum);}*第10页【例5-3】编写一个程序,在屏幕上打印出具有8行7列的如下图案:这是一个很有规律的图案,可接受二重循环嵌套的方式:第1层限制行数,第2层限制列数。算法流程图如下图:*第11页/*exam5_3.c打印图案*/#include<stdio.h>main(){ inti,j; for(i=1;i<=8;i++) { for(j=1;j<=7;j++) printf("*"); printf("\n"); }}*第12页§5.2while语句

While语句也是一种用于产生循环动作的语句,一般形式为:while(<表达式>)

<循环体语句>功能:先计算<表达式>的值,若该值为“假”,则跳出循环,执行循环体后面的语句;若该值为“真”,则执行<循环体语句>,然后回过头来再检查<表达式>的值,重复以上的操作。while语句的流程图*第13页<循环语句体>:是用一对花括号括起来的复合语句。留意:在<循环语句体>中要有使<表达式>的值为假(或<表达式>的值为零)的语句,否则会使程序出现无限循环而发生错误。留意:由于while循环是先推断<表达式>的值,后确定是否执行<循环语句>,因此,有可能一次也不执行<循环语句>。*第14页【例5-4】将例5-1用while语句重写,求简洁几何级数的和。/*exam5_4.c用while求简洁几何级数的和*/#include<stdio.h>main(){ inti=1,sum=0; while(i<=100) { sum=sum+i; i++; } printf("sum=%d\n",sum);}程序运行结果:sum=5050*第15页【例5-5】输入一个正整数n,求n!。计算表达式:n!=n*(n-1)*(n-2)*…*2*1。用i代表循环变量,s代表n!的结果值。编程时既可以接受for循环,也可以接受while循环求随意正整数n的阶乘的算法流程图如图:*第16页/*exam5_5.cwhile应用:求n!*/#include<stdio.h>main(){ inti,n;longs; printf("pleaseenterainteger:\n"); scanf("%d",&n); if(n>=0) { s=1;

i=1;

while(i<=n) { s=s*i; i++; } printf("%d!=%ld",n,s); } else printf("Invalidinput!");}试改为for循环?*第17页while和for的比较for(i=1;i<=10;i++)

sum=sum+i;i=1;循环变量赋初值while(i<=10){循环条件sum=sum+i;i++;循环变量的变更}循环体*第18页例5-6从键盘输入一批学生的成果,计算平均分。分析:求累加和确定循环条件不知道输入数据的个数,无法事先确定循环次数用一个特殊的数据作为正常输入数据的结束标记,比如选用一个负数作为结束标记。*第19页#include<stdio.h>Intmain(void){intnum; doublegrade,total; num=0;total=0; printf(“Entergrades:\n"); scanf("%lf",&grade);/*输入第1个数*/

while(grade>=0){/*输入负数,循环结束*/

total=total+grade; num++;scanf(“%lf”,&grade); } if(num!=0)printf(“Gradeaverageis%.2f\n",total/num); elseprintf("Gradeaverageis0\n");return0;}Entergrades:6788735482-1Gradeaverageis72.80Entergrades:-16788735482Gradeaverageis0*第20页§5.3do~while语句

do_while语句是另一种用于产生循环动作的语句。一般形式为:do{<循环体语句>}while(<表达式>);功能:先执行一次<循环体语句>,然后计算<表达式>的值,若该值为“真”,则重复以上的操作,直到该值为“假”,则退出循环语句,执行下一条语句。do_while语句的流程图:*第21页<循环语句体>应当是用一对花括号括起来的复合语句。留意:要有可以使<表达式>的值为“假”(即<表达式>的值等于零)的语句,否则会使程序出现无限循环而发生错误。do_while循环与while循环的区分,不论状况怎样,do_while循环中的<循环语句体>至少会执行一次。*第22页【例5-7】将例5-6用do_while语句重写。*第23页#include<stdio.h>Intmain(void){intnum; doublegrade,total; num=0;total=0;do {

printf(“Entergrades:");scanf(“%lf”,&grade);total=total+grade; num++; }while(grade>=0);/*输入负数,循环结束*/printf(“Gradeaverageis%.2f\n",(total+1)/(num-1)); return0;}Entergrades:6788735482-1Gradeaverageis72.80Entergrades:-16788735482Gradeaverageis0*第24页【例5-8】求sin(x)=x-x3/3!+x5/5!-x7/7!+…直到最终一项确定值小于le-7(即10-7)为止。分析:多项式从其次项起,每一项都是前一项乘以一个因子,(-x2)/(n*(n-1))(n=3,5,7,9……)用s代表sin(x)的值,t代表每一项的值,则:t=t*(-x2)/(n*(n-1));s=s+t;x的值是用弧度值表示的(10=/180弧度),如:3000.523598775算法流程图如后图:*第25页*第26页/*exam5_8.c求sin(x)的值*/#include<stdio.h>#include<math.h>main(){ doubles,t,x; intn=1; scanf("%lf",&x); t=x; s=x; do {

n=n+2; t=t*(-x*x)/(n*(n-1)); s=s+t; }while(fabs(t)>=1e-7); printf("sin(%lf)=%lf\n",x,s);}程序运行结果:1.57sin(1.570000)=1.000000

*第27页while是先判别条件,再确定是否循环;do-while是先至少循环一次,然后再依据循环的结果确定是否接着循环。while和do-while的比较真假表达式循环体语句do-while的下一条语句真假while的下一条语句表达式循环体语句*第28页

循环语句的选择if(循环次数已知) 运用for语句else /*循环次数未知*/ if(循环条件在进入循环时明确) 运用while语句 else /*循环条件须要在循环体中明确*/ 运用do-while语句*第29页§5.4

用于循环中的break和continue语句

一、break语句break语句的作用是从一种限制结构中跳出来。break语句可用于循环结构,其作用是从本层循环结构中跳出,可以提前结束执行<循环语句体>,执行循环结构外的下一条语句。break语句的一般形式为:break;

break语句在循环语句体中的位置应依据程序的须要而定,一般是用在循环体内某一个if条件分支的语句中,用来表示在循环过程中当某一个条件成立时提前结束循环。*第30页程序解析-推断素数算法:除了1和m,不能被其它数整除。设i取值[2,m-1]假如m不能被该区间上的任何一个数整除,即对每个i,m%i都不为0,则m是素数只要找到一个i,使m%i为0,则m确定不是素数m%2%3%4%5%(m-1)不是素数||==0==0是素数&&!=0!=0m不行能被大于m/2的数整除i取值[2,m-1]、[2,m/2]、[2,]for(i=2;i<=m/2;i++)if(m%i==0)break;if(i>m/2)printf("yes\n")elseprintf("no\n”);*第31页intmain(void){inti,m; printf(“Enteranumber:"); scanf("%d",&m); for(i=2;i<=m/2;i++) if(m%i==0)break; if(i>m/2)printf("%disaprimenumber!\n",m); elseprintf("No!\n"); }源程序-推断素数Enteranumber:9NoEnteranumber:1111isaprimenumber!循环条件?循环的结束条件?*第32页break语句while(exp){

语句1if(expb)break;

语句2}真假

exp

语句1假

expb

语句2循环体真for(i=2;i<=m/2;i++) if(m%i==0)break;if(i>m/2)printf("Yes");elseprintf("No!\n");当循环有多个出口时:表示循环条件区分结束条件for(i=2;i<=m/2;i++)if(m%i==0){printf("No!\n");break;}printf("Yes");*第33页二、Continue语句Continue语句只适用于循环结构,其一般形式为:作用:提前结束本次循环,提前进行下一次循环。【例5-10】编写程序,打印100-200中不能被3整除的数。/*exam5_10.c求不能被3整除的数*/#include<stdio.h>main(){ intn; for(n=100;n<=200;n++) { if(n%3==0) continue; printf("%d\t",n); }}*第34页算法流程图如图:要精确地运用break语句和continue语句,除非有必要,否则若可以不用则尽量不接受break语句和continue语句。*第35页对于例5-10的问题,打印100-200中不能被3整除的数。不接受continue语句的算法流程图如图所示:*第36页/*exam5q10.c例5-10问题不用continue*/#include<stdio.h>

main(){ intn; for(n=100;n<=200;n++) if(n%3

!=0)/*n不能被3整除*/

printf("%d",n); }*第37页【例5-11】break语句和continue语句在程序中的区分/*exam5_11.cbreak的作用*/#include<stdio.h>main(){ intx; for(x=1;x<=10;++x) { if(x==5) break; printf("%d",x); }}运行结果:1,2,3,4,/*exam5q11.ccontinue的作用*/#include<stdio.h>main(){intx; for(x=1;x<=10;++x) { if(x==5) continue; printf("%d,",x); }}运行结果:1,2,3,4,6,7,8,9,10,*第38页§5.5循环结构的嵌套

循环结构的嵌套,指的是某一种循环结构的语句中,包含有另一个循环结构。

运用嵌套的结构时,要留意嵌套的层次,不能交叉。例5.12

求1!+2!+….+100!*第39页嵌套循环for(i=1;i<=100;i++){item=i!sum=sum+item;}for(i=1;i<=100;i++){

item=1; for(j=1;j<=i;j++) item=item*j;sum=sum+item;}*第40页例4-6源程序#include<stdio.h>intmain(void){ inti,j; doubleitem,sum;/*item存放阶乘*/ sum=0;for(i=1;i<=100;i++){item=1;/*每次求阶乘都从1起先*/ for(j=1;j<=i;j++) /*内层循环算出item=i!*/ item=item*j; sum=sum+item; } printf("1!+2!+3!+…+100!=%e\n",sum);}*第41页内层循环的初始化for(i=1;i<=100;i++){

item=1;

for(j=1;j<=i;j++) item=item*j;sum=sum+item;}求1!+2!+….+100!item=1;for(i=1;i<=100;i++){for(j=1;j<=i;j++)item=item*j;sum=sum+item;}求1!+1!*2!+……+1!*2!*……*100!?*第42页分析嵌套循环的执行过程for(i=1;i<=100;i++){item=1;

for(j=1;j<=i;j++) item=item*j;sum=sum+item;}外层循环变量i的每个值内层循环变量j变更一个轮次;内外层循环变量不能相同分别用i和j*第43页for(i=1;i<=100;i++)for(j=1;j<=i;j++) printf("%d%d\n",i,j);*第44页§5.6goto语句

goto语句是一种无条件转向语句,它可以用在程序的任何地方,其一般形式为:goto语句标号;“语句标号”为任何合法的标识符,放在某个语句前面并加上冒号“:”作为语句的标号,标号只对goto语句有意义,带有标号的语句被称作标号语句。如:error:、end:、exp:等均为合法的语句的标号。goto语句的作用:转到标号语句所在的地方接着执行。*第45页【例5-13】用if语句和goto语句组合构成的循环重写计算器的程序。/*exam5_13.cif+goto构成循环*/#include<stdio.h>main(){ inti,sum=0; i=1;

loop:if(i<=100) { sum=sum+i; i++;

gotoloop; } printf("sum=%d",sum);}程序运行结果:sum=5050goto语句是一种非结构化的语句,在程序设计中应尽量少用或不用goto语句。

*第46页§5.7程序范例

【例5-16】打印出ASCⅡ码序列中从33~127(十进制)的字符比照表。/*exam5_16.c打印部分ASCII码字符*/#include<stdio.h>main(){ inti; for(i=33;i<128;i++) { printf("%d---%c\t",i,i); }}*第47页【例5-17】设公鸡每只5元,母鸡每只3元,小鸡每元3只,现用100元钱买100只鸡,编写一个程序,算出可以各买多少只鸡?#include<stdio.h>main(){inti,j,k;for(i=0;i*5<=100;i++)for(j=0;j*3<=100;j++)for(k=0;k/3<=100;k+=3) if((i*5+j*3+k/3)==100&&(i+j+k)==100)printf("Cock-%d\tHen-%d\tChicken-%d\n",i,j,k);}*第48页程序运行结果:Cock--0Hen--25Chicken--75Cock--4Hen--18Chicken--78Cock--8Hen--11Chicken--81Cock--12Hen--4Chicken--84*第49页小结:三种循环结构:for、while和do_while循环。当循环次数是确定的状况下,用for循环比较便利。while循环和for循环都要先推断条件再执行循环语句体,因此,有可能一次也不执行循环语句体。do_while循环不论怎样都会先执行一次循环语句体。留意避开以下几个方面的问题:1.循环语句体为复合语句,但没有运用花括号。2.使程序发生无限循环。3.混淆break语句与continue语句的功能。*第50页循环程序设计循环程序的实现要点:归纳出哪些操作须要反复执行?循环体这些操作在什么状况下重复执行?循环条件选用合适的循环语句forwhiledo-while循环具体实现时考虑(循环条件):事先给定循环次数,首选for通过其他条件限制循环,考虑while或do-while*第51页#include<stdio.h>intmain(void){inti,mark,max,n;printf("Entern:");scanf("

温馨提示

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

评论

0/150

提交评论