1、共 38 页 第 1 1 页本章要点本章要点: : 建立循环程序设计的基本概念和逻辑思维建立循环程序设计的基本概念和逻辑思维 掌握循环程序设计的方法掌握循环程序设计的方法共 38 页 第 2 2 页什么是循环?什么是循环?为什么要使用循环?为什么要使用循环?l循环是有规律的重复操作。循环是有规律的重复操作。将复杂问题将复杂问题分解分解为简单的操作过程,程序只对简单过程描述,为简单的操作过程,程序只对简单过程描述,这些过程的多次这些过程的多次重复重复就可完成对问题的求解。就可完成对问题的求解。重复的频繁性决定了循环在程序设计中必不可重复的频繁性决定了循环在程序设计中必不可少!少!1001nyn问
2、题问题1 1:问题问题2 2:问题问题3 3:问题分解问题分解循环控制循环控制共 38 页 第 3 3 页l if-goto 循环循环l while循环循环l for循环循环l do while循环循环 先判断后循环先判断后循环 先循环后判断先循环后判断 特点:特点:难点:难点: C提供四种循环控制:提供四种循环控制:共 38 页 第 4 4 页一般形式:一般形式: goto 标号标号; 标号:语句标号:语句 其中:其中:标号用标识符表示,即由字母、数字和标号用标识符表示,即由字母、数字和下划线组成,且首字符必须为字母或下下划线组成,且首字符必须为字母或下划线划线。不能用整数作标号。不能用整数
3、作标号。用途:用途:1. 与与if语句一起构成循环结构。语句一起构成循环结构。2. 从循环体中跳到循环体外从循环体中跳到循环体外(一般指最深层)。一般指最深层)。3. 改变程序自上而下的执行顺序。改变程序自上而下的执行顺序。缺点:滥用缺点:滥用goto语句,可使程序无规律、可读性差。语句,可使程序无规律、可读性差。共 38 页 第 5 5 页#include “stdio.h”main( ) int i=1,s=0;L1: if(i=100) s=s+i; i+ ; goto L1; printf(“s=%dn”,s); i=100开始i=1,s=0s=s+i ,i+零零非零非零结束输出s 求
4、和求和 s=1+2+100运行结果运行结果: S=?共 38 页 第 6 6 页1.1.whilewhile循环语句的形式循环语句的形式 whilewhile(表达式)语句(表达式)语句 先判断条件,后执行语句先判断条件,后执行语句表达式语句零零非零非零2.2.执行过程执行过程注意注意: :v 循环体若包含一个以上循环体若包含一个以上语句,应该用花括号括起语句,应该用花括号括起来来( (使用复合语句使用复合语句) )。v 循环体内应注意设置修循环体内应注意设置修改循环条件的语句。否则改循环条件的语句。否则循环无法终止。循环无法终止。v 如果表达式的值第一次如果表达式的值第一次计算就等于计算就等
5、于0 0,则循环体一,则循环体一次也不执行。次也不执行。共 38 页 第 7 7 页 求求1001nni=1,sum=0i=100?sum=sum+ii=i+1零零非零非零#include “stdio.h”main() int i=1,sum=0; while (i=100) sum=sum+i; i+; printf(%d,sum);思考:删除思考:删除i+;i+;后果?后果? 调换调换i+;i+;与求和语句的后果?与求和语句的后果?共 38 页 第 8 8 页 输入一批正数,输入输入一批正数,输入0时表示输入结束,时表示输入结束,求这些正数的和。求这些正数的和。#include “std
6、io.h”main( ) int s=0, x; scanf(“%d”,&x); while( x!=0 ) s=s+x; scanf(“%d”,&x); printf(“s=%dn”,s); 零零非零非零x!=0开始s=0s=s+x结束输出s输入正数x输入正数x思考:取消循环内的输入语句后果?思考:取消循环内的输入语句后果? 共 38 页 第 9 9 页1. dowhile1. dowhile循环语句的形式循环语句的形式 do do 语句语句 while(while(表达式)表达式); 先执行语句,后判断条件先执行语句,后判断条件 2. 执行过程执行过程说明:说明:(1 1)dowhiled
7、owhile循环语句循环语句首先执行循环体,然后计首先执行循环体,然后计算表达式并检查循环条件,算表达式并检查循环条件,所以所以循环体至少执行一次。循环体至少执行一次。(2 2)退出)退出dowhiledowhile循环循环的条件与退出的条件与退出whilewhile循环的循环的条件相同。条件相同。表达式语句零零非零非零5.3 dowhile5.3 dowhile循环语句循环语句共 38 页 第 1010 页表达式=0?语句零零非零非零i=100?sum=sum+ii=i+1i=1,sum=0 用用do-while型循环求:型循环求:1001nn#include “stdio.h”main()
8、 int i=1, sum=0; do sum=sum+i; i+; while (i=100) ; printf(%d,sum);共 38 页 第 1111 页表达式=0?语句零零非零非零i=n?s=s*ii=i+1i=1,s=1输入n 用用do-while型循环求型循环求n!S=123(n-1) n#include stdio.hmain() int i=1;long s=1; scanf(“%d”,&n); do s*=i; i+; while (i=n) ; printf(%d!=%ldn”,n,s);共 38 页 第 1212 页 用迭代法求用迭代法求a的算数平方根。公式的算数平方根
9、。公式 :xn=0.5*(xn-1+a/xn-1) 确定初值为确定初值为x0, 取取a/2为为x0的初值,迭代结束条件的初值,迭代结束条件:|x1-x0|1e-5); printf(“squrt(a)=%fn”,x1);表达式=0?语句零零非零非零 |x1-x0|10-5 ?x0=x1x1=(x0+a/x0)/2输入ax1=a/2输出a,x1共 38 页 第 1313 页注意注意: :当当whilewhile后的表达式为后的表达式为真真时,时,whilewhile语句和语句和dowhiledowhile语句的结果相同,否则不同。语句的结果相同,否则不同。main( )int i , s=0;s
10、canf(“%d”,&i); while(i=10) s=s+i; i+; printf(“s=%dn”, s); 输入:输入:1 打印:打印:55输入:输入:11 打印:打印:0main( )int i , s=0; scanf(“%d”,&i); do s=s+i; i+; while(i=10) ; printf(“s=%dn”, s); 输入:输入:1 打印:打印:55 输入:输入:11 打印:打印:11共 38 页 第 1414 页1.for1.for循环语句的形式循环语句的形式 forfor( 表达式表达式11; 表达式表达式22; 表达式表达式33)语句)语句表达式2表达式1语句
11、表达式3零零非零非零2. 执行过程执行过程说明:说明:(1)(1)计算表达式计算表达式1;1;(2)(2)计算表达式计算表达式2 2,值非零执行,值非零执行循环体,计算表达式循环体,计算表达式3 3,重复,重复(3)(3)表达式表达式1 1仅被执行一次;表仅被执行一次;表达式达式2 2决定了是否继续执行循环决定了是否继续执行循环; ;表达式表达式3 3则不断修改循环控制变则不断修改循环控制变量的值。量的值。(4)(4)三个表达式均可省略,分号三个表达式均可省略,分号不能省略。不能省略。for for 循环体可以是循环体可以是复合语句。复合语句。共 38 页 第 1515 页3.说明:说明:(1
12、)基本的应用形式:基本的应用形式:forfor(循环变量赋初值;循环条件;循环变量增值)(循环变量赋初值;循环条件;循环变量增值) 求级数求级数12+22+32+前前10项之和。项之和。main() int i, sum=0; for (i=1;i=10;i+) sum=sum+i*i; printf(%d,sum);共 38 页 第 1616 页(2)三个表达式均可缺省,但起分割作用的两个分)三个表达式均可缺省,但起分割作用的两个分号不可省略。号不可省略。 例如:例如:for( ; ; ) 相当于相当于while (1) 语句语句(3)表达式)表达式1和表达式和表达式3可为逗号表达式。可为逗
13、号表达式。 例:例: int i,j,sum; for(sum=0, i=0,j=100;i=j;i+,j- ) sum=sum+i+j;共 38 页 第 1717 页 输出输出100以内所有偶数的和与所有奇数的和。以内所有偶数的和与所有奇数的和。#include “stdio.h”main() int I,s1=0,s2=0; for(i=1;i100;i+) if(i%2=0) s2=s2+i; else s1=s1+i; printf(“s1=%d,s2=%dn”,s1,s2); 共 38 页 第 1818 页 输出所有被整除,并能被整除余,被整除输出所有被整除,并能被整除余,被整除缺缺
14、1的两位数。的两位数。 #include stdio.h main( ) int i; for( i=10; i100; i+) if( i%3=0&i%5=3&(i+1)%7 = = 0) printf(%dn, i ); 共 38 页 第 1919 页#include stdio.hmain( ) long f,f1,f2; int i; f1=f2=1; printf(“%8ld%8ld”,f1,f2); for( i=3; i2)Fn=1(n=1,n=2),Fn=Fn-1+Fn-2 (n2)运行结果运行结果程序运行演示程序运行演示共 38 页 第 2020 页 for语句和语句和whi
15、le语句先判断条件,后执行语句,语句先判断条件,后执行语句,故循环体有可能一次也不执行,而故循环体有可能一次也不执行,而dowhile语句语句的循环体的循环体至少执行一次至少执行一次。 必须在必须在while 语句和语句和dowhile语句之前对循环体语句之前对循环体变量赋初值,而变量赋初值,而for语句可在表达式语句可在表达式1中对循环变中对循环变量赋初值。量赋初值。 在循环次数已经确定的情况下,习惯用在循环次数已经确定的情况下,习惯用for语句;语句;而对于循环次数不确定只给出循环结束条件的问而对于循环次数不确定只给出循环结束条件的问题,习惯用题,习惯用while语句解决。语句解决。共 3
16、8 页 第 2121 页1. 1. 定义:定义:在循环体内又包含一个循环结构,称为循在循环体内又包含一个循环结构,称为循环嵌套。三种循环都可以嵌套。下面几种都是合环嵌套。三种循环都可以嵌套。下面几种都是合法的嵌套形式:法的嵌套形式: for( ; ; ) while( ) for循环体嵌套循环体嵌套while循环体循环体for( ; ; ) for( ; ; ) for循环体嵌套循环体嵌套for循环循环共 38 页 第 2222 页do do while( ); while( );do_while循环循环体体嵌套嵌套do_while循环循环while( ) do while( ); while
17、循环体循环体嵌套嵌套do_while循环循环while( ) for( ; ; ) while循环体嵌套循环体嵌套for循环循环 do for( ; ; ) while( ); do_while循环体循环体嵌套嵌套for循环循环共 38 页 第 2323 页 2.2.嵌套结构规则嵌套结构规则 外循环外循环内循环内循环交叉循环交叉循环外循环外循环入口入口内循环出口内循环出口内循环出口内循环出口外循环出口外循环出口共 38 页 第 2424 页for(i=1;i=2;i+) for(j=1;j=2;j+) printf(“%3d”,i+j); printf(“n”); for(i=1;i=2;i+
18、) for(j=1;j=2;j+) printf(“%3d”,i+j); printf(“n”); output: 2 3 3 4output: 2 3 3 4共 38 页 第 2525 页 1 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 9- 1 1 2 4 2 4 3 6 9 3 6 9 4 8 12 16 4 8 12 16 5 10 15 20 25 5 10 15 20 25 6 12 18 24 30 36 6 12 18 24 30 36 7 14 21 28 35 42 49 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64
19、 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 9 18 27 36 45 54 63 72 81 思路:思路:行号为行号为i i,列号为列号为j ji i= =7 7j j= =5 5i i* *j j( (1 1=i=i=9 9) )( (1 1=j j=i i) ) 则则:第:第 i i 行中一共要输出行中一共要输出 i i 个乘积个乘积共 38 页 第 2626 页用用forfor语句实现打印乘法九九表。语句实现打印乘法九九表。 #include stdio.h#include main ( )main ( ) int int i,
20、j; i, j;forfor ( ( i=1i=1; ; i=9;i=9; i+i+ ) ) printf printf (%4d,i); (%4d,i); printf (n-n printf (n-n););forfor ( ( i=1i=1; ; i=9; i=9; i+i+ ) ) forfor ( ( j=1;j=1; j=ij=i; ; j+j+ ) ) printf printf ( ( (j=i)(j=i) ? ? %4dn%4dn: :%4d,%4d,i i* *j);j); 输出函数输出函数printfprintf中使用了中使用了“? ?”操作,含义相当于:操作,含义相当于
21、: if ( jif ( j=i ) printfi ) printf (%4dn, i (%4dn, i* *j );j ); else else printf printf (%4d, i (%4d, i* *j );j );思考思考:如何如何打印打印1*1=1?共 38 页 第 2727 页forfor循环嵌套循环嵌套whilewhile循环:循环:输入输入6 6名学生名学生5 5门课程的成绩,分别统计每名学生门课程的成绩,分别统计每名学生5 5门课程的门课程的平均成绩。平均成绩。main()main() int i,j int i,j; ; float score,sum;ave fl
22、oat score,sum;ave; ; for(i for(i=1;i=6;i+)=1;i=6;i+) sum=0; sum=0; j=1; j=1; while(j while(j=5)=5) scanf(“%f”,&score scanf(“%f”,&score);); sum=sum+score sum=sum+score; ; j+; j+; ave ave=sum/5;=sum/5; printf(“i=%d ave printf(“i=%d ave=%6.2fn”,i,ave);=%6.2fn”,i,ave); 共 38 页 第 2828 页1. break 语句语句语法语法:
23、break ;功能功能:终止终止包含该语句的包含该语句的最内层循环。最内层循环。 main( ) int n; for(n=100;n=200;n+) if(n%3=0) break ; printf(“%6d”,n); 2. continue 语句语句语法语法:continue ;功能功能:结束结束循环体的本次循环体的本次执行。执行。main( ) int n; for(n=100;n=200;n+) if(n%3=0) continue ; printf(“%6d”,n); 该语句只能出现在该语句只能出现在for, whilefor, while或或dodowhilewhile语句中。语句
24、中。该语句只能出现在该语句只能出现在switch,forswitch,for, , whilewhile或或dodowhilewhile语句中。语句中。共 38 页 第 2929 页说明:说明:发生下列情况之一时,循环结束执行:发生下列情况之一时,循环结束执行:表达式表达式2的值为的值为0;循环体内遇到循环体内遇到break语句;语句;循环体内遇到循环体内遇到goto 语句,且与该语句,且与该goto语句配合语句配合 使用的标号所指定的语句在本循环体外;使用的标号所指定的语句在本循环体外;共 38 页 第 3030 页3. 空语句空语句形式:形式: ;(只由一个分号构成)(只由一个分号构成)功
25、能功能: 什么也不做。(可出现在程序中任何语句可什么也不做。(可出现在程序中任何语句可以出现的地方)以出现的地方)例例10:求级数求级数12+22+32+,前,前10项之和。项之和。main( ) int i, sum; for(sum=0,i=1;i=10;sum+=i*i, i+) ; printf(“sum=%dn”, sum); 共 38 页 第 3131 页1. 1. 输入一个整数输入一个整数m m,判断是否为素数。,判断是否为素数。若若m m不能被不能被2 2m-1m-1之间的任何一个整数整除,则之间的任何一个整数整除,则m m为为素数。素数。算法分析:算法分析:设设k=m-1,k
26、=m-1,用用2 2至至m-1m-1依次去除依次去除m,m, 若若m m能被能被2 2k k之中任何一个整数整除,则不必除下去,肯定之中任何一个整数整除,则不必除下去,肯定不是素数,跳出循环不是素数,跳出循环,(i=k),(i=k+1.i=k+1.在循环之后判别在循环之后判别i的值是否大于或等于的值是否大于或等于k+1,若是,则表明未曾被,若是,则表明未曾被2k之间任一整数整除过,因此输出之间任一整数整除过,因此输出“是素数是素数”。编程举例编程举例共 38 页 第 3232 页程序如下:程序如下:#include stdio.hmain( ) int m, i, k; scanf(“%d”,
27、&m); k=m-1; for(i=2; i=k+1) printf(“%d is a prime numbern”, m); else printf(“%d is not a prime numbern”, m);共 38 页 第 3333 页1. 输入输入m;2. for ( k=1; k=m; k+) 打印打印 k 个个 * * ; 换新行换新行; 1. 输入输入m;2. for ( k=1; k=m; k+) * * * * * * *说明说明:1. :1. 循环变量可以控制循环次数;循环变量可以控制循环次数; 2. 2. 外循环变量可作为内循环次数的控制变量外循环变量可作为内循环次数
28、的控制变量. .共 38 页 第 3434 页#include #include main ( )main ( ) intint k, m, j; k, m, j; scanfscanf ( ( “%d”, &m);“%d”, &m); for ( k=1; k=m; k+) for ( k=1; k=m; k+) for ( j=1; j=k; j+) for ( j=1; j=k; j+) printfprintf (“ (“* *”)”); printf(“nprintf(“n”) ;”) ; 整理得到程序如下:整理得到程序如下:共 38 页 第 3535 页 3. 3. 求求sin(x
29、sin(x) )的近似值的近似值(x(x是弧度)。是弧度)。sin x=x- xsin x=x- x3 3/3!+x/3!+x5 5/5!-x/5!-x7 7/ 7!+(-1)/ 7!+(-1)n+1n+1x x2n-12n-1/(2n-1)! /(2n-1)! +分析:本例可作为循环累加问题处理分析:本例可作为循环累加问题处理, ,考虑适当的精度要求。考虑适当的精度要求。设设i i为项数为项数,s,s为累加和,为累加和,s=s+s=s+级数的下一项级数的下一项第第i i项的绝对值:项的绝对值:x x2i-12i-1/ (2i-1)!/ (2i-1)!第第i i项的运算符号项的运算符号(-1)
30、(-1)i+1i+1第第i+1i+1项的绝对值等于项的绝对值等于x x2(i+1)-12(i+1)-1/(2(i+1)-1)!= x/(2(i+1)-1)!= x2i+12i+1/(2i+1)!/(2i+1)!因此因此, ,第第i+1i+1项的绝对值等于第项的绝对值等于第i i项的绝对值乘项的绝对值乘x x2 2再除以再除以(2i)(2i)* *(2i+1)(2i+1)级数的下一项可用下面表达式实现:级数的下一项可用下面表达式实现: -(-(上一项的值上一项的值) )* *x x* *x/(2+i)x/(2+i)* *(2(2* *i+1);i+1);共 38 页 第 3636 页程序如下:程
31、序如下:#include “stdio.h#include “stdio.h”main()main() int int i; i; double x,t,s double x,t,s=0.0;=0.0; scanf(“%lf”,&x scanf(“%lf”,&x);); x=x x=x* *3.1415926/180;3.1415926/180; for(t=x,i for(t=x,i=1;i=10;i+)=1;in) ?m:n); in) ?m:n); i=m* *n;in;i+)+) if(i%m if(i%m=0&i%n=0)=0&i%n=0) printf(“time=%d,i pri
32、ntf(“time=%d,i);); break; break; 4.输入两个正整数输入两个正整数m和和n,求其最小公倍数求其最小公倍数.程序运行演示程序运行演示共 38 页 第 3838 页1.循环程序设计的要点循环程序设计的要点 循环初值,循环条件,循环体设定循环初值,循环条件,循环体设定2.C语言循环程序设计的三种结构语言循环程序设计的三种结构 for, while, do- while3.程序设计的一般步骤程序设计的一般步骤 分析给定问题的详细步骤,总结出解决问题的一般方法;分析给定问题的详细步骤,总结出解决问题的一般方法; 画出程序流程图或写出程序草案;画出程序流程图或写出程序草案; 编制程序;编制程序; 输入程序、进行语法检查;输入程序、进行语法检查; 运行、测试程序(使用多组数据进行测试)。运行、测试程序(使用多组数据进行测试)。4. 本章通过例子介绍了递推法、迭代法等基本算法。本章通过例子介绍了递推法、迭代法等基本算法。