1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,C Programming Language,*,关于本周上机情况存在的问题及其说明,建立工程错误,或重复使用工程,不会使用,if,语句,特别是判定条件,没有输入或者没有输出,复合语句没有加大括号,个别同学忘了加头文件,方法一:,if,(x1)y=x;,else if,(x10)y=2*x-1;,else,y=3*x-11;,printf(“y,=%,fn”,y,);,方法二:,if,(x1),y=x;,else,if,(x10)y=2*x-1;,else,y=3*x-11;,printf(“y,=%,fn”,
2、y,);,实验,【3,2】,给出一个百分制成绩,要求输出成绩等级,A,B,C,D,E,。,90,分以上为,A,,,60,分以下为,E,,要求:,分别用,if,语句,和,switch,语句,实现。,输入一个,负分数以及超过,100,分,以上,不应该得到成绩,你应该如何修正?,西南石油大学计算机科学学院,主讲:张耀文,第5章 循环结构程序设计,内容提要:,5.1,while,语句,5.2,do while,语句,5.3,for,语句,5.4,与循环有关的控制语句,5.5,程序举例,课后任务,本章要点,:,建立循环程序设计的,基本概念,和,逻辑思维,掌握,C,语言循环程序设计的,方法,概述,1.,引
3、入循环控制语句的作用,当满足一定条件时,重复执行一段程序,.,2.,设置循环需要考虑的问题,循环初值,;,循环条件的设置,;,循环体应包括的语句;循环条件的修改。,3.C,语言中可用以下语句实现循环,(1),用,while,语句,(2),用,dowhile,语句,(3),用,for,语句,1.,while,循环语句的形式,while,(表达式),循环,语句,先判断条件,后执行语句,表达式,语句,零,非零,2.,执行过程,:,注意,:,循环体若包含一个以上语句,应该用,花括号,括起来,(,使用复合语句。,循环体内,应注意设置修改循环条件的语句。否则循环无法终止。,4,.,1,while,循环语句
4、此处无,;,说明:,执行,while,循环语句时,如果表达式的值第一次计算就等于,0,,则循环体一次也不执行。,无限循环,:,while(1),循环体,;,发生下列情况之一时,,while,循环结束执行:,表达式的值为,0,循环体内遇到,break,语句,循环体内遇到,go,to,语句,,且与该,go,to,语句配合使用的标号所指定的语句在本循环体外,循环体内遇到,return,语句,,此时退出,while,循环后,执行的流程从包含该,while,语句的函数返回到调用函数,例,2,:求,i=1,sum=0,i=100,?,sum=sum+i,i=i+1,零,非零,main(),int i=1
5、sum=0;,while(i=100),sum=sum+i;,i+;,printf(%d,sum);,1.dowhile,循环,语句的形式,do,循环体,while,(,条件表达式);,先执行语句,后判断条件,2.,执行过程,说明:,(,1,),dowhile,循环语句首先执行循环体,然后计算表达式并检查循环条件,所以循环体至少执行一次。,(,2,)退出,dowhile,循环的条件与退出,while,循环的条件相同,表达式,语句,零,非零,5,.,2,dowhile,循环语句,此处有,;,表达式,=0,?,语句,零,非零,i=100,?,sum=sum+i,i=i+1,i=1,例,4,:用,
6、do-while,型循环求:,main(),int i=1,sum=0;,do,sum=sum+i;,i+;,while(i=100),;,printf(%d,sum);,结论:,当,while,后的表达式为真时,,while,语句和,do,while,语句的结果相同,否则不同。,main(),int i,s=0;,scanf(“%d”,while(i=10),s=s+i;,i+;,printf(“s=%dn”,s);,main(),int i,s=0;,scanf(“%d”,do,s=s+i;,i+;,while(i=10);,printf(“s=%dn”,s);,输入:,1,打印:,55,
7、输入:,11,打印:,0,输入:,1,打印:,55,输入:,11,打印:,11,一般形式:,for(,表达式,1,;,表达式,2;,表达式,3,),循环体语句,执行流程:,表达式,2,循环体,假(0),真(非0),for,表达式,1,表达式,3,5.3 for,语句,1.,先求解表达式,1,;,2.,求解表达式,2,,若其值为真,(,非,0),,则执行循环体的内容,然后执行第,3,步。若为假,(0),,则结束循环,执行,for,语句下面一条语句。,3.,若表达式为真,执行指定的语句后,求解表达式,3,。,4.,返回第,2,步执行。,此处无,;,for,语句一般应用形式,:,for(,循环变量赋
8、初值,;,循环条件,;,循环变量增值),循环体语句,说明:,for,语句中,表达式,1,、表达式,2,、表达式,3,类型任意,都可省略,但分号;不可省,无限循环,:for(;),for,语句可以转换成,while,结构,表达式,1;,while(,表达式,2),循环体语句;,表达式,3;,此处无,;,例 用,for,循环求,#include,main(),int i,sum=0;,for(i=1;i=100;i+),sum+=i;,printf(%d,sum);,例:,#include,main(),int i=0;,for(i=0;i10;i+),putchar(a+i);,运行结果:,ab
9、cdefghij,例:,#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+),;,省略表达式,1,省略表达式,1,、,3,省略循环体,/*c5_8.c*/,main(),int i,j,k;,for(i=0,j=100;i=j;i+,j-),k=i+j;,printf(%d+%d=%dn,i,j,k);,/*c5_9.c*/,#inc
10、lude,main(),char c;,for(;(c=getchar()!=n;),printf(%c,c);,/*c5_7.c*/,#include,main(),int i,c;,for(i=0;(c=getchar()!=n;i+=3),printf(%c,i+c);,表达式,1,、,3,为逗号表达式,结论:,for,语句的功能强大!,三种循环可互相嵌套,层数不限,外层循环可包含两个以上内循环,但不能相互交叉,嵌套循环的执行流程,for(;),do,while();,while(),.,内循环,外循环,内循环,嵌套循环的跳转,禁止:,从外层跳入内层,跳入同层的另一循环,向上跳转,循环的
11、嵌套,-,在循环体内又包含一个循环结构,称为循环嵌套。,for(;),while(),for,循环体嵌套,while,循环体,for(;),for(;),for,循环体嵌套,for,循环,do,do,while();,while();,do_while,循环体,嵌套,do_while,循环,while(),do ,while();,while,循环体嵌套,do_while,循环,while(),for(;),while,循环体嵌套,for,循环,do,for(;),while();,do_while,循环体嵌套,for,循环,打印九九乘法表,1,2,3,4,5,6,7,8,9,1,2,4,3,
12、6,9,9,18,27,36,45,54,63,72,81,.,例 循环嵌套,输出九九表,i,j,/*c99,乘法,.c*/,#include ,stdio.h,void main(),printf(t,九九乘法表,n);,printf(t,-n);,for(int,i=1;i=9;i+),for(int,j=1;j=9;j+),printf(%d%d,=%,dt,i,j,i,*j);,printf(n,);,思考:打印上三角或下三角程序如何改动?,i10,printf,假(0),真(非0),i=1,j+,j=1,j=i,真(非0),假(0),i+,for(i=1;i10;i+),for(j=
13、1;j=i;j+),printf(j=i)?%4dn:%4d,i*j);,外循环,内循环,几种循环的比较,三种循环均可处理同一问题;,for,和,while,语句为先判断后执行,,do-while,语句则先执行后判断;,do-while,和,while,语句多用于,循环次数不定,的情况,,循环次数确定的用,for,语句,更方便;,do-while,语句更适合,第一次,肯定执行的情况;,do-while,和,while,语句只有一个表达式,用于控制循环是否进行。,for,语句有三个表达式,不仅可以控制循环是否进行,而且能为循环变量赋初值及不断修改其值。故,for,语句功能更强,更灵活。,用上述三
14、种循环语句求,while,语句,:,n=1;s=0;,while(n=100),s=s+n;,n=n+1;,n=1;s=0;,do,s=s+n;,n=n+1;,while(n=100);,do-while,语句,:,for(n=1,s=0;n=100;n+),s=s+n;,for,语句,:,5.4.1,break,语句,一般形式:,break,;,功能:在循环语句和,switch,语句中,,,终止并跳出循环体或开关体,说明:,break,只能,终止并跳出,最近一层,的结构,break,不能用于循环语句和,switch,语句之外的任何其它语句之中,5.4 break,语句和,continue,语
15、句,do,break;,.,表达式,假(0),真(非0),while,表达式,break;,假(0),真(非0),while,switch,表达式,语句组,1,break;,语句组,2,break;,语句组,n,break;,语句组,break;,.,const 1,const 2,const n,default,case,表达式,2,break;,.,假(0),真(非0),for,表达式,1,表达式,3,例,break,举例:输出圆面积,面积大于100时停止,#include,#define PI 3.14159,main(),int r;,float area;,for(r=1;r100)
16、break;,printf(r=%d,area=%.2fn,r,area);,例,break,举例:,小写字母转换成大写字母,,,直至输入非,小写,字母,字符。,/*ch6-5-2.c*/,#include,main(),char c;,while(1),c=getchar();,if(c=a&c=z),putchar(c-a+A);,else,break;,5.4.2,continue,语句,一般形式:,continue,;,功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断,说明:,仅用于循环语句中,continue,语句仅结束本次循环,但,break,语句则
17、是结束整个循环过程。,真(非0),do,continue;,.,表达式,假(0),while,表达式,2,continue;,.,假(0),真(非0),for,表达式,1,表达式,3,表达式,continue;,假(0),真(非0),while,例 求输入的十个整数中正整数的个数及其和与平均值,#include,main(),int i,num=0,a;,float sum=0;,for(i=0;i10;i+),scanf(%d,if(a=,1e-6,pi=pi+t,n=n+2,s=-s,t=s/n,pi=pi*4,输出,pi,分子:,1,,,-1,,,1,,,-1,分母:,1,,,3,,,5
18、7,5.5,程序举例,/*c4_6.c*/,#include,#include,main(),int s;,float n,t,pi;,t=1;pi=0;n=1.0;s=1;,while(fabs(t)=1e-6),pi=pi+t;,n=n+2;,s=-s;,t=s/n;,pi=,pi,*4;,printf(pi,=%10.6fn,pi);,例,5.6,用 公式求,的近似值,直到最后一项的绝对值小于,10,-6,为止,兔子繁殖规律,第几月 小兔子 中兔子 老兔子 兔子总数,1 1 0 0 1,2 0 1 0 1,3 1 0 1 2,4 1 1 1 3,5 2 1 2 5,6 3 2 3
19、8,7 5 3 5 13,例,5.7,求,Fibonacci,(,斐波纳契,),数列:1,1,2,3,5,8,的前40个数,。,F1=1 (n=1),F2=1 (n=2),F,n,=F,n-1,+F,n-2,(n,3),1,5,34,233,1597,10946,75025,514229,3524578,24157817,1,8,55,377,2584,17711,121393,832040,5702887,39088169,2,13,89,610,4181,28657,196418,1346269,9227465,63245986,3,21,144,987,6765,46368,317811
20、2178309,14930352,102334155,/*c4_7.c*/,#include,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;,f1=1,f2=1,for i=1 to 20,输出,f1,f2,f1=f1+f2,f2=f2+f1,例,5.8,判断,m,是否素数,/*c4_8.c*/,#include,#include,main(),int,m,i,k,;,scanf(%d,&m
21、);,k=,sqrt(m,);,for(i,=2;i=k+1),printf(%d,is,m);,else,printf(%d,is not,m);,printf(a,prime numbern);,课后延伸,:求,100200,间的全部,素数,(,课后作业,),读入,m,i=2,当,i,k,m,被,i,整除,真,假,用,break,结束循环,i=i+1,i,k+1,真,假,输出,:m”,是素数,”,输出,:m”,不,是素数,”,k=,m,例,5.9,译密码,ABCDEFGHIJKLMNOPQRSTUVWXYZ,例如:,Hello,world!,译成密码:,Lipps,asvph!,/*c4
22、10.c*/,#include,main(),char c;,while(c=getchar()!=n),if(c=a&c=A&cZ&cz),c=c-26;,printf(%c,c);,1,输入两个正整数,m,和,n,,求其最大公约数和最小公倍数。,2,找出,100999,之间的所有“水仙花”数,所谓“水仙花”数是指一个三位数,其各位数字的立方和等于该数本身,例如:,153=1,3,+3,3,+5,3,,所以,,153,是“水仙花”数。,课后任务,分析:设,100=n=999,i,、,j,、,k,分别代表数,n,百位、十位、个位上的数字,则:,i=n/100,j=n/10%10,k=n%10,如果,i3+j3+k3=n,,则,n,即是所求。,3,猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第,10,天早上想再吃时,就只剩一个桃子了。求第一天共摘多少桃子。,4,打印出以下图案,*,*,*,*,*,*,*,谢谢光临!,






