C语言循环结构程序设计

上传人:xiao****1972 文档编号:244902221 上传时间:2024-10-06 格式:PPT 页数:62 大小:435KB
返回 下载 相关 举报
C语言循环结构程序设计_第1页
第1页 / 共62页
C语言循环结构程序设计_第2页
第2页 / 共62页
C语言循环结构程序设计_第3页
第3页 / 共62页
点击查看更多>>
资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,循环的引入,for,循环,while,循环,do,while,循环,循环的比较,循环嵌套,break,和,continue,语句,应用举例,第,4,章 循环结构程序设计,什么是循环?,为什么要使用循环?,问题,1,:,问题,2:,求学生平均成绩,分数相加后除以课数,在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。,4.1,循环的引入,4.1,循环的引入,循环结构的共同特点是:在给定条件成立的情况下,反复执行某段程序,直到条件不成立为止(结束循环)。我们将给定的条件称为,循环条件,,被反复执行的代码部分称为,循环体,。,4.2 for,循环,for,语句基本形式为:,for(,表达式,1;,表达式,2;,表达式,3),循环体语句,;,表达式,2,表达式,3,表达式,1,循环体语句,T,F,For,循环流程图,C,语言中的,for,语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替,while,语句。,4.2 for,循环,for,语句的执行过程:,(1),先求解表达式,1,。,(2),求解表达式,2,,若其值为真,(,值为非,0),,则执行,for,语句中指定的内嵌语句,然后执行下面第,(3),步。若为假,(,值为,0),,则结束循环,转到第,(5),步。,(3),求解表达式,3,。,(4),转回上面第,(2),步骤继续执行。,(5),循环结束,执行,for,语句下面的一个语句,表达式,2,?,执行,语句,成立,不成立,执行,for,循环之后的语句,执行表达式,3,执行表达式,1,循环初始条件,循环控制条件,循环体,for,语句等价于下列语句:,表达式,1,;,while,(表达式,2,),语句;,表达式,3,;,for,语句最简单的形式:,for(,循环变量赋初值;循环条件;循环变量增值,),例如,: for(i=1;i=100;i+) sum=sum+i;,相当于:,i=1;,while(i=100),sum=sum+i;i+;,用,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) for,语句的一般形式中的“表达式,1”,可以省略,此时应在,for,语句之前给循环变量赋初值。注意省略表达式,1,时,其后的分号不能省略。如,for(,;,i=100;i+) sum=sum+i;,执行时,跳过“求解表达式,1”,这一步,其他不变。,用,for,语句实现循环,说明:,(2),如果表达式,2,省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式,2,始终为真。,例如:,for(i=1; ;i+) sum=sum+i;,表达式,1,是一个赋值表达式,表达式,2,空缺。它相当于:,i=1;,while(1),sum=sum+1;i+;,用,for,语句实现循环,说明:,(3),表达式,3,也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:,for(i=1;i=100;),sum=sum+i;i+;,在上面的,for,语句中只有表达式,1,和表达式,2,,而没有表达式,3,。,i+,的操作不放在,for,语句的表达式,3,的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。,用,for,语句实现循环,说明:,(4),可以省略表达式,1,和表达式,3,,只有表达式,2,,即只,给循环条件。如:,for(;i=100;) while(i=100) sum=sum+i;,相当于,sum=sum+i;,i+; i+;,在这种情况下,完全等同于,while,语句。可见,for,语句,比,while,语句功能强,除了可以给出循环条件外,还可,以赋初值,使循环变量自动增值等。,用,for,语句实现循环,说明:,(5) 3,个表达式都可省略,如:,for(; ;),语句,相当于,while(1),语句,即不设初值,不判断条件,(,认为表达式,2,为真值,),,,循环变量不增值。无终止地执行循环体。,用,for,语句实现循环,说明:,(6),表达式,1,可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如,:,for (sum=0;i=100;i+),sum=sum+i;,表达式,3,也可以是与循环控制无关的任意表达式。,用,for,语句实现循环,说明:,表达式,1,和表达式,3,可以是一个简单的表达式,也可以,是逗号表达式,即包含一个以上的简单表达式,中间用,逗号间隔。如:,for(sum=0,,,i=1;i=100;i+) sum=sum+i;,或,for(i=0,,,j=100;i=j;i+,,,j-) k=i+j,;,表达式,1,和表达式,3,都是逗号表达式,各包含两个赋值,表达式,即同时设两个初值,使两个变量增值,.,用,for,语句实现循环,说明:,在逗号表达式内按自左至右顺序求解,整个逗号表达,式的值为其中最右边的表达式的值。如,:,for(i=1;i=100;i+,,,i+) sum=sum+i;,相当于,for(i=1;i=100;i=i+2) sum=sum+i;,用,for,语句实现循环,说明:,(7),表达式一般是关系表达式,(,如,i=100),或逻辑表达式,(,如,ab & xy),,但也可以是数值表达式或字符表达,式,只要其值为非零,就执行循环体。,用,for,语句实现循环,说明:,for(i=0;(c=getchar()!=,n;,i+=c,);,在表达式,2,中先从终端接收一个字符赋给,c,,然后判断,此赋值表达式的值是否不等于,n(,换行符,),,如果,不等于,n,,就执行循环体。,注意:,此,for,语句的循环体为空语句,把本来要在循环,体内处理的内容放在表达式,3,中,作用是一样的。可见,for,语句功能强,可以在表达式中完成本来应在循环体,内完成的操作。,用,for,语句实现循环,说明:,for( ;(c=getchar()!=,n;),printf(%c,,,c);,for,语句中只有表达式,2,,而无表达式,1,和表达式,3,。,其作用是每读入一个字符后立即输出该字符,直到输入,一个“换行”为止。请注意,从终端键盘向计算机输入,时,是在按,Enter,键以后才将一批数据一起送到内存缓,冲区中去的。,运行情况:,Computer (,输入,),Computer (,输出,),而不是,Ccoommppuutteerr,用,for,语句实现循环,注意,:,C,语言中的,for,语句比其他语言,(,如,BASIC,,,PASCAL),中的,FOR,语句功能强得多。可以把循环体,和一些与循环控制无关的操作也作为表达式,1,或,表达式,3,出现,这样程序可以短小简洁。但过分,地利用这一特点会使,for,语句显得杂乱,可读性,降低,最好不要把与循环控制无关的内容放到,for,语句中。,4.3 while,循环,while,语句的一般形式为:,while(,表达式,),循环体语句,;,表达式,F,循环体语句,T,while,循环流程图,用,while,语句实现循环,while,语句用来实现“当型”循环结构。,一般形式:,while (,表达式,),语句,当表达式为非,0,值时,执行,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),循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现,.(2),在循环体中应有使循环趋向于结束的语句。,如果无此语句,则,i,的值始终不改变,循环永不结束。,例:结果不可预知的累加求和。,#include ,void main(),int i,sum=0;,while(i=100),sum+=i;,i+;,printf(Sum = %dn,sum);,使用,while,语句时,要确保循环控制变量在循环之前初始化,而在循环体内要有改变循环控制变量的语句,否则容易出现异常的错误或造成死循环。,未初始化循环变量,4.4 dowhile,循环,do,while,语句的一般形式为:,do,循环体语句,;,while (,表达式,);,表达式,F,循环体语句,T,Dowhile,循环流程图,用,do-while,语句实现循环,do-while,语句的特点,:,先执行循环体,然后判断循环条件是否成立。,一般形式,:,do,循环体语句,while (,表达式,),;,执行过程:,先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零,(“,真”,),时,返回重新执行循环体语句,如此反复,直到表达式的值等于,0,为止,此时循环结束。,例:用,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,Dowhile,表达式之后要加分号,4.5,循环的比较,4.5.1 for,语句和,while,语句,for,循环语句比较灵活,可以将循环控制变量初始、循环变量修改和循环控制表达式集中在一个,for,语句中,比较适合循环次数可预测的情况。,while,循环适合不通过递增或递减循环控制变量的循环。,标准的,for,语句,for (,表达式,1;,表达式,2;,表达式,3),循环体语句,;,可以替换成下面的,while,语句,表达式,1;,while (,表达式,2),循环体语句,;,表达式,3;,#include ,void main(),int count_even=0,count_odd=0;,int number;,printf(Input a int number(=0),if(number%2=0),count_even+;,else,count_odd+;,printf(Input a int number(=0 to end):n);,scanf(%d,printf(even number: %dn,count_even);,printf(odd number: %dn,count_odd);,例,:,使用,while,循环统计用户输入的整数中偶数和奇数的个数,判断是否为偶数,Input a int number(=0 to end):,45,Input a int number(=0 to end):,22,Input a int number(=0 to end):,34,Input a int number(=0 to end):,55,Input a int number(=0 to end):,-2,even number: 2,odd number: 2,运行结果,#include ,void main(),int count_even=0,count_odd=0;,int number=1;,printf(Input a int number(=0; ),if(number%2=0),count_even+;,else,count_odd+;,printf(Input a int number(=0 to end):n);,scanf(%d,printf(even number: %dn,count_even);,printf(odd number: %dn,count_odd);,使用,for,循环实现奇偶数的统计,#include ,void main(),int count_even=0,count_odd=0;,int number;,do,printf(Input a int number(0),if(number%2=0),count_even+;,else,count_odd+;,while(number=0);,printf(even number: %dn,count_even);,printf(odd number: %dn,count_odd);,使用,dowhile,循环实现奇偶数的统计,4.5.2 while,语句和,do,while,语句,当,while,后的条件表达式在第一次循环时就为假的话,,while,循环的循环体语句一次也不执行。,do,while,语句则不同,即使循环条件不成立,循环体语句也会被执行一次。,在一般情况下,用,while,语句和用,do-while,语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。,例,: while,和,do-while,循环的比较,(1) #include (2) #include void main ( ) void main( ) int sum=0,,,i; int sum=0,,,i; scanf(“%d,,, scanf(”%d,,,printf(“sum=%dn,,,sum); printf(“sum=%dn”,sum); ,运行结果:,1,sum=55,再运行一次:,11,sum=0,运行结果:,1,sum=55,再运行一次:,11,sum=11,说明:,当,while,后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同。,4.5.3,数值输入中的问题,在实际编程中,往往要求用户输入一个指定范围内的数值,比如要输入某门课程的考试成绩,则成绩取值范围应该为,0,100,。在程序中要求用户输入成绩时,要考虑到用户有可能会出现误操作,如输入一个负数或大于,100,的数,在这种情况下应该能够提醒用户重新输入直到用户输入一个正确数据为止。,例:要求用户输入一个,0,100,的数,直到合法为止。,#include ,void main(),int score=-1;,printf(Input your score(0100):n);,scanf(%d,while(score100),printf(Score must between 0 and 100!n);,printf(Input again:n);,fflush(stdin);,scanf(%d,printf(Your score is: %dn,score);,清除缓冲区内容,4.6,循环嵌套,一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套,循环,这就是多层循环。,三种循环,(while,循环、,do-while,循环和,for,循,环,),可以互相嵌套。,循环的嵌套,下面几种都是合法的形式:,(1),while( ) (2) do (3) for(;), ,while( ) do for(;), , while( ); , while( );,循环的嵌套,(4),while( ) (5) for(;) (6) do, ,do while( ) for(;) ,while( ) , , while( ),几种循环的比较,(1),三种循环都可以用来处理同一问题,一般情况下它们可以互相代替。,(2),在,while,循环和,do-while,循环中,只在,while,后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句,(,如,i+,,或,i=i+1,等,),。,for,循环可以在表达式,3,中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式,3,中。因此,for,语句的功能更强,凡用,while,循环能完成的,用,for,循环都能实现。,几种循环的比较,(3),用,while,和,do-while,循环时,循环变量初始化的操作应在,while,和,do-while,语句之前完成。而,for,语句可以在表达式,1,中实现循环变量的初始化。,(4)while,循环、,do-while,循环和,for,循环,可以,用,break,语句跳出循环,用,continue,语句结束本,次循环,(break,语句和,continue,语句见下节,),。而,对用,goto,语句和,if,语句构成的循环,不能用,break,语句和,continue,语句进行控制。,4.6,循环嵌套,4.6.1,三重循环求解,例:编程求解马克思手稿中的数学问题,马克思手稿中有下面的一道数学题,共有,30,个人,其中有男人、女人和小孩,他们在一家饭馆吃饭共花费了,50,先令,其中每个男人花费,3,先令,每个女人花费,2,先令,每个小孩各花,1,先令,问,30,个人中男人、女人和小孩各几人?,x+y+z=30,3x+2y+z=50,通过题意可以列出以上方程,#include ,void main(),int x,y,z;,printf(Man t Women t Childrenn);,for(x=0;x=30;x+),for(y=0;y=30;y+),for(z=0;z=30;z+),if(x+y+z = 30 & 3*x+2*y+z = 50),printf(%3d t %5d t %8dn,x,y,z);,程序运行结果,Man Women Children,0 20 10,1 18 11,2 16 12,3 14 13,4 12 14,5 10 15,6 8 16,7 6 17,8 4 18,9 2 19,10 0 20,4.6.2,缩小穷举范围,#include ,void main(),int x,y,z;,printf(Man t Women t Childrenn);,for(x=0;x=16;x+),for(y=0;y=25;y+),for(z=0;z=30;z+),if(x+y+z = 30 & 3*x+2*y+z = 50),printf(%3d t %5d t %8dn,x,y,z);,可以通过优化缩小搜索范围,4.6.3,两重循环解决问题,#include ,void main(),int x,y,z;,printf(Man t Women t Childrenn);,for(x=0;x=16;x+),for(y=0;y=25;y+),z=30-x-y;,if( 3*x+2*y+z =50),printf(%3d t %5d t %8dn,x,y,z);,通过设置条件将三层循环改为两层循环,4.6.4,极限情况:一层循环的求解,#include ,void main(),int x,y,z;,printf(Man t Women t Childrenn);,for(x=0;x=0 & z=0),printf(%3d t %5d t %8dn,x,y,z);,优化方程式将两重循环缩减为一层循环,4.7 break,和,continue,语句,4.7.1 break,语句,break,用于结束其所在层的循环,,执行该层循环后面的语句,对外层循环没有影响。,break,语句,break,语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句,一般形式:,break;,注意,:,break,语句不能用于循环语句和,switch,语句之外的任何其他语句中,。,#include ,void main(),char c;,while(1),c=getchar();,if(c=a & c=z),putchar(c-32);,else,break;,程序运行结果:,abcdEFabc,ABCD,遇到非小写字母强行跳出循环,例:将用户输入的小写字母转换成小写字母,break,语句,例,:,float pi=3.14159;,for(r=1;r100) break;,printf(r=%f,area=%fn,,,r,area);,程序的作用是计算,r=1,到,r=10,时的圆面积,直到面积,area,大于,100,为止。从上面的,for,循环可以看到:当,area100,时,执行,break,语句,提前结束循环,即不再继续执行其余的几次循环,。,4.7.2 continue,语句,continue,语句用于跳过本层循环体内,continue,语句之后的部分循环体,并开始下一轮循环,,即只结束本轮循环,。,continue,语句,作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定,.,一般形式:,continue;,例:输入十个整数,统计正数个数并计算正数的平均值,#include ,void main(),int i,count=0,num;,float sum=0;,printf(Input 10 integers:n);,for(i=0;i10;i+),scanf(%d,if(num=0),continue;,count+;,sum+=num;,printf(The number of plus integer is: %dn,count);,printf(Average value: %0.2fn,sum/count);,程序运行结果:,Input 10 integers:,3 2 5-4 -60 55 3 3 9,The number of plus integer is: 7,Average value: 11.43,判断是否为正数,4.8,应用举例,例:查找,2,100,之间的所有素数并按每行,5,个打印输出,#include ,#include ,void main(),int i,j;,int find_num=0;,int n;,int is_prime;,标志变量,for(i=2;i=100;i+),is_prime=1;,n=(int)sqrt(i);,for(j=2;j=n;j+),if(i%j=0),is_prime=0;,break;,if(is_prime),printf(%4d ,i);,find_num+;,if(find_num%5=0),printf(n);,设置循环范围,每行数据量的显示限制,若不为素数则设标志位为,0,程序运行结果:,break,语句和,continue,语句,continue,语句和,break,语句的区别,continue,语句只结束本次循环,,而不是终止整个循环的执行。,while,(,表达式,1), ,if,(,表达式,2),continue;,break,语句和,continue,语句,continue,和,break,的区别,break,语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,while,(,表达式,1), ,if,(,表达式,2),break;,例,:,把,100,200,之间的不能被,3,整除的数输出。,#include void main() int n; for (n=100;n=200;n+) if (n%3=0) continue; printf(%d ,,,n); ,说明:,当,n,能被,3,整除时,执行,continue,语句,结束本次循环,(,即跳过,printf,函数语句,),,只有,n,不能被,3,整除时才执行,printf,函数。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!