收藏 分销(赏)

第五章 循环控制.ppt

上传人:pc****0 文档编号:13881547 上传时间:2026-04-29 格式:PPT 页数:70 大小:2.65MB 下载积分:10 金币
下载 相关
第五章 循环控制.ppt_第1页
第1页 / 共70页
第五章 循环控制.ppt_第2页
第2页 / 共70页


点击查看更多>>
资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,第五章 循环控制,循环控制,学习的意义,第,3,章讨论,第,4,章讨论,本章讨论,顺序结构,选择结构,循环结构,许多实际问题中往往需要有规律地重复某些操作,如菜谱中可以有:,“打鸡蛋直到泡沫状”,这样的步骤,也就是说,在鸡蛋没有打成泡沫状时要反复地打。相应的操作在计算机程序中就体现为某些语句的重复执行,这就时所谓的,循环,。,循环控制,程序如下:,int s=0;,s=s+1;,s=s+2;,s=s+3;,s=s+100;,printf(“s=%d”,s);,有!就是用,循环,来编程。,下面来思考一个问题:,如何编程来计算,1+2+3+100,?,重复,100,次,晕!,有没有更好的方法来计算呢?,学习目标,循环控制,理解循环结构的含义;,掌握,C,语言三种循环结构的特点;,掌握,while,、,do-while,、,for,、,goto,、,break,、,continue,语句的使用方法;,掌握不同循环结构的选择及其转换方法;,掌握混合控制结构程序设计的方法。,循环控制,学习内容,实现循环的语句,01,循环的嵌套与比较,02,循环控制程序举例,04,break,语句与,continue,语句,03,循环,第二种,while,语句,第一种,用,goto,和,if,构成循环,第四种,for,语句,第三种,dowhile,语句,实现循环的语句,实现循环的语句,goto,语句,一般形式:,goto,语句标号,;,语句标号,:,语句标号,:,goto,语句标号,;,或,说明,语句标号,是按标识符规定书写的符号,放在某一语句行的前面,标号后加,冒号,(,:,),。语句标号起标识语句的作用,与,goto,语句配合使用。,作用,goto,语句的作用是在,不需要任何条件,的情况下直接使程序跳转到该语句标号所标识的语句去执行。,实现循环的语句,goto,语句可与条件语句配合使用来实现条件转移,构成循环。,goto,语句的应用:,例:求,1,100,的累计和,#include,void main(),int i=1,sum=0;,loop:,sum+=i+;,if(i=100),/,如果,i,小于或等于,100,goto loop;,/,转到标号为,loop,的语句去执行,printf(sum=%dn,sum);,循环初值,循环终值,循环条件,循环体,循环变量增值,运行结果:,sum=5050,在嵌套循环的情况下,利用,goto,语句可以直接从最内层的循,环体跳出最外层的循环体。,实现循环的语句,int tag=0;,for(),while(),if()goto stop;,stop:for,循环后的第一条语句,注意:,在结构化程序设计中一般不主张使用,goto,语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。,实现循环的语句,while,语句,(,当型循环结构,),一般形式:,while(,表达式,),循环体语句;,执行流程:,F,T,expr,循环体,while,其中:,while,后面的括号()不能省。,while,后面的表达式可以是任意类型的,表达式,但一般是条件表达式或逻辑,表达式。,表达式的值是循环的控制条件。,语句部分称为循环体,当需要执行多,条语句时,应使用复合语句。,特点:先判断表达式,再执行循环体,实现循环的语句,例:用,while,语句求,1,100,的累计和。,#include,void main(),int i=1,sum=0;,while(i=100),sum+=i;,i+;,printf(sum=%dn,sum);,循环初值,循环终值,循环条件,循环体,循环变量增值,运行结果:,sum=5050,实现循环的语句,例:显示,1,10,的平方,#include,void main(),int i=1;,while(i 0),/a 0,为假,,b+,不可能执行,b+;,循环体中的语句可为任意类型的,C,语句,。,实现循环的语句,int num=0;,/,字符计数,while(1),if(getchar()=n),/,如果输入的字符是回车符,则返回,return;,num+;,遇到下列情况,退出,while,循环:,表达式为假(为,0,)。,循环体内遇到,break,、,return,或,goto,语句(,break,和,goto,语句将,在随后介绍)。,实现循环的语句,在执行,while,语句之前,循环控制变量必须初始化,否则执行,的结果将是不可预知的。,例:计算,10!,#include,void main(),int i;,/i,应赋初始值,10,long s=1;,while(i=1),s*=i-;,printf(10!=%ldn,s);,实现循环的语句,i=1;,while(i 100),/,死循环,因为,i,的值没变化,永远小于,100,sum+=i;,printf(sum=%dn,sum);,要在,while,语句的某处(表达式或循环体内)改变循环控制变量,,否则极易构成死循环。,实现循环的语句,i=1;,while(i=9),j=1;,while(j=9),printf(%d*%d=%dn,i,j,i*j);,j+;,i+;,允许,while,语句的循环体又是,while,语句,从而形成双重循环。,例 求两个正整数的最大公因子。,我们采用,Euclid,(欧几里德)算法来求最大公因子,其算法是:,(1),输入两个正整数,m,和,n,。,(2),用,m,除以,n,,余数为,r,,如果,r,等于,0,,则,n,是最大公因子,算法结束,否则,(3),。,(3),把,n,赋给,m,,把,r,赋给,n,,转,(2),。,#include,void main(),int m,n,r;,printf(Please input two positive integer:);,scanf(%d%d,while,(n!=0),r=m%n;,/,求余数,m=n;,n=r;,printf(Their greatest common divisor is%dn,m);,运行结果:,Please input two positive integer:24 56,Their greatest common divisor is 8,实现循环的语句,do_while,语句(直到型循环),一般形式:,do,循环体语句;,while(,表达式,);,执行流程:,其中:,while,后面的括号()不能省。,while,最后面的分号,;,不能省。,while,后面的表达式可以是任意类型的,表达式,但一般是条件表达式或逻辑,表达式。,表达式的值是循环的控制条件。,语句部分称为循环体,当需要执行多,条语句时,应使用复合语句。,F,T,expr,循环体,do,while,特点:先执行循环体,再判断表达式,实现循环的语句,例:用,do_while,语句求,1,100,的累计和。,#include,void main(),int i=1,sum=0;,do,sum+=i;,i+;,while(i=100);,printf(sum=%dn,sum);,运行结果:,sum=5050,循环初值,循环终值,循环条件,循环体,循环变量增值,实现循环的语句,#include,void main(),int sum=0,i;,scanf(“%d”,while(i=10),sum+=i;,i+;,printf(sum=%dn,sum);,#include,void main(),int sum=0,i;,scanf(“%d”,do,sum+=i;,i+;,while(i 0);,如果,do-while,后的表达式的值一开始就为假,循环体还是要执行一次。,在,if,语句、,while,语句中,表达式后面都不能加分号,而在,do-while,语,句的表达式后面则必须加分号,否则将产生语法错误。,实现循环的语句,循环体中的语句可为任意类型的,C,语句,和,while,语句一样,在使用,do-while,语句时,不要忘记初始,化循环控制变量,否则执行的结果将是不可预知的。,要在,do-while,语句的某处(表达式或循环体内)改变循环,控制变量的值,否则极易构成死循环。,do-while,语句也可以组成多重循环,而且也可以和,while,语,句相互嵌套。,实现循环的语句,for,语句,一般形式:,for(,表达式,1,;表达式,2,;表达式,3),循环体语句;,执行流程:,其中:,for,后面的括号()不能省。,表达式,1,:,一般为赋值表达式,给控制变量赋初值。,表达式,2,:,关系表达式或逻辑表达式,循环控制条件。,表达式,3,:,一般为赋值表达式,给控制变量增量或减量。,表达式之间用分号分隔。,语句部分称为循环体,当需要执行多条语句时,应使用复合语句。,F,T,expr2,循环体,for,expr1,expr3,for,语句很好地体现了正确表达循环结构应注意的三个问题:,控制变量的初始化。,循环的条件。,循环控制变量的更新。,实现循环的语句,例,:,用,for,语句求,1,100,的累计和。,#include,void main(),int i,sum=0;,for(i=1;i=100;i+),sum+=i;,printf(sum=%dn,sum);,运行结果:,sum=5050,实现循环的语句,for,语句注意事项:,例:计算,1*2+3*4+5*6+99*100,。,int i,j;,long sum=0;,for(i=1,j=2;i=99;i=i+2,j=j+2),sum+=i*j;,printf(sum=%ldn,sum);,表达式,1,、表达式,2,和表达式,3,可以是任何类型的表达式。比方说,这三个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。,逗号表达式,逗号表达式,实现循环的语句,#include,void main(),int i,sum=0;,i=1;,for(;i=100;i+),sum+=i;,printf(sum=%dn,sum);,省掉表达式,1,表达式,1,、表达式,2,、和表达式,3,都是任选项,可以省掉其中的,一个、两个或全部,但其用于间隔的分号是一个也不能省的。,循环前给变量赋初值,#include,void main(),int i,sum=0;,for(,i=1,;i+),sum+=i;,printf(sum=%dn,sum);,省掉表达式,2,无终止的循环下去,实现循环的语句,#include,void main(),int i,sum=0;,for(,i=1,;i=100;),sum+=i+;,printf(sum=%dn,sum);,省掉表达式,3,另外设计循环变量增值,#include,void main(),int i,sum=0;,i=1;,for(;i 100)break;,sum+=i+;,printf(sum=%dn,sum);,省掉表达式,1,2,3,如无适当设计也会陷入死循环,循环体中的语句可为任意类型的,C,语句。,for,语句也可以组成多重循环,而且也可以和,while,语句和,do-while,语句相互嵌套。,循环体可以是空语句。,例:计算用户输入的字符数(当输入是回车符时统计结束,),。,#include,void main(),int n=0;,printf(input a string:n);,for(;getchar()!=n;n+);,printf(%d,n);,表示循环体为空语句,并非表示,for,语句结束,实现循环的语句,循环控制,学习内容,实现循环的语句,01,循环的嵌套与比较,02,循环控制程序举例,04,break,语句与,continue,语句,03,循环的嵌套与比较,注意事项:,三种循环可互相嵌套,层数不限。,外层循环可包含两个以上内循环,但不能相互交叉。,在嵌套的各层循环中,应使用复合语句保证逻辑上的正确性。,内层和外层循环控制量不应同名,以免造成混乱。,嵌套循环最好采用右缩进格式书写,以保证层次的清晰性。,循环嵌套,一个循环的循环体中有另一个循环称为循环嵌套。,外层循环,内层循环,内层循环,内层循环,合法的嵌套循环,嵌套循环的跳转时禁止:,从外层跳入内层,跳入同层的另一循环,向上跳转,循环的嵌套与比较,while(),while(),.,do,do,while();,.,while();,while(),do,while();,.,嵌套循环的执行流程,for(;),for(;),.,for(;),while(),.,do,for(;),.,while();,for(;),do,while();,while(),.,外循环,内循环,内循环,循环的嵌套与比较,例:,循环嵌套,输出九九表,i,j,#include,void main(),int i,j;,for(i=1;i 10;i+),printf(%4d,i);,printf(n-n);,for(i=1;i 10;i+),for(j=1;j 10;j+),printf(j=9)?%4dn,:%4d,i*j);,循环的嵌套与比较,i10,printf,假,(0),真,(,非,0),i=1,j+,j=1,j10,真,(,非,0),假,(0),i+,外循环,内循环,for(i=1;i10;i+),for(j=1;j10;j+),printf(j=9)?%4dn:%4d,i*j);,循环的嵌套与比较,几种循环的比较,4,种循环都可以用来处理同一问题,一般情况下它们可以相互替换,但一般不提倡用,goto,语句。,在,while,循环和,do-while,循环中,只在,while,后面的括号内指定循环条件,为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如,i+/i=i+1,)。,for,循环可以在表达式,3,中包含使循环趋于结束的操作。,用,while,循环和,do-while,循环时,循环变量初始化的操作应在,while,和,do-while,语句之前完成,,for,语句可以在表达式,1,中实现循环变量初始化。,while,循环、,do-while,循环和,for,循环,可以用,break,语句跳出循环,用,continue,语句结束本次循环,而对于用,goto,语句与,if,语句构成的循环,不能用,break,语句和,continue,语句进行控制。,循环的嵌套与比较,选择三种循环的一般原则,如果循环次数已知,计数控制的循环,用,for,如果循环次数未知,条件控制的循环,用,while,或,do-while,如果循环体至少要执行一次,用,do-while,循环体可能一次也不执行,,用,while,这只是“一般”原则,不是“原则”,例:求,1,100,之间的所有素数,问题分析:,素数,是指除了能被,1,和它本身整除外,不能被其它任何整数整除的数。,例如,,17,就是一个素数,除了,1,和,17,之外,它不能被,2,16,之间的任何整数整除。根据素数的这个定义,可得到判断素数的方法:,把,m,作为被除数,把,i=2,(m-1),依次作为除数,判断被除数,m,与除数,i,相除的结果,若都除不尽,即余数都不为,0,,则说明,m,是素数,反之,只要有一次能除尽(余数为,0,),则说明,m,存在一个,1,和它本身以外的另一个因子,它不是素数。,事实上,根本用不着除那么多次,用数学的方法可以证明:,只需用,2,之间(取整数)数去除,m,,,即可得到正确的判定结果。,这一思路的算法如下:,从键盘输入一正整数,m,。,计算,k=,i,从,2,变化到,k,,依次检查,m%i,是否为,0,。,若,m%i,为,0,,则判定,m,不是素数,并终止对其余,i,值的检验;否则,令,i=i+1,;并继续对其余,i,值进行检验,直到全部检验完毕为止,这时判定,m,是素数。,#include,#include,void main(),int m,i,k;,printf(input a number:“);,scanf(%d,k=sqrt(m);,for(i=2;i k),printf(yesn);,else,printf(non);,for,循环,#include,#include,void main(),int m,i,k;,printf(input a number:“);,scanf(%d,k=sqrt(m);i=2;,while(i k),printf(yesn);,else,printf(non);,while,循环,#include,#include,void main(),int m,i,k;,printf(input a number:“);,scanf(%d,k=sqrt(m);i=2;,do,if(m%i=0)break;,i+;,while(i k),printf(yesn);,else,printf(non);,do_while,循环,循环控制,学习内容,实现循环的语句,01,循环的嵌套与比较,02,循环控制程序举例,04,break,语句与,continue,语句,03,break,语句与,continue,语句,while(,表达式,1),if(,表达式,2),break;,语句,do,if(,表达式,2),break;,while(,表达式,1);,语句,for(;,表达式,1;),if(,表达式,2),break;,语句,break,语句,在循环语句和,switch,语句中,终止并跳出循环体或开关体,功能:,1,、,break,不能用于循环语句和,switch,语句之外的任何其它语句之中。,2,、,break,只能,终止并跳出,最近一层,的结构,。,3、,break,通常与条件判断语句(if)组合使用,说明:,break,语句与,continue,语句,例,:,输出圆面积,面积大于100时停止,#define PI 3.14159,void main(),int r;,float area;,for(r=1;r100),break;,printf(r=%d,area=%.2fn,r,area);,break,语句与,continue,语句,例:将用户输入的小写字母转换成大写字母,直到,输入非小写字母字符。,#include,void main(),char c;,while(1),c=getchar();,/,读取一个字符,if(c=a&c=z),/,是小写字母,putchar(c-a+A);,/,输出其大写字母,else,/,不是小写字母,break;,/,循环退出,运行结果:,howareyou,HOWAREYOU,break,语句与,continue,语句,方法:,通过设置一标志变量,tag,,然后在每层循环后加上一条语句:,if(tag)break;,其值为,1,表示,跳出循环体,为,0,则不跳出。,for(),while(),if()break;,while,循环后的第一条语句,多重循环中,,break,的使用,int tag=0;,for(),while(),if(),tag=1;,break;,if(tag)break;,for,循环后的第一条语句,在嵌套循环情况下,如何让,break,语句跳出最外层的的循环体,?,break,语句与,continue,语句,for(),while(),if(),continue;,while,循环后的第一条语句,continue,语句,功能:,结束本次循环,跳过,循环体中,尚未执行的语句,进行下一次是否执行循环体的判断。,1,、仅用于循环语句中,。,2,、在嵌套循环的情况下,,continue,语句只对包含它的,最内层,的循环体语句起作用。,说明:,break,语句与,continue,语句,例:,求输入的十个整数中正数的个数及其平均值。,#include,void main(),int i,a,num=0;,float sum=0;,for(i=0;i 10;i+),scanf(%d,/,输入一整数,if(a=1e-6),pi+=t;,n+=2;,s=-s;,t=s/n;,pi*=4;,printf(pi=%.6fn,pi);,运行结果:,pi=3.141594,例,:,古典算术问题搬砖头,某地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,,小孩两人搬一块。问用45人正好搬45块砖,有多少种搬法?,循环控制程序举例,#include,void main(),int men,women,child;,for(men=0;men=45;men+),for(women=0;women=45;women+),for(child=0;child=45;child+),if(men+women+child=45)&,(men*3+women*2+child*0.5=45),printf(men=%d women=%d child=%dn,men,women,child);,运行结果:,men=0 women=15 child=30,men=3 women=10 child=32,men=6 women=5 child=34,men=9 women=0 child=36,循环控制程序举例,例,:,求,Fibonacci,数列的前40个数,1202,年,意大利数学家斐波那契出版了他的算盘全书。他在书中提出了一个关于兔子繁殖的问题:如果一对兔子每月能生一对小兔(一雄一雌),而每对小兔在,它出生后的第三个月里,又能开始生一对小兔,假定在不发生死亡,的情况下,由一对出生的小兔开始,,50,个月后会有多少对兔子?,时间,(,月,),初生兔子,(,对,),成熟兔子,(,对,),兔子总数,(,对,),1,1,0,1,2,0,1,1,3,1,1,2,4,1,2,3,5,2,3,5,6,3,5,8,7,5,8,13,循环控制程序举例,#include,void main(),long int f1=1,f2=1;,int i;,for(i=1;i=20;i+);,printf(%12ld%12ld,f1,f2);,if(i%2=0)printf(“n”);,f1=f1+f2;,f2=f2+f1;,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,2178309,14930352,102334155,循环控制程序举例,例:国王的许诺,相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王,十分喜欢象棋,决定让宰相自己选择何种赏赐。,这位聪明的宰相指着,88,共,64,格的象棋盘说:陛下,请您赏给,我一些麦子吧,就在棋盘的第一个格子中放,1,粒,第,2,格中放,2,粒,,第,3,格放,4,粒,以后每一格都比前一格增加一倍,依此放完棋盘上,的,64,个格子,我就感恩不尽了。,舍罕王让人扛来一袋麦子,他要兑现他的许诺。,国王能兑现他的许诺吗?试编程计算舍罕王共要多少麦子赏赐,他的宰相,这些麦子合多少立方米?,(已知,1,立方米麦子约,1.42e8,粒),总粒数为:,sum=1+2+2,2,+2,3,+2,63,#define CONST 1.42e8,#include,#include,main(),int n;,double term,sum=0;/*,累加求和变量赋初值*,/,for(n=1;n=64;n+),term=pow(2,n-1);/*,根据累加项的规律计算累加项*,/,sum=sum+term;/*,作累加运算*,/,printf(sum=%en,sum);/*,打印总麦粒数*,/,printf(volum=%en,sum/CONST);/*,折合总麦粒体积数*,/,方法,1,#define CONST 1.42e8,#include,main(),int n;,double term=1,sum=1;/*,累乘求积累加求和变量赋初值*,/,for(n=2;n=64;n+),term=term*2;/*,根据后项总是前项的,2,倍计算累加项*,/,sum=sum+term;/*,作累加运算*,/,printf(sum=%en,sum);/*,打印总麦粒数*,/,printf(volum=%en,sum/CONST);/*,折合总麦粒体积数*,/,方法,2,运行结果:,sum=1.84467e+19,volum=1.29907e+11,循环控制程序举例,韩信有一队兵,他想知道有多少人,便让士兵排队报数。按从,1,至,5,报数,最末一个士兵报的数为,1,;按从,1,至,6,报数,最末一个士兵报的数为,5,;按从,1,至,7,报数,最末一个士兵报的数为,4,;最后再按从,1,至,11,报数,最末一个士兵报的数为,10,。你知道韩信至少有多少兵吗?,设兵数为,x,,则,x,应满足:,x,%5=1&,x,%6=5&,x,%7=4&,x,%11=10,穷举法对,x,从,1,开始试验,例:韩信点兵,循环控制程序举例,#include,main(),int x;,for(x=1;,x 5000,;x+),if(x%5=1&x%6=5&x%7=4&x%11=10),printf(x=%dn,x);,瞎猫碰死耗子,#include,main(),int x;,for(x=1;x+),if(x%5=1&x%6=5&x%7=4&x%11=10),printf(x=%dn,x);,死循环,循环控制程序举例,#include,main(),int x;,for(x=1;x+),if(x%5=1&x%6=5&x%7=4&x%11=10),printf(x=%dn,x);,goto END;,END:;,方法一:,goto,#include,main(),int x;,for(x=1;x+),if(x%5=1&x%6=5&x%7=4&x%11=10),printf(x=%dn,x);,break;,方法二:,break,#include,main(),int x;,int find=0,;,for(x=1;,!find,;x+),if(x%5=1&x%6=5&x%7=4&x%11=10),printf(x=%dn,x);,find=1;,方法三:标志变量,例,:,验证哥德巴赫猜想:任一充分大的偶数,可以用两个素数之和表示。例如:,4=2+2,,,6=3+3,,,98=19+79,这一思路的算法如下:,读入大于,3,的偶数,n,。,p=1,do,p=p+1;q=n-p;,p,是素数吗?,q,是素数吗?,while p,、,q,有一个不是素数。,输出,n=p+q,。,问题分析:,读入一个偶数,n,,将它分成,p,和,q,,使,n=p+q,。怎样分呢?可以令,p,从,2,开始,每次加,1,,而令,q=n-p,,如果,p,、,q,均为素数,则正为所求,否则令,p=p+1,再试。,flagp=1;,for(j=2;j=(int)sqrt(p);j+),if(p,除以,j,的余数,=0),flagp=0;break;,flagq=1;,for(j=2;j=(int)sqrt(q);j+),if(q,除以,j,的余数,=0),flagq=0;break;,设置两个标志量,flagp,和,flagq,,,0-,是不素数,,1-,是素数,while(flagp*flagq=0);,循环控制程序举例,#include,#include,void main(),int i,n,p,q,flagp,flagq;,printf(please input n:);,scanf(%d,/,输入一偶数,if(n 4|n%2!=0),/,如果该数不是偶数,goto stop;,/,程序结束,p=1;,do,p+;q=n-p;,flagp=1;,for(i=2;i=(int)sqrt(p);i+),if(p%i=0),flagp=0;break;,flagq=1;,for(i=2;i=(int)sqrt(q);i+),if(q%i=0),flagq=0;break;,while(flagp*flagq=0);,printf(%d=%d+%dn,n,p,q);,stop:printf(input data error!n);,判断,p,是否为素数,判断,q,是否为素数,运行结果:,please input n:98,98=19+79,please input n:9,input data error!,例,:,打印大小可变的菱形图案(下面菱形的大小是,7,)。,问题分析:,菱形的大小,size,其实就是中间行中*号的个数,也是整个菱形的行数,其值必须是奇数。,问题的关键之一,是如何确定每行中*号的个数。经过分析得知:当行数,i,(假设最上面的一行为第,1,行),(size+1)/2,时,该行上的*号个数为,n=2*i-1,,否则,n=2*(size-i+1)-1,。,问题的关键之二,是如何确定每行显示的第一个*号的位置,也就是显示第一个*号之前应显示多少个空格。经过分析得知:每行应显示的空格数为,m=(size-n)/2,个。,循环控制程序举例,循环控制程序举例,#include,#include,void main(),int i,j,k,m,n,size;,printf(input size:);,/,输入大小提示,scanf(“%d”,/,输入大小,/,如果为小于或等于,0,的数或为偶数,if(size=0|size%2=0),printf(the size is error!n);,exit(-1);,/,程序结束,for(i=1;i=size;i+),/,控制行数,n=(i=(size+1)/2)?i:size-i+1;,/,每行中,*,号的个数,n=2*n-1;,m=(size-n)/2+15;,/,每行打印,*,之前应打印的空格数,for(k=1;k=m;k+),/,打印每行前面的空格,printf();,for(j=1;j=n;j+),/,打印每行的,*,printf(*);,printf(n);,/,打印一行后,回车换行,本章主要讨论了循环结构程序设计的有关方法,重点介绍了与,C,语言三种循环控制结构有关的,while,语句、,do-while,语句及,for,语句。,本章所涉及到的主要关键字有:,while,、,do,、,for,、,goto,、,break,、,continue,。,语言提供了三种循环语句。,for,语句主要适用于循环次数确定的循环结构。,循环次数及控制条件要在循环过程中才能确定的循环可用,while,或,do-while,语句。,三种循环语句可以相互嵌套组成多重循环,循环之间可以并列但不能交叉。,三种循环结构可以相互转换。,可用转移语句把流程转出循环体外,但不能从外面转向循环体内。,在循环程序中应避免出现死循环,即应保证循环控制变量的值在运行过程中可以得到修改,并使循环条件逐步变为假,从而结束循环。,break,、,continue,和,goto,语句都可用于流程控制。其中,,break,语句用于退出,switch,或一层循环结构,,continue,语句用于结束本次循环,继续执行下一次循环,,goto,语句无条件转移到标号所标识的语句处去执行。当程序需要退出多重循环时,用,goto,语句比用,break,语句更直接方便。,结构化程序设计,Structured Programming,,简称,SP,1965,年,最早由,E.W.Dijkstra,在一次国际会议上提出,1966,年,,C.Bohm,和,G.Jacopini,首先证明了:,只用顺序、选择、循环三种基本的控制结构就能实现任何单入口、单出口的程序,给结构化程序设计奠定了基础,1971,年,,IBM,公司的,Mills,提出:,程序应该只有一个入口和一个出口,进一步补充了结构化程序的规则,一个比较流行的定义是:,结构化程序设计是一种进行程序设计的原则和方法,它避免使用,goto,语句,采用“自顶向下、逐步求精”方法进行程序设计,按照这种原则和方法设计出的程序的特点为:,结构化程序设计,结构清晰 容易阅读 容易修改 容易验证,结构化程序设计的核心思想,采用顺序、选择和循环三种基本结构作为程序设计的基本单元,只有一个入口;,只有一个出口;,无死语句,即不存在永远都执行不到的语句;,无死循环,即不存在永远都执行不完的循环。,采用“自顶向下、逐步求精”和模块化的方法进行结构化程序设计,Top-down,Stepwise refinement,1971,年,,wirth,提出,先全局后局部,先整体后细节,先抽象后具体,结构化程序设计,if-else,switch,for,while,do-while,break,continue,结构化程序设计,结构化的控制语句:,The End!,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服