第5章_循环结构程序设计

上传人:沈*** 文档编号:247322333 上传时间:2024-10-17 格式:PPT 页数:54 大小:591.50KB
返回 下载 相关 举报
第5章_循环结构程序设计_第1页
第1页 / 共54页
第5章_循环结构程序设计_第2页
第2页 / 共54页
第5章_循环结构程序设计_第3页
第3页 / 共54页
点击查看更多>>
资源描述
C,语言程序设计,C,语言程序设计,C,语言程序设计,C,语言程序设计,上一页,下一页,C语言程序设计教程,5.1,while,语句,5.2,do-while,语句,5.3,for,语句,5.4,break、continue,和,goto,语句,5.5 循环的嵌套,5.6 复合结构程序举例,第五章 循环结构程序设计,教学目的和基本要求:,要求学生了解循环结构程序设计,掌握各种循环语句应用的特点及异同点,掌握循环嵌套及复合结构。,教学重点:,各种循环语句应用的特点及异同点。,scanf,(“%f”,s=s+a;,scanf,(“%f”,s=s+a;,.,这样重复一百次,然后,输出,s,的值。,这样写显然非常麻烦。我们注意到程序中的,scanf,(“%f”,s=s+a;,两句话是一直重复的,如果能用一种语句,使这两句话能自动的重复执行一百次,就可以简化了书写的麻烦,这就是循环语句。,编程解决这样的一个问题:,从键盘输入一百个学生的成绩,求总成绩。,从前面所学,有两种解决方法。,1.设一百个变量,分别输入学生的成绩,然后求和。,这种方法浪费内存空间,显然不实际。,2.设一个变量,每次输入一个学生成绩,累加后再输入下一个学生成绩,如下:,C,语言有,while、do-while、,和,for,语句三种循环结构语句。,前两个称为条件循环,即根据条件来决定是否继续循环;,后一个称为计数循环,即根据设定的执行次数来执行循环。,5.1,while,语句,一般形式:,while(,表达式),语句,表达式,语句,真,假,表达式,1.计算表达式,语句,2.如果表达式的值为非零,,,执行语句,表达式,3.返回第一步,重新计算表达式,4.如果表达式的值为零,则结束循环,如果表达式的值一开始就为,0,,则语句一次也不会被执行。,执行流程:,while,语句举例,问题,:,求学生的平均成绩,以输入负数成绩为结束,算法分析:,1.定义变量,score,存储学生成绩,定义,s=0,存储累加的成绩,,定义,n=0,统计录入的成绩数目。,2.,输入第一个学生的,score,3.,若,score=0,执行第4步,否则执行第7步,4.,n+,5.s=s+score,6.,录入下一个,score,并返回第3步,7.,如果,n0,输出,s/n,否则输出没有学生成绩,main(),int,n=0;,float s=0,score;,scanf,(“%f”,while(score=0),n+;,s=s+score;,scanf,(“%f”,if(n0),printf,(“n%f”,s/n);,else,printf,(“no student score!”);,程序:,5.2,do,while,语句,一般形式:,do,语句 ,while (,表达式),;,1.执行语句,3.表达式的值为非零,,返回第1步,4.表达式的值为零,结束循环,语句至少被执行一次。,表达式,语句,2.计算表达式,执行流程:,注意:,分号不能丢,语句,表达式,真,假,main(),int,n=0;,float s=0,score;,do,scanf,(“%f”,n+;,s=s+score;,while(score=0);,if(n1),printf,(“n%f”,(s-score)/(n-1);,else,printf,(“no student score!”);,用,do-while,语句编写统计学生平均成绩的程序:,由于,do-while,语句至,少要被执行一次,特,别要注意,n,和,s,的取值,问题!,想想这样的一段循环语句的执行结果:,i=1;,while(i=100),putchar,(*);,i+;,这个循环永远不会结束,因为循环控制变量,i,没有在循环体内被改变,,i+;,不属于循环体。,应该改为:,i=1;,while(i=100),putchar,(*);,i+;,循环语句中一定要注意表达式的值是否能在循环执行过程中被改变,以免造成死循环。,5.3,for,循环语句,for(,表达式,1;,表达式,2;,表达式,3),循环体语句,一般形式:,1.计算表达式1,通常用于循环开始前设置变量初值。,2.计算表达式2,值为0则结束循环,否则执行第3步。,3.执行循环体语句。,4.计算表达式3,返回第2步。,执行流程,表达式,1,表达式,2,循环体,表达式,3,假,真,例:,求,1+2+99,#,include,main(),int,i,s=0;,for(i=1;i=99;i+),s=s+i;,printf,(“s=%d”,s);,分析:用变量,i,从1到99循环,把,i,的值累加到变量,s,中,最后输出,s,的值。,程序如下:,i=1,i=99,s=s+i,i+,假,真,从上面的程序我们看到,,for,语句中:,表达式1:,通常是给循环变量赋初值,表达式2:,循环是否继续执行的判别表达式,这个表达式通常与某一个(或多个)变量的值有关,随着这个(些)变量的值的改变,表达式的结果发生变化,这个(些)变量被称为循环因变量。,表达式3:,通常用于改变循环因变量的值。,在某些情况下,,for,语句中的表达式1、2、3都可以省略,而改用其他的方式来实现这些功能。我们还用上面的例子说明,for,语句省略表达式的情形。,1.省略表达式1:,#,include,main(),int,i=1,s=0;,for(;i=99;i+),s=s+i;,printf,(“s=%d”,s);,2.,省略表达式3:,#,include,main(),int,i,s=0;,for(i=1;i=99;),s=s+i;i+;,printf,(“s=%d”,s);,3.同时省略表达式1、3,#,include,main(),int,i=1,s=0;,for(;i=99;),s=s+i;i+;,printf,(“s=%d”,s);,表达式2也可以省略,但在循环体中要借助,break;,语句来实现循,环的结束,我们将在,后面介绍。,注意:表达,式省略,分,号不省略。,for,语句中的表达式可以是一切形式的表达式,逗号运算符参与的表达式也可以运用在,for,语句中,通常运用于表达式1和表达式3。,如上面的例子可以改写为:,#,include,main(),int,i,s;,for(s=0,i=1;ij,时结束循环(即,i=j,时继续循环)。最后输出,s。,程序如下:,#,include,main(),int,i,j;,float s=0;,for(i=1,j=100;i=j;i+,j-),s=s+(float)i/j;,printf,(“ns=%f”,s);,for、while、do-while,的比较,所有需要用到循环结构的程序,都可以用,for、while、do-while,中的任何一个来实现,区别只在于某些问题用哪种语句更方便。,比如求1+2+99的问题我们也可以分别用,while,与,do-while,语句编写如下:,用while:,#,include,main(),int,i=1,s=0;,while(i=99),s=s+i;i+;,printf,(“ns=%d”,s);,用do-while:,#,include,main(),int,i=1,s=0;,dos=s+i;,i+;while(i0,执行第4步,否则执行第7步,4.,i=a%10,5.t=t*10+i,6.a=a/10,,并返回第3步,7.输出,t,程序:,#,include,main(),long a,i,t=0;,scanf,(“%ld”,while(a0),i=a%10;,t=t*10+i;,a=a/10;,printf,(“n%ld”,t);,在这里由于,a,的值可能,很大所以用到了,long,型定,义变量,a,如果希望取到的,值更大,可以用,unsigned,long,型。,问:如果,a,用,double,型,并,把,i=a%10,改为,i=(long)a%,10;,把,a=a/10,改为,a=(long)a,/10,可以吗?,答:不可以!,例:有数列2/3、4/5、6/9、10/15求此数列前30项的和。,1.,初值,i=2,j=3,s=0;,2.,用,n,从1到30循环,5.,输出,s;,3.,s=s+i/j;,4.c=i;i=j+,1,;j=c+j;,算法分析:,对于数列的题,首先要找出通项公式,或前后项的计算关系公式,根据公式求所需。由于数列的题一般执行次数能确定,用,for,语句来编写比较方便。,此题,前后项的关系是:后一项的分子是前一项的分母加1,后一项的分母是前一项的分子加分母。解题思路是用循环语句求各项,并把值累加,因为是求前30项的和,循环执行30次。,程序:,#,include,main(),int,i=2,j=3,n,c;,float s=0;,for(n=1;n99)break;,s=s+i;i+;,printf,(“s=%d”,s);,例:前面讲到的计算1+2+99的程序,可以同时省略,for,循环的三个表达式,改写成如下形式:,本程序中,当,i99,时,利用,break,语句强行终止,for,循环,继续执行,for,语句后的下一条语句。,5.4.2,continue,语句,该语句被称为继续语句,。,在循环结构中执行,continue,语句,使本次循环提前结束,即跳过循环体中,continrue,语句下面的尚未执行的循环体语句,但不结束整个循环,继续进行下一次循环的条件判别,条件为真,继续进行执行循环语句。,一般形式:,continue,;,例:下面这个程序,想想它实现的是什么功能?,#,include,main(),int,i,s=0;,for(i=1;i=100;i+),if(i%5=0)continue;,s=s+i;,printf,(“n%d”,s);,在左边的程序中,,i,从1到100循环,当,i,是5的倍数时,直接进入下一个,i,当,i,不是5的倍数时,把,i,累加到,s,最后输出,s。,所以,这个程序实现的是求1100中间所有非5的倍数的数之和。,5.5 循环的嵌套,当循环体语句又是一条循环语句,或作为循环体的复合语句中又包含循环语句时称为循环的嵌套。嵌套可以是两层或多层。,While、do-while、for,三种循环都可以互相嵌套。,循环体语句可以是任何形式的语句,简单语句、空语句、复合语句、流程控制语句都可作为循环体语句。,例:输出,nm,中(0,n0,执行第6步,否则执行第9步,#,include,main(),long a,x,i,t,n,m;,scanf,(“%ld%ld”,for(a=n;a0),i=x%10;,if(i=5),printf,(“t%ld”,a);break;,x=x/10;,程序:,问:,能把,a%3=0,也放到,for,循环语句的表达,式2中,写成,a=m,&a%3=0,吗?,答:不可以!,例:求3150中所有素数的和。,算法分析:,1.用变量,a,从3到150循环,每次值增加1,2.用变量,i,从2到,a-1,循环,每次值增加1,3.若,a%i=0,结束,i,的循环,执行第4步,4.,若,i=a,,把,a,累加到,s,上。,5.输出,s,的值,注意:此题中执行第4步时有两种情况。第一种:在第3步,中发现了满足,a%i=0,的情况,直接跳出了,i,的循环,此时的,i,一定是在2到,a-1,中间的一个值,而且,a,不是素数。第二种:一,直没有发现满足,a%i=0,的,i,在,i=a,时,不再满足,i,循环的执行,条件,,i,循环结束,此时的,a,是素数!,程序:,#,include,main(),int,a,s=0,i;,for(a=3;a=150;a+),for(i=2;i=a-1;i+),if(a%i=0)break;,if(a=i)s=s+a;,printf,(“n%d”,s),求素数的方法很,多,大同小异。此,题可以做一些改动,。如:,i,的值可以是,从2取到,sq
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


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

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


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