资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,11/7/2009,#,第,章,4,循环结构程序设计,C语言主要提供了4种循环语句,包括while语句、do-while语句、for语句以及if和,goto语句构成的循环。虽然各循环语句的格式不同,关键字不同,对循环条件判断的,先后顺序不同,循环次数是否固定也有所不同,但循环控制是它们的共同点,都是由,循环条件判断和循环体两部分组成,相互之间也可以进行转换。,2,4.1,while循环,4.2,do-while循环,4.3,for循环,目录,CONTENTS,4.4,循环嵌套,4.5,goto语句,4.6,其他循环控制语句,PART,while循环,4.1,4.1while循环,while循环语句的一般形式为:,while(表达式),语句;,/*循环体*/,while循环,5,4.1while循环,圆括号内的表达式是控制表达式,语句是循,环体,循环体可以是一条简单的语句,也可,以是多条语句组成的复合语句(用花括号括,起来)。其执行流程如右图所示。,语句,表达式,非0,0,while循环语句的执行流程,6,4.1while循环,执行该语句时,先计算表达式的值,如果,它为真,则执行循环体;接着再次判定表,达式的值,如果它仍为真,继续执行循环,体,依此类推,直到表达式的值为假结束,循环,执行while语句后的下一条语句。,7,4.1while循环,【例4.1】,计算从1到100的和。,#include,intmain(),inti,sum;,sum=0;,i=1;,while(i100时结束*/,sum=sum+i;,i=i+1;,/*求和,将结果放入sum中*/,/*循环控制变量i加1*/,printf(1+2+3+.+99+100=%d,sum);,return0;,/*输出sum的值*/,8,4.1while循环,程序运行的结果为:,1+2+3+99+100=5050,(1)变量初始化描述要完整、准确。,(2)在循环体中应有使循环趋向于结束的,语句。,注意,9,4.1while循环,【例4.2】,统计从键盘输入一行字符的个数。,#include,intmain(),intn=0;,printf(inputastring:n);,while(getchar()!=n),/*初始化变量n*/,/*输出提示信息*/,/*循环输入字符,当输入回车时结束*/,/*n自加1*/,/*输出n的值*/,n+;,printf(%d,n);,return0;,程序运行的结果为:,inputastring:,abcdef,6,10,4.1while循环,【例4.3】,输出110中各个数的平方。,#include,intmain(),intn=10;,while(n),/*初始化变量*/,/*当n不为0时循环*/,printf(%d,n*n);,n-;,/*输出n*n的值*/,/*n自减1*/,return0;,本例程序将执行10次循环,每执行一次,n值减1。循环体输出表达式n*n的值。程序运行的结果为:,100816449362516941,11,4.1while循环,【例4.4】,使用格里高利公式求的近似值,要求精确到最后一项的绝对值小于10,-4,。,提示,格里高利公式求:/4=1-1/3+1/5-1/7+,#include,#include,intmain(),intdenominator=1,flag=1;,doubleitem=1.0,pi=0;,while(fabs(item)=0.0001),/*初始化变量*/,/*当精度大于0.0001时循环*/,item=flag*1.0/denominator;,pi=pi+item;,flag=-flag;,/*计算每一项*/,/*累加*/,/*取反*/,12,4.1while循环,denominator=denominator+2;/*底数加2*/,pi=pi*4;,printf(pi=%fn,pi);,return0;,/*求pi的值*/,/*输出pi的值*/,本例题while循环将计算精度作为循环执行条件,用flag变量作为正负标记。程序运行的结果为:,pi=3.141793,13,PART,do-while循环,4.2,4.2do-while循环,do-while语句的一般形式为:,do,语句;,/*循环体*/,while(表达式);,do-while循环,15,4.2do-while循环,这个循环与while循环的不同在于:它先执行,循环中的语句,然后再判断表达式是否为真,,如果为真则继续循环;如果为假,则终止循,环。因此,do-while循环至少要执行一次循环,语句。其执行过程如右图所示。,语句,表达式,非0,0,do-while语句的执行流程,16,4.2do-while循环,【例4.5】,求,nn!123.,。,#include,intmain(),inti=1,s=1,n;,printf(pleaseinputn:);,scanf(%d,do,/*定义及初始化变量*/,/*输出提示语*/,/*输入n的值*/,/*开始循环*/,s=s*i;,i+;,/*计算阶乘*/,/*i自加1*/,/*当i=n成立时循环*/,/*输出*/,while(i=n);,printf(%d!=%dn,n,s);,return0;,17,4.2do-while循环,程序运行的结果为:,pleaseinputn:5,5!=120,使用do-while循环语句时,如果循环体中有多条语句,必须采用复合语句的形式。,do-while语句中,条件放在while后面的圆,括号中,并且最后必须加上一个分号,这是,很多初学者容易遗漏的。,注意,18,4.2do-while循环,while语句先进行循环条件的判断,再决定是否执行,循环体;do-while语句则先执行一次循环体,再进行,循环条件的判断决定是否继续循环。do-while语句至,少要执行一次循环体,而while语句在第一次条件判,断不成立时,则一次循环体都不执行。,19,4.2do-while循环,因此,如果用这两种语句描述同一个循环功能时,,当第一次判断循环条件表达式成立时,两种语句的,执行结果完全一致,只有在第一次判断循环条件表,达式不成立时,二者的执行结果才可能出现不同。,因此,在编程时,要注意do-while语句的至少执行一,次循环体的特点。,20,4.2do-while循环,【例4.6】,统计一个整数的位数。,#include,intmain(),intcount=0,number;,printf(Enteranumber:);,scanf(%d,if(number0),/*定义及初始化变量*/,/*输出提示语*/,/*输入整数*/,/*如果输入的为负整数则取反*/,number=-number;,do,number=number/10;,count+;,/*number整除10,即去掉最低位*/,/*位数加1*/,/*number不为0时循环*/,/*输出位数*/,while(number!=0);,printf(Itcontains%ddigits.n,count);,return0;,21,4.2do-while循环,程序运行的结果为:,Enteranumber:456,Itcontains3digits.,22,PART,for循环,4.3,4.3for循环,在C语言中,除了可以用while和do-while语句实现,循环外,还可以用for语句实现循环。其一般形式为:,for(表达式1;表达式2;表达式3),语句;,/*循环体*/,for循环,24,4.3for循环,for循环语句的执行流程,如右图所示。,求解表达式1,1,先求解表达式1。,表达式2,0,2,然后求解表达式2,若其值为真(非0),则执行for,语句中指定的循环语句,然后执行第(3)步;若其,值为假(0),则结束循环,转到第(5)步。,非0,语句,3,求解表达式3。,求解表达式3,4,返回到第(2)步继续执行。,for语句的下一个语句,5,循环结束,执行for语句下面的语句。,for循环语句的执行流程,25,4.3for循环,for语句将控制循环的主要操作集中在循环语句开头的圆括号里。圆括号中的三个表达式的作用是:,表达式1,表达式2,表达式3,通常为关系表达式或逻辑,表达式,用来判断是否继,续循环。在每次执行循环,体前先执行此表达式,决,定是否继续执行循环。,一般被称为“步长”,环变量的修改,该表达式是在,每次循环体执行完以后、下一,次循环条件判断之前执行的,,使循环变量经过多次循环的累,积而发生改变,最终因为不满,足循环条件退出循环。,,用于循,通常为赋值表达式,实现,循环控制变量的初始化,,只执行一次。,26,4.3for循环,【例4.7】,编程计算1到49之内的奇数和。,#include,intmain(),intsum=0,n;,for(n=1;n49时结束,步长为2*/,/*累加*/,/*输出结果*/,sum=sum+n;,printf(sum=%d,sum);,return0;,程序运行的结果为:,sum=625,27,4.3for循环,可将for循环语句改写为如下的while循环形式:,表达式1;,while(表达式2),语句;,表达式3;,例如:,for(i=1;i=100;i+),sum=sum+i;,相当于:,i=1;,while(i=100),sum=sum+i;,i+;,28,4.3for循环,因此,可以将例4.7用while语句进行改写如下:,#include,intmain(),intsum=0,n;,n=1;,while(n49时结束*/,sum=sum+n;,n+=2;,/*累加*/,/*步长为2*/,printf(sum=%d,sum);,return0;,/*输出结果*/,29,4.3for循环,使用for循环语句时,我们必须注意以下几个问题:,for循环中的“表达式,1”“表达式2”和“表达,式3”都是可选项,即,可以缺省,但表达式,之间的分号“;”绝对,不能缺省。,省略“表达式1”,表,示不对循环控制变量,赋初值。,01,02,30,4.3for循环,例如:,省略“表达式2”,表示,不用判断循环条件是否,成立,循环条件总是满,足的,则如果不做其他,处理,便成了死循环。,for(i=1;i+),sum=sum+i;,相当于:,03,i=1;,while(1),sum=sum+i;,i+;,31,4.3for循环,例如:,省略“表达式3”,则不对循环控,制变量进行操作,这时可在循,环体中加入修改循环控制变量,的语句。,for(i=1;i=100;),04,sum=sum+i;,i+;,32,4.3for循环,例如:,for(;),05,省略3个表达式。,相当于:,while(1),33,4.3for循环,表达式1和表达式3可以是,一个简单的表达式,也可,以是逗号表达式,即包含,一个以上的简单表达式,,中间用逗号间隔。,例如:,06,for(i=0,j=100;i=100;i+,jk=i+j;-),34,4.3for循环,【例4.8】,含有逗号表达式的for语句。,#include,intmain(),inti,j;,for(i=1,j=1;i=10|j=1),#includestdio.,很多初学者容易遗漏的。,当用户输入编号14时,显示相应,通常为关系表达式或逻辑,通常为赋值表达式,实现,输入其他编号,显示价格为0。,通常为赋值表达式,实现,编程计算1到49之内的奇数和。,4.4循环嵌套,【例4.10】,打印九九乘法表。,程序可用for循环的嵌套来实现,用外循环控,制被乘数i的变化,用内循环控制乘数j的变化,,内循环的循环体计算i*j并输出结果。外循环的,循环体包括整个内循环及退出内循环后执行,的“printf(n);”语句。,40,4.4循环嵌套,#include,intmain(),inti,j;,for(i=1;i=9;i+),/*定义变量*/,/*外循环控制被乘数*/,for(j=1;j=9;j+),/*内循环控制乘数*/,/*输出结果*/,/*结束一个内循环后输出一个回车*/,printf(%d*%d=%d,i,j,i*j);,printf(n);,return0;,程序运行的结果为:,1*1=11*2=21*3=31*4=41*5=51*6=61*7=71*8=81*9=9,2*1=22*2=42*3=62*4=82*5=102*6=122*7=142*8=162*9=18,9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81,41,4.4循环嵌套,上述程序中,输出了很多多余项,可以通过修改程序去掉这些多余项,具体代码如下:,#include,intmain(),inti,j;,for(i=1;i=9;i+),/*定义变量*/,/*外循环控制被乘数*/,for(j=1;j=1求阶乘*/,loop:if(i=1),result*=i;,i-;,gotoloop;,/*求乘积*/,/*i自减1*/,/*转向loop*/,printf(5!=%dn,result);,return0;,/*输出结果*/,47,4.5goto语句,程序运行的结果为:,5!=120,(1)goto语句的跳转只能在函数内部,不能在不同的函数,之间进行。函数的内容将会在第5章进行介绍,在此对其简,单了解即可。,(2)goto语句在早期编程语言中很常见,但在现在的C语,言编程中却很少用到它了,这是因为它的大量使用会破坏,程序的结构化,使程序的流程控制混乱,可读性降低,调,试困难。,提示,48,PART,其他循环控制语句,4.6,4.6其他循环控制语句,4.6.1break语句,在几种循环结构中,主要是在循环次数不能预先确定,的情况下使用break语句,在循环体中增加一个分支,结构,当某个条件成立时,由break语句退出循环体,,从而结束循环过程。其一般形式为:,break;,50,4.6其他循环控制语句,4.6.1break语句,【例4.12】,求300以内能被19整除的最大数。,#include,intmain(),intx;,for(x=300;x=1;x-),/*循环*/,if(x%19=0)break;,/*当x能被19整除时跳出循环*/,/*输出x的值*/,printf(x=%dn,x);,return0;,在for语句中,当x能被19整除时,执行语句“break;”结束for循环语句;否则,进入下一次,循环。程序运行结果为:,x=285,51,4.6其他循环控制语句,4.6.1break语句,(1)break语句不能用于循环语句和switch,语句之外的其他语句。,提示,(2)在多重循环的情况下,使用break语,句时,仅退出包含break语句的那层循环体。,52,4.6其他循环控制语句,4.6.1break语句,【例4.13】,假设自动售货机出售4种商品,薯片、爆米花、巧克力和可乐,售价分别是每份3.0,2.5,,4.0和3.5元。在屏幕上显示以下菜单,用户可以连续查询商品的价格,当查询次数超过5次,时,自动退出查询;不到5次时,用户可以选择退出。当用户输入编号14时,显示相应,商品的价格;输入0,退出查询;输入其他编号,显示价格为0。,1Selectcrisps,2Selectpopcorn,3Selectchocolate,4Selectcola,0Exit,53,4.6其他循环控制语句,4.6.1break语句,#include,intmain(),intchoice,i;,doubleprice;,for(i=1;i=5;i+),/*定义变量*/,/*循环5次*/,printf(1Selectcrispsn);,printf(2Selectpopcornn);,printf(3Selectchocolaten);,printf(4Selectcolan);,printf(0Exitn);,printf(Enterchoice:);,scanf(%d,if(choice=0)break;,/*输出提示信息*/,/*输入数据*/,/*当输入为0时跳出循环*/,54,4.6其他循环控制语句,4.6.1break语句,switch(choice),/*根据输入的数值决定price的取值*/,case1:price=3.0;break;,case2:price=2.5;break;,case3:price=4.0;break;,case4:price=3.5;break;,default:price=0.0;break;,printf(price=%0.1fn,price);,/*输出price的值*/,printf(Thanksn);,return0;,/*输出提示信息*/,55,4.6其他循环控制语句,4.6.1break语句,程序运行的结果为:,1Selectcrisps,2Selectpopcorn,3Selectchocolate,4Selectcola,0Exit,Enterchoice:1,price=3.0,1Selectcrisps,2Selectpopcorn,3Selectchocolate,4Selectcola,0Exit,Enterchoice:0,Thanks,56,4.6其他循环控制语句,4.6.1break语句,【例4.14】,输入10个字符,分别统计出其中空格或回车、数字和其他字符的个数。,#include,intmain(),intblank=0,digit=0,i,other=0;,charch;,printf(Enter10characters:);,for(i=1;i=10;i+),/*初始化变量*/,/*输出提示信息*/,/*循环10次*/,/*输入一个字符*/,/*判断字符*/,ch=getchar();,switch(ch),case:,casen:blank+;break;,case0:case1:case2:case3:case4:,case5:case6:case7:case8:case9:digit+;break;,/*如果为空格或回车,blank自加1*/,/*计算数字的个数*/,57,4.6其他循环控制语句,4.6.1break语句,default:other+;break;,/*计算其他字符的个数*/,printf(blank=%d,digit=%d,other=%dn,blank,digit,other);/*输出结果*/,return0;,程序运行的结果为:,Enter10characters:qwe123qw3,blank=1,digit=4,other=5,58,4.6其他循环控制语句,4.6.2continue语句,有时并不希望终止整个循环的操作,只希望提前结束本次,循环,而接着执行下次循环。这时可以用continue语句,其,一般形式为:,continue;,作用是结束本次循环,即跳过循环体中continue语句后面的,语句,开始下一次循环。,59,4.6其他循环控制语句,4.6.2continue语句,(1)continue语句只能出现在while、do-,while和for循环语句的循环体中。,(2)若执行while或do-while语句中的,continue语句,则跳过循环体中continue语,句后面的语句,直接转去判别下次循环控制,条件;若continue语句出现在for语句中,则,执行continue语句就是跳过循环体中,continue语句后面的语句,转而执行for语句,的表达式3。,提示,60,4.6其他循环控制语句,4.6.2continue语句,在循环结构中,continue语句通常与if语句一起使用,用来加速循环。,【例4.15】,输出0100之间能被7整除的数。,#include,intmain(),intn;,for(n=0;n100时退出循环*/,if(n%7!=0),/*如果n不能被7整除则退出本次循环*/,continue;,printf(%d,n);,/*输出n的值*/,return0;,61,4.6其他循环控制语句,4.6.2continue语句,for循环语句中,首先判断n能否被7整除,如果不能则结束本,次循环,开始下一次循环,如果n能够被7整除,则输出n。程,序执行的结果为:,0714212835424956637077849198,62,4.6其他循环控制语句,4.6.2continue语句,在循环结构中使用break语句和continue语句通常是,和选择结构一起使用的,,break语句作用是提前结束循环,转向执行循环体,外的语句;,而continue语句的作用是提前结束本次循环,转去,判断是否继续进行下一次循环。,灵活运用这两种语句在解决某些问题时可以减少循环,的次数,提高程序的运行速度。,63,感谢观看,
展开阅读全文