第5章循环结构程序设计.ppt_第1页
第5章循环结构程序设计.ppt_第2页
第5章循环结构程序设计.ppt_第3页
第5章循环结构程序设计.ppt_第4页
第5章循环结构程序设计.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

5.1 while语句 5.2 do-while语句 5.3 for 语句 5.4 break、continue和goto语句 5.5 循环的嵌套 5.6 复合结构程序举例,第五章 循环结构程序设计,教学目的和基本要求:,要求学生了解循环结构程序设计,掌握各种循环语句应用的特点及异同点,掌握循环嵌套及复合结构。,教学重点:,各种循环语句应用的特点及异同点。,对于这样的一个问题: 从键盘输入一百个学生的成绩,求总成绩。 从前面所学,有两种解决方法。 1.设一百个变量,分别输入学生的成绩,然后求和。 这种方法浪费内存空间,显然不实际。 2.设一个变量,每次输入一个学生成绩,累加后再输入下一个学生成绩,如下: scanf(“%f”, . 这样重复一百次,然后 输出s的值。,这样写显然非常麻烦。我们注意到程序中的 scanf(“%f”, 两句话是一直重复的,如果能用一种语句,使这两句话能自动的重复执行一百次,就可以简化了书写的麻烦,这就是循环语句。,c语言有while 、 do - while 、和for语句三种循环结构语句。 前两个称为条件循环,即根据条件来决定是否继续循环; 后一个称为计数循环,即根据设定的执行次数来执行循环。,5.1 while语句,while 语句是通过判断循环控制条件是否满足来决定是否继续循环的语句。 一般形式: while (表达式) 语句 表达式为循环控制条件,当表达式的值为非零(满足循环条件),就执行语句, 当表达式的值为零,就退出循环。,while语句执行流程,首先计算表达式,如果表达式的值为非零,执行语句,重新计算表达式,如果表达式的值为0,则跳出循环,如果表达式的值一开始就为0,则语句一次也会被不执行。,while语句举例,问题: 求n个学生的平均成绩 算法: 1 输入 n ; i = 1 , average=0; 2 输入第 i 个学生的score; 3 average += score; i +; 4 当 i= n 重复做2; 5 average /= n ;,main( ) int n, score, i = 1 ; float average=0; printf (“ n enter n:” ); scanf( “%d” , ,5.2 dowhile语句,dowhile 语句的一般形式是: do 语句 while (表达式) 特点: 首先执行语句,再通过判断循环控制条件是否满足来决定是否继续循环。,dowhile语句执行流程,首先计算语句, 再计算表达式。,如果表达式的值为非零, 继续下一次循环,如果表达式的值为0,则跳出循环,如果表达式的值一开始就为0,也会执行一次语句。,main( ) int n, score, i = 0; float average=0; do printf (“ n enter score:” ); scanf( “%d” , ,注意:循环控制变量值在循环体内必须有所改变。,例如: i=1; while (i=100) putchar(*); i+;,这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,i+; 不属于循环语句。,i+应该在循环体内改变:,i=1; while (i=100) putchar(*); i+; ,5.3 for循环语句,for(表达式1;表达式2;表达式3) 循环体语句,这是c语言最有特点的循环语句。使用最为灵活方便 一般形式:,先计算初值表达式,用于循环开始前设置变量初值。 接着计算循环控制逻辑表达式,控制循环条件,决定循环次数。 执行循环体语句,这个语句也可以是其它循环。 循环控制变量,修改表达式。,执行流程,例: 求 1+2 +99,#include(stdio.h) main() int i,s=0; / *s清0 */ for(i=1;i100;i+) s=s+i; printf(“s=%d”,i;) ,循环语句的多种表示,for( i=0; i100; i+ ) s=s+i;,main() int i=1,s=0; do s=s+i; while (+i100) printf(“s=%d”,i); ,main() int i,s=0; i=0; while(i100) s=s+i; i+; printf(“s=%d”,i); ,for语句的表达式可以省略,如已先给变量赋过值。则可以省略表达式1。,for(;i100;i+),如果想在循环内部改变变量的值,则可以省略表达式3。,for(i=0;i100;),如果都省略的话就相当于while。,for(;i100;) while(i100),全部省略就是死循环。,for(;) (需要用break跳出),逗号表达式,逗号运算符的主要应用就在for语句中。 for语句中的表达式1和表达式3可以是逗号表达式,特别是有两个循环变量参与对循环的控制时。表达式1和表达式3为逗号表达式,将使程序显得非常清晰。,例: for( i=1, j=10 ;i=j; i+, j-),for(i=a,j=b; i=j; i+,j-) 举例,问题: 求 1/100+2/99+1 float s=0.0; for(i=1,j=100; i=j; i+,j-) s = s + i/j;,循环语句流程图,while循环 dowhile循环 for循环,循环语句流程图的统一格式。,5.4 break、continue、goto语句,这一类语句的功能是改变程序的结构,使程序从其所在的位置转向另一处。 这类语句是非结构化语句,非结构化语句之break,它的作用是把流程转向所在结构之后。 在switch分支结构中,使用break语句可以使流程跳出switch分支结构。 同样的,在循环结构中,使用break语句使流程跳出当前的循环层,转向执行该循环结构后面的语句。,简单的说就是跳出当前所在的结构,main( ) int s=0,i=1: for (; ;) s = s+i; i+; if (i100) break; /* 如果 i100,则退出循环*/ printf(“s=%d”,s); 本程序中,当i100时,强行终止for循环,继续执行for语句下一条语句,非结构化语句之continue,continue语句被称为继续语句。执行continue语句,使本次循环提前结束,即跳过循环体中continrue语句下面的尚未执行的循环体语句,但不结束整个循环,继续进行下一次循环的条件判别,条件为真,继续进行执行循环语句。该语句形式为: continue;,例5.4 显示输入的字符, 如果按的是esc键, 则退出循环; 如果按的是enter键, 则不做任何处理,继续输入下一个字符。,#include “conio.h” main( ) char ch; for (; ;) ch=getch(); /*字符输入函数 */ if (ch=27) /* esc键的acsii码为27*/ break; /*退出循环*/ if (ch=13) continue; /*按的是enter:键,跳过字符输出语句*/ putch(ch); /*显示输入的字符*/ getch( ); /*让程序停一下,拍任意键继续*/ ,非结构化语句之goto,goto被称为无条件转移语句。由两部分组成 goto 标号; 和 标号: 语句,它最大的好处就是可以一下子跳出多重循环,而break却不能做到这点。,#include “stdio.h” main( ) float score , average=0; int n=0; scanf(“%f”, &score); /* 输入第一个学生的分数 */ if (score=0) /* 表达式为非0, 转移到loop标号处 */ goto loop; average = average /n ; /*求平均成绩average */ end:printf(“%6.2f”, average); /*输出平均成绩,保留两位小数 */ ,5.5 循环的嵌套,在循环体语句中又有另一个完整的循环结构的形式,称为循环的嵌套。嵌套在循环体内的循环称语句称为内循环,外面的循环语句称为外循环。如果内循环体中又有嵌套的循环语句,称为多层循环。while 、do-while、for三种循环都可以互相嵌套。 循环嵌套的程序中,要求内循环必须被包含在外层循环的循环体中,不允许出现内外层循环体交叉的情况。,00 01 02 03 04 05 10 11 12 13 14 15 20 21 22 23 24 25 30 31 32 33 34 35 40 41 42 43 44 45 50 51 52 53 54 55,输出结果:,执行语句段: for(i=0;i6;i+) for(j=0;j6;j+) printf(“%3d %3d”,i,j); putchar(n); ,循环嵌套举例,问题:输出图形 * * * * * *,分析: 一共6行, 每行的 *数目与行号相同 算法: 行用 i 表示 , 当 i = 6 do 输出 i 个 * 换行 ,int i,j; for ( i=1; i7; i+) printf(“n“); for (j=1; j=i; j+ ) putchar(*); ,循环嵌套举例,问题:输出图形 * * * *,循环嵌套,分析: 一共4行, 第i行输出的空格数为: (7-i+1)/2 第i行输出 i*2-1个*, 算法: 当 i = 7 do 输出 (7-i+1)/2个空格 ; 输出i 个 * 换行 ; i+=2 ; ,main() int i,j; for ( i=1; i=7; i+=2) printf(“n”); for (j=1;j=(7-i+1)/2 ; j+) putchar( ); /*输出 (7-i+1)/2个空格*/ for (j=1;j=i;j+ ) putchar(*); /* 输出i 个 * */ getch(); ,复合程序结构,c语言允许循环语句与分支结构语句联用,即在循环体包含一个完整的分支结构,这样的程序结构被称为复合程序结构。复合程序结构同样必须做到嵌套层次清楚,决不允许出现嵌套层次之间相互交叉的情况。,例:给多个学生的成绩评级。 #include main() int i, score; scanf(“%d“ , /*输入下一个学生的成绩*/ while 结构中嵌套了一个多分支选择结构。,5.6 复合程序结构举例,例1 目标:输入一个年号,判断是否为闰年。 算法:能被4整除且不是100的倍数,或者能被400整除。,#include void main ( ) int year ,leap; printf (“enter year:”); scanf(“%d ”, /*不是闰年leap 置成0*/ if (leap = =1) printf (“%d: is a leap year.”, year); else printf (“d is not a leap year”, year); ,例2 目标:找出3至1000内的全部的质数。 算法:从i= 1 开始做 分别用2,3,4,i-1 除i, 如果i被某个数整除 , i是素数。 i+; 测试下一个i;,#include main( ) int i, j ,count,flag; /* 用flag作标志 */ count=0; for(i=3; i=1000; i+) flag = 0; /* 设标志为0 */ for(j=2; j=sqrt(i); j+) if (i % j = =0) /* 用 j 测试 i */ flag = 1; /* 不是素数,设标志为1 */ /* i 测试完毕 */ if(flag = = 0) /* i是素数 */ printf(“%4d, ”, i ); count+; if (count % 8 = = 0) printf(“n” ); /* 每输出8个素数就换行 */ /* 测试下一个 i */ ,习题课: 1.10,130之间,所有整数的平方和。 分析:用变量i从10到130循环,用变量s求和,s初值为0,每次循环,s=s+i * i ;,main() long int i,s=0; for(i=10;i=130;i+) s=s+i*i; printf(“n%d”,s); ,注意:i一定要是 long int 型。,2. 10,150奇数的平方和。 分析:用变量s求和,s初值为0。用变量i从10到150循环,如果i是奇数(i%2!=0),则s=s+i*i,main() long int i, s=0; for(i=10;i=150;i+) if(i%2!=0) s=s+i*i; printf(“n%ld”,s); ,3. 10,150之间,能被3或7整除的数的平方和。 分析:用变量s求和,s初值为0。用变量i从10到150循环,如果i能被3或7整除(i%3=0|i%7=0),则s=s+i*i,main( ) long int i,s=0; for( i=10;i=150;i+) if(i%3=0|i%7=0) s=s+i*i; printf(“n%ld”,s); ,4.1,800中能被3和8整除的数的个数。 分析:用变量n求个数,n初值为0。用变量i从1到800循环,如果i能被3和8整除(i%3=0&i%8=0),则n+,main( ) int i,n=0; for(i=1;i=800;i+) if(i%3=0 ,5.s=1+1/(2*2)+1/(3*3)+1/(m*m),求m=50时的s(结果保留4位小数) 分析:用变量s求和,s初值为0。用变量i从1到50循环,s=s+1/(i*i) main( ) int i; float s=0; for(i=1;i=50;i+) s=s+1.0/(i*i) printf(“n%.4f”,s); ,6.求100以内最小的自然数n,使1*1+2*2+3*3+n*n5500 分析:用变量s求和,s初值为0。用变量n从1开始循环,每次i增加1,如果s5500,循环结束。 main() int n=1,s=0; do s=s+n*n; n=n+1; while(s=5500); printf(“nn=%d”,n-1); ,7.a1=1 a2=1/(1+a1) an=1/(1+an-1),求a25(结果保留10位小数) 分析:用变量a求项,a初值为1。用变量i从2到25循环,a= 1/(1+a) main( ) int i; float a=1; for(i=2;i=25;i+) a=1/(1+a); printf(“n%.10f”,a); ,8.1/1!+1/2!+.+1/10!(结果保留10位小数) 分析:用变量s求和,s初值为0。用变量a求阶乘,a初值为1。用变量i从1到10循环,a=a*i,s=s+1/a。 main( ) int i; long int a=1; float s=0; for(i=1;i=10;i+) a=a*i; s=s+1.0/a; printf(“n%.10f”,s); ,9.求s=1+1/3+(1*2)/(3*5)+(1*2*n)/(3*5*(2*n+1)当n=40时的值。(结果保留10位小数) 分析:用变量s求和,s初值为1。用变量a用来求项的分子,变量b求项的分母,a、b初值均为1。用变量n从1到40循环,a=a*n,b=b*(2*n+1),s=s+a/b。 main() float s=1; int n; long int a=1,b=1; for(n=1;n=40;n+) a=a*n; b=b*(2*n+1); s=s+(float)a/b; printf(“ns=%.10f”,s); ,10.数列 1,1,2,3,5,8有f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=1,求 f(40) 分析:用 变量f1、f2、f作为数列相邻的三项,初值f1=1,f2=1。用变量n从3到40循环,f=f1+f2,f1=f2,f2=f. main( ) long int f1=1,f2=1,f,n; for( n=3;n=40;n+) f=f1+f2; f1=f2; f2=f; printf(“nf=%ld”,f); 作业:求14万之内的最大的f(n).,11.求2/1,3/2,5/3,8/5的前30项之和(保留4位) 分析:此数列特征为后一项的分子是前一项的分子与分母的和,后意项的分母为前一项的分子。用变量s求和,s初值为0。用变量a用来求项的分子,变量b求项的分母,c为中间变量,初值a=2,b=1。用变量i从2到30循环,c=a,a=a+b,b=c,s=s+a/b; main( ) float s=2,a=2,b=1,c; int i; for( i=2;i=30;i+) c=a; a=a+b; b=c; s=s+a/b; printf(“n%.4f”,s); ,12. sn=1-1/3+1/5-1/7+1/(2n-1) 求s(100)(保留4位小数) 分析:用变量s求和,s初值为0。用变量n从1到100循环,如果n是奇数(n%2!=0),s=s+1/(2*n-1),否则s=s-1/(2*n-1) 。 main( ) int n; float s=0; for( n=1;n=100;n+) if(n%2!=0) s=s+1.0/(2*n-1) else s=s-1.0/(2*n-1); printf(“n%.4f”,s); ,13.求20,700间素数的个数。 分析:用变量n求个数,n初值为0。用变量a从20到700循环,如果a是素数,则n值加一。判断素数的方法:用变量i从2到a-1循环,如果存在i使得a%i=0,则a不是素数,否则,a是素数。 main( ) int a,n=0,i; for( a=20;a=700;a+) for( i=2;i=a-1;i+) if(a%i=0) break; if(i=a) n+; printf(“nn=%d”,n); ,14.求1000以内最大的20个素数之和。 分析:用变量s求和,s初值为0。用变量i统计以求得素数的个数,i初值为1。用变量a从1000到1循环,如果a是素数,并且i值小于等于20,则s=s+a,i+。当i值大于20时,跳出循环。素数求法同上题,用变量j从2到a-1循环。 main( ) int a,s=0,i=1, j; for( a=1000;a=1;a-) for( j=2;j20) break; printf(“n%d”,s); ,15.200,1000的双胞胎数的对数。双胞胎数:两素数差为2称为双胞胎数。 分析:用变量n统计以求得双胞胎数的对数,n初值为0。用变量a从200到998循环,如果a是素数,则令变量b=a+2,如果b也是素数,则n值增1。素数求法同前,用变量i循环。 main( ) int a,b,n=0,i; for(a=200;a=998;a+) for(i=2;ia;i+) if(a%i=0) break; if(a=i) b=a+2; for(i=2;ib;i+) if(b%i=0) break; if(b=i) n+; printf

温馨提示

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

评论

0/150

提交评论