《循环结构程序设计》PPT课件.ppt

上传人:za****8 文档编号:13196193 上传时间:2020-06-07 格式:PPT 页数:53 大小:282.55KB
返回 下载 相关 举报
《循环结构程序设计》PPT课件.ppt_第1页
第1页 / 共53页
《循环结构程序设计》PPT课件.ppt_第2页
第2页 / 共53页
《循环结构程序设计》PPT课件.ppt_第3页
第3页 / 共53页
点击查看更多>>
资源描述
第5章循环结构程序设计,5.1循环结构程序设计5.2while语句和dowhile语句5.3for语句5.4循环的嵌套5.5break语句和continue语句5.6循环结构程序设计综合应用,本章要点,while,for,do-while三种循环语句的使用方法break,continue两种循环控制语句的使用方法循环结构程序设计的特点循环结构程序设计的一般方法。,5.1循环结构程序设计,循环结构是结构化程序设计中一种很重要的结构,又称为重复结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。在进行循环结构程序设计时,关键是要设计好循环判断条件和循环体。循环判断条件判断循环体是否需要再次执行,什么时候结束,所以在设计循环判断条件时一定要准确。循环体决定哪些语句应该在循环体内,哪些语句应该放在循环体外,判断的标准是该语句是否需要多次执行,不能放错位置。循环条件和循环体设置不好,很可能得不到预期的结果,甚至出现死循环。,现在,以例4-14的生肖查询为例,介绍循环结构程序设计一般的设计思路。1.循环条件设计如果查询人数确定,可用一个变量来记录已查询的人数,循环条件可设计为判断计数变量是否小于指定人数,源程序可以参阅例5-6,如果不能确定查询的人数,则可约定一个查询结束键,每次查询完一个人后,要求用户输入一个是否继续的选择键,循环条件可设计为用户是否输入查询结束键,源程序可以参阅例5-1。2.循环体设计生肖判断的有关语句肯定应该放在循环体中,那么,输入出生年份语句和显示查询结果的语句呢?很显然,每次查询都要求输入出生年份,显示查询结果,即需要多次执行,所以这两个语句应放在循环体中。如果循环条件设计为是否输入查询结束键,那么查询结束键的输入语句也应放在循环体中。语言提供了3种循环语句:while语句、do-while语句和for语句,可以利用它们来组成各种不同形式的循环结构。,5.2while语句和dowhile语句,5.2.1while语句1.while语句的一般格式while(循环条件表达式)循环体语句说明:(1)循环条件表达式,一般是关系表达式或逻辑表达式,必须用括号括起来。只要表达式的值为真(非0),则循环继续执行。(2)当循环体中超过一个语句时,必须用括起来,构成复合语句。应注意循环条件的选择,避免死循环。(4)while语句先进行条件判断,然后决定是否执行循环体语句,如果第一次条件为假,则循环体语句一次也不执行。,(5)循环之前要为有关变量赋初值,对于循环控制变量,一般要设置满足循环条件的初值,其他相关变量一般根据需要设置一个特殊值,如0、1、空串等。2.执行过程先计算循环条件表达式的值,如果为真(非0)则执行循环体语句,然后再进行循环判断,直到循环条件表达式的值为假(0),结束循环,转去执行while语句后面的语句。while语句的执行流程如图5.1所示。,图5.1while语句的执行流程,【例5-1】输入一个人的出生年份,显示他的生肖,要求可连续查询,按Y键时继续判断,按其他键结束。#includemain()intyear,x,n;charc=y;/*注意,赋初值时应保证程序执行循环体*/while(c=y|c=Y)/*循环体开始*/scanf(%d,switch(x),case0:printf(猴n);break;case1:printf(鸡n);break;case2:printf(狗n);break;case3:printf(猪n);break;case4:printf(鼠n);break;case5:,printf(牛n);break;case6:printf(虎n);break;case7:printf(兔n);break;case8:printf(龙n);break;case9:printf(蛇n);break;case10:,printf(马n);break;case11:printf(羊n);elseprintf(请输入一个大于0的年份n);/*以下3个语句也应放在循环体内*/printf(是否要继续查询?继续查询请按:);getchar();/*消去缓冲区中的回车键*/scanf(%c,/*循环体结束*/阅读本程序时,请重点关注与循环相关的程序语句。,【例5-2】求1+2+3+4+99+100的值。分析:本例是一个典型的累加问题。对于简单的累加问题应注意以下几点:(1)和变量初值为0。(2)累加的开始值,即初值,本例初值为1。(3)累加的结束值,即终值,本例终值为100。(4)相邻两个数的间隔,即步长,本例步长值为1。(5)累加的典型语句为s=s+i;。在程序设计时,和变量的初值可在变量定义时初始化,循环变量的初值应在循环语句前预先处理,终值在一般循环条件中体现,步长处理和累加的典型语句为s=s+i;则放在循环体中。,程序代码:main()inti,s=0;i=1;/*初值处理*/while(i=100)/*判断条件,终值处理*/s=s+i;i+;/*步长处理*/printf(s=%dn,s);,【例5-3】求1*2*3*4*5*6*7的值。分析:本例是一个典型的累乘问题,程序的总体结构与例5-2相似。同样,对于简单的累乘问题应注意以下几点。(1)积变量初值为1,同时,连乘很容易产生一个很大的数,要特别注意积变量的数据类型。(2)累乘的开始值,即初值,本例初值为1。(3)累乘的结束值,即终值,本例终值为7。(4)相邻两个数的间隔,即步长,本例步长值为1。(5)累乘的典型语句为s=s*i;。,程序代码:main()inti,s=1;i=1;while(i=7)s=s*i;i+;printf(s=%dn,s);,5.2.2do-while语句1.do-while语句的语法格式do-while语句的一般格式:do循环体语句while(循环条件表达式);说明:(1)循环条件表达式,一般是关系表达式或逻辑表达式,必须用括号括起来。在if语句和while语句中,表达式后面都不能加分号“;”,而在do-while语句中,条件表达式后面的分号“;”不能省。(3)注意循环条件的选择,避免死循环。,(4)do-while语句先执行循环体,然后进行条件判断,决定是否再次执行循环体,即使第一次条件为假,循环体也要执行一次。这一点和while语句是不同的。(5)循环体中超过一个语句,必须用括起来,构成复合语句。(6)循环之前要为有关变量赋初值。2.执行过程先执行循环体语句,然后进行循环条件判断。如果循环条件表达式的值为真,则再次执行循环体语句,直到循环条件表达式的值为假,结束循环。do-while语句的执行流程如图5.2所示。,图5.2do-while语句的执行流程,【例5-4】求1+2+3+4+99+100的值。main()inti,s=0;i=1;/*初值处理*/dos=s+i;i+;/*步长处理*/while(i=100);/*判断条件,终值处理*/printf(s=%dn,s);用do-while语句求和,与while语句很接近,只是将while的条件表达式移到循环体的后面,在循环体前加一个do。,5.3for语句,for语句是语言所提供的功能最强、使用最广泛的一种循环语句。1.for语句的一般格式for(表达式1;表达式2;表达式3)循环体语句说明:(1)表达式1:通常用来给变量赋初值,一般为赋值表达式,表达式1可省略,省略表达式1时,应在循环语句前,给相关变量赋初值。(2)表达式2:通常是循环条件,一般为关系表达式或逻辑表达式,表达式2也可省略,当其省略时,应在循环体中,用if语句设置退出循环的条件,否则会出现死循环。(3)表达式3:通常用来修改循环变量的值,即处理步长,一般是赋值语句,表达式3也可省略,当其省略时,应在循环体中处理步长,否则会出现死循环。,(4)无论省略哪个或哪些表达式,其后的分号不能省,所以for语句的括号内,有且只有两个分号。(5)每个表达式都可使用逗号表达式,但一般只在表达式1和表达式3中常用。(6)循环体只能是一个语句,当循环体超过一个语句时,应加上构成复合语句。(7)表达式3中,改变循环变量值时,一定要使循环趋于结束,否则会出现死循环。在for语句中,可以直接处理循环变量的初值、终值、步长,在这方面比while语句和do-while语句都方便。2.执行过程for语句的执行顺序:表达式1表达式2循环体语句表达式3表达式2循环体语句表达式3表达式2。表达式1只执行一次。表达式2的值为真继续执行,否则结束循环,如果循环正常结束,则最后执行的一定是表达式,2,即一般情况下表达式2是循环的唯一出口。for语句的执行流程如图5.3所示。,图5.3for语句的执行流程,【例5-6】输入一个人的出生年份,显示他的生肖,一次运行可以连续查询5个人。#includemain()intyear,x,n;for(n=1;n0)x=year%12;switch(x),case1:printf(鸡n);break;case2:printf(狗n);break;case3:printf(猪n);break;case4:printf(鼠n);break;case5:printf(牛n);break;case6:printf(虎n);break;,case7:printf(兔n);break;case8:printf(龙n);break;case9:printf(蛇n);break;case10:printf(马n);break;case11:printf(羊n);,elseprintf(请输入一个大于0的年份n);/*循环体结束*/,【例5-7】求1+2+3+4+99+100的值。分析:在程序设计时,和变量的初值可在变量定义初始化时赋值,也可放在循环的表达式1中,循环变量的初值可在表达式1中处理,终值在表达式2中处理,步长在表达式3中处理,累加的典型语句s=s+i;放在循环体中。main()inti,s=0;/*和变量s初值为0*/for(i=1;i=100;i+)/*循环变量i的初值为1,终值为100,步长为1*/s=s+i;/*累加典型语句*/printf(s=%dn,s);思考:如果在for(i=1;i=100;i+)后加一个分号,程序的运行结果会不会改变?,【例5-9】输出菲波那切数列(Fibonacci数列)的前20项。分析:所谓菲波那切数列是指数列最初两项的值均为1,以后每一项为前两项的和,即1,1,2,3,5,8,13,在程序中,可设3个变量i1、i2、i3,变量i1和i2表示数列的前两项,变量i3表示前两项的和,即当前项,每计算完一个数后,将i2的值赋给i1,将i3的值赋给i2,再计算新的i3值。,程序代码:#includestdio.hmain()inti1=1,i2=1,i3,i;printf(n%5d%5d,i1,i2);for(i=3;i=20;i+)i3=i1+i2;printf(%5d,i3);i1=i2;i2=i3;,4.几种循环语句的比较(1)C语言提供的几种循环语句,都可用来处理同一问题,一般情况下,它们可以互相代替。(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)如果循环条件第一次执行时就为假,for和while的循环体一次也不执行,而dowhile语句则至少要执行一次循环体。(5)对于循环变量不是呈规则变化(递增或递减)的循环,最好用while或do-while语句。(6)三种循环语句都可用break语句跳出整个循环,用continue语句结束本次循环,选择三种循环的一般原则,如果循环次数已知,用for如果循环次数未知,用while如果循环体至少要执行一次,用do-while这只是“一般”原则,不是“原则”,5.4循环的嵌套,在一个循环结构中,又包含另一个完整的循环结构称为循环的嵌套。内嵌循环的循环体中还可以出现新的循环,这就构成了多重循环。C语言提供的for语句、while语句和do-while语句,不但可以嵌套循环语句自身,而且可以相互嵌套,所以在C语言中,循环的嵌套有多种形式。循环嵌套的执行:外层循环体每执行一次,内层循环要整体循环一次(从初值开始,一直执行到不满足循环条件为止)。嵌套循环的执行流程如图5.4所示(以两个while语句的嵌套为例)。,图5.4嵌套循环的执行流程,【例5-10】求1!+2!+3!+4!+5!+6!。分析:本题要求6个数相加,6个数相加是一个典型的累加问题,可用如下程序段实现:for(i=1;i7;i+)(1)s=s+i;但这6个数不是一个简单的值,而是一个数的阶乘。所以s=s+i;语句中的i应改为i!,i!又是一个典型的累乘。可用以下程序段来实现:for(j=1;j=i;j+)(2)t=t*j;显然(1)的循环体每执行一次,即每加一个数,会对应一个数的阶乘,(2)必须完整(从循环初值一直执行到终值)地执行一次。因此本题要用循环的嵌套来实现,且累加是外循环,累乘是内循环,内外层循环联系,通过外层循环的循环变量i来实现。,程序代码:main()inti,j,s=0,t;for(i=1;i=6;i+)/*外循环*/t=1;/*思考:此语句为什么要放在该位置?*/for(j=1;j=i;j+)/*内循环*/t=t*j;s=s+t;/*外循环语句*/printf(sum=%dn,s);本程序的执行过程:,【例5-11】编程显示以下图形:*分析:二维图形的输出要通过双重循环来实现。输出不同的图案由3个要素决定,即行数、每行中图标的个数以及每行第一个图标的输出位置。其中行数是由外循环(的循环次数)来控制的,即所谓“外循环控制行”;每行中输出图标的个数由某个内循环(的循环次数)来控制,即所谓“内循环控制列”;而每行第一个图标的输出位置,则由外循环体中的循环控制变量控制。,本例输出的图形共分5行,其中第1行输出1个“*”,第2行输出3个“*”,第3行输出5个“*”,依此类推,第i行输出(2*i-1)个“*”。每行第一个“*”的输出,以每行向左移动一个字符位置的速度向左倾斜。分析了以上3个要素后,就可以编程了。程序由两重for循环构成,外层for循环的循环次数为5,其循环体共分为3部分:第一部分是for循环j,控制每行第一个“*”的输出,如果要求向左倾斜,即要使下一行输出的行首空格个数较上一行少1个,变量i前要用减号;如果要求向右倾斜,即要使下一行输出的行首空格个数较上一行多1个,变量i前就要用加法;如果不倾斜,就与变量i无关,本循环可以省略。第二部分是for循环k,它完成各行“*”的输出,并控制每行输出的“*”的个数。每行输出的“*”个数为2*i+1,即输出的“*”个数与行数有关,可用2*i+1作为循环k的循环判断条件。第三部分是printf(n),它的功能是换行,当一行的“*”输完后,一定要换行,因此它也是本程序不可缺少的组成部分。通过以上分析得知,只要对本例稍加修改,就可以输出不同的图形。,程序代码:main()inti,j,k;for(i=1;i=5;i+)for(j=1;j=20-i;j+)printf();for(k=1;k=2*i-1;k+)printf(*);printf(n);思考:如何使以上图形变为钻石形,即要在例5-11显示图形的基础上再添加4行,变化规律:逐行减少2个“*”号,同时显示开始位置逐行向右移动1个位置。说明:对于简单二维图形的显示,还有一个非常简单的方法,直接用printf函数将结果输出到屏幕上,但对于行数或列数较多的图形,使用循环的嵌套实现比较方便。,5.5break语句和continue语句,1.break语句(1)break语句的一般格式:break;(2)语句功能:break语句只能用于switch语句或循环语句中,其功能是跳出switch语句或跳出本层循环,转去执行其他后继语句。当循环次数不确定,需要在循环语句的执行过程中提前结束循环,或需要循环语句中提供多个出口时,可用break语句。break语句使循环结构编程更加灵活、方便。(3)使用方法:在循环语句中,break语句一般可与if语句配合使用,用if语句设置退出条件,break语句则执行退出操作。在同一个循环语句中可以使用多个break语句。break语句的执行流程如图5.5所示。,图5.5break语句的执行流程,【例5-12】如果圆半径取整数,那么圆面积不超过150的最大值是多少,此时的圆半径为多大?分析:半径为10的圆面积为314,显然大于150,所以我们要找的圆半径肯定小于10(当然,还可进一步精确估计可能的最大值),那到底是19中的哪一个值呢?一个最简单的办法就是一个一个试算,当面积刚好大于150时结束,它的前一个圆半径,刚好是我们要求的圆半径。提前结束循环用break语句实现。,main()intr;floatpi=3.1415926,area;for(r=1;r150)break;/*面积刚好大于150时结束循环*/r=r-1;/*最大的圆半径应该是前一个*/area=pi*r*r;/*重新计算面积*/printf(r=%d,area=%fn,r,area);思考:本题也可直接将面积area作为循环结束条件,而不用break语句,如果用area=150作为循环判断条件,本程序该如何修改?,【例5-13】已知sum=1+2+3+i+,求sum大于20时,i的最小值。#includestdio.hmain()inti=1,sum=0;while(i20)break;/*当sum的值大于20时,退出循环*/printf(%d,i-1);/*注意i的值要减1*/思考:如果用s=20作为循环判断条件,本程序该如何修改?,2.continue语句(1)continue语句的一般格式:continue;(2)语句功能:continue语句只能用在循环体中,结束本次循环,即不再执行循环体中continue语句之后的循环语句,转入下一次循环条件的判断与执行。continue语句的执行流程如图5.6所示。注意,本图以while语句为例说明break语句的执行流程,如果是for语句,则执行continue语句后回到for语句表达式3,而不是条件判断(即for语句的表达式2)。,图5.6cotinue语句的执行流程,注意:continue语句只是不再执行其后循环体语句,转去执行判断循环条件的操作(对于for语句则执行表达式3),并不结束本层循环,完全不同于break语句。认真比较以下两个程序的运行结果,找出产生不同的原因。,【例5-15】把100200之间的不能被3整除的数输出。分析:从100开始,判断此数是否能被3整除,如果能被3整除,则继续寻找;如果不能被3整除,则输出此数。#includestdio.hmain()intn;for(n=100;n=200;n+)if(n%3=0)continue;printf(%d,n);,5.6循环结构程序设计综合应用,【例5-16】求1/2+1/3+1/4+1/5+1/100的值。分析:虽然各个加数值的变化没有规律,但各个加数的分母变化很有规律,可用一个循环变量控制分母的变化,然后将循环变量的值取倒数就变成了本题对应的加数,即s=s+1.0/i。main()inti;floats=0;for(i=2;i=100;i+)s=s+1.0/i;printf(s=%fn,s);思考:在语句s=s+1.0/i;中,如果将1.0改为1,程序的运行结果会不会改变?,【例5-17】输入一个大于2的整数n,判断其是否为素数。分析:素数是除了1和它本身以外,不能被其他数整除的数。设该数为n,可以在2,n-1范围内逐个取数,判断该数是否能被n整除,如果都不能,则n为素数,否则不是素数。因为一个数的因子总是成对出现,显然,如果有因子,一定有一个在n的平方根之前(包括平方根),而另一个一定在n的平方根之后(包括平方根)。判断一个数不是素数,只要找到一个除1和它本身的外因子即可,所以查找范围可缩小到n的平方根之内(包括平方根)。在编写程序时,可用循环在2到n的平方根之内逐个数判断,如果找到一个因子,则提前结束循环,如果找不到因子则按循环条件正常结束循环,因为这两种方法结束循环时,循环控制变量的值不同,所以可以通过检查循环变量的值来确定,程序是否正常结束循环,如果循环是正常结束,则该数为素数,否则该数不是素数。判断一个数是不是n的因子,可用n除以该数取余,如果余数为0则说明该数是n的因子。,程序代码:#includemain()intn,k,i;scanf(%d,思考:如何找出所有三位的素数?,【例5-18】输入两个正整数m和n,求它们的最大公约数和最小公倍数。分析:求最大公约数可用辗转相除法,用大数除以小数,然后将小数作大数,用余数作小数,继续相除,直到余数为0结束,最后一次相除时,小数即为最大公约数。两个数的最小公倍数是两个数的乘积除以这两个数的最大公约数。main()intr,i,j,t;printf(请输入两个整数:);scanf(%d,%d,if(ij)/*确保i为大数,j为小数*/,t=i;i=j;j=t;r=i%j;/*给余数赋初值,准备循环*/while(r!=0)/*辗转相除法,直到余数为0结束循环*/i=j;/*小数变大数*/j=r;/*余数变小数*/r=i%j;printf(最大公约数为:%dn,j);printf(最小公倍数为:%dn,(m*n)/j);思考:如何实现将输入一个分数化为最简形式?,【例5-19】求1-1/2+1/3-1/4+1/5-1/6+-1/100的值。分析:用一个变量专门处理符号位,每处理一个数后,将符号位变量取反,注意符号位变量的初值,它必须与第1个数的符号保持一致。main()inti,t=1;/*变量t作为正负符号标志*/floats=0;for(i=1;i=100;i+)s=s+t*1.0/i;t=-t;/*每次取相反数*/printf(s=%fn,s);思考:如果不用一个变量来处理符号位,该如何修改程序?,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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