《循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《循环结构程序设计.ppt(39页珍藏版)》请在优知文库上搜索。
1、2023-3-241第第5 5章章 循环结构程序设计循环结构程序设计学习目标学习目标理解循环结构的概念。掌握如何用while语句构成循环结构。掌握如何用do-while语句构成循环结构。熟练掌握如何用for语句构成循环结构。掌握循环结构的嵌套使用。理解break和continue语句应用于循环体。2023-3-242n引言引言l循环循环体l循环结构的构成: 用while语句 用do-while语句 用for语句 用if语句和goto语句(非结构化,不提倡) 此外,在结构化循环语句的循环体中还可以包含break和continue语句2023-3-243nwhile语句语句lwhile语句格式:
2、while (条件表达式条件表达式) SlS是循环体,往往是一个复合语句l当条件满足则继续循环l特点是: 先判断后执行l特殊情况:开始时条件不满足就不进入循环;条件永远满足则永远循环(死循环)2023-3-244真真(非零非零)表达式表达式 循环体循环体假假(零零)while语句流程图语句流程图2023-3-245S1:定义初始化变量。:定义初始化变量。 本程序需要三个变量,一个用来输入整数的本程序需要三个变量,一个用来输入整数的n,一个一个i 用来表示求阶乘过程中数据从用来表示求阶乘过程中数据从1到到n的变的变化,还有一个化,还有一个fac用来保存计算阶乘的结果用来保存计算阶乘的结果S2:输
3、入:输入n,需要考虑输入数据的合法性,需要考虑输入数据的合法性S3:计算:计算n! ,就是一个循环累乘求积的过程,就是一个循环累乘求积的过程 n!= 1*2* 3* . (n - 1)* n【例5-1】用while语句求n!2023-3-246#include stdio.hvoid main ( ) int n, i=1; long fac; printf(input an integer:); scanf(%d,&n) ; while(i0) printf( + ); /* 判断正负判断正负 */ else printf( - ); scanf(%f, &x); /* 继续输入继续输入 *
4、/ 输入: 1.2 7 -3.5 9 0 输出: + + - +【例】输入一系列实数,判断其正负,当输入零时结束循环。2023-3-248#include stdio.h while(ch!=n) num+; ch=getchar(); printf(num=%dn, num); 输入: abcd 输出: num=4【例】统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)2023-3-249ndo-while语句语句ldo-while语句格式: do S while (条件表达式条件表达式)l当条件满足则继续循环l特点是: 先执行后判断l至少循环一次l特殊情况:条件永远满足则死循环20
5、23-3-2410do-while语句流程图语句流程图真真(非零非零)表达式表达式 循环体循环体假假(零零)2023-3-2411 void main ( ) int n, i=1; long fac; scanf(%d,&n) ; do fac*=i; i+; while(i=n) printf(%d!=%ldn, n, fac); /* 此例改用后面的此例改用后面的for循环语句更合理循环语句更合理 */ 输入: 5 输出: 5!=60【例5-2】用do-while语句求n!2023-3-2412【例】输入一系列整数求和,直到输入的整数是零为止。 void main() int n, s=
6、0; /*累加器初始化累加器初始化*/ do scanf(%d, &n); s=s+n; /*累加器求和累加器求和*/ while (n!=0); printf(s=%dn, s); 输入: 8 6 4 2 0 9 7 输出: s=202023-3-2413【例】用二分法求下面方程在0, 1的近似解 x3+1.1x2+0.9x-1.4=0 令令f(x)= x3+1.1x2+0.9x-1.4 。因。因f(0)0,且且f (x)0(x0,1),故,故f(x) 为单调递增函数,故在为单调递增函数,故在 0, 1间方程有一根。又间方程有一根。又f (x) 0(x0,1),得下图,得下图 设设a=0,b
7、=1,为两端点,为两端点, 循环做:求循环做:求a与与b的中点送的中点送x, 判断若判断若f(x)0, 则则b=x,即产生新右端点;,即产生新右端点; 否则否则a=x,即产生新左端点;,即产生新左端点; 经多次循环后,得到的经多次循环后,得到的x即为所求。即为所求。o1xy2023-3-2414void main( )float a=0.0, b=1.0, x; do x=(a+b)/2; if (f(x)0.0) b=x; else a=x; while (fabs(f(x)1e-6); printf(x=%fn, x);程序如下:程序如下:#includemath.h#includestd
8、io.hfloat f(float x) return(x*x*x+1.1 *x*x+0.9*x-1.4); 输出: x=0.6706572023-3-2415nfor语句语句lfor语句格式: for (表达式表达式1;表达式;表达式2;表达式;表达式3) S 先计算初始化表达式1 若条件表达式2为真则执行S,否则结束循环 执行S之后,计算修正表达式3 重新执行 循环结束则执行for之后的语句初始化表达式条件表达式修正表达式2023-3-2416for语句流程图语句流程图计算计算表达式表达式3 3计算表达式计算表达式1 1循环体循环体判断表达式判断表达式2 2假假真真forfor的下一条语句
9、的下一条语句2023-3-2417【例】用for语句改写【例5-1 】 for(fac=1,i=1; i=n; i+) fac*=i; 它相当于以下语句: fac=1;i=1; /* 相当于表达式相当于表达式1 */ while (i=n) /* 相当于表达式相当于表达式2 */ fac*=i; i+; /* 相当于表达式相当于表达式3 */ 2023-3-2418【例】求1!+2!+3!+20! #include stdio.h void main() int i; float s=0., t=1.; for(i=1; i=20; i+) t*=i; s+=t; printf(1!+2!+3
10、!+20!=%-20.0fn, s); 输出:1!+2!+3!+20!=25613274551890739202023-3-2419【例】求和:1-1/2+1/3-1/4+-1/100 void main() float sum, t; int sign=1, i; /* sign为正负为正负1 */ for(i=1,sum=0; i=100; i+) t=sign*1./i; sum+=t; sign=-sign; printf(sum=%fn,sum); 输出: sum=0.6881722023-3-2420 for语句中表达式省略的几种情况:语句中表达式省略的几种情况:(1 1)forf
11、or语句一般形式中的语句一般形式中的“表达式表达式1”1”可以省略可以省略 如:如:fac=1; i=1; for ( ; in) break; fac*=i; 2023-3-2421(3 3)表达式)表达式3 3也可以省略,同样,此时循环体中要也可以省略,同样,此时循环体中要保证循环能正常结束保证循环能正常结束 如:如: for(fac=1,i=1;i=n;) fac*=i; i+; (4) (4) 可以省略表达式可以省略表达式1 1和表达式和表达式3 3,只有表达式,只有表达式2 2 如:如:fac=1; i=1; for (;in) break; fac*=i; i+; (6 6)循环体
12、可以是空语句)循环体可以是空语句 如:如:for(fac=1,i=1; in) break; fac*=i; i+; 2023-3-2423ncontinue语句的使用语句的使用2023-3-2424nbreak语句的使用语句的使用lbreak语句只能使用在循环体和switch语句内l用break语句可以使程序执行流程跳出switch语句体, 从而构成多分支选择结构lbreak出现在循环体中时,用于结束当前循环,跳出break所在的循环结构lbreak语句是完全从循环中跳出,而continue语句只结束本次循环2023-3-2425【例5-3】找出1100之间的前10个偶数 void main
13、() int n=0, count=0; while(n100) n+; if(count=10) break; /*判断是否满判断是否满10个个*/ if(n%2!=0) /*判断是否奇数判断是否奇数*/ continue; /*若是奇数则重新循环若是奇数则重新循环*/ printf(%d ,n); /*打印偶数打印偶数*/ count+; /*统计偶数个数统计偶数个数*/ /* 此例改用此例改用for循环语句更合理循环语句更合理 */ 输出: 2 4 6 8 10 12 14 16 18 202023-3-2426【例】输入10个正整数(非正整数则无效)求和 void main() int
14、 a, i=0, s=0; for ( ; ; ) /* 用用for(i=s=0; ;)更合理更合理 */ scanf(%d, &a); if (a=0) continue; i+; s+=a; /* i是计数器是计数器 */ if (i=10) break; printf(sum=%dn, s); 输入: 1 2 3 -1 4 5 6 -2 -4 7 8 9 10 输出: sum=552023-3-2427n循环的嵌套循环的嵌套l一个循环体内又包含另一个循环语句,称为循环的嵌套l循环可以多重嵌套,如两重循环、三重循环、甚至四重循环l三种不同循环语句可以互相嵌套l执行时,整个内循环循环完后外循
15、环才前进一步,内循环又从头循环l循环中若执行break,则只能跳出该层循环2023-3-2428循环嵌套时正确和错误的逻辑关系循环嵌套时正确和错误的逻辑关系 for(.).for(.).内循环内循环外循环外循环for(.).for(.).并列循环并列循环嵌套循环嵌套循环交叉循环交叉循环for(.). for(.) . 错误!错误!交叉循环交叉循环2023-3-2429【例】输出由数字1、2、3、4、5组成的所有不重复数码的三位十进制整数#includestdio.h if(i!=j&j!=k&k!=i) void main() t=i*100+j*10+k; int i, j, k, t; p
16、rintf(%dt,t); for(i=1;i=5;i+) for(j=1;j=5;j+) printf(n); for(k=1;k=5;k+) /* 共得到共得到60个数个数 */2023-3-2430【例5-4】打印九九乘法表 输出: 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 2023-3-2431【例5-6】判断一个正整数是否为素数void main() int x,k; int flag=1; /* 设立标志设立标志 */ scanf(%d, &x); for(k=2;kx-1;k+) if(x%k=0) flag=0; break; if(flag) printf(%d is a prime.n , x); else printf(%d is not a prime.n , x); 输入: 6 输出: 6 is not a prime.n应用举例应用举例2023-3-2432【例5-7】求Fibonacci序列前n个数 1,1,2,3,5,8,13,21 其规律为: f1=f2=1 fn=fn-1+fn-2 用循环移位算法: 其循环体为: f1