您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > 4.2 循环结构程序设计
4.2.1while语句4.2.2do-while语句4.2.3for语句4.2.4转移语句4.2.5循环的嵌套4.2.6循环结构程序设计举例4.2循环结构程序设计循环的概念当所要解决的问题存在重复执行内容时,应该使用循环结构来实现,具体的设计步骤可归纳如下。(1)构造循环体。(2)寻找控制循环的变量。(3)找出控制循环的3个要素。循环控制变量的初值。循环的条件。使循环趋于结束的部分。在C语言中可以用以下语句来实现循环:1.用while语句;2.用do--while语句;3.用for语句;4.用goto语句和if语句构成循环;4.2.1while语句真(非零)表达式循环体假(零)1、while语句的形式:while(表达式)循环体;2、while语句常称为“当型”循环语句。3、说明:先判断表达式,后执行语句。表达式同if语句后的表达式一样,可以是任何类型的表达式。循环体多于一句时,用一对{}括起。while循环结构常用于循环次数不固定,根据是否满足某个条件决定循环与否的情况。例:分析下列程序段的循环次数i=1;while(i=100)putchar(‘*’);i++;#includestdio.hvoidmain(){intx;scanf(%d,&x);例:输入一系列整数,判断其正负号,当输入0时,结束循环。输入数据,为第一次判断做准备while(x!=0)判断是否结束{if(x0)printf(+);elseprintf(-);scanf(%d,&x);}}判断正负号#includestdio.hvoidmain(){charch;intnum=0;ch=getchar();例:统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。while(ch!='\n')判断是否输入结束{num++;ch=getchar();}printf(num=%d\n,num);}注意表达式在判断前,必须要有明确的值。循环体中一般有改变条件表达式的语句。while(表达式)后面没有分号。4.2.2do--while语句1、do--while的形式:do{循环体;}while(表达式);2、do--while语句常称为“直到型”循环语句。真(非零)表达式循环体假(零)3、说明:先执行语句,后判断表达式。第一次条件为真时,while,do-while等价;第一次条件为假时,二者不同。例:用do-while语句编写程序统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。#includestdio.hvoidmain(){charch;intnum=0;ch=getchar();do{num++;ch=getchar();}while(ch!='\n');printf(num=%d\n,num);}注意在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。do-while和while语句相互替换时,要注意修改循环控制条件。5.3.3for语句1、for的形式:for(初始表达式1;条件表达式2;循环表达式3){循环体;}表达式1:用于循环开始前为循环变量设置初始值。表达式2:控制循环执行的条件,决定循环次数。表达式3:循环控制变量修改表达式。循环体语句:被重复执行的语句。表达式3计算表达式1循环体判断表达式2零非零for的下一条语句2、执行过程for(i=1;i=100;i++)sum=sum+i;例如:它相当于以下语句:i=1;while(i=100){sum=sum+i;i++;}表达式1;while(表达式2)表达式3;3、说明三个表达式都可以是逗号表达式。三个表达式都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省略。1、for语句中表达式省略的形式(1)for语句一般形式中的“表达式1”可以省略;如:sum=0;i=1;for(;i=100;i++)sum=sum+i;1、for语句中表达式省略的形式(2)表达式2省略,即不判断循环条件,循环无终止地进行下去;如:for(sum=0,i=1;;i++){if(i100)break;sum=sum+i;}1、for语句中表达式省略的形式(3)表达式3也可以省略,但此时保证循环能正常结束如:for(sum=0,i=1;i=100;){sum=sum+i;i++;}(4)可以省略表达式1和表达式3,只有表达式2,如:i=1;sum=0;for(;i=100;){sum=sum+i;i++;}1、for语句中表达式省略的形式i=1;sum=0;while(i=100){sum=sum+i;i++;}相当于while(1)循环体;即不设初值,不判断条件,循环变量不增值。无终止地执行循环体。(5)三个表达式都可省略,如for(;;)循环体;1、for语句中表达式省略的形式如:sum=0,i=1;for(;;){if(i100)break;sum=sum+i;i++;}相当于(6)循环体为空语句对for语句,循环体为空语句的一般形式为:for(表达式1;表达式2;表达式3);如:for(sum=0,i=1;i=100;sum+=i,i++);1、for语句中表达式省略的形式(1)在进入累加前先给累加器赋初值(一般为0);(2)用循环语句实现累加;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体语句的设计。累加器当前值=累加器原值+循环变量当前值;典型例题分析例:求累加和1+2+3+…+1000基本方法:属于“累加器”类型问题。累加器赋初值求偶数和2+4+6+…+100参考程序:voidmain(){longintk,s;s=0;for(k=1;k=1000;k++)s=s+k;printf(s=%ld,s);}累加思考(1)给累乘器赋初值,一般为1;(2)用循环语句实现累乘;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体设计。累乘器当前值=累乘器原值*循环变量当前值;例:求累乘积。如:1×2×3×...×100基本方法:属于“累乘器”类型问题。累乘器赋初值求n!=1×2×3×…n参考程序:voidmain(){doubles=1;intk;for(k=1;k=100;k++)s=s*k;printf(s=%lf,s);}累乘思考整数连乘结果一定是整数,而本例中结果数值相当大,用long型都无法存放,因此将存放累乘结果的变量s定义为double型。例:判断一个数是否为素数?一个数x在[2,sqrt(x)]范围内没有因子,我们就称其为素数(质数)主要编程方法:循环变量终值法、标记变量法#includemath.hvoidmain(){intx,k;scanf(%d,&x);排除法:如果有因子,不再往下判断是否是素数循环变量终值法for(k=2;k=sqrt(x);k++)if(x%k==0)break;if(ksqrt(x))printf(%disaprime,x);elseprintf(%disnotaprime,x);}在判断范围内无因子,程序正常终止有因子,程序非正常终止#includemath.hvoidmain(){intx,k,f=1;scanf(%d,&x);排除法:如果有因子,不再往下判断是否是素数for(k=2;k=sqrt(x);k++)if(x%k==0){f=0;break;}if(f==1)printf(%disaprime,x);elseprintf(%disnotaprime,x);}在判断范围内无因子,程序正常终止有因子,程序非正常终止标记变量法4.2.4转移语句1、语句形式:goto语句标号;例如:gotolabel;……label:…...语句标号用标识符表示,它的定名规则与变量名相同。一、goto语句2、语句执行流程:在程序执行过程中,如果遇到goto语句,则程序执行流程无条件地转向语句标号后的语句继续执行。3、说明语句标号仅仅对goto语句有效,对其它语句不影响。同一个程序中,不允许有同名标号。goto语句通常与条件语句配合使用。可用来实现条件转移、构成循环、跳出循环体等功能例:分析下面程序的运行结果:#includestdio.hvoidmain(){charc;loop:c=getchar();if(c=='\n')gotoend;putchar(c);gotoloop;end:printf(Theend\n);}程序运行情况为:123asd↙123asdTheend二、break语句(1)语句形式:break;(2)作用:结束break所在的switch语句。结束当前循环,跳出break所在的循环结构。例:求300以内能被17整除的最大的数。#includestdio.hvoidmain(){intx,k;for(x=300;x=1;x--)if(x%17==0)break;printf(x=%d\n,x);}找到满足条件的最大数,结束循环(1)语句形式:continue;(2)语句作用:结束本次循环。三、continue语句(3)语句执行流程:continue语句可以结束本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断与执行。例:求300以内能被17整除的所有整数。#includestdio.hvoidmain(){intx,k;for(x=1;x=300;x++){if(x%17!=0)continue;printf(%d\t,x);}}while(条件){语句A;break;语句B;}真语句B条件语句Abreak假结束循环break语句与continue语句的区别:至此位置while(条件){语句A;continue;语句B;}真语句B条件语句Acontinue假结束循环至此位置#includestdio.hvoidmain(){inta,b;for(a=1,b=1;a=10;a++){if(b=10)break;if(b%3==1){b+=3;continue;}}printf(%d\n,a);}例:分析以下程序的运行结果。程序运行结果:4在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。4.2.5循环的嵌套嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。while、do-while、for三种循环都可以互相嵌套。循环语句之间的关系for(...){...for(...){...}...}内循环外循环for(....){...}for(...){...}并列循环嵌套循环交叉循环for(....){...for(...){...}}错误真真外循环初始条件内循环初始条件内循环体外循环条件假内循环条件假内循环循环条件外循环循环条件循环结束二重循环嵌套结构执行流程例:输出图形:****************编程分析:采用双重循环,一行一行输出。每一行输出步骤:一般3步。1)光标定位3)每输完一行光标换行(\n)2)输出图形。例如本题:共4行,若行号用k表示,则每一行有2*k-1个*号。#includestdio.hvoidmain(){intk1,k2;for(k1=1;k1=4;k1++){for(k2=4-k1;k2=k1;k2--)putchar(‘’);for(k2=1;k2=k1*2-1;k2++)putchar(‘*’);putchar(‘\n’);}}定位输出编程方法:“递推法”例:裴波那契数列的第1、2项分别为1、1,以后各项的值均是其前两项之和。求前30项菲波那契数。所谓递推法就是从初值出发,归纳出新值与旧值间的关系,直到求出所需值为止。新值的求出依赖于旧值,不知道旧值,无法推导出新值。数学上递推公式正是这一类问题。4.2.6循环结构程序设计举例f1--第一个数f2--第二个数f3--第三个数f1=1;f2=1;f3=f1+f2;以后只要改变f1,f2的值,即可求出下
本文标题:4.2 循环结构程序设计
链接地址:https://www.777doc.com/doc-3123092 .html