《北京大学计算概论C语言经典课件Lecture8循环结构》由会员分享,可在线阅读,更多相关《北京大学计算概论C语言经典课件Lecture8循环结构(35页珍藏版)》请在金锄头文库上搜索。
1、计算概论(Introduction to Computing) 主讲人:马思伟北京大学数字媒体研究所第八讲第八讲 程序结构程序结构-循环结构循环结构2 2 2 2 2 2复习:分支控制if-elseo两种形式nif(表达式)语句;/语句组;nif(表达式)语句;/语句组;else语句;/语句组2;n例if(i0)y=x/i;elsex=i;y=-x;3 3 3 3 3 3分支控制if-elseo嵌套if-else,最近邻原那么-else与最近的if语句共同构成一句oif(i0)oif(ji)ox=j;oelseox=i;o区别oif(i0)ooif(ji)ox=j;ooelseox=i;4 4
2、 4 4 4 4多分支语句switch-case/defaulto表达式expression的值类型必须是整型或字符型:char,short,int,longocase子句中的值valueI也必须是整型或字符型常量,而且所有case子句中的值应是不同的o可以有任意数目的case条件,但不能有两个完全相同的case表达式5 5 5 5 5 5多分支语句switch-case/defaulto例switch(c)caseA:capa+;casea:lettera+;default:total+;v例switch(i)case-1:n+;break;case0:z+;break;case1:p+;b
3、reak;v例v case a:v case b:v case c:v case d:v case e:v case f: x+;v另:vif (c=a) | (c=f) )v x+; 6 6 6 6 6 6循环语句o很多实际问题中会遇到具有规律性的重复运算,因此,在程序中就需要将某些语句重复执行。o比方,求1到N的和,如果没有循环,我们该如何编程?123N?o1:intN=10,i,S=0;o2:i=1;o3:if(i=N)o4:S=S+i;o5:i=i+1;o6:回到37 7 7 7 7 7循环语句o循环控制语句包括:n循环语句:forn当型循环语句:whilen直到型循环语句:do-wh
4、ile8 8 8 8 8 8循环语句foro循环语句for另一种当型循环ofor(初始条件表达式;循环控制表达式;循环操作表达式)o语句/语句组o一次for循环执行过程o首先执行初始条件表达式第一次:可以为空o循环控制表达式:一定是一个数值表达式,也可以为空o如果表达式值为真,条件成立,执行循环体一次o如果表达式值为假,条件不成立,退出循环o如果省略,默认值为真,直到遇到break,return语句退出循环o循环操作表达式:也可为空初始条件初始条件表达式表达式语句语语句语句组句组循环操作循环操作表达式表达式循环控循环控制表达制表达式式9 9 9 9 9 9循环语句foro例,计算从0到100的
5、整数中有多少个数是偶数包括,奇数中有多少数是的倍数o#includeointmain()oointi,n2=0,n3=0;ofor(i=0;i=100;i+)ooif(i%2=0)on2+;oelseif(i%3=0)on3+;ooprintf(“n2=%d,n3=%dn,n2,n3);oreturn0;o101010101010循环语句for111111111111循环语句whileo循环语句while当型循环owhile(表达式)语句/语句组o表达式必须是数值表达式o一次循环o计算表达式的值o如果表达式值为真,执行循环体,为假退出o循环表达式表达式语句语句/语语句组句组1212121212
6、12循环语句whileo计算从1到100的所有整数的平方和o#includeointmain()oointi=100;ointsum=0;owhile(i0)oosum=sum+i*i;oi-;ooprintf(“sum=%dn,sum);oreturn0;o131313131313循环语句while141414141414循环语句do-whileo循环语句do-while直到型循环odoo语句/语句组owhile(表达式);o一次循环o执行一次循环体o计算表达式,条件成立再执行一次循环体,否那么退出循环语句语句/语句语句组组表达式表达式151515151515循环语句do-whileo计算从
7、1到100的所有整数的平方和o#includeointmain()oointi=100;ointsum=0;odooosum=sum+i*i;oi-;owhile(i0);oprintf(“sum=%dn,sum);oreturn0;o161616161616循环语句do-while171717171717课堂练习o以下的for循环。ofor(x=0,y=0;(y!=123)&(x0);a的值是。oA.5B.0C.1D.-2o答案B,C181818181818程序转移语句o程序转移相关语句包括:nbreakncontinue191919191919程序转移语句breako在switch语中,b
8、reak语句用来终止switch语句的执行,使程序从整个switch语句后的第一条语句开始执行o在循环语句中(while,do-while,for),break用于终止并跳出循环,从紧跟着循环体代码段后的语句执行。break语句的格式为:break;202020202020程序转移语句breakobreak退出的是包含它的最内层循环体o例输出两个10以内的数,两数的和是5的倍数o#includeointmain()oointi,j;ofor(i=1;i10;i+)ofor(j=1;j10;j+)ooif(i+j)%5=0)ooprintf(“%d%d,i,j);oobreak;ooooretu
9、rn0;o212121212121程序转移语句continueocontinue语句用来结束本次循环(while,do-while,for),跳过循环体中continue之后尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环。注意:在进行终止条件的判断前,都应先执行迭代语句。它的格式为:continue;222222222222程序转移语句continue232323232323程序转移语句continueo例计算1-99之间所有模8余数不等于1的整数的和o#includeointmain()oointi=100,x=0,y=0;owhile(i0)ooi-;ox=i%8;oif(x=
10、1)ocontinue;oy=y+x;ooprintf(“y=%d,y);oreturn0;o242424242424空语句o仅由一个分号组成的语句为空操作语句。空语句不做任何操作,它在一些特殊情况下是很有用的,如用循环来跳过输入字符开始的空格或制表符:while(c=getchar()=|c=t);不要以为空语句不做任何操作就可以滥用它,有时会造成语法错误:252525252525返回语句returnoreturn语句从当前函数中退出,返回到调用该函数的语句处,并从紧跟该语句的下一条语句继续程序的执行。返回语句有两种格式:returnexpression;/当函数需要返回某种类型数据时ret
11、urn;/当函数的返回类型为void时262626262626初等算法o程序数据结构算法o算法:实际问题的求解算法o程序=函数的调用树o函数=语句的序列o语句=简单语句|复合语句o简单语句=变量定义与初始化语句|赋值语句|o函数调用语句|自增减语句|return|空语句,o复合语句=if-else|switch-case/default|while|odo-while|for|break|continue、语句与控制流272727272727初等算法数目o例,输入假设干整数,以-1结束,输出在-1之前读入的整数个数。o思路:定义一个变量存储每次读入的整数,再定义一个变量记录已经读入的整数的个数
12、o#includeointmain()oointcount=0,tmp=0;owhile(tmp!=-1)ooscanf(“%d,&tmp);oif(tmp!=-1)count+;ooprintf(“%dn,count);oreturn0;o282828282828初等算法计数o例,顺序读入一组0,1数字串不是或输入结束,输出其中0和1的个数o思路:定义两个变量记录输入0,1的个数,一个变量存放输入数据o#includeointmain()oointn0=0,n1=0,tmp=0;owhile(tmp=0|tmp=1)ooscanf(“%d,&tmp);oif(tmp=0)n0+;oelsei
13、f(tmp=1)n1+;ooprintf(“%d%d,n0,n1);o292929292929初等算法求统计值o例,输入假设干整数值,以结束,求其中最大、最小和平均值o思路:?o#includeointmain()oointmax,min,sum,count,tmp;oscanf(“%dn,&tmp);oif(tmp=0)return;omax=min=sum=tmp;ocount+;owhile(tmp!=0)ooscanf(“%dn,tmp);oif(tmp!=0)oosum+=tmp;ocount+;oif(tmpmax)max=tmp;oif(tmpmin)min=tmp;ooprin
14、tf(“max=%d,min=%d,average=%dn,max,min,sum/count);oreturn0;o303030303030初等算法o程序数据结构算法o算法:实际问题的求解算法o程序=函数的调用树o函数=语句的序列o语句=简单语句|复合语句o简单语句=变量定义与初始化语句|赋值语句|o函数调用语句|自增减语句|return|空语句,o复合语句=if-else|switch-case/default|while|odo-while|for|break|continue、语句与控制流313131313131初等算法数目o例,输入假设干整数,以-1结束,输出在-1之前读入的整数个数
15、。o思路:定义一个变量存储每次读入的整数,再定义一个变量记录已经读入的整数的个数o#includeointmain()oointcount=0,tmp=0;owhile(tmp!=-1)ooscanf(“%d,&tmp);oif(tmp!=-1)count+;ooprintf(“%dn,count);oreturn0;o323232323232初等算法计数o例,顺序读入一组0,1数字串不是或输入结束,输出其中0和1的个数o思路:定义两个变量记录输入0,1的个数,一个变量存放输入数据o#includeointmain()oointn0=0,n1=0,tmp=0;owhile(tmp=0|tmp=
16、1)ooscanf(“%d,&tmp);oif(tmp=0)n0+;oelseif(tmp=1)n1+;ooprintf(“%d%d,n0,n1);o333333333333初等算法求统计值o例,输入假设干整数值,以结束,求其中最大、最小和平均值o思路:?o#includeointmain()oointmax,min,sum,count,tmp;oscanf(“%dn,&tmp);oif(tmp=0)return;omax=min=sum=tmp;ocount+;owhile(tmp!=0)ooscanf(“%dn,tmp);oif(tmp!=0)oosum+=tmp;ocount+;oif(
17、tmpmax)max=tmp;oif(tmpmin)min=tmp;ooprintf(“max=%d,min=%d,average=%dn,max,min,sum/count);oreturn0;o343434343434总结o程序结构n循环语句:for,while,do-whilen转移控制:break,continueo初等算法353535353535上机作业oP262n输入输出、分支:3.1n输入输出:3.2n循环:3.3,分别使用,for,while,do-while语句实现o有一分数序列2/1,3/2,5/3,8/5,13/8,21/13求这个数列的前20项之和。o一个数如果恰好等于它的因子之和,这个数就称为完数,例如6=1+2+3,6就是完数。编程找出1000以内的完数,并按下面格式输出其因子:6itsfactorsare1,2,3