第7章循环结构程序设计

上传人:cl****1 文档编号:569483627 上传时间:2024-07-29 格式:PPT 页数:49 大小:312KB
返回 下载 相关 举报
第7章循环结构程序设计_第1页
第1页 / 共49页
第7章循环结构程序设计_第2页
第2页 / 共49页
第7章循环结构程序设计_第3页
第3页 / 共49页
第7章循环结构程序设计_第4页
第4页 / 共49页
第7章循环结构程序设计_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《第7章循环结构程序设计》由会员分享,可在线阅读,更多相关《第7章循环结构程序设计(49页珍藏版)》请在金锄头文库上搜索。

1、 教学内容:教学内容: 7.1 7.1 gotogoto语句语句 7.2 7.2 while while 语句语句 7.3 7.3 do-while do-while 语句语句 7.4 7.4 for for 语句语句 7.5 7.5 breakbreak和和 continue continue 语句语句 7.6 7.6 循环的嵌套循环的嵌套 7.7 7.7 循环结构程序举例循环结构程序举例 教学要求:教学要求: 1.1.掌握掌握whilewhile、do_whiledo_while、forfor语句的语法和使用方法。语句的语法和使用方法。 2. 2.掌握掌握breakbreak和和count

2、inuecountinue语句使用方法。语句使用方法。 3. 3.掌握循环嵌套及多重循环的程序设计。掌握循环嵌套及多重循环的程序设计。 第第7 7章章 循环结构程序设计循环结构程序设计 循环结构程序循环结构程序程序中使用的这种重复执行结构,称为循环结构。程序中使用的这种重复执行结构,称为循环结构。 C语言提供了循环语句来实现,以简化、并规范循环语言提供了循环语句来实现,以简化、并规范循环结构程序设计。结构程序设计。C语言提供的循环语句有以下几种:语言提供的循环语句有以下几种:(1)用)用 goto 语句和语句和 if 语句构成循环。语句构成循环。(2)用)用 while 循环语句。循环语句。

3、(3)用)用 for 循环语句。循环语句。(4)用)用 do-while 循环语句。循环语句。1.语句格式:语句格式:goto 语句标号;语句标号;2.语句功能:使系统转向标号所在的语句行执行。标语句功能:使系统转向标号所在的语句行执行。标号的命名遵循标识符命名规则。号的命名遵循标识符命名规则。3.goto语句说明语句说明: (1 1)语语句句标标号号符符合合标标识识符符定定义义规规则则, 放放在在某某一一语语句句行行的的前前面面,标标号号后后加加冒冒号号( (:) )。语语句句标标号号起起标标识识语语句句的作用,与的作用,与goto goto 语句配合使用。语句配合使用。例如例如: labe

4、l: a+; loop: while(x7); 7.1 7.1 goto goto 语语 句句 (2 2)语言不限制程序中使用标号的次数,但各标号语言不限制程序中使用标号的次数,但各标号不得重名。不得重名。 (3 3)gotogoto语句通常与语句通常与ifif条件语句配合使用。可用来实条件语句配合使用。可用来实现条件转移,构成循环,跳出循环体等功能。现条件转移,构成循环,跳出循环体等功能。 使用使用gotogoto语句构成循环的一般形式:语句构成循环的一般形式: 语句标号语句标号: : 语句或语句组语句或语句组 if ( if ( 条件条件 ) ) goto goto 语句标号语句标号; ;

5、 (4 4)在在结结构构化化程程序序设设计计中中一一般般不不主主张张使使用用gotogoto语语句句, 以以免免造造成成程程序序流流程程的的混混乱乱,使使理理解解和和调调试试程程序序都都产产生生困困难。难。 main ( ) int sum=0, i=1; loop: sum=sum+i; i + +; if (i=100) goto loop ; printf (sum=%d , sum) ; 例例 7.1 求求1100 的累计和的累计和 例例7.2求求2536之间所有偶数的累计和之间所有偶数的累计和 #include main() int n, sum ;n=26; sum=0;loop:

6、 if (n38) sum=sum+n; n=n+2 ; goto loop; printf(sum=%d,sum); 重复执行的语句重复执行的语句累加累加求下一求下一次要加的数值次要加的数值例例7.3 统计从键盘输入一行字符的个数。统计从键盘输入一行字符的个数。#includestdio.hmain() int n=0; printf(input a stringn); loop: if(getchar()!=n) n+; goto loop; printf(%d,n); (1)语句格式)语句格式: while ( 循环条件循环条件 ) 语句语句 (2)执行过程)执行过程: 求解求解“循环条

7、件循环条件”表达式。如果其值为非表达式。如果其值为非0值,则值,则做做执行循环体语句;否则转执行循环体语句;否则转 。 执行循环体语句,然后转执行循环体语句,然后转 。 执行执行 while 语句的下一条。语句的下一条。说明:说明:循环体如包括有一个以上的语句,则必须用循环体如包括有一个以上的语句,则必须用 括起来,括起来, 组成复合语句。组成复合语句。 7.2 7.2 while while 语语 句句(3 3)流程图)流程图: :表达式表达式 循环体语句循环体语句0=0 下一语句下一语句 当表达式成立当表达式成立 执行循环体执行循环体 语句语句执行后继语句执行后继语句 N-S N-S 图图

8、 例 7.4 用用 while 语语句句求求解解1100累计和累计和。main( ) int i =0, sum=0; while ( i=100 ) sum=sum+i; i+; printf(“%d”, sum);程序运行情况如下程序运行情况如下: sum=5050可改写成可改写成i101循环循环条件条件循环体循环体语句语句例 7.5 while 语句语句表达式一般是关系表达或表达式一般是关系表达或逻辑表达式,表达式,也可以是其它也可以是其它表达式表达式,只要表达式的只要表达式的值为非非0值,值,即可即可继续循循环。 main() int a=0,n; printf(n input n:

9、); scanf(%d,&n); while (n- -) printf(%d ,a+*2); 例例 7.6应用应用while循环循环 :求:求 n!#include main() int i, n; long s; s=1; i=1; scanf (%d,&n); if (n=0) while (i=n) s=s*i; i+; printf(%d!=%ld,n,s); elseprintf(Invalid input:); if (n0) printf(“please enter a integer n:”); scanf(“%d”,&n);分支语句中包含分支语句中包含while循环语句循环

10、语句1直到型循环语句直到型循环语句一般格式一般格式 do 语句语句 while( 表达式表达式 );2语句功能:句功能:先执行循环体语句,先执行循环体语句, 再判别表达式的值,若表达式的再判别表达式的值,若表达式的值为真值为真(T)时则继续循环,直到表达式的值为假时则继续循环,直到表达式的值为假(F)时时才终止循环,执行才终止循环,执行while语句后面的语句。语句后面的语句。 。do-whiledo-while循环语句的特点是循环语句的特点是:先执行循环体语句组,:先执行循环体语句组,然后再判断循环条件。然后再判断循环条件。本行的分号不本行的分号不能缺省能缺省 7.3 7.3 do whil

11、e do while 语语 句句例例7.7 用用do-while语句求解语句求解1100的累计和。的累计和。 main() int i=1, s=0; do s += i; i+; while(i=100);/*循环条件循环条件*/ printf(“sum=%dn”,sum); do-whiledo-while语句比较适用于处理:不论条件是否成立,语句比较适用于处理:不论条件是否成立,先执行先执行1次循环体语句组的情况。除此之外,次循环体语句组的情况。除此之外,do-whiledo-while语语句能实现的,句能实现的,forfor语句也能实现,而且更简洁。语句也能实现,而且更简洁。 例例7.

12、8 求求 sin(x) 的值的值, 其计算公式:其计算公式: sin(x) = x - x3/3! + x5/5! - x7/7!+. 程序设计分析:程序设计分析: 给定一个给定一个x 的的数值数值(弧度值弧度值); 求解求解sin(x)的数值的数值,就是求出多项式就是求出多项式: x - x3/3! + x5/5! - x7/7! + 的值的值 循环语句中用循环语句中用累加赋值语句:累加赋值语句: sum += t ; t 为多项式的一项,它的变化规律:为多项式的一项,它的变化规律: x + (- x3/3! ) + ( x5/5!) + (- x7/7! )+ x + (x * ( - x

13、2/2 *3) + (- x3/3! ) *(- x2/4 * 5) + ( x5/5!) *(- x2/ 6 * 7 )+ 求多项式的任一项的语句:求多项式的任一项的语句: n=n+2; (n初值为初值为1) t = t *(-x * x)/(n-1) * n); 循环程序如下循环程序如下 # include main() double sum , t, x; int n=1; scanf(%lf,&x); t=x; s=x;do n=n+2; t = t *(- x * x)/(n-1) * n); sum=sum+t; while( fabs(t)=1e-7 );printf(sin(%

14、lf)=%lfn,x,s); 1. 语句的一般格式:语句的一般格式: for ( 表达式表达式1; 表达式表达式2; 表达式表达式3 ) 语句语句 说明:说明: (1 1)表达式表达式1,可以是给循环变量赋初值的赋值表达,可以是给循环变量赋初值的赋值表达式,也可是与此无关的其它表达式(如逗号表达式)式,也可是与此无关的其它表达式(如逗号表达式) (2 2)“表达式表达式2 ”是循环条件部分,一般是关系或逻是循环条件部分,一般是关系或逻辑表达式,也允许是数值或字符表达式。辑表达式,也允许是数值或字符表达式。 (3 3)表达式表达式1,表达式,表达式2,表达式,表达式3(循环变量增值),(循环变量

15、增值),3部分均可缺省,甚至全部缺省,但其间的分号不能省略。部分均可缺省,甚至全部缺省,但其间的分号不能省略。 (4 4)当循环体语句由多条语句构成时,必须使用复合当循环体语句由多条语句构成时,必须使用复合语句形式。语句形式。 7.4 7.4 for for 语语 句句2. 2. 流程图流程图 求表达式求表达式2 2计算表达式计算表达式1 1 计算表达式计算表达式3 3=0(假假) 0(真真)循环体语句循环体语句结束结束for循环循环for for 语句的语句的 N-S N-S 图图 计算表达式计算表达式1 1当当表达式表达式2 2成立成立执行循环体语句执行循环体语句执行后继语句执行后继语句计

16、算表达式计算表达式3 32for语句的执行过程语句的执行过程(1)求解表达式)求解表达式1;(2)求解表达式)求解表达式2;如果其值非如果其值非0,执行(,执行(3);否则,);否则,转至执行(转至执行(4)。)。(3)执行循环体语句组,并求解表达式)执行循环体语句组,并求解表达式3,然后转向,然后转向步骤(步骤(2)。(4)执行)执行for语句的下一条语句。语句的下一条语句。在循环语句中,在循环语句中,forfor语句语句最为灵活,不仅可用于循环最为灵活,不仅可用于循环次数已经确定的情况,也可用于循环次数虽不确定、但次数已经确定的情况,也可用于循环次数虽不确定、但给出了循环继续条件的情况。给

17、出了循环继续条件的情况。 例例7.9 求求1100的累计和的累计和 main() main( ) int i, sum; int i, sum; sum0; sum=0; i=1; for (i=1; i=100; i+) while ( i=100 ) sum += i; sum + =i; printf(sum=%dn,sum); i+; printf(“%d”, sum); 程序运行情况如下程序运行情况如下: sum=5050 可以去掉可以去掉表达式表达式1编写成以下形式的程序:编写成以下形式的程序:main ( ) int i=1, s=0;for ( ; i=100; i+) s=s

18、+i;printf(s=%dn, s); 若去掉表达式若去掉表达式1 1,应在,应在forfor语句保留语句保留 “ ;” “ ;”,且在,且在forfor语句之前应赋初值给循环变量语句之前应赋初值给循环变量 i i 。可以去掉可以去掉表达式表达式3,但必须在循环体中有语句修,但必须在循环体中有语句修改循环变量改循环变量 i 的值。的值。mian ( ) int i, s=0; for (i=1; i=100 ; ) s=s+i; i+ ; printf (s=%dn, s); 一般不可以去掉表达式一般不可以去掉表达式2,否则出现无限循环,否则出现无限循环,因因 “ “ i=100” i100

19、) break ; s=s+i ; printf(s=%dn, s); 例例 7.10 将例将例7.9程序改写为以下两种程序程序改写为以下两种程序 main() int i, sum; for(sum=0, i=1; i=100; i+) sum += i; printf(sum=%dn,sum); main() int i, sum; for(sum=0, i=1; i=100; i+ ,sum += i) ; printf(sum=%dn,sum); 表达式表达式1为逗为逗号表达式号表达式 表达式表达式1、表达式、表达式3 均为逗号表达式均为逗号表达式例例 7.11 求求n的阶乘的阶乘n!

20、(n!=1*2 * * n) main() int i, n; long fact=1; printf(“Input n: ”); scanf(“%d”, &n); for(i=1; i=n; i+) fact * = i ; printf(%d ! = %ldn, n, fact); 程序运行情况如下程序运行情况如下: Input n: 5 5 ! = 120程序程序1#include main() int i; for (i=65; i91; i+) printf(% c - % d n,i,i); 程序程序2#include main() int i ; i =65; for ( ; i

21、91 ; ) printf(% c - % d n,i,i); i+; 例例7.12 用用3个个for循环程序,均实现输出大写字母及循环程序,均实现输出大写字母及对应对应ASCII值。值。 程序程序3#include main() int i; i =65; for ( ; ; ) if ( i91 ) printf(% c - % d n,i,i); i+; 3.3.几几 种种 循循 环环 的的 比比 较较 1. 一般情况下一般情况下, 四种循环可相互替代。但不提倡四种循环可相互替代。但不提倡用用goto. 2. for语句和语句和while语句语句,是先判断后执行;是先判断后执行; dow

22、hile则是先执行后判断。则是先执行后判断。 3. for循环功能强于循环功能强于while, dowhile.但若不是明但若不是明显地给出循环变量初、终值显地给出循环变量初、终值(或修改条件或修改条件), 则应用则应用while 或或do while.以增强程序的结构化和可读性。以增强程序的结构化和可读性。7.5 7.5 breakbreak和和 continue continue 语句语句 1. break语句语句 (1)(1)breakbreak语语句句作作用用是是跳跳出出switchswitch语语句句或或跳跳出出本本层层循循环环,转转去去执执行行后后面面的的下下一一条条语语句句。由由

23、于于breakbreak语语句句的的转转移方向是明确的,所以不需要语句标号与之配合。移方向是明确的,所以不需要语句标号与之配合。 (2)(2) breakbreak语句的形式为:语句的形式为: break;break; 2. continue语句语句 continue语句只能用在循环体中。语句只能用在循环体中。 (1)(1)continuecontinue功功能能: : continuecontinue语语句句只只能能用用在在循循环环体体中中, ,结结束束本本次次循循环环,即即不不再再执执行行循循环环体体中中continue continue 语语句句之之后后的的语语句句,转转入入下下一一次次

24、循循环环条条件件的的判判断断与与执执行行。应应注注意意的的是是, 本本语语句句只只结结束束本本层层次次的的循循环环,并并不不跳跳出出循环。循环。 (2)(2)语句格式:语句格式:continue;continue; 说说明明:对对于于 for 循循环环,跳跳过过循循环环体体其其余余语语句句,转转向循环表达式向循环表达式3的计算;的计算; 对对于于 while 和和 do-while循循环环,跳跳过过循循环环体体其其余余语语句,但转向循环继续条件的判定。句,但转向循环继续条件的判定。 3.3. Break 语句和语句和 continue 语句执行流程比较语句执行流程比较例例7.13 break的

25、作用的作用main() int x; for(x=1;x=10;+x) if (x/3=0) break;printf(%d,x); 运行结果:运行结果: 1,2 例例7.14 求不能被求不能被3整除的数整除的数main() int n; for(n=100;n=200;n+) if (n%3=0)continue; printf(%dt,n); 例例7.15 输出输出100200之间的全部素数。素数之间的全部素数。素数n是指,除是指,除1和和n之外,不能被之外,不能被2(n-1)之间的任何整数整除。之间的任何整数整除。 算法设计要点:算法设计要点: (1 1)只要设计出判断某数)只要设计出判

26、断某数 n n 是否是素数的算法,用一是否是素数的算法,用一个个for for 循环,循环,n n的值取的值取 100 100200 200 的各个值,即可。的各个值,即可。 (2 2)判断某数)判断某数 n n 是否是素数的算法:根据素数的定义,是否是素数的算法:根据素数的定义,再用一个再用一个 for for 循环,用循环,用 2 2(n-1n-1)之间的每一个数去整之间的每一个数去整除除 n n,如果都不能被整除,则表示该数是一个素数。如果都不能被整除,则表示该数是一个素数。 判断一个数是否能被另一个数整除,可通过判断它们判断一个数是否能被另一个数整除,可通过判断它们整除的余数是否为整除

27、的余数是否为0 0来实现来实现 main() int i, j, cou=0; for(i=101; i=200; i+=2) if(cou%10= =0) /*每输出每输出10个数换一行个数换一行*/ printf(“n”); for(j=2; j= i ) /*i是素数:输出,计数器加是素数:输出,计数器加1*/ printf(“%6d”,i); cou+; 例例 7.16 写出下面程序的运行结果:写出下面程序的运行结果:#include main() int i; for( i=1; i=5; i+ ) if ( i2) printf(“*); else continue; printf

28、(“#); printf(“$n); 运行结果:运行结果: * # * # * # $ 1.循环嵌套:循环嵌套:循环语句的循环体语句内,又包含另一个完整的循环循环语句的循环体语句内,又包含另一个完整的循环结构,称为循环嵌套。结构,称为循环嵌套。C C语言的语言的forfor语句、语句、whilewhile语句、语句、do-whiledo-while语句都允许语句都允许循环嵌套循环嵌套 。 2 循环嵌套几种形式:循环嵌套几种形式:A) for ( ; ; ) for ( ; ; ) 循环体语句循环体语句 7.6 7.6 循循 环环 的的 嵌嵌 套套 b) for ( ; ; ) . while

29、( ) 循环语句循环语句 . c) while ( ) . for ( ; ; ) 循环语句循环语句 . d) while ( ) while ( ) 循环语句循环语句 . 例例7.17 输出乘法口诀表输出乘法口诀表 #include main() int i, j; for ( i=1;i=9;i+) for(j=1;j=i;j+) printf( %4d,i*j ); printf(n); 用用 i 控制控制乘乘法口诀表法口诀表行数,行数, 用用 j 控制控制每行打印的每行打印的乘积乘积的个数;的个数;例例7.18 打印以下图形打印以下图形:*程序如下程序如下: main( ) int i

30、, j;for (i=1; i=5; i+) for (j=1; j=i; j+) printf (*); pritnf(n); 用用 i i 控制打印图形控制打印图形的行数,用的行数,用 j j 控制每控制每行打印行打印“*”“*”的个数;的个数;第五行左右两边的第五行左右两边的 可以去掉;可以去掉;第四行至第六行为外第四行至第六行为外循环的循环体,因此必循环的循环体,因此必须用须用 括起来;括起来;例例7.197.19 打印右边图形打印右边图形: # include main() int i, j; for (i=1 ;i=5; i+) for (j=1; j=fabs(i-3); j+)

31、 printf( “ ”); for (j=1; j=5-2*fabs(i-3); j+) printf( “*”); printf( “n”); * * * *7.7 7.7 循环结构程序举例循环结构程序举例 例例7.20 从从键键盘盘上上任任意意输输入入二二个个正正整整数数m和和n,编编程序求出二数的最大公约数和最小公倍数。程序求出二数的最大公约数和最小公倍数。 解题思路:解题思路: 首首先先输输入入二二个个正正整整数数,先先判判断断二二个个数数的的大大小小,使使大大的的数数放放在在m m中中, ,小小的的数数放放在在n n中中,设设r r为为余余数数,k k为为最最小小公公倍数。倍数。

32、这道题可以采用欧几里德算法这道题可以采用欧几里德算法( (即辗转相除法即辗转相除法) )。程序如下:程序如下:main( ) int r,m,n,k,t; seanf(“d,%d”,&m,n); if(mn) t=m;m=n;n=t; k=m*n;r=m%n; while(r!=0) m=n;n=r;r=mn; k=kn ; printf(“最大公约数为最大公约数为:d”,n); printf(“最小公倍数为最小公倍数为:d”,k); 例例7.21 #include main() int i, j, k; for(i=1; i*5=100; i+) for(j=1; j*3=100; j+)

33、for(k=1; k/3=3) f1=f1+f2 ; f2=f1+f2 ; 交替的结果正好为一序列,如下面所示交替的结果正好为一序列,如下面所示: 112358f1f2每输出每输出4 4个数时换行个数时换行。 流程图:流程图:fl=1, f2=1, i=1i=20输出输出fl, f2i%2=0输出回车换行输出回车换行fl= fl + f2, f2= fl+ f2i+结束结束真真假假假假真程序程序: main ( ) long int f1, f2, int i;f1=1; f2=1;for (i=1; i=20; i+) printf( %12Ld %12Ld , f1, f2); if ( i%2= =0) printf(n ); f1=f1+f2; f2=f1+f2; 运行结果为:运行结果为:15342331597109467502551422935245782415781718553772584177111211393832040570288739088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352102334155同同 学学 们们 再再 见见 程程 序序 设设 计计 基基 础础

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号