《chap4-2 循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《chap4-2 循环结构程序设计.ppt(71页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、4.2.1 while4.2.1 while语句语句4.2.2 do-while4.2.2 do-while语句语句4.2.3 for4.2.3 for语句语句 4.2.4 4.2.4 转移语句转移语句4.2.5 4.2.5 循环的嵌套循环的嵌套4.2.6 4.2.6 循环结构程序设计举例循环结构程序设计举例 4.2 4.2 循环结构程序设计循环结构程序设计循环的概念循环的概念 当当所所要要解解决决的的问问题题存存在在重重复复执执行行内内容容时时,应应该该使使用用循循环环结结构构来来实实现现,具具体体的的设设计计步步骤骤可可归纳如下。归纳如下。(1)构造循环体。)构造循环体。(2)寻找控制循环
2、的变量。)寻找控制循环的变量。(3)找出控制循环的)找出控制循环的3个要素。个要素。循环控制变量的初值。循环控制变量的初值。循环的条件。循环的条件。使循环趋于结束的部分。使循环趋于结束的部分。在在C语言中可以用以下语句来实现循环:语言中可以用以下语句来实现循环:1.用用while语句;语句;2.用用do-while语句;语句;3.用用for语句语句;4.用用goto语句和语句和if语句构成循环;语句构成循环;4.2.1 while语句语句真真(非零非零)表达式表达式 循环体循环体假假(零零)1、while 语句的形式语句的形式:while(表达式表达式)循环体;循环体;2、while 语句语句
3、 常称常称为为“当型当型”循环语句。循环语句。3、说明、说明:先判断表达式,后执行语句。先判断表达式,后执行语句。表达式同表达式同ifif语句后的表达式一样,可以是语句后的表达式一样,可以是任何类型的表达式。任何类型的表达式。循环体多于一句时,用一对循环体多于一句时,用一对 括起括起。whilewhile循环结构常用于循环次数不固定,根循环结构常用于循环次数不固定,根据是否满足某个条件决定循环与否的情况。据是否满足某个条件决定循环与否的情况。例:分析下列程序段的循环次数例:分析下列程序段的循环次数i=1;while(i=100)putchar(*);i+;例:用用whilewhile语句编程实
4、现:计算语句编程实现:计算1+2+3+4+1001+2+3+4+100算法:s1.s1.设一个变量sum用于存放最后的结果,初值为0 s2.s2.设一个循环变量i,初值为1 s3.s3.判断i是否小于等于100,若是执行s4s4;否则程序结束 s4.s4.sum=sum+i s5.s5.i+s6.s6.返回s3s3main()main()intint sum=0,i=1;sum=0,i=1;whilewhilewhilewhile(i(i=100)=100)sum=sum=sum+isum+i;i+;i+;printf(“%d”,sumprintf(“%d”,sum););开始开始intint
5、 sum sum intint i iwhliewhlie(i(i=100)0)printf(+);else printf(-);scanf(%d ,&x);判断正负号判断正负号#include stdio.h void main()char ch;int num=0;ch=getchar();例例:统计从键盘输入的一行字符的个数(以回统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。车键作为输入结束标记)。while(ch!=n)判断是否输入结束判断是否输入结束num+;ch=getchar();printf(num=%dn,num);注意注意表达式在判断前,必须要有明确的值。表达
6、式在判断前,必须要有明确的值。循环体中一般有改变条件表达式的语句。循环体中一般有改变条件表达式的语句。while(while(表达式表达式)后面没有分号。后面没有分号。4.2.2 do-while语句语句1、do-while的形式:的形式:do 循环体;循环体;while(表达式);表达式);2、do-while语句语句 常称常称为为“直到型直到型”循环语句。循环语句。真真(非零非零)表达式表达式 循环体循环体假假(零零)3、说明、说明:先先执行执行语句语句,后判断,后判断表达式表达式。第一次条件为真时,第一次条件为真时,while,do-while等价;等价;第一次条件为假时,二者不同。第一
7、次条件为假时,二者不同。例:用用do-whiledo-while语句编程实现:计算语句编程实现:计算1+2+3+4+1+2+3+4+100+100算法:s1.s1.设一个变量sum用于存放最后的结果,初值为0 s2.s2.设一个循环变量i,初值为1 s3.s3.sum=sum+i s4.s4.i+s5.s5.判断i是否小于等于100,若是重复执行s3s3 s5s5;否则程序结束main()main()intint sum=0,i=1;sum=0,i=1;dodododo sum=sum=sum+isum+i;i+;i+;whilewhilewhilewhile(i(i=100);100);pr
8、intf(“%d”,sumprintf(“%d”,sum););例:用用do-whiledo-while语句编程实现:计算语句编程实现:计算1+2+3+4+1+2+3+4+100+100 开始开始intint sum sum intint i iwhliewhlie(i(i=100)=100)sum=sum+isum=sum+ii+i+结束结束yndodo 例例:用用do-whiledo-while语语句句编编写写程程序序统统计计从从键键盘盘输输入入的的一一行行字符的个数(以回车键作为输入结束标记)。字符的个数(以回车键作为输入结束标记)。#include stdio.hvoid main()
9、char ch;int num=0;ch=getchar();do num+;ch=getchar();while(ch!=n);printf(num=%dn,num);注意注意在在if、while语句中,表达式后面都没有分语句中,表达式后面都没有分号,而在号,而在do-while语句的表达式后面则必语句的表达式后面则必须加分号。须加分号。do-while和和while语句相互替换时,要注意语句相互替换时,要注意修改循环控制条件修改循环控制条件。5.3.3 for语句语句1、for的形式:的形式:for(初始表达式初始表达式1;条件表达式;条件表达式2;循环表达式;循环表达式3)循环体循环体;
10、表表达达式式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+;表达
11、式表达式1 1;while(表达式表达式2)表达式表达式3 3;3、说明说明三个表达式都可以是逗号表达式。三个表达式都可以是逗号表达式。三个表达式都是任选项,都可以省略,但要注三个表达式都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省略。意省略表达式后,分号间隔符不能省略。1、for语句中表达式省略的形式语句中表达式省略的形式(1)for语语句句一一般般形形式式中中的的“表表达达式式1”可可以以省省略;略;如:如:sum=0;i=1;for(;i100)break;sum=sum+i;1、for语句中表达式省略的形式语句中表达式省略的形式(3)表达式)表达式3也可以省略,但此时保
12、证循环也可以省略,但此时保证循环能正常结束如:能正常结束如: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(i100)break;sum=sum+i;i+;相当于相当于(6)循环体为空语句)循环体为空语句 对对for语句,循环体为空语句的一般形式为语句,循环体为空语句的一般形式为:for(表达式表达式1;表达式;表达式2;表达式;
13、表达式3);如:如:for(sum=0,i=1;i=100;sum+=i,i+);1、for语句中表达式省略的形式语句中表达式省略的形式 forfor语句与语句与whilewhile比较比较 例:forfor(i=1;i=10,i+)(i=1;i=10,i+)a=a*i;a=a*i;printf(printf(“%d,%d%d,%d”,a,i,a,i););表达式表达式1 1 while while(表达式表达式2 2)循环语句;循环语句;表达式表达式3 3;for(for(表达式表达式1;1;表达式表达式2;2;表达式表达式3)3)循环语句;循环语句;forfor语句语句whilewhile
14、语句语句 i=1;i=1;while while(i=100)(i=100)a=a*i;a=a*i;printf(printf(“%d,%d%d,%d”,a,i,a,i););i+;i+;(1)在进入累加前先给累加器赋初值(一般为)在进入累加前先给累加器赋初值(一般为0););(2)用循环语句实现累加;)用循环语句实现累加;for(循环变量赋初值;循环条件;循环变量改变规律)循环变量赋初值;循环条件;循环变量改变规律)(3)循环体语句的设计。)循环体语句的设计。累加器当前值累加器当前值=累加器原值累加器原值+循环变量当前值循环变量当前值;典型例题分析例例:求累加和求累加和1+2+3+1+2+3
15、+1000+1000基本方法基本方法:属于属于“累加器累加器”类型问题。类型问题。累加器赋初值累加器赋初值求偶数和求偶数和2+4+6+100参考程序:参考程序:void main()long int k,s;s=0;for(k=1;k=1000;k+)s=s+k;printf(s=%ld,s);累加累加思考思考(1)给累乘器赋初值,一般为)给累乘器赋初值,一般为1;(2)用循环语句实现累乘;)用循环语句实现累乘;for(循环变量赋初值;循环条件;循环变量改变规律)循环变量赋初值;循环条件;循环变量改变规律)(3)循环体设计。)循环体设计。累乘器当前值累乘器当前值=累乘器原值累乘器原值*循环变量
16、当前值;循环变量当前值;例例:求累乘积。求累乘积。如:如:123.100基本方法基本方法:属于属于“累乘器累乘器”类型问题。类型问题。累乘器赋初值累乘器赋初值求求n!=1 2 3 n参考程序:参考程序:void main()double s=1;int k;for(k=1;k=100;k+)s=s*k;printf(s=%lf,s);累乘累乘思考思考整数连乘结果一定整数连乘结果一定是整数,而本例中是整数,而本例中结果数值相当大,结果数值相当大,用用longlong型都无法存型都无法存放,因此将存放累放,因此将存放累乘结果的变量乘结果的变量s s定义定义为为doubledouble型。型。例例:
17、判断一个数是否为素数判断一个数是否为素数?一个数一个数x在在2,sqrt(x)范围内没有因子,范围内没有因子,我们就称其为素数(质数)我们就称其为素数(质数)主要编程方法:循环变量终值法、标记变主要编程方法:循环变量终值法、标记变量法量法#include math.h void main()int x,k;scanf(%d ,&x);排除法:如果有因子,排除法:如果有因子,不再往下判断是否是素不再往下判断是否是素数数循环变量终值法循环变量终值法for(k=2;ksqrt(x)printf(%d is a prime ,x);else printf(%d is not a prime ,x);在
18、判断范围内无因在判断范围内无因子,程序正常终止子,程序正常终止有因子,程序有因子,程序非正常终止非正常终止#include math.h void main()int x,k,f=1;scanf(%d ,&x);排除法:如果有因子,排除法:如果有因子,不再往下判断是否是素不再往下判断是否是素数数for(k=2;k=1;x-)if(x%17=0)break;printf(x=%dn,x);找到满足条件的最找到满足条件的最大数,结束循环大数,结束循环(1)语句形式)语句形式:continue;(2)语句作用)语句作用:结束结束本次循环本次循环。三、三、continue 语句语句(3)语句执行流程)
19、语句执行流程:continuecontinue语句可以结束本次循环,即不再语句可以结束本次循环,即不再执行循环体中执行循环体中continue continue 语句之后的语句,转语句之后的语句,转入下一次循环条件的判断与执行。入下一次循环条件的判断与执行。例:例:求求300300以内能被以内能被1717整除的所有整数。整除的所有整数。#include stdio.hvoid main()int x,k;for(x=1;x=300;x+)if(x%17!=0)continue;printf(%dt,x);while(条件条件)语句语句A;break;语句语句 B;真真语句语句B条件条件语句语句
20、Abreak假假结束循环结束循环breakbreak语句与语句与continuecontinue语句的区别:语句的区别:至此位置至此位置while(条件条件)语句语句A;continue;语句语句 B;真真语句语句B条件条件语句语句Acontinue假假结束循环结束循环至此位置至此位置#include stdio.hvoid main()int a,b;for(a=1,b=1;a=10)break;if(b%3=1)b+=3;continue;printf(%dn,a);例:分析以下程序的运行结果。例:分析以下程序的运行结果。程序运行结果:程序运行结果:4 4 在循环体语句中又包含有另一个完整
21、的循环结构在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。嵌套的循环语句,则构成多重循环。4.2.5 循环的嵌套循环的嵌套嵌套在循环体内的循环体称为内循环,外面的循环嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。称为外循环。while、do-while、for三种循环都可以互相嵌套。三种循环都可以互相嵌套。循环语句之间的关系循环语句之间的关系for(.).for(.).内内循循环环外外循循环环for(.).for(.).并列循环并列循环嵌套循环嵌套循环交叉循环交叉循环for(
22、.).for(.).错误错误真真真真外循环初始条件外循环初始条件内循环初始条件内循环初始条件内循环体内循环体外循环条件外循环条件假假内循环条件内循环条件假假内循环循环条件内循环循环条件外循环循外循环循环条件环条件循环结束循环结束二重二重循环循环嵌套嵌套结构结构执行执行流程流程 例例:输出图形输出图形:*编程分析编程分析:采用双重循环,一行一行输出。采用双重循环,一行一行输出。每一行输出步骤:一般每一行输出步骤:一般3步。步。1)光标定位)光标定位3)每输完一行光标换行)每输完一行光标换行(n)2)输出图形。)输出图形。例如本题:共例如本题:共4行行,若行号用若行号用k表示,表示,则每一行有则每
23、一行有2*k-1个个*号。号。#include stdio.h void main()int k1,k2;for(k1=1;k1=k1;k2-)putchar();for(k2=1;k2=k1*2-1;k2+)putchar(*);putchar(n);定位定位输出输出编程方法:编程方法:“递推法递推法”例:例:裴波那契数列的第裴波那契数列的第1、2项分别为项分别为1、1,以后各项的值均是其前两项之和。求前,以后各项的值均是其前两项之和。求前30项菲波那契数。项菲波那契数。所所谓谓递递推推法法就就是是从从初初值值出出发发,归归纳纳出出新新值值与与旧旧值值间间的的关关系系,直直到到求求出出所所需
24、需值值为为止止。新新值值的的求求出出依依赖赖于于旧旧值值,不不知知道道旧旧值值,无无法法推推导导出出新新值值。数数学学上递推公式正是这一类问题。上递推公式正是这一类问题。4.2.6 循环结构程序设计举例循环结构程序设计举例 f1-第一个数第一个数 f2-第二个数第二个数 f3-第三个数第三个数 f1=1;f2=1;f3=f1+f2;以后只要改变以后只要改变f1,f2的值,即可求出下一个数的值,即可求出下一个数.f1=f2;f2=f3;f3=f1+f2;递推递推void main()long f1=1,f2=1,f3;int k;参考程序参考程序:printf(%ldt%ldt,f1,f2);f
25、or(k=3;k=30;k+)f3=f1+f2;printf(%ldt ,f3);f1=f2;f2=f3;注意注意f1、f2、f3、x 的类型的类型递推递推例:输出例:输出100以内的素数。以内的素数。所谓素数是指只能被所谓素数是指只能被1和其本身整除的数。和其本身整除的数。算法分析:我们先用穷举法来对算法分析:我们先用穷举法来对2100之间所有之间所有的数进行判断。在判断一个数的数进行判断。在判断一个数n是否是素数时,是否是素数时,我们对我们对n用用2n-1逐个去除,若某次可以整除逐个去除,若某次可以整除则说明则说明n不是素数,跳出该层循环。不是素数,跳出该层循环。如果在所如果在所有的数都是
26、未除尽的情况下结束循环,则为素有的数都是未除尽的情况下结束循环,则为素数。程序源代码如下:数。程序源代码如下:main()int n,i;for(n=2;n=100;n+)for(i=2;i=n)printf(t%d,n);例:求解百鸡百钱问题。公元钱五世纪,我国古代数学例:求解百鸡百钱问题。公元钱五世纪,我国古代数学家张丘建在家张丘建在算经算经一书中提出了一书中提出了“百鸡百钱百鸡百钱”问题:问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?买百鸡,问鸡翁、鸡母、鸡雏各几何?算法分析:百鸡百钱问题是典型的穷举法
27、问题。我们设算法分析:百鸡百钱问题是典型的穷举法问题。我们设x,y,z分别为买的鸡翁分别为买的鸡翁,鸡母鸡母,鸡雏的个数,则有鸡雏的个数,则有x+y+z=1005*x+3*y+z/3=100而而x,y可能取数的范围为可能取数的范围为x:020y:033z可以由公式可以由公式z=100-x-y计算出来。计算出来。据此,我们建立一个两重循环,对所有可能的情况进行据此,我们建立一个两重循环,对所有可能的情况进行判别。判别。程序源代码如下:程序源代码如下:#include stdio.hmain()int i,j,k;printf(解百鸡百钱问题解百鸡百钱问题n);for(i=1;i=20;i+)fo
28、r(j=1;j0);0);问最后问最后b b的值为多少?循环了多少次?的值为多少?循环了多少次?b=4 循环2次习题3.3.i=1;a=0;s=1;i=1;a=0;s=1;do a=do a=a+sa+s*i;*i;s=-s;s=-s;i+;i+;while(iwhile(i=10);=10);printf(“aprintf(“a=%=%d”,ad”,a););a=0+1-2+3-4+5-6+7-8+9-10习题4.4.运行以下程序,输入运行以下程序,输入right?right?则下面程序结果为则下面程序结果为?#include include main()main()char c;char
29、c;while(cwhile(c=getchargetchar()!=?)()!=?)putchar(+cputchar(+c););sjhiu习题5.5.5.5.main()main()intint i,j;i,j;for(i=1;i=10;i+)for(i=1;i50)break;50)break;while(awhile(a=14);=14);a=12 y=12a=16 y=28a=16 y=44a=16 y=60/*给a赋值*/7.7.1-1-习题2 21 1+3 31 1+99991 1-1001001 1 用三种做法做for(i=1;i0)t=m%n;m=n;n=t;习题9.9.输
30、入两个整数输入两个整数x x、y y,求求x xy ymain()int x,y,i,mul=1;scanf(“%d,%d”,&x,&y);for(i=1;i=y;i+)mul=mul*x;printf(“%d”,mul);习题10.10.求出求出11001100之间的所有素数之间的所有素数main()int i,j,flag;for(i=2;i=100;i+)flag=1;for(j=2;j=sqrt(i);j+)if(i%j=0)flag=0;break;if(flag=1)printf(“%5d”,i);习题11.11.计算计算1 1!+2+2!+3+3!+100+100!main()i
31、nt i,sum=0,s=1;for(i=1;i=100;i+)sum=sum+s;s=s*i;printf(“%5d”,sum);1、写出程序运行结果、写出程序运行结果:void main()int i,j,x=0;for(i=0;i2;i+)x+;for(j=0;j=3;j+)if(j%2)continue;x+;x+;printf(“x=%dn”,x);运行结果:运行结果:x=8练练 习习 void main()int x=1,y=0,a=0,b=0;switch(x)case 1:switch(y)case 0:a+;break;case 1:b+;break;case 2:a+;b+;break;case 3:a+;b+;printf(“a=%d,b=%dn”,a,b);运行结果运行结果:a=2,b=1