《第三章循环结构.ppt》由会员分享,可在线阅读,更多相关《第三章循环结构.ppt(55页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 1 页,第三章 循环结构,什么是循环结构?循环语句语法练习,第 2 页,循环语句,提出问题,?,提问:从键盘上输入10个整数并求和,怎么编程?回答:在程序中写入10个scanf( )语句。提问:从键盘上输入500个整数并求和,怎么编程?回答:这个,嗯? 不会让我写500个.,老师:让我们换一个角度来看待这些问题, 以上问题的实质是:将scanf函数重复执行N遍。学生:对!好象是这么回事.老师:我们可以引出一个概念“循环”,简单而言:循环就是不断反复地执行同一段程序。学生:这就是我们今天要学的新东西?,第 3 页,循环语句,循环 反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。C
2、语言中控制循环的语句: while for do-while,第 4 页,while语句,while语句格式while ( 表达式 ) 语句;说明:语句部分可以是简单语句,也可以是复合语句。while语句的执行流程,第 5 页,while语句-实例,例C5_1.C 从键盘输入10个整数,求这10个整数的和。 #include main ( ) int count,num,total; /* count:计数器,num:输入的整数 */ count=0; total=0; /* total:存放累加和 */ while ( count10 ) /* 循环控制条件 */ count +; /* 循
3、环体 */ printf (Enter the No.%d=, count); scanf (%d, ,第 6 页,while语句-实例,例:分析程序的运行结果 #include main ( ) int n=0;while ( n3 )printf (”n is %dn”,n);n+;printf(”Thats all this program does.n”);结果:程序将不停的打印“n is 0”,直至终止程序无法正常终止的程序,称为“死循环”。结论:在while语句循环体中,一定要有能够对循环控制条件产生影响的语句。避免出现“死循环”现象。,第 7 页,while语句-实例,例c5_2
4、:分析下列程序段 index=1;while ( index 5 )printf(”Good morning!n”);分析:程序段将无限制打印这条问候语句。因为循环中没有任何语句可以改变循环控制变量index的初值1例5_3:分析下列程序段 index=1;while( - index 5 )printf(”Good morning!n”);分析:仍有问题,程序改变了index的值,但方向错了。在index达到系统能够处理的最大负数时,将会产生下溢而终止程序。结论:循环体中必须有能够使循环正常停止的条件。,第 8 页,while语句-实例,例5_4.C:从键盘中读入一系列字符,直到输入字母a时
5、才停止。分析:由于不知道要输入的字符数量,只知道停止条件是输入字母a,则只能将循环控制条件设为ch!=a。 #include main( ) char ch= ; while ( ch!=a) putchar( ch = getch( ) );,改写: #include main( ) char ch; while ( (ch = getch( ) !=a ) ;,循环体为空语句,第 9 页,while语句-实例,例C5_5.C:对输入的行和字符进行计数。分析:n作为行结束标记的,DOS中有CTRL+Z作为文件结束标记 #define EOF -1#include main ( )int c,
6、nl=0,nc=0; while ( ( c = getchar( ) ) != EOF ) + nc; if ( c = n ) + nl; printf(chars=%d, lines=%dn, nc, nl);,定义文件结束标记 nl行计数器nc字符计数器 进行字符计数 如果找到n,则行计数,第 10 页,while语句-实例,例c5_6:求1到100的之和。 main ( ) int total=0, i=1; while ( i = 100 ) total = total + i;i +; printf(”Total=%dn, total);,变形1:while ( i total+
7、=i; +i 变形2:int i=0; while ( +i +i; 判断i 判断i +i; total+=i,第 11 页,while语句-实例,循环嵌套 在循环体中,又包含有循环语句,构成循环嵌套。例C5_7.C:输出下三角形乘法九九表。 1 2 3 4 5 6 7 8 9- 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 假设:行号为i ,列号为j,i=6j=5i*j,(1=i=9),(1=j=
8、i),则:第 i 行中要输出 j 个乘积,第 12 页,while语句-实例,#include main ( ) int i=1, j; /* i:行计数器 j:列计数器 */ while ( i = 9 ) /* 控制打印表头 */ printf ( %4d, i+ ); printf (n-n); i=1; while ( i= 9 ) j = 1; /* 列计数器置1 */ while ( j 1 时 #include main ( ) long int n=1; int i; for ( i = 1; i =10; i+ ) n = n * i; /* 求N! */printf ( %
9、2d!=%ldn, i, n); ,for语句最常用的形式for (初值;控制条件;增量) 语句;,第 16 页,for语句-实例,例C5_9.C:用for语句实现打印乘法九九表。 #include main ( ) int i, j;for ( i=1; i10; i+ ) printf (%4d,i); /* 打印表头 */ printf (n-n);for ( i=1; i10; i+ ) /* 控制打印表体 */ for ( j=1; j=i; j+ ) printf ( (j=i) ? %4dn : %4d , i*j);,输出函数printf中使用了“?”操作,含义相当于: if
10、( j=i ) printf (%4dn, i*j ); else printf (%4d, i*j );,第 17 页,for语句,for语句的变化形式for语句中的三个表达式中的任意一个都是可以省略的,但是分号不能省略。1.省略表达式2,则:for(表达式1; ;表达式3) 就形成了一个死循环。2.省略表达式1和表达式3,则:for(;表达式2;) 就等同于: while( 表达式 ) 据此结论:所有用while语句实现的循环都可以用for语句实现。3.表达式1、2、3全省略,则:for ( ; ; ) 就等同于: while (1),第 18 页,for语句-实例,语句中的逗号(,)运算
11、逗号(,)运算常见的三种用途是:1.在变量说明表中用来分隔变量,起分隔符的作用。如:int i, j, k, m3, *p;2.在函数的参数表中分隔参数。如:printf (n=%d, x=%dn, n, x);3.在语句中使用。其形式是:表达式n1,表达式n2; 用逗号分隔开的表达式从左到右进行计算,结果的类型和值是最右边表达式的类型和值。,第 19 页,for语句-实例,例C5_10.C:用逗号运算输出下列字符串。a z b y c x d w e v f u g t h s i r j q k p l o m n 分析:奇数位上的字符从a开始逐次递增,偶数位上的字符从z开始逐次递减 #i
12、nclude main ( ) char i, j; /* i:奇位字符 j:偶位字符 */* i从a开始逐次递增,j从z开始逐次递减 */ for ( i=a, j=z; ij; i+, j- ) printf(” %c %c”, i, j); /* 输出两个字符 */ printf(n);,第 20 页,do-while语句,do-while语句格式 do 语句 while ( 表达式 ) ;do-while语句的执行流程,循环控制条件,循环体,第 21 页,do-while语句,do-while语句特点 do-while与while和for的最大区别:do-while语句先执行循环体然后
13、再判断循环控制条件,而while和for却是先判断条件之后再执行循环体。使用do-while构成的循环,循环体部分至少要执行一次;而采用while和for构成的循环,循环体部分有可能一次也不会执行。,第 22 页,do-while语句-实例,例C5_11.C:输入一个正整数,要求以相反的顺序输出该数。例如:输入12345,则输出为54321。 基本思路:可以从个位开始,按位输出整数的每一位 main( ) unsigned int number; printf (Input the number:); scanf (%d, ,思考:使用while或for语句,如何实现?,两个程序有何区别?,前
14、面的程序可以处理数字0,后面的程序不能处理,第 23 页,do-while语句-实例,例C5_12.C 从键盘输入任意的字符,按下列规则进行分类计数。第一类 0,1,2,3,4,5,6,7,8,9第二类 +,-,*,/,%,=第三类 其它字符当输入字符时先计数然后停止接收输入。,第 24 页,do-while语句-实例,main( ) int class1=0, class2=0, class3=0; char ch; do putchar( ch=getch( ) ); switch (ch) case 0: case 1: case 2: case 3: case 4: case 5: c
15、ase 6: case 7: case 8: case 9: class1+; break; /* 对分类1计数 */ case +: case -: case *: case /: case %: case =: class2+; break; /* 对分类2计数 */ default: class3+; break;/* 对分类3计数 */ while (ch != ); printf(class1=%d, class2=%d, class3=%dn, class1, class2, class3); ,第 25 页,循环语句小结,C语言提供了三种循环语句:for、while、do-whi
16、le。特点如下:1、for和while先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。2、while和do-while语句的条件表达式只有一个,for语句有三个。3、while、do-while、for可以相互替换使用。4、while语句多用于不需要赋初值的或循环次数不定的情况。 for语句多用于要赋初值或循环次数固定的情况。 do-while语句多用于至少要运行一次的循环控制。5、循环语句可以嵌套,循环可以并列,但不能交叉。,第 26 页,循环语句小结,为了保证循环体正常运行,应该特别注意: 循环控制条件 控制条件的初始状态(初始值) 循环体内部对控制条件的影响以
17、上三个方面相互配合,相互影响,共同完成循环控制,第 27 页,转移语句,转移语句的作用 改变程序的运行流程。C语言转移语句 break continue goto return,第 28 页,break语句,格式break;break语句的功能 1.在switch语句中结束case子句,使控制转到switch语句之外。 2.在循环语句的循环体中使用,结束循环过程,使控制转移到整个循环语句之外的下一条语句处。,第 29 页,break语句,break语句的执行流程,break,break,break,while语句,for语句,do-while语句,第 30 页,break语句-实例,例C5_1
18、3.C:求555555的约数中最大的三位数是多少? main( )int j; long n; printf(Please input number:); scanf(%ld, /* 控制退出循环 */ ,第 31 页,break语句-实例,break语句使用注意:1、在嵌套循环中,break语句仅能退出一层(当前)循环。2、若在循环语句中包含了switch语句,那么switch语句中的break语句仅能使控制退出switch语句。3、break语句并不是程序设计中必不可少的语句,可以通过改变程序的结构去掉。,第 32 页,continue语句,continue语句格式continue;con
19、tinue语句的功能 continue语句仅能在循环语句中使用. 它的作用不是结束循环,而是开始一次新的循环。 对于for语句,将控制转到执行表达式3和条件测试部分 对于while和do-while语句,将控制转到条件测试部分 从逻辑上讲,改变if语句的条件表达式所表示的条件,就可以不需要使用continue语句。,第 33 页,continue语句,continue语句的执行流程,第 34 页,continue语句-实例,例C5_14.C:输入10个整数,求其中正数的个数及平均值,精确到小数点后两位。 main ( ) int i, count=0, j, sum=0; for ( i=1;
20、 i0),公差为d(d0)。则该数列满足条件: a+(a+d)+(a+2*d)+(a+3*d) = 4*a+6*d = 26 a*(a+d)*(a+2*d)*(a+3*d) = 880 则可以推出,首项a和公差d的取值范围为: 1 = a =5 1 = d =3 可以使用穷举的方法,在首项a和公差d的取值范围内进行判断。,第 37 页,goto语句-实例,main( ) int a, b, c, d, i; for (a=1; a=5; +a) /* 在a的范围内穷举 */ for (d=1; d0) 则 i 为整数的平方。#include ”stdio.h”main ( ) int i, m
21、; scanf (”%d”, ,第 42 页,典型数值问题-例2,例2:一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。问题分析与算法设计 按照题目的要求造出一个前两位数(i)相同、后两位数(j)相同且相互间又不同的整数。0 =31),第 43 页,典型数值问题-例2,#include ”stdio.hmain( )int i, j, k, m; for (i=1; i=9; i+) /* i:
22、车号前二位的取值 */ for (j=0; j=9; j+) /* j:车号后二位的取值 */ if ( i!=j ) /* 判断两位数字是否相异 */ k=i*1000+i*100+j*10+j; for ( m=31; m*mk; m+) ; /* 判断是否为整数的平方 */ if ( m*m=k ) printf(Lorry_No. is %d.n, k); 运行结果:Lorry_No. is 7744.,第 44 页,典型非数值(图型)问题-例3,例3:打印边长为m的正方型要求:从键盘输入m值,输出m行每行m个*号。例:输入m=4,输出的图形如下:* * * * * * * * * *
23、 * * *算法分析与设计:1. 输入 m ,2. 重复打印 m 行,每行打印 m 个 *;加细:1. 输入 m ;2. for ( k=1; k=m; k+)打印一行中的 m 个 * ;,第 45 页,典型非数值(图型)问题-例3,加细:1. 输入m;2. for ( k=1; k=m; k+)打印 m 个 * ;换新行;加细:1.输入m;2. for ( k=1; k=m; k+)for ( j=1; j=m; j+ ) printf (”*”);printf(”n”) ;,第 46 页,典型非数值(图型)问题-例3,整理,得到程序如下: #include main ( )int k, m
24、, j;scanf ( ”%d”, j+ ) /* 打印一行中的m个*号 */printf (”*”); printf(”n”);分析方法逐步求精法。对于复杂问题,不可能一下得到程序,可以先将简单的部分明确出来,再逐步对复杂部分进行细化,一步一步推出程序。,第 47 页,典型非数值(图型)问题-例4,例4:从键盘输入h值,输出h行用*号组成等腰三角形。例:输入 h=4,输出的图形如下:* * * * * * * * * * * * *,1 *2 * * *3 * * * * *4 * * * * * * *,要输出 h-k 个 空格 和 2k-1 个 *,分析: 程序的关键是:找出每一行中输出
25、空格的数量和*的数量 对于第k行(1=k=h):,第 48 页,典型非数值(图型)问题-例4,分析:要输出 h-k 个 空格 和 2k-1 个 *算法设计1.输入 h;2.重复打印h行,每行h-k个空格和2k-1个* 加细: 2. for ( k=1; k=h; k+ ) /* h行 */ 重复打印 h-k 个空格; 重复打印 2k-1 个 *; 换行; ,第 49 页,典型非数值(图型)问题-例4,程序: #include main ( ) int h, k, j; scanf (”%d”, ,第 50 页,典型非数值(图型)问题-例4,* * * * * * * * * * * * * *
26、 h=4换一个思路分析: 对于第 k 行 ( 1=k=h ): 要输出 h+k-1 个 空格 或 * 号 对于第j个字符,若 j=h-k 输出 空格 若 j h+k-1 输出 *算法设计 for ( k=1; k=h; k+) /* 重复打印h行 */ for ( j=1; j=h+k-1; j+) if (j=h-k) 打印 空格; else 打印 * 号; 换行; ,第 51 页,典型非数值(图型)问题-例4,程序: #include main ( ) int h, k, j; scanf (”%d”, ,第 52 页,典型非数值(图型)问题-例5,例5:从键盘输入 h 值,输出 h 行用
27、*号组成的菱形。例:输入 h=4 ,输出的图形如下: * * * * * * * * * * * * * * * * * * * * * * * * *,分析: 1. h为上三角形的高度,总行数为 。 2. 对于第 j 行,要输出 m 个空格和 n 个*号。 3. 当 j=h 时,为上三角,则:m= , n= 4. 当 时,为下三角,则: m = n = 总宽度 - 空格,1234567,空格 3 *号 1 2 3 1 5 0 7 1 5 2 3 3 1,2h-1 h-j 2j-1 hj=2h-1 j-h = 2h-1 - 2(j-h) = 4h-1-2j,第 53 页,典型非数值(图型)问题
28、-例5,算法设计for (j=1; j=2*h-1; j+) 控制打印行 若 为上三角 j=h 则: m = h-j; n = 2j-1 否则:m = j-h; n = 4h-1-2j 重复打印 m 个空格 重复打印 n 个 *; 换行;加细循环体 if (j=h) m=h-j; n=2*j-1; else m=j-h; n=4*h-1-2*j; for (k=1; k=m; k+) printf ( ); for (k=1; k=-10; y-) /* 圆的半径为10 */ m = 2.5*sqrt(100-y*y); /* 计算行y对应的列坐标m */ for(x=1;x30-m;x+) printf( ); /* 左侧空白控制 */ printf(*); /* 圆的左侧 */ for(;x30+m;x+) printf( ); /* 空心部分控制 */ printf(*n); /* 圆的右侧 */ ,典型非数值(图型)问题-例6,