资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,5,章 循环结构,本章关键点,:,5.1 while,语句和用,while,语句组成循环结构,5.2 do-while,语句和用,do-while,语句组成循环结构,5.3 for,语句和用,for,语句组成循环结构,5.4,循环结构嵌套,5.5 break,和,continue,语句在循环体中作用,5.6,程序举例,第1页,5.1.1 while,循环普通形式,由,while,语句组成循环也称“当”循环,,While,语句普通形式为:,While,(表示式),循环语句;,以下是几点说明:,1,while,是,C,语言关键字。,2,while,后表示式,能够是,C,语言中任意正当表示式,通常为关系表示式或逻辑表示式,但也能够是其它运算表示式。当表示式值为零时,表示条件为假;非零时,表示条件为真。,第2页,3,循环体能够是一条简单可执行语句,也能够是复合语句。,4,假如第一次计算时表示式值就为,0,,则循环语句一次也不被执行,流程直接跳过,While,语句,执行下一条语句。,重点提醒:,while,型循环语句中循环体执行次数能够从,0,到无穷。若第一次计算表示式值为,0,,则循环体执行,0,次;若表示式恒为真,则陷入死循环。,第3页,5.1.2 while,循环执行过程,while,循环执行过程是:计算,while,后表示式值,,当值为非零时,执行循环体中语句;,当值为零时,退出,while,循环。,第4页,注意,:,进入,while,循环后,一定要有能使此表示式值变为,0,操作,不然,循环将会无限制进行下去,即进入死循环。在程序设计中,这个是不允许出现。,比如:,计算,1+2+3+100,。,main(),int i,sum=0;,i=1;,while(i100,时,循环条件就不满足,循环到此结束。假如无此语句,则,i,值一直不变,循环永不结束,这就称为“死循环”。在程序设计中,是不允许死循环出现。,重点提醒:,在循环体中应有使循环趋于结束语句。在程序设计中,是不允许死循环出现。,第6页,5.2 do-while,语句和用,do-while,语句组成循环结构,5.2.1 do-while,语句组成循环结构,do-while,是另一个循环结构,它普通形式为:,do,循环语句;,while,(表示式);,第7页,以下是几点说明:,1,do,是,C,语言关键字,必须和,while,联合使用。,2,在,while,(表示式)后分号“;”不可丢,它表示,do-while,语句结束。,3,while,后括号中表示式能够是任意正当表示式,由它来控制循环是否执行。,4,do-while,之间循环体能够是一条可执行语句也能够是由“,”,组成符合语句。,第8页,5.2.2 do-while,循环执行过程,do-while,语句执行过程是,:先执行一次指定循环语句,然后判断表示式值,若表示式值为非,0,,再返回重新执行循环语句,如此重复,直到表示式值为,0,时才跳出循环语句,执行下一条语句;若表示式值为,0,,则不再返回重新执行循环语句,直接退出循环语句,执行下一条语句。如图,5.1,(,b,)所表示。,do while,语句特点是,:先执行语句,后判断表示式值。故,do While,语句又称“直到型”循环结构。因为是先执行后判断,所以,do while,语句循环语句最少被执行一次。,注意,:while,圆括号后面有一个分号“;”,书写时不能丢。,第9页,比如,:用,do while,循环结构来计算,1+2+3+100,。,main(),int i,sum=0;,i=1;,do,sum+=i;,i+;,while(i=100);,printf(dn,sum);,程序运行结果,为:,5050,第10页,能够看出,,,此例结果与上节例程结果是完全相同,也就是说,对同一问题既能够用,while,语句来处理,也可用,do while,语句来处理。在普通情况下,用,while,语句和,do while,语句处理同一问题时,若二者循环体一样,运行结果也就一样。但当,while,后面表示式值一开始就为,0,时,两种循环结构结果是不相同。,重点提醒,:,do-while,语句先执行语句,后判断表示式值。故,do-while,语句又称“直到型”循环结构。因为是先执行后判断,所以,do-while,语句循环语句最少被执行一次。,第11页,5.3 for,语句和用,for,语句组成循环结构,5.3.1 for,语句组成循环结构,for,语句普通形式为:,for,(表示式,1,;表示式,2,;表示式,3,),循环语句;,以下是几点说明:,1,表示式,1,普通为赋值表示式,用于进入循环之前给循环变量赋初值。,2,表示式,2,普通为关系表示式或逻辑表示式,用于执行循环条件判定,它与,while,、,do while,循环中表示式作用完全相同。,3,表示式,3,普通为赋值表示式或自增、自减表示式,用于修改循环变量值。,第12页,for,循环结构是几乎全部高级语言都提供循环控制结构。但,C,语言中,for,语句使用最为灵活,它不但能够用于循环次数已经确定情况,而且能够用于循环次数不确定而只给出循环结束条件情况,因而它完全能够代替,while,语句和,do while,语句。,重点提醒:,表示式,1,、表示式,2,、表示式,3,都必须为,for,语句要求正当表示式。,第13页,for,语句执行过程是:先计算表示式,1,值。再计算表示式,2,值,若其值为真,则执行循环体一次;不然跳转第步。然后计算表示式,3,值。转回上面第步。结束循环,执行,for,语句下面一个语句。,5.3.2 for,循环执行过程,第14页,图,5.2 for,语句执行流程图,重点提醒:,在整个,for,语句中,表示式,1,只计算一次,表示式,2,和表示式,3,则可能计算屡次。循环体可能屡次执行,也可能一次都不执行。,第15页,5.3.3,相关,for,语句说明,(,1,),for,语句普通形式中“表示式,1”,能够省略,即:,for,(;表示式,2,;表示式,3,),循环语句;,但注意省略表示式,1,时,其后分号不能省略。此时,应在,for,语句之前给循环变量赋初值。,(,2,)假如省略表示式,2,,即:,for,(表示式,1,;表示式,3,),循环语句;,则表示表示式,2,值一直为真,循环将无终止地进行下去。比如:,for(i=1;i+),printf(%d,i);,将无限循环输出,1,2,3,4,5,6,第16页,(,3,)假如省略表示式,3,,即:,for,(表示式,1,;表示式,2,;),循环语句;,此时,也将产生一个无穷循环。所以,程序设计者应另外设法确保循环能正常结束,能够将循环变量修改部分(即表示式,3,)放在循环语句中控制。比如:,for(i=1;i=100;),sum+=i;,i+;,上述,for,语句中没有表示式,3,,而是将表示式,3,(,i+,)放在循环语句中,作用相同,都能使用循环正常结束。注意表示式,2,后面分号不能省略。,(,4,)也能够同时省略表示式,1,和表示式,3,,即:,for,(;表示式,2,;),循环语句;,也即省略了循环初值和循环变量修改部分,此时完全等价于,while,语句。,第17页,(,5,)同时省略表示式,1,、表示式,2,和表示式,3,,即:,for,(;),循环语句;,相当于赋循环变量初值,循环控制条件一直为真,不修改循环变量,故循环将无终止地进行下去。,(,6,)在,for,语句中,表示式,1,和表示式,3,不但能够使用简单表示式,也能够,使用逗号表示式,,即包含一个以上简单表示式,中间用逗号间隔。在逗号表示式内按自左至右求解,整个表示式值为其中最右边表示式值。,比如:,for(i=1;i=100;i+,sum=sum+i),相当于,for(i=1;i=100;i+),sum=sum+i;,(,7,)在,for,语句中,表示式普通为关系表示式或逻辑表示式,但也能够是其它表示式(如字符表示式、数值表示式)。,第18页,(,8,),for,语句循环语句能够是空语句。,空语句用来实现延时,即在程序执行中等候一定时间。以下为延时程序,例子,:,for(i=1;i=1000;i+);,注意以上语句最终分号不能省略,它代表一个空语句。,比如:用,for,循环结构来计算,1+2+3+100,。,main(),int i,sum=0;,for(i=1;i=100;i+),sum+=i;,printf(%dn,sum);,程序运行结果为:,5050,第19页,能够看出,此例结果前两例是完全相同。显然,用,for,语句简单、方便。,重点提醒,:,for,语句中表示式能够部分或全部省略,但两个分号不能省略,且三个表示式均省略时,循环将会无限制执行,而形成死循环。,所以,编写程序时,在,for,后面一对圆括号内,应只含有能对循环进行控制表示式,其它操作尽可能放在循环体内完成。,第20页,5.4,循环结构嵌套,1,循环嵌套形式,在一个循环体内又完整地包含了另一个循环,称为循环嵌套。循环嵌套能够是多层,但每一层循环在逻辑上必须是完整。比如以下几个形式二重嵌套。,while,与,while,二重嵌套,第21页,while(),while(),do while,与,do while,二重嵌套,do,do,while();,while();,for,与,for,二重嵌套,for(;),for(;),while,与,while,二重嵌套,第22页,2,关于循环嵌套几点说明,(,1,)三种循环语句不但各自能够嵌套,而且还能够相互嵌套。比如:,while,与,do while,二重嵌套,while(),do,while;,第23页,while,与,for,二重嵌套,while(),for(;),do while,与,for,二重嵌套,do,for(;),while();,第24页,(,2,)使用嵌套时,应注意一个循环结构应完整地嵌套在另一个循环体内,不允许循环体间交叉。比如以下循环结构是不正确:,while(),do,while();,(,3,)除了上述二重嵌套外,还能够有三重嵌套、四重嵌套等多层嵌套。,(,4,)嵌套外循环和内循环循环控制变量不得同名,但并列内、外循环允许有同名循环控制变量。比如以下为正当循环结构:,for(j=1;j=10;j+),for(i=1;i=10;i+),for(i=1;i=10;i+),第25页,3,循环嵌套程序举例,利用双层,for,循环结构打印出,99,乘法表。,main(),int i,j;,for(i=1;i10;i+),printf(%5d,i);,printf(n);,for(i=1;i=46;i+),printf(-);,printf(n);,for(i=1;i10;i+),for(j=1;j=9;j+),printf(%5d,i*j);,printf(n);,程序运行结果为:,1 2 3 4 5 6 7 8 9,-,1 2 3 4 5 6 7 8 9,2 4 6 8 10 12 14 16 18,3 6 9 12 15 18 21 24 27,4 8 12 16 20 24 28 32 36,5 10 15 20 25 30 35 40 45,6 12 18 24 30 36 42 48 54,7 14 21 28 35 42 49 56 63,8 16 24 32 40 48 56 64 72,9 18 27 36 45 54 63 72 81,第26页,(,1,)第,45,行和第,78,行为两个并列,for,循环结构,作用是输出运行结果第,1,行和第,2,行。,(,2,)第,6,行和第,9,行“,printf(n);”,语句作用是输出一行后进行换行处理。,(,3,)第,1014,行为二重嵌套,for,循环结构,作用是打印乘法表,其中第,14,行作用是每次退出内循环之时,即每次输出一行完成后进行换行处理。,重点提醒,:,在循环嵌套中,内嵌第一个,for,循环结束条件和外循环控制变量是相关,而最里面,for,循环循环结束条件是固定不变。,第27页,5.5 break,和,continue,语句在循环体中作用,5.5.1 break,语句,在第四章中我们介绍过,使用,break,语句能够使流程跳出,switch,语句体,在循环结构中,也能够使用,break,语句使流程跳出本层循环体,从而提前结束本层循环。,break,语句普通形式为:,break,;,第28页,关于,break,语句有以下几点说明:,(,1,),break,语句不能用于循环语句和,switch,语句之外任何其它语句中。,(,2,),break,语句只能用于循环体内,不能用在循环语句上。如,for(i=1;i10;break,i+),是不正确。,(,3,),break,语句只能跳出一层循环,即从当前循环层中跳出。假如要跳出多层循环,可使用,goto,语句。,第29页,比如,:设计一个程序,求能同时满足除以,3,余,1,、除以,5,余,3,、除以,7,余,5,、除以,9,余,7,最小正整数。,main(),int i;,for(i=1;i+),if(i%3=1&i%5=3&i%7=5&i%9=7),break;,printf(%dn,i);,程序运行结果为,:,313,因为此题无法确定循环条件和循环次数,所以应采取无限循环配以,break,语句方法。,重点提醒:,当,break,语句出现在循环体中,switch,语句体内时,其作用只是跳出该,switch,语句体,当,break,语句出现在循环体中,但并不在,switch,语句体内时,则在执行,break,后,跳出本层循环。,第30页,5.5.2 continue,语句,1,continue,语句普通形式,continue,语句作用是结束此次循环,即不再执行循环体中,continue,语句之后语句,而是跳转到循环开始处,进行下一次是否执行循环判定。它普通形式为:,continue,;,2,关于,continue,语句几点说明,(,1,),continue,语句只是结束循环结构中此次循环,并非跳出整个循环过程。详细说:对,while,和,dowhile,语句,遇,continue,语句后,转向执行,while,之后圆括号内条件表示式判断;对,for,语句,遇,continue,语句后,转向执行表示式,3,。,(,2,)执行,continue,语句并没有使整个循环终止。,(,3,),continue,语句与,break,语句有本质区分:,continue,语句只是结束此次循环,而不终止整个循环执行;而,break,语句作用则是强制终止整个循环过程。,第31页,3,continue,语句与,break,语句区分,比如:,打印出数字,010,,但跳过(即不输出)数字,5,。,main(),int i;,for(i=0;i=10;i+),if(i=5),continue;,printf(%5d,i);,程序运行结果为:,0 1 2 3 4 6 7 8 9 10,第32页,(,1,)当,i,等于,5,时执行,continue,语句,它作用是终止此次循环,即不再执行,continue,后面语句,故不输出,5,,而是转转向执行,for,语句表示式,3,,继续进行下一轮循环。,(,2,)实际上,在程序中完全能够不用,continue,语句,如本例中能够去掉第,6,、,7,两行,而用下面语句来代替:,if(i!=5),(,3,)假如在本例中将第,7,行“,continue;”,语句,改为“,break;”,语句,则输出结果为:,0 1 2 3 4,能够清楚地看出,break,语句是终止整个循环过程,它与,continue,语句作用是截然不一样。,重点提醒:,当,break,语句出现在循环体中,switch,语句体内时,其作用只是跳出该,switch,语句体,当,break,语句出现在循环体中,但并不在,switch,语句体内时,则在执行,break,后,跳出本层循环。,第33页,5.6,程序举例,例,1,求两个正整数,m,和,n,最大条约数。,例,2,输入两个整数,m,和,n,,求,m,n,范围内全部素数。,例,3,试设计一个程序,将输入数字逆序输出。,例,4,用以下公式求,近似值,直到最终一项绝对值小于,10-4,为止。,/4=1-1/3+1/5-1/7+1/9,第34页,
展开阅读全文