




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、程序设计基础(C语言)ITERATION STRUCTURE2Description on dataDescription on processingSequencial statementsSelective statementsChapter 3Chapter 4 & 5What We have learned:当过程中出现选择结构问题时,针对问题的类型,可有三种不同的条件判定方法来描述过程。New question内存分配指令分配第 3 页 Flow of Iterative Statements while statements for statements do-while stat
2、ements Design of some simple algorithms Simple graphic output(输出简单图形) Exhaustive Search (穷举法)When we need do some processing repeatedly, we can use Iterative Statements.第 4 页6.1 Concept of IterationWhy we need Iteration?Question:从键盘上输入10个整数并求和,怎么编程?Answer:在程序中写10个scanf语句,还可以写%d%d.Question :从键盘上输入500
3、个整数并求和,怎么编程?Answer :这个,嗯? 不会让我写500个.从更一般的角度来看待这些问题, 问题的实质:将某操作(scanf函数)重复执行N遍。 引出 “循环”概念 - - 反复地执行同一段程序第 5 页6.1 Concept of IterationIteration (循环) 反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。Iteration statements in C while for do-while第 6 页6.2 while statementswhile语句格式while ( 表达式 )语句;说明:语句可是简单语句,也可是复合语句。while语句的执
4、行流程表达式?执行语句成立不成立执行while循环之后的语句循环控制条件循环体第 7 页6.2 while statements - Example (Numerical)count10?count=count+1成立不成立输出结果total计数器count=0累加器total=0输入numtotal += num开始结束while ( count10 )count+;scanf(%d, &num);total += num;Key pointsTo get 10 integers from keyboard and calculate the sum.Example第 8 页6.2 whil
5、e statements - Example (Numerical) #include main ( ) int count,num,total; /* count:计数器,num:输入的整数 */ count=0; total=0; /* total:存放累加和 */例C3_5101 while ( count10 ) /* 循环控制条件 */ count +; /* 循环体 */ printf (Enter the No.%d=, count); scanf (%d, &num); total += num; /* 计算累加和 */ printf(Total=%dn, total);第 9
6、 页6.2 while statements Example (char)ch!=a?显示ch成立不成立ch=读入一个字符ch=读入下一个字符开始结束while (ch!=a) ch = getchar( );putchar( ch );ch = getchar( );Analysis:由于不知道要读入的字符数量,只知停止条件是读入字母a,则只能将循环控制条件设为 ch!=aKey points:To get characters repeatedly from keyboard until get the letter a.Example第 10 页6.2 while statements
7、Example (char)#include main( ) char ch; ch = getchar( ); while ( ch!=a) putchar ( ch ); ch = getchar( ); ch!=a?显示ch成立不成立ch=读入一个字符ch=读入下一个字符开始结束第 11 页6.2 while statements NotesNotes on while statements 1.while (0) . 由于循环的条件表达式恒等于0,循环体永远也不会执行,是编程者的错误。 2.while (1) . 由于循环的条件表达式恒等于 1,所以不可能通过循环控制条件来结束循环体的
8、执行,称为“死循环”。 3.为了保证循环正常运行,应该特别注意: 循环控制条件 控制条件的初始状态(初始值) 循环体内部对控制条件的影响第 12 页6.3 for statements Grammar of for statementfor (表达式1;表达式2;表达式3) 语句;Flow of for statement循环初始条件循环控制条件 表达式2?执行语句成立不成立执行for循环之后的语句执行表达式3执行表达式1循环体for语句等价于下列语句:表达式1;while (表达式2) 语句; 表达式3;第 13 页6.3 for statements Example (numerical)
9、 To calculate the factorial from 1 to 10. 递推公式:n! = 1 当 n=1 时n! = (n-1)! * n当 n1 时 #include main ( ) long int n=1; int i; for ( i = 1; i =10; i+ ) n = n * i; /* 求N! */printf ( %2d!=%ldn, i, n); for语句最常用的形式for (初值;控制条件;增量) 语句;Example第 14 页6.3 for statements语句中的逗号(,)运算逗号(,)运算常见的三种用途是:1.在变量说明表中用来分隔变量,起
10、分隔符的作用。 如:int i, j, k, m3, *p;2.在函数的参数表中分隔参数。 如:printf (n=%d, x=%dn, n, x);3.在语句中使用。其形式是:表达式n1,表达式n2; 用逗号分隔开的表达式从左到右进行计算,结果的类型和值是最右边表达式的类型和值。第 15 页6.3 for statements Example (char) 用逗号运算输出下列字符串。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开始逐次递减 #include main ( ) c
11、har i, j; /* i:奇位字符 j:偶位字符 */* i从a开始逐次递增,j从z开始逐次递减 */ for ( i=a, j=z; i=0, output the number in converse sequence. e.g.for 12345, output 54321. Idea: 可以从个位开始,按位输出整数的每一位 main( ) unsigned int number; printf (Input the number:); scanf (%d, &number);do printf(%d, number%10); number /= 10; /* number缩小10倍
12、 */ while ( number!=0 ); 思考:使用while或for语句,如何实现?要考虑到对数字0的处理Example第 19 页6.4 do-while statements -Example (char) 从键盘输入任意的字符,按下列规则进行分类计数。第一类 0, 1, 2, 3, 4, 5, 6, 7, 8, 9第二类 +, -, *, /, %, =第三类 其它字符当输入字符 时先计数然后停止接收输入。Example第 20 页6.4 do-while statements -Example (char) main( ) int class1=0, class2=0, cl
13、ass3=0; char ch; do putchar( ch=getch( ) ); /* 函数的嵌套调用 */ switch ( ch ) case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: class1+; break; /* 对分类1计数 */ case +: case -: case *: case /: case %: case =: class2+; break; /* 对分类2计数 */ default: class3+; break;/* 对分类3计数 */ while
14、 (ch != ); printf(class1=%d, class2=%d, class3=%dn, class1, class2, class3); 第 21 页6.4 do-while statements - NotesFeatures of do-whileDifferences between do-while & while for do-while 语句先执行循环体然后再判断循环控制条件,而 while 和 for 却是先判断条件之后再执行循环体。 使用 do-while 构成的循环,循环体部分至少要执行一次; 而采用 while 和 for 构成的循环,循环体部分有可能一次也
15、不会执行。第 22 页Brief Summary on Iteration3 Iteration Statements: for、while、do-while: 1、for和while先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。 2、while和do-while语句的条件表达式只有 1个;for语句有3个表达式,表达式2是条件表达式。 3、while、do-while、for可以相互替换使用。 4、各自适用于:while语句多用于不需要赋初值的或循环次数不定的情况。for语句多用于要赋初值或循环次数固定的情况。do-while语句多用于至少要运行一次的循环。 5
16、、循环语句可以嵌套,可以并列,但不能交叉。第 23 页Brief Summary on IterationPlease pay attention especially to: 循环控制条件 控制条件的初始状态(初始值) 循环体内部对控制条件的影响 以上三个方面相互配合,相互影响,共同完成循环控制第 24 页6.5 common algorithms using Iteration 草原上有一对小兔子,它们刚出生后的第1个月就会逐步长大,到了第2个月末就生出一对小兔子。第3个月大兔子会继续生一对小兔子,而第2个月出生的小兔子会逐步长大。第4个月时,第1月出生的兔子继续生育,第2月出生的小兔子也
17、可以生育一对小兔子了,第3月出生的小兔子则逐步长大 假设这些草原的兔子非常长寿,可以认为它们不会死亡。请建立数学模型,计算 第N个月时,草原上将会有多少对兔子?Example1 Iteration and Recurrence(递推)第 25 页6.5 common algorithms using IterationFibonacci sequence (菲波那奇数列) : 数列1、1、2、3、5、8、13、21、 ,其递推通项公式为:1 2 n n-1 n-2(n=3)根据递推通项公式,可用递推法编写程序求第N项。递推法:由初始的已知条件开始,先计算出第(N-1)步的结果,再利用前面已知的
18、(N-1)项结果,按照递推公式(或遵照递推规则),推出第N步结果。递推法是程序设计中最常用的方法之一,使用递推法必须有明确的递推初始值和递推规则(递推公式)。Example1 Iteration and Recurrence(递推)第 26 页6.5 common algorithms using Iterationun = un_1 = 1;for (i=3; i=n; i+) un_2 = un_1; un_1 = un; un = un_2 + un_1;i = n?向前传递前两项un_2 = un_1un_1 = un成立不成立初始化:un=un_1=1计算 un=un_2+un_1递
19、推项:i=3i +数列对应关系: un_2,un_1,un递推计算Example第 27 页6.5 common algorithms using IterationProgram in C:#include main( ) int n,i,un_2,un_1,un; for ( ; ; ) printf (Input n=?); scanf (%d,&n); if ( n = 3 ) break; /* 退出for循环 */ else printf (nInput n is error !n); /* 控制输入正确的N值 */ un = un_1 = 1; /* 设置递推初始值 */ for
20、 ( i=3; i=n; i+) /* 用递推法计算第N项的值 */ un_2 = un_1; un_1 = un; un = un_2 + un_1; printf (No. %d is %dn, n, un);6.5 common algorithms using Iteration在一个循环结构的循环体中又包含了另一个循环结构,称为循环的嵌套( Nested Loops )。嵌套形式多种多样,可嵌套任意的一个或多个循环。Example:x=1while ( x=9) for(i=1;i=9;i+) printf(“%5d”, x*i); x+; printf(“n”); for(i=1;
21、i=9;i+) for(j=1;j=9;j+) printf(“%5d”, i*j); printf(“n”); for(i=1;i=9;i+) j=1; do printf(“%5d”, i*j); j+ ; while (j10) ; printf(“n”); 注意大括号的使用 不要可以吗?2 Nested Loops外循环内循环交叉循环外循环入口内循环出口内循环出口外循环出口如:打印乘法九九表外循环出口1. 在嵌套的循环中外循环与内循环变量不可同名。2. 外循环与内循环不可交叉。6.5 common algorithms using Iteration2 Nested Loops第 30
22、 页 To display multiplication table in lower triangular matrix. 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 ,列号为ji=6j=5i*j(1=i=9)(1=j=i) 则:第 i 行中一共要输出 i 个乘积6.5 common algorithms using Iteration2 N
23、ested LoopsExample第 31 页6.5 common algorithms using Iteration #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 = i ) /* 嵌套的二重循环。输出第i行 */ printf (%4d, i*j ); j +; /* 列计数器+1 */ printf (n);
24、 /* 一行输出结束后,输出n */ i +; /* 行计数器+1 */ 外层循环体执行1次,内层循环要完整执行1次第 32 页 用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=100; j-) if ( n%j=0 ) /* 若能够整除j,则j是约数 */ printf(”3 digits in %ld=%dn”, n, j ); brea
25、k; /* 控制退出循环 */ Example第 37 页6.6.1 break statementsNotes for break statements: 1、在嵌套循环中,break 语句仅能退出一层(当前层)循环。 2、若在循环语句中包含了 switch 语句,那么switch 语句中的 break 语句仅能使控制退出 switch 语句。 3、break 语句并不是程序设计中必不可少的语句,可以通过改变程序的结构去掉。第 38 页6.6.2 continue statementsGrammarcontinue;Usage of continuecontinue语句仅能在循环语句中使用.
26、它的作用不是结束循环,而是开始一次新的循环。对于for语句,将控制转到执行表达式3和条件测试部分;对于while和do-while语句,将控制转到条件测试部分;从逻辑上讲,改变if语句的条件表达式所表示的条件,就可以不需要使用continue语句。第 39 页6.6.2 continue statementsFlow of continue statements表达式2?continue成立不成立执行后续语句执行表达式3执行表达式1表达式?continue成立不成立执行后续语句表达式?continue成立不成立执行后续语句while语句for语句do-while语句第 40 页6.6.2 co
27、ntinue statements 输入10个整数,求其中正数的个数及平均值,精确到小数点后两位。 main ( ) int i, count=0, j, sum=0; for ( i=1; i=10; i+) printf (Input integer:); scanf (%d, &j); if (j0 ) printf(Plus numer:%d,average value:%.2f, count, 1.0*sum/count); else printf(Plus numer: 0, average value: 0);改变if语句的条件表达式,可以不需要使用continue。Exampl
28、e第 41 页6.6.3 goto statementsGrammargoto 标号;Usage of goto statements1、将控制转移到标号所指定的语句处继续执行。2、标号的唯一功能就是作为goto语句的目标。标号的作用域是它所在的整个函数。NOTES要尽量避免使用goto 语句。使用 goto 语句的地方都可以用C的其它控制流程语句改写。 int a;p: scanf(“%d”,&a); if (a0),公差为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
29、则可以推出,首项a和公差d的取值范围为: 1 = a =5 1 = d =3 可以使用穷举的方法,在 首项a 和 公差d 的取值范围内进行判断。Example第 43 页6.6.3 goto statementsmain( ) int a, b, c, d, i; for (a=1; a=5; +a) /* 在a的范围内穷举 */ for (d=1; d=3; +d) /* 在d的范围内穷举 */ b=a+(a+d)+(a+2*d)+(a+3*d); /* 前四项的和 */ c=a*(a+d)*(a+2*d)*(a+3*d); /* 前四项的积 */ if (b=26 & c=880) /*
30、若满足条件 */ goto out; /* 退出二重循环 */ out: for (i=0; i=20; +i) /* 输出运行结果 */ printf(%d, a+i*d);不提倡使用GOTO语句!第 44 页6.6.3 goto statementsmain( ) int a, b, c, d, i, flag=1; /* flag:标志变量 */ for (a=1; a=5 & flag; +a) /* flag!=0是进行循环 */ for (d=1; d=3 & flag; +d) b=a+(a+d)+(a+2*d)+(a+3*d); /* 前四项的和 */ c=a*(a+d)*(a
31、+2*d)*(a+3*d); /* 前四项的积 */ if (b=26 & c=880) /* 若满足条件 */ for (i=0; i=20; +i) /* 输出结果 */ printf(%d, a0+i*d0); flag = 0; /* 控制退出二重循环 */ 通过增加标志变量可以有效地控制循环第 45 页6.6.4 return statementsGrammar格式一:return;格式二:return (表达式);Usage of return statements 1.return语句使程序从被调用函数中返回到调用函数的调用处继续运行。 2.如果return后跟一表达式,则该表达
32、式的值会从被调用函数中带回到调用它的函数,称为返回值。6.7 Design of Iterative structure循环程序的实现要点:归纳出哪些操作需要反复执行? 循环体这些操作在什么情况下重复执行? 循环条件选用合适的循环语句for while do-while循环具体实现时考虑(循环条件):事先给定循环次数,首选for通过其他条件控制循环,考虑while或do-while#include int main(void) int i, mark, max, n; printf(Enter n: ); scanf (%d, &n); printf(Enter %d marks: , n);
33、 scanf (%d, &mark); /* 读入第一个成绩 */ max = mark; /* 假设第一个成绩是最高分 */ for (i = 1; i n; i+ ) scanf (%d, &mark); if (max mark) max = mark; printf(Max = %dn, max); return 0;输入一批学生的成绩,求最高分(for)mark maxmaxmarkEnter n: 5Enter 5 maks: 67 88 73 54 82Max = 88Enter n: 0Example#include int main(void) int mark, max; printf(“Enter marks:); scanf (%d, &mark); /* 读入第一个成绩 */ max = mark; /* 假设第一个成绩最高分 */ while (mark = 0) if(max mark) max = mark ; scanf (%d, &mark ); ; printf(Max = %dn, max); return 0;输入一批学生的成绩,求最
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 政府车库管理办法
- 政府议事管理办法
- 指南规程管理办法
- 戒烟控烟管理办法
- 政府费用管理办法
- 投入预算管理办法
- 报账员+管理办法
- 建筑区域管理办法
- 日常采购管理办法
- 林地置换管理办法
- 2026版高三一轮总复习(数学)第六章 第4课时 数列求和 课件
- 心衰患者营养治疗
- 2025至2030中国石油化工行业市场发展现状及前景趋势与投资报告
- 杭州婚姻介绍管理办法
- 三年级语文上册阅读与理解试卷(15篇)
- 配电运检-试卷及答案练习试题
- 浙江首考2025年1月普通高等学校招生全国统一考试政治试卷(含答案)
- 悬灸技术课件
- 术后患者腹胀护理
- 术后伤口的观察及护理
- 2025至2030中国自动点胶机行业发展分析及竞争格局与发展趋势分析与未来投资战略咨询研究报告
评论
0/150
提交评论