C语言教程课件ch课件.ppt
课本129页习题:6.16.56.66.8补充题:某人新开了一个存款帐户,存入1000元,年利率是5%。假定所有利息收入都于满整年时,重新存入帐户,请计算并打印在为期10年的时间里,每一年结束时的账面金额。,4月1日 上机3:循环结构程序设计,#include void main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);,#include void main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(%d,sum);,#include void main()int i,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(%d,sum);,#include void main()int i,sum=0;i=1;loop:if(i=100)sum=sum+i;i+;goto loop;printf(%d,sum);,#include void main()int i,sum=0;i=1;loop:sum=sum+i;i+;if(i=100)goto loop;printf(%d,sum);,break;continue;,第六章 循环控制,本章主要内容:用while语句实现循环用dowhile语句实现循环用for语句实现循环循环的嵌套break语句和continue语句程序举例,1一般形式:goto 语句标号;,6.2 goto语句以及用goto语句构造循环,2说明:1)语句标号定名规则与变量名相同;2)不提倡使用goto语句;,1形式:while(条件表达式)循环体语句2作用:实现“当型”循环 当条件满足时,执行语句3特点:先判断表达式,后执行语句,6.3 while语句,循环体语句,条件表达式,循环体语句,条件表达式,while语句的图形表达,真,假,while的后续语句,例0:用 while 语句实现在屏幕上输出10行“I love programming!”。,分析:设计变量并赋初值 用int型变量i表示行数,初值为1设计循环条件 i10设计循环体 printf(“I love programming!n”);i+;用循环语句实现,#include void main()int i;i=1;while(i=10)printf(“I love programming!n”);i+;,条件表达式必须加括号,括号后不能有;,循环体包含多条语句时,不能少,使用说明:1)在while的循环体中一定要有使循环趋于结束的语句;否则将形成死循环;2)注意循环操作的范围、花括号、分号的使用;3)注意与循环变量赋初值的位置及初值的正确性;,例1:用 while 语句实现 1+2+3+100,分析:设计变量并赋初值 1.用int型变量sum存放和,初值为0 2.用int型变量i表示累加变量,初值为1设计循环体 sum=sum+i;i+;设计循环条件 i100用循环语句实现,程序流程图:,开始,初始化 sum=0;i=1;,判断:i=100?,sum=sum+i;,i=i+1;,输出 sum,结束,真,假,真,sum=sum+i;,i=i+1;,判断:i=100?,#include void main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);,#include void main()int sum=0,i=1;while(i=100)sum=sum+i;i+;printf(sum%dn,sum);,程序:,i+;sum+=i;,i=0;,100,例 2求1到100之间的奇数之和,偶数之积。,sum=0 mul=1,i=100,i%2=0,1,0,mul=mul*i,sum=sum+i,输出sum,mul,i+;,i=1,void main()double mul=1;int i=1,sum=0;while(i=100)if(i%2=0)mul=mul*i;else sum=sum+i;i+;printf(sum=%dn,sum);printf(mul=%en,mul);,void main()int i,k1,k2,k;i=1;k1=1;k2=2;while(i=5)k=k1+k2;k1=k2;k2=k;i+;printf(%5d,k);,例 3读程序练习:,3 5 8 13 21,1形式:do 语句 while(表达式);2作用:实现“直到型”循环3特点:先执行语句,后判断条件,直到条件不满足为止。,6.4 do-while语句,循环体语句,条件表达式,循环体语句,条件表达式,do_while语句的图形表达,真,假,void main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(sum=%d,sum);,例 1用do_while 语句实现 1+2+3+100,i+;sum+=i;,i=0;,100,while循环与do_while循环小结:1.循环体内必须有使循环趋于终止的条件,while(i=100)sum=sum+i;i+;,do sum=sum+i;i+;while(i=100);,2.注意循环初值与循环条件,i=1;while(i=100)sum=sum+i;i+;,i=0;while(i100)i+;sum=sum+i;,3.do_while 循环的循环体至少执行一 次,while循环的循环体可能一次 也不执行。,4.在循环体至少执行一次的前提下,do_while与while 循环等价。,例3:求 n!,void main()int i=1,n;double m=1;scanf(%d,void main()int i=1,n;double m=1;scanf(%d,1.一般形式:for(表达式1;表达式2;表达式3)语句,for 的循环体,括号不可少,分号不可少,6.5 for语句,求表达式1,判表达式2,语句,求表达式3,for语句的下一个语句,真,非0,假,值为0,for语句执行过程示意,for(表达式1;表达式2;表达式3)语句,表达式1只执行1次;表达式3和内嵌语句执行多次,通常:表达式1用于对循环控制变量赋初值 表达式2给出循环控制条件;表达式3使循环控制变量增值;,循环类型:当型,例:#include void main()int i,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(“sum=%dn”,sum);,例:for(i=0;i=10;i=i+2)printf(“%3d”,i);printf(“ni=%d”,i);运行结果:0 2 4 6 8 10 i=12例:for(i=10;i;i-)printf(“%d,”,i);运行结果:10,9,8,7,6,5,4,3,2,1,例:for(i=1,j=6;ij;i+,j-)printf(“%d*%d=%dn”,i,j,i*j);运行结果:1*6=6 2*5=10 3*4=12 例:空循环构成一个延时器 long t;for(t=0;t=83000000;+t);,3.说明:1)表达式1可省略,但分号不能省;如:int i=1,sum=0;for(;i=100;i+)sum=sum+i;2)若表达式2省略,循环条件永远为真;如:for(i=1;i+)printf(“%d,”,i);,死循环,3)表达式3也可省略,但应设法保证循环正常结束;如:for(i=1;i=100;)sum=sum+i;i+;4)可只给循环条件;i=1;for(;i=100;)sum=sum+i;i+;,5)三个表达式都可省;for(;)相当于 while(1)6)表达式1和表达式3可以是逗号表达式;如:for(i=1,sum=0;i=100;i+)sum=sum+i;,7)表达式2一般为关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零就执行循环体。如:for(;(c=getchar()!=n;)printf(%c,c);,注:1.尽量避免用实型变量控制循环次数。2.在循环体内尽量避免改变循环变量的 值,否则将难以预知循环次数。,void main()int i;for(i=1;i=20;i+)i=i+5;printf(%5d,i);printf(n);,运行结果为:6 12 18 24,修改了循环变量,概念:一个循环体内又包含另一个完整的循环结构。说明:1)三种循环可以互相嵌套 2)嵌套可以是多层的,6.6 循环的嵌套,错误的循环交叉形式:,例:do-while嵌套 例:do-while、for混合嵌套 do do do for(e1;e2;e3)while(e1);while(e);while(e);,*,void main()int i,j;for(i=1;i=5;i+)for(j=1;j=5;j+)printf(*);printf(n);,例:在屏幕上输出一个由5*5星号组成的方形。,#includevoid main()int i,j,n;scanf(“%d”,例:在屏幕上输出一个由n*n个星号组成的方形。,四种循环一般可互相代替循环次数已知时,常用for 循环次数未知时,常用while或do-while。3.while和do-while循环的循环体中应包括使循环趋于结束的语句。4.for的功能强于while和do-while 5.循环变量初始化的位置不同。6.while和for循环是当型循环,do-while循环是直到型循环,6.7 几种循环的比较,一、break语句 作用:1)从循环体内跳出,即提前结束循环,接着执行循环下面的语句;2)break语句只能 用于循环语句和 switch 语句。,6.8 break语句和continue语句,#include void main()int r;float area;for(r=1;r100)break;printf(“r=%d,area=%-7.2fn”,r,area);printf(“r=%d”,r);,计算半径为1到10的各圆面积,直到面积大于100为止。,注意:在循环中使用了break语句后,循环语句的结束可能有两种:正常结束(正常出口);由于循环条件表达式为假非正常结束(异常出口):由break语句引起,使用说明:1)内循环中的break仅跳出内循环结构;,if(e)break;,2)被循环语句嵌套的switch中出现的break,仅跳 出switch;,switch(e)break;,二、continue 语句作用:结束本次循环,即跳过循环体中下面尚未 执行的语句,接着执行下一次是否执行循环的判 定。,for(n=100;n=200;n+)if(n%3=0)continue;printf(“%d”,n);,if(n%3!=0)printf(“%d”,n);,例:for中用 continue 例:while中用continue for(e1;e2;e3)while(e1)if(e)continue;if(e)continue;,三、break语句和continue语句的区别是:1)continue 语句只结束本次循环,不终止整个循环的执行;2)break 语句是终止整个循环的执行,不再进行条件判断。,例:从键盘上任意输入一个正整数,判断其是否为素数。,素数:除了1和它本身之外没有其他因子的数。换句话说只要有因子(除了1和它本身之外)则该数一定不是素数,判断m是否素数:(穷举法)for(i=2;i=m-1;i+)if(m%i=0),若此循环正常结束则m是素数。,则m不是素数,成立,im-1,void main()int m,i;scanf(%d,方法1,void main()int m,i,k=1;scanf(%d,方法2,标志变量,例1用公式求的近似值,直到最后一项的绝对值小于10-6为止。/41-1/3+1/5-1/7+算法分析:1.循环累加 pi=pi+t;2.交替改变符号 s=-s;3.每项分子为 1,分母 n=n+2;,6.9 程序举例,#include void main()int s;float n,t,pi;t=1;pi=0;n=1;s=1;while(fabs(t)=1e-6)pi=pi+t;n=n+2;s=-s;t=s*1.0/n;printf(pi=%10.6fn,4*pi);,程序:,例 2求Fibonacci数列:1,1,2,3,5,8,.的前40个数。,f1 f2 1 1,f1=f1+f2;f2=f2+f1;,fi=fi-1+fi-2,f1,2,f2,3,.,.,void main()long int f1,f2;int i;f1=1;f2=1;for(i=1;i=20;i+)printf(%12ld%12ld,f1,f2);if(i%2=0)printf(n);f1=f1+f2;f2=f2+f1;,与此解题方法类似的有:(递推法)1、编写求 20+21+22+2 3+263 的程序。2、求1!+2!+3!+20!。3、有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13求出这个数列的前20项之和4、求:Sn=a+aa+aaa+aaaaaa,其中a是一个数字,n表示a的位数,n要求由键盘输入。等等。,void main()int i,j,m=0;for(j=100;jj-1)printf(%5d,j);m+;if(m%10=0)printf(n);printf(m=%dn,m);,例3:求100200之间的所有素数及素数的个数。,输出10个素数后换行,与此解题方法类似的有:(穷举法、列举法)1、输出所有的水仙花数。2、找出11000之间的全部同构数。一个数等于它的平方数的右端,就称为同构数。如:5的平方是25,25的平方是625。3、编程找出1000之内的所有完数。一个数恰好等于它的因子之和,这个数就称为“完数”。例如:6的因子为1,2,3,而6=1+2+3,因此6是完数。,例4:从键盘输入字符直到输入字符#为止,并统计 输入字母的个数。特点:循环次数事先无法确定#include void main()char ch;int count=0;do ch=getchar();if(ch=A,例4:从键盘输入字符直到输入字符#为止,并统计 输入字母的个数。方法2:#include void main()char ch;int count=0;while(1)ch=getchar();if(ch=A,例5:在屏幕上输出以下图形。,*,分析:(设N=5)第1行:4个空格 1个“*”换行符 第2行:3个空格 3个“*”换行符第3行:2个空格 5个“*”换行符第4行:1个空格 7个“*”换行符第5行:0个空格 9个“*”换行符,由此归纳出:第i行的空格数5-i个;第i行的“*”数是2i-1个。,void main()int i,j;for(i=1;i=5;i+)for(j=1;j=5-i;j+)printf();for(j=1;j=2*i-1;j+)printf(*);printf(n);,本章小结,本章介绍的内容 介绍了while、dowhile、for三种循环结构的使用和它们之间的区别,以及break、continue的用法要求达到的目标掌握while、dowhile、for语句的用法会使用这三种结构进行循环程序设计理解 break 和 continue在程序控制中的作用,课本129页习题:6.16.56.66.8补充题:某人新开了一个存款帐户,存入1000元,年利率是5%。假定所有利息收入都于满整年时,重新存入帐户,请计算并打印在为期10年的时间里,每一年结束时的账面金额。,作业:,