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

下载本文档

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

文档简介

第5章 循环结构,1. 5.1 5.5 2学时 2. 5.6 2学时,问题的提出:对于这样的一类问题: 问题1. 从键盘输入10个学生的成绩,求总成绩。 问题2. 求100以内的素数 问题3. 求1!+2!+3!+10! 用前面所学知识来解决这些问题是非常麻烦的 对于问题1的一个笨办法:设一个变量,每次输入一个学生成绩,累加后再输入下一个学生成绩,如下: scanf(“%f”, . 这样重复10次,然后输出s的值。,5.1 goto循环结构 概述 C语言可实现循环的语句: 用goto 和 if 构成循环 while 语句 do while 语句 for 语句 goto语句及用goto构成循环 goto语句一般格式:,goto 语句标号; . 标号:语句;,功能:无条件转移语句 说明: 不能用整数作标号 只能出现在goto所在函数内,且唯一 只能加在可执行语句前面 限制使用goto语句,例 用if 和goto语句构成循环,求,/*ch5_1.c*/ #include main() int i,sum=0; i=1; loop: if(i=100) sum+=i; i+; goto loop; printf(“%d“,sum); ,sum=0+1 sum=1+2=3 sum=3+3=6 sum=6+4 sum=4950+100=5050,5.2 while循环结构 一般形式:,while(表达式) 循环体语句;,执行流程:,特点:先判断表达式,后执行循环体 说明: 循环体有可能一次也不执行 循环体可为任意类型语句 下列情况,退出while循环 条件表达式不成立(为零) 循环体内遇break,return,goto 无限循环: while(1) 循环体;,例 用while循环求,/*ch5_2.c*/ #include main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(“%d“,sum); ,【例】问题1的解决方法1:采用while循环结构 main() int count=1,total=0,grade; while(count=10) printf(“input the grade:“); scanf(“%d“, ,应注意: 1、计数器和累加器的初值; 2、一次循环后,循环控制变量的变化情况。 3、跳出循环时循环控制变量的值应为多少?如果count初值为10,20时呢?,11,10,9,8,7,6,5,4,3,2,count,10,9,8,7,6,5,4,3,2,1,次数,每次循环后,控制变量count的变化情况,例 显示110的平方,/*ch5_21.c*/ #include main() int i=1; while(i=10) printf(“%d*%d=%dn“,i,i,i*i); i+; ,运行结果: 1*1=1 2*2=4 3*3=9 4*4=16 5*5=25 6*6=36 7*7=49 8*8=64 9*9=81 10*10=100,注意:循环控制变量值在循环体内必须有所改变。,例如:请问下例中循环结束时i值为多少? i=1; while (i=100) putchar(*); i+;,这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,i+; 不属于循环语句。,i+应该在循环体内改变:, ,do 循环体语句; while(表达式);,执行流程:,5.3 dowhile循环结构 一般形式:,特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while结构,例 用dowhile循环求,/*ch5_3.c*/ #include main() int i,sum=0; i=1; do sum+=i; i+; while(i=100); printf(“%d“,sum); ,【例】问题1的解决方法2:采用do-while循环结构 【源程序】 main() int count=1,total=0,grade; do printf(“input the grade:“); scanf(“%d“, ,应注意: 1、一次循环后,循环控制变量的变化情况。 2、跳出循环时循环控制变量的值应为多少?如果count初值为10,20时呢?,11,10,9,8,7,6,5,4,3,2,count,10,9,8,7,6,5,4,3,2,1,次数,每次循环后,控制变量的变化情况,例 while和dowhile比较,/*ch5_4.c*/ #include main() int i,sum=0; scanf(“%d“, ,main() int i,sum=0; scanf(“%d“, ,1、跳出循环时循环控制变量的值应为多少?如果输入值为1,10,20时呢?2、输出结果呢?,1.while结构与do-while循环结构相类似. 2.但要注意区别: 前者:先判断表达式,再执行语句。至少要执行0次 后者:先执行语句,再判断表达式。至少要执行1次。 3.也就是说用两种循环结构处理同一问题时,若二者的循环体部分是一样的,当while后面表达式的第一次的值为“真(非0)”时,两种循环结构得到的结果相同,否则二者的结果不相同。,While 与 do while 循环结构的比较,5.4 for循环结构 一般形式:,for(expr1 ; expr2 ; expr3) 循环体语句;,执行流程:,for(循环变量赋初值;循环条件;改变循环变量),表达式1,循环体,T,F,for语句一般应用形式:,for(循环变量赋初值;循环条件;循环变量增值) 循环体语句; ,说明: for语句中expr1, expr2 ,expr3 类型任意,都可省略,但分号;不可省 无限循环: for(;) for语句可以转换成while结构,expr1; while(expr2) 循环体语句; expr3; ,例:#include main( ) int i=0; for(i=0;i10;i+) putchar(a+i); ,运行结果:abcdefghij,例:#include main( ) int i=0; for(;i10;i+) putchar(a+i); ,例:#include main( ) int i=0; for(;i10;) putchar(a+(i+); ,例:#include main( ) int i=0; for(;i10;putchar(a+i),i+) ; ,逗号运算符的主要应用在for语句中的表达式1或表达式3,建议为了增强程序的可读性,尽量不省略for结构中的表达式。,main() int i,j,k; for(i=0,j=100;i=j;i+,j-) k=i+j; printf(“%d+%d=%dn“,i,j,k); ,#include main() char c; for(;(c=getchar()!=n;) printf(“%c “,c); ,#include main() int i,c; for(i=0;(c=getchar()!=n;i+=3) printf(“%c “,i+c); ,main() int count,total=0,grade; for(count=1;count=10;count+) printf(“input the grade:“); scanf(“%d“, ,11,10,9,8,7,6,5,4,3,2,count,10,9,8,7,6,5,4,3,2,1,次数,每次循环后,控制变量的变化情况,【例】问题1的解决方法3:采用for循环结构,5.5 辅助控制语句 break语句 功能:在循环语句和switch语句中,终止并跳出循环体或开关体 说明: break只能终止并跳出最近一层的结构 break不能用于循环语句和switch语句之外的任何其它语句之中,例 break举例:输出圆面积,面积大于100时停止,#define PI 3.14159 main() int r; float area; for(r=1;r100) break; printf(“r=%d,area=%.2fn“,r,area); ,例 break举例:小写字母转换成大写字母,直至输入非字母字符,#include main() int i,j; char c; while(1) c=getchar(); if(c=a ,例 判断m是否素数,#include #include main() int m,i,k; scanf(“%d“, ,continue语句 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断 仅用于循环语句中,例 求输入的十个整数中正数的个数及其平均值,#include main() int i,num=0,a; float sum=0; for(i=0;i10;i+) scanf(“%d“, ,5.6 第4-5章实例解析,【例】显示输入的字符, 如果按的是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( ); /*让程序停一下,拍任意键继续,可以不要*/ ,main() int a,b,c,d,t; printf(“input a,b,c,d:n“); scanf(“%d,%d,%d,%d“, ,【例】P.66输入4个数,要求按大小顺序输出.,3, 6, 9, 5,6, 3, 9, 5,9, 3, 6, 5,a, b, c, d,先排出最大数,算法:1.从4个数中排出最大数;2.从剩下的3个数中排出次大数;3.从剩下的2个数中排出第3大数;,【例】编程输入若干个学生的成绩(用负数结束输入),统计并输出最高分和最低分。 分析:该题对若干个学生的成绩的输入采用循环控制,然后在循环体内用条件判断语句比较成绩的高低即可。,【源程序】 main() int grade,max,min; printf(“input the grade:“); scanf(“%d“, ,课堂任务: 1.用dowhile改写,【源程序】/用dowhile改写,并用了break main() int grade,max=-1,min=1000; /为何这样取初值? do printf(“input the next grade:“); scanf(“%d“, ,main() int n; long t=1,sum=0;/注意累乘器及累加器的初值 for(n=1;n100;n+) t=t*n; if(n%2=0) continue; sum=sum+t; printf(“sum=%ldn“,sum); ,每次循环后,重要变量的变化情况,【例】计算1!+ 3!+ 5!+ + 99!。 分析:该题实质上是一个累加求和的问题,而且已知其循环的次数因此可以用for语句来实现;对于累加应有选择地进行,即只对奇数项求和,可以用if语句和continue语句组合来进行选择性地累加。,【源程序】 main() int n=1;n while(n=10) if(n=6) continue; printf(“%4d“,n); n+; ,请问: 跳出循环时循环控制变量的值应为多少?运行结果呢?该程序有何问题?如果有该如何改正?,无限循环; 运行结果:1 2 3 4 5,5,5,5,5,5,4,3,2,1,n,9,8,7,6,5,4,3,2,1,次数,每次循环后,重要变量的变化情况,例. 阅读程序并回答问题,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);,例. 10,150之间,能被3或7整除的数的平方和。 分析:用变量s求和,s初值为0。用变量I从10到150循环,如果I能被3或7整除(I%3=0|I%7=0),则s=s+I*I,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%d”,i,j); putchar(n); ,算法: 从i= 3 开始做 分别用2,3,4,i 除i,(可参考数论知识) 如果i被某个数整除 , i是合数。 i+; 测试下一个i;,例 编程求出3至1000内的全部的质数。,#include main( ) int i, j ,count=0,flag; /* 用flag作标志 */ for(i=3; i=1000; i+) flag = 0; /* 设标志为0 */ for(j=2; j=sqrt(i); j+) if (i % j = =0) /* 测试 j 能够整数 i*/ flag = 1;break /* 能,则不是素数,标志为1 */ /* i 测试完毕 */ if(flag = = 0) /* i是素数,则输出 */ printf(“%4d, ”, i ); count+; if (count % 8 = = 0) printf(“n” ); /*每行输出8个*/ /* 测试下一个 i */ ,main( ) long int f1=1,f2=1,f3,n; for( n=3;n=40;n+) f3=f1+f2; f1=f2; /*准备下次循环*/ f2=f3; /*准备下次循环*/ printf(“nf3=%ld”,f3); /*作业:求14万之内的最大的f(n)*/,例.Fibonacci数列 1,1,2,3,5,8有f(n)=f(n-1)+f(n-2), f(1)=1, f(2)=1,求 f(40), 分析:用 变量f1、f2、f3作为数列相邻的三项,初值f1=1,f2=1。用变量n从3到40循环,f3=f1+f2,f1=f2,f2=f3.,循环次数,每运行语句 f3=f1+f2后的变量情况,例.求1000以内最大的完数。完数就是其真因子的和等于其本身的数。 分析:用变量a从1000到1循环,如果a等于其真因子的和,则循环结束。判断a是否等于其真因子的和:用变量s求a的真因子的和,s初值为0,用变量I从1到a-1循环,如果a%I=0,则s=s+i。得出s值后,若a=s,则a为所求。,main( ) int a,I,s; for(a=1000;a=1;a-) s=0; for(I=1;Ia;I+) if(a%I=0) s=s+I; if(a=s) break; printf(“n%d”,a); ,例:求 1/99+2/

温馨提示

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

评论

0/150

提交评论