循环结构程序设计课件_第1页
循环结构程序设计课件_第2页
循环结构程序设计课件_第3页
循环结构程序设计课件_第4页
循环结构程序设计课件_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 循环结构程序设计 C 语言程序设计第5章 循环结构程序设计 C 语言程序设计2022/9/252循环结构的应用场合循环结构是指根据问题的需要任意次地重复执行一行或多行语句。具体地说就是某些语句在某一条件成立时,需要重复执行,直到条件不成立时才结束重复执行。循环结构的应用场合计算1+2+3+n,属于循环累加问题,总共执行n次。计算n!=123n,属于循环累乘问题,执行n次。计算e的近似值,e=1+1/1!+1/2!+1/3!+1/n!,直到满足精度的要求,即最后一项的绝对值小于10-5时循环停止。循环次数事先未知。以二维形式打印乘法九九表,属于双重循环问题。2022/9/242循环结构的

2、应用场合循环结构是指根据问题的2022/9/253循环结构类型NYP成立?A当P成立时 A A当P成立时YNAP成立?N-S流程图流程图直到型循环当型循环2022/9/243循环结构类型NYP成立?A当P成立时 2022/9/254本章主要内容5.1 C语言的循环语句5.1.1 while语句(当型循环)5.1.2 do-while语句(直到型循环)5.1.3 for语句5.1.4 三种循环语句的比较和使用5.2 循环的跳转5.2.1 break语句5.2.2 continue语句5.3 循环嵌套5.4 循环结构程序设计举例2022/9/244本章主要内容5.1 C语言的循环语句2022/9/

3、2555.1.1 while语句 语句一般格式 while (表达式) 语句 一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式 用来控制循环体是否执行称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句是循环重复执行的部分 2022/9/2455.1.1 while语句 语句一般格式2022/9/2565.1.1 while语句功能:计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后面的语句。 当表达式为真 语句N-S结构图NY流程图表达式非0?语句循环控制条件循环体2022/9/24

4、65.1.1 while语句功能:计算表达2022/9/2575.1.1 while语句(举例)【例5.1】编写程序,求100个自然数的和即: s=1+2+3+ +100 思路:寻找加数与求和的规律 加数i从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。求和设变量 sum 存放和,循环求sum=sum+i,直至i超过100。 2022/9/2475.1.1 while语句(举例)【例52022/9/258算法和程序:#include main( ) int i,sum; i=1; sum=0; while (i=100) sum=sum+i; i+; printf(

5、sum=%dn,sum);程序输出结果:sum=5050i: 循环控制变量sum: 累加器 i=1,sum=0 当i = 100 sum=sum+i i+输出sum2022/9/248算法和程序:#include stdi2022/9/259注意: 如果while的 (表达式) 值为0,则循环体一次也不执行 (例如当i的初值=101) 。在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。 在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。 思考程序段的输出? while (i=100) i+; sum=sum+i; 运行后,输出:sum=5150原因是什么? 202

6、2/9/249注意: 如果while的 (表达式) 值2022/9/2510注意(续):为了保证循环正常运行,应该特别注意: 循环控制条件的描述 控制条件的初始状态(初始值) 循环体内部对控制条件的影响2022/9/2410注意(续):为了保证循环正常运行,应该2022/9/25115.1.1 while语句(举例)【例5.2】编写程序,从键盘输入字符,直到输入的字符为0时停止,统计输入的字符个数。求累加和:确定变量len,初值为0确定循环条件:输入字符不为0,即getchar()!=0思路:程序#include void main( ) char ch; int len=0; printf(

7、请输入字符:n); while(ch=getchar()!=0) putchar(ch); len+; printf(字符个数为:%dn, len);自学:P58例4-1;P61例4-2。2022/9/24115.1.1 while语句(举例)【例2022/9/25125.1.2 do-while语句语句一般格式 do 语句 while (表达式); 功能:先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为 0 结束循环,转去执行while下面的语句。2022/9/24125.1.2 do-while语句语句一2022/9/2513 do

8、-while循环的算法 循环体当表达式为真N-S结构图NY循环体表达式非0?流程图main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); printf(%dn,sum);例:用do-while语句求100个自然数的和 2022/9/2413 do-while循环的算法 2022/9/25145.1.2 do-while语句(说明:) while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构。区别:do- while 语句先执行循环体再判断条件,循环体至少执行一次; while 语句先判断条件再执

9、行循环体,循环体有可能一次也不执行。dowhile循环体中一定要有能使表达式值趋于0的操作(如i+),否则会出现死循环。 2022/9/24145.1.2 do-while语句(说明2022/9/2515while 和 do-while 的用法比较输入一些数,求和,直到输入负数为止。#include void main( ) int x, sum=0; do scanf(%d, &x); sum+=x; while (x0); printf(sum=%d, sum);#include void main( ) int x, sum=0; scanf(%d, &x); while (x0) su

10、m+=x; scanf(%d, &x); ; printf(sum=%d, sum);输入 1 2 5 -10输入 -10 1 2 5sum-x2022/9/2415while 和 do-while 的用2022/9/25165.1.2 do-while语句(简单应用) 【例5.3】用辗转相除法求m和n的最大公约数。所谓辗转相除法,即用两数中较大数m除较小数n求余数r,然后再用较小数(赋给m)除余数(赋给n)求余数r,依次类推,当所得余数为0时停止,最后的较大数m就是最大公约数。定义m、n、rmnT F m和n交换r=m%nm=nn=r 当r != 0时输出最大公约数mN-S结构图:程序#in

11、clude void main( ) int m,n,r; scanf(%d, %d,&m,&n); if (mn) r=m; m=n; n=r; do r=m%n; m=n; n=r; while(r!=0); printf(%dn,m);自学:P62例4-3。2022/9/24165.1.2 do-while语句(简单2022/9/25175.1.3 for语句 语句一般格式 for (表达式1;表达式2;表达式3) 语句 功能:计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句

12、。循环初始条件循环控制条件循环体2022/9/24175.1.3 for语句 语句一般格式功2022/9/2518for语句的算法N-S结构图for (表达式1;表达式2;表达式3) 语句NY流程图计算表达式1 语句计算表达式3表达式2为真?例如:求100个自然数的和 main( ) int i,sum; sum=0; for ( i=1; i=100; i+) sum=sum+i; printf(sum=%dn,sum);可部分或全部省略,但“;”不可省略2022/9/2418for语句的算法N-S结构图for (2022/9/25195.1.3 for语句(省略表达式的for语句)省略表达

13、式1,即: for ( ;表达式2;表达式3) 此时应在for 语句之前给循环变量赋初值。例如: i=1;for ( ; i100) 2022/9/24195.1.3 for语句(省略表达式的f2022/9/25205.1.3 for语句(省略表达式的for语句)省略表达式3,即:for (表达式1;表达式2;)等同于:表达式1; while(表达式2) (死循环) 此时应在循环体中设置变量的增值。例如: for (i=1; i100) i+; 总结:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行。2022/9/24205.1.3 for语句(省略表达式的f202

14、2/9/25215.1.3 for语句(说明:)所有用 while 语句实现的循环都可以用for 语句实现。 等价于:for(表达式1;表达式2 ;表达式3) 语句;表达式1;while (表达式2) 语句; 表达式3; for 语句中的表达式1和表达式3,既可以是一个简单表达式,也可以由逗号运算符将多个表达式连接起来。例如:for ( i=0,sum=0; i=100; i+,i+) sum+=i; for ( i=0,sum=0; i=100; i=i+2) sum+=i; 2022/9/24215.1.3 for语句(说明:)所有用2022/9/25225.1.3 for语句(简单应用)

15、【例5.4】求n! ,即计算p=123n的值。 思路:求阶乘与求累加的运算处理过程类似,只要将“+”变为“*”。设置:乘数i ,初值为1,终值为n(n是循环控制终值,需要从键盘输入)累乘器 p ,初值为1,每次循环令p = p*i2022/9/24225.1.3 for语句(简单应用)【例2022/9/2523程序:#include main( ) int i, n; long p; p=1; printf(Enter n:); scanf(%d,&n); for (i=1; i=n; i+) p = p * i; printf(p = %ld n,p);思考:如何输出1!, 2!, , n!

16、 ?如何求s =1!+ 2!+ + n! ? 2022/9/2423程序:#include stdio.2022/9/2524熟悉几个循环语句 while (!x) x+; 当 x=0 时,执行循环体x+; while (c=getchar( ) != n) n=n+1; n 称为计数器,作用是统计输入字符的个数while (num+5); 先执行循环体x*=-3,再判断条件(x5) for (n=0; n26; n+) printf(%c , n+A); 作用是输出26个大写字母for (sum=0, i=1; i=100; sum=sum+i, i+=2) ;作用是计算100以内的奇数和

17、2022/9/2424熟悉几个循环语句 while (!x)2022/9/25255.1.4 3种循环语句的比较和使用while和do-while语句的表达式只有一个,for语句有三个。while 和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。while语句多用于循环次数不定的情况do-while语句多用于至少要运行一次的情况for语句多用于要赋初值或循环次数固定的情况2022/9/24255.1.4 3种循环语句的比较和使用w2022/9/25265.1.4 3种循环语句的比较和使用循环语句的选择if(循环次数已知) 使用for语句else /* 循环次

18、数未知 */if (循环条件在进入循环时明确)使用while语句else /* 循环条件需要在循环体中明确 */使用do-while语句2022/9/24265.1.4 3种循环语句的比较和使用循2022/9/25275.1.4 3种循环语句使用(课堂练习)K1:求1+2+3+4+ nK2:求1+1/2+1/3+1/4+ 1/nK3:求1-1/2+1/3-1/4+ 1/nK4:求1-1/3+1/5-1/7+ 前n项之和K5:输入100个整数,求其中正数之和K6:输入一个正整数n, 再输入n个数,输出最大值( P71例4-7)2022/9/24275.1.4 3种循环语句使用(课堂练习2022/

19、9/25285.1.4 3种循环语句使用(课堂练习)K1:求1+2+3+4+ n算法:i =1 to n s=s+i i+程序段:s=0;for(i=1; i=n; i+) s=s+i;2022/9/24285.1.4 3种循环语句使用(课堂练习2022/9/25295.1.4 3种循环语句使用(课堂练习)K2:求1+1/2+1/3+1/4+ 1/n算法:i =1 to n s=s+t t=1.0/i i+程序段:s=0;for(i=1; i=n; i+) s=s+1.0/i;2022/9/24295.1.4 3种循环语句使用(课堂练习2022/9/25305.1.4 3种循环语句使用(课堂练

20、习)K3:求1-1/2+1/3-1/4+ 1/n算法:i =1 to n s=s+t t=1.0/i*flag flag=-flag i+程序段:s=0;flag=1;for(i=1; i=n; i+) s=s+1.0/i*flag; flag=-flag;2022/9/24305.1.4 3种循环语句使用(课堂练习2022/9/25315.1.4 3种循环语句使用(课堂练习)K4:求1-1/3+1/5-1/7+ 前n项之和算法:i =1 to n s=s+t t=1.0/i*flag flag=-flag tt=tt+2 i+程序段:s=0;flag=1;tt=1for(i=1; i=n;

21、i+) s=s+1.0/tt*flag; tt+=2; flag=-flag;2022/9/24315.1.4 3种循环语句使用(课堂练习2022/9/25325.1.4 3种循环语句使用(课堂练习)K5:输入100个整数,求其中正数之和# include void main() int i , sum=0, x; for (i=0; i0) sum=sum+x; printf(%d,sum); 算法:i =1 to 100scanf(%d, &x)if x0sum=sum+xi+2022/9/24325.1.4 3种循环语句使用(课堂练习2022/9/25335.1.4 3种循环语句使用(课

22、堂练习)K6:输入一个正整数n, 再输入n个数,输出最大值(P71例4-7)思路:void main() int i , max, n, x; scanf(%d, &n); if(n=1) scanf(%d, &x); max=x; for (i=1; in; i+) scanf(%d, &x); if (max x) max=x; printf(%d, max); x maxmaxx循环2022/9/24335.1.4 3种循环语句使用(课堂练习2022/9/25345.2 循环的跳转有如下两种语句实现跳转:break语句continue语句在循环语句的循环体中使用,可以进行循环的流程控制2

23、022/9/24345.2 循环的跳转有如下两种语句实现跳2022/9/2535后续语句break;YN表达式?后续语句break;表达式?YN5.2.1 break语句功能:利用break语句能够强迫终止本层循环,转到后续语句执行。while语句do-while语句后续语句计算表达式3计算表达式1break;表达式2?YNfor语句2022/9/2435后续语句YN表达式?后续语句表达式2022/9/25365.2.1 break语句 int x,n=0,s=0;while (n10) scanf(%d,&x); if (x0) break; s+=x; n+; ; int x,n=0,s=

24、0;do scanf(%d,&x); if (x0) break; s+=x; n+; while (n10); for (n=0,s=0; n10; n+ ) scanf(%d,&x); if (x0) break; s+=x; 程序功能:从键盘输入不超过10个数,求和,一旦输入负数立即停止输入。2022/9/24365.2.1 break语句 int 2022/9/25375.2.1 break语句(举例)算法:除了1和m,不能被其它数整除。设 i 取值 2, m-1 如果m不能被该区间上的任何一个数整除,即对每个i,m%i 都不为0,则m是素数只要找到一个i,使m%i为0,则m肯定不是素

25、数m %2 %3 %4 %5 %(m-1)不是素数 | =0 =0是素数 & !=0 !=0 m不可能被大于 m/2 的数整除 i 取值 2, m-1 、 2, m/2 、 2, for(i=2; im/2) printf(yesn)else printf(non”);【例5.5】输入一个正整数m,判断它是否为素数。2022/9/24375.2.1 break语句(举例)算法2022/9/2538#include int main(void) int i, m;printf(“Enter a number: );scanf (%d, &m);for (i=2; i m/2 ) printf(%

26、d is a prime number! n, m); else printf(No!n); 5.2.1 break语句(举例)问题:能否改写为:for (i= 2; i= m/2; i+) if (m%i= 0) printf(No!n); else printf(%d is a prime number! n, m); 循环条件?循环的结束条件?【例5.5】输入一个正整数m,判断它是否为素数。2022/9/2438#include 52022/9/25395.2.1 break语句(说明)break只能终止并跳出最近一层的结构。break不能用于循环语句和switch语句之外的任何其它语句

27、之中。思考:用break语句实现例5.3,即求m和n的最大公约数。分析:最大公约数在1到两个数中较小的那个数之间,因此可用循环结构实现。循环变量初值为m和n中较小数,终值为1。具体语句: for (i=n; i=1; i-)if (m%i=0 &n%i=0) m=i;break; 2022/9/24395.2.1 break语句(说明)br2022/9/2540后续语句continue; YN表达式?后续语句continue;表达式?YN5.2.2 continue语句 功能:中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。while语句do-while语句后续语

28、句计算表达式3计算表达式1continue;表达式2?YNfor语句2022/9/2440后续语句YN表达式?后续语句表达式2022/9/25415.2.2 continue语句(与break区别) int x,n=0,s=0;while (n10) scanf(%d,&x); if (x0) continue; s+=x; n+; ; int x,n=0,s=0;do scanf(%d,&x); if (x0) continue; s+=x; n+; while (n10); for (n=0,s=0; n10; n+) scanf(%d,&x); if (x0) continue; s+=

29、x; 程序功能:从键盘输入10个数,统计其中的正数和。2022/9/24415.2.2 continue语句(与b2022/9/25425.2.2 continue语句(举例) 【例5.6】把100200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。 for (n=100; n=200; n+) n能被7整除 T F 终止本次循环 输出n 输出10个数 T F 换行算法:2022/9/24425.2.2 continue语句(举例2022/9/25435.2.2 continue语句(举例)#include main( ) int n,j=0; for(n=100

30、;n=200;n+) if (n%7!=0) continue; printf(%6d,n); j+; if (j%10=0) printf(n); printf( n j=%dn,j); 2022/9/24435.2.2 continue语句(举例2022/9/25445.3 循环的嵌套如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套。典型形式: (1) while() while() . (2) do do while( ); . while( );(3) while() do while( ); . (4) for( ; ;) do while(); while() .20

31、22/9/24445.3 循环的嵌套如果循环语句的循环体2022/9/25455.3 循环的嵌套(注意:)while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。例如:for(a=1;a=10;a+) for (b=0;b=5;b+) 外循环执行了10次,内循环执行6次循环正常结束时,内循环执行了106=60次 2022/9/24455.3 循环的嵌套(注意:)while2022/9/25465.3 循环的嵌套(举例)【例5.7】 P67例4-5:求1!+2!+n! (n由输入决定)分

32、析:这是一个累加求和问题,共循环n次,每次累加1项,循环算式:sum = sum + 第i项(i!)因此累加求和的for语句为: for (i=1; i=n; i+) item=i!; sum=sum+item; 进一步改写为: for (i=1; i=n; i+) item=1; for (j=1; j=i; j+) item=item*j; sum = sum + item; 2022/9/24465.3 循环的嵌套(举例)【例5.7】2022/9/25475.3 循环的嵌套(举例)【例5.7】 求1!+2!+n! (n由输入决定)程序:#include int main(void) in

33、t i, j,n;double item, sum; sum= 0; scanf(“%d“,&n); for(i=1; i=n; i+) item=1; for (j=1; j=i; j+) item=item*j;sum=sum+item; printf(1!+2!+3!+%d!=%en, n,sum); item=1; for (i=1; i=n; i+) for (j=1; j=i; j+) item=item*j; sum = sum + item; 问题:内层循环的初始化能否改为:2022/9/24475.3 循环的嵌套(举例)【例5.7】2022/9/25485.3 循环的嵌套(举

34、例)【例5.7】 求1!+2!+n! (n由输入决定)for(i=1; i=n; i+) item=1; for (j=1; j=i; j+)item=item*j; sum=sum+item; 分析嵌套循环的执行过程: 外层循环变量 i 的每个值 内层循环变量 j 变化一个轮次; 内外层循环变量不能相同 分别用 i 和 j2022/9/24485.3 循环的嵌套(举例)【例5.7】2022/9/25495.3 循环的嵌套(举例)【例5.7】 求1!+2!+n! (n由输入决定)如果理解了阶乘的含义,该题实际也可用单循环来编程,程序如何写?累加求和的for语句为: sum=0;for (i=1

35、; i=n; i+) item=i!; sum=sum+item; 改写为:item=1; for (i=1; i=n; i+) item=item*i; sum=sum+item; 2022/9/24495.3 循环的嵌套(举例)【例5.7】2022/9/25505.3 循环的嵌套(举例)【例5.8】 编写程序,输出如下九九乘法表。12 43 6 94 8 12 165 10 15 20 256 12 18 24 30 367 14 21 28 35 42 498 16 24 32 40 48 56 649 18 27 36 45 54 63 72 81分析:这是一个典型的双重循环问题。需要

36、两个循环变量i、j。ij外循环变量i用于控制输出行数,因此初值为1,终值为9。内循环变量j用于控制输出列数,因此初值为1,终值为当前外循环的i值(为什么?)。2022/9/24505.3 循环的嵌套(举例)【例5.8】2022/9/25515.3 循环的嵌套(举例)【例5.8】 编写程序,输出九九乘法表。程序:#include main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j2)fn= 设变量f1、f2和f3,并为f1和f2赋初值1,令f3=f1+f2得到第3项;将f1f2, f2f3,再求f3=f1+f2得到第4项;依此类推求第5项、第6

37、项这是一种递推算法应采用循环实现2022/9/24545.4 循环结构程序设计(举例)【例52022/9/2555【例5.10】:算法和程序#include main( ) int i,f1,f2,f3; f1=f2=1; printf(n%8d%8d,f1,f2); for (i=3; i=20; i+) f3=f1+f2; f1=f2; f2=f3; printf(%8d,f3); if (i%5=0) printf(n); f1=1,f2=1并输出for (i=3; i=20; i+) f3=f2+f1 f1=f2,f2=f3 输出f3 输出5个数 T F 换行2022/9/2455【例

38、5.10】:算法和程序#inclu2022/9/25565.4 循环结构程序设计(举例)【例5.11】编程序求21000以内的完数。 完数:一个数的因子(除了这个数本身)之和等于该数本身。思路:设定i从2变到10000,对每个i找到其因子和s;判定 is?若相等,则i为完数,否则不是。 例如:6的因子是1、2、3,因子和 1+2+36因此 6 是完数。使用穷举算法用双层循环实现2022/9/24565.4 循环结构程序设计(举例)【例52022/9/2557【例5.11】:算法和程序#include main( ) int i,j,s; for (i=2; i=1000; i+) s=0; for (j=1; ji; j+) if (i%j=0) s+=j; if (i=s) printf(%6dn,s); for(i=2;i=1000

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论