第四章循环结构_第1页
第四章循环结构_第2页
第四章循环结构_第3页
第四章循环结构_第4页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、第第 四四 章章 循环结构循环结构while语句语句do while 语句语句break和和continue语句语句 1385811513214.1 用格里高利公式求用格里高利公式求的近似值的近似值使用格里高利公式求使用格里高利公式求的近似值,要求精的近似值,要求精确到最后一项的绝对值小于确到最后一项的绝对值小于104。 1385811513221,3,5,7,分之一,正负交替分之一,正负交替 flag = 1; /* int */ denominator = 1; /* int */ item = 1.0; /* double */ pi = 0; /* double */ while(fa

2、bs (item) = 0.0001) item = flag * 1.0 / denominator; pi = pi + item; flag = -flag; denominator = denominator +2; pi = pi * 4; 4.1.1 程序解析求程序解析求的近似值的近似值 1385811513234.1.2 while 语句语句while (条件表达式条件表达式) 循环体语句循环体语句; 真真假假while下一条语句下一条语句表达式表达式循环体语句循环体语句循环条件循环条件循环体循环体 138581151324复合语句复合语句 138581151325for ( i

3、=1; in; i+) item = 1.0/i; sum = sum + item;for ( i=1; in; i+) sum = sum + i;if( x0 ) x = -x;if( xy ) temp = x; x = y; y = temp;while 语句和语句和for语句语句都是在循环前先判断条件都是在循环前先判断条件while 语句说明语句说明表达式表达式1;while (表达式表达式2) 循环体语句循环体语句; 表达式表达式3; 138581151326for(表达式表达式1; 表达式表达式2; 表达式表达式3) 循环体语句循环体语句改写改写for语句为语句为while 语

4、句语句while 和和 for 的比较的比较for (i = 1; i = 10; i+) sum = sum + i; i = 1; 循环变量赋初值循环变量赋初值while (i = 10) 循环条件循环条件 sum = sum + i; i+; 循环变量的改变循环变量的改变循环体循环体 138581151327例例4-2 从键盘输入一批学生的成绩,计算平均从键盘输入一批学生的成绩,计算平均分。分。分析:分析:求累加和求累加和确定循环条件确定循环条件n不知道输入数据的个数,无法事先确定循环次数不知道输入数据的个数,无法事先确定循环次数n用一个用一个特殊的数据特殊的数据作为正常输入数据的结束标

5、志,作为正常输入数据的结束标志,比如选用一个负数作为结束标志比如选用一个负数作为结束标志。4.1.3 统计输入的一批学生的平均成绩统计输入的一批学生的平均成绩 138581151328#include Int main(void) int num; double grade, total; num = 0; total = 0;printf(“Enter grades: n); scanf(%lf, &grade); /* 输入第输入第1个数个数*/while (grade= 0) /* 输入负数,循环结束输入负数,循环结束 */ total = total + grade; num+

6、; scanf (“%lf”, &grade);if(num != 0) printf(“Grade average is %.2fn, total/num);else printf( Grade average is 0n); return 0;Enter grades: 67 88 73 54 82 -1Grade average is 72.80Enter grades: -1 67 88 73 54 82Grade average mark 1385811513294.2.2 do - while 语句语句do 循环体语句循环体语句 while (表达式表达式)先循环先循环后判

7、断后判断真真假假表达表达式式循环体语句循环体语句do-while的下一条语句的下一条语句 13858115132104.2 统计一个整数的位数统计一个整数的位数从键盘读入一个整数,统计该数的位数。从键盘读入一个整数,统计该数的位数。4.2.1 程序解析程序解析4.2.2 do - while语句语句 4.2.3 循环语句的选择循环语句的选择 1385811513211int main(void) int count, number; count = 0;printf(“Enter a number: );scanf (%d, &number) ;if (number 0) number

8、 = -number; do number = number / 10; count +; while (number != 0);printf(It contains %d digits.n, count); return 0;4.2.1 程序解析统计一个整数的位数程序解析统计一个整数的位数Enter a number: 12534It contains 5 digits.Enter a number: -99It contains 2 digits.Enter a number: 0It contains 1 digits.while (number != 0) number = numb

9、er / 10; count +; 1385811513212if (number=0) count = 1;n while 是先判别条件,再决定是否循环;是先判别条件,再决定是否循环;n do-while 是先至少循环一次,然后再根据是先至少循环一次,然后再根据循环的结果决定是否继续循环。循环的结果决定是否继续循环。while 和和 do-while 的比较的比较真真假假表达式表达式循环体语句循环体语句do-while的下一条语句的下一条语句真真假假while的下一条语句的下一条语句表达式表达式循环体语句循环体语句 13858115132134.2.3 循环语句的选择循环语句的选择if(循环

10、次数已知)循环次数已知) 使用使用for语句语句else /* 循环次数未知循环次数未知 */if (循环条件在进入循环时明确循环条件在进入循环时明确)使用使用while语句语句else /* 循环条件需要在循环体中明确循环条件需要在循环体中明确 */使用使用do-while语句语句 13858115132144.3 判断素数判断素数输入一个正整数输入一个正整数m,判断它是否为素数。判断它是否为素数。 13858115132154.3.1 程序解析判断素数程序解析判断素数算法:除了算法:除了1和和m,不能被其它数整除。,不能被其它数整除。设设 i 取值取值 2, m-1 n如果如果m不能被该区

11、间上的任何一个数整除,即对不能被该区间上的任何一个数整除,即对每个每个i,m%i 都不为都不为0,则,则m是素数是素数n只要找到一个只要找到一个i,使使m%i为为0,则,则m肯定不是素数肯定不是素数m %2 %3 %4 %5 %(m-1)不是素数不是素数 | =0 =0是素数是素数 & !=0 !=0 m不可能被大于不可能被大于 m/2 的数整除的数整除 i 取值取值 2, m-1 、 2, m/2 、 2, mfor(i = 2; i m/2) printf(yesn)else printf(non”); 1385811513216int main(void) int i, m;pr

12、intf(“Enter a number: );scanf (%d, &m);for (i = 2; i m/2 ) printf(%d is a prime number! n, m); else printf(No!n); 例例4-4源程序判断素数源程序判断素数Enter a number: 9NoEnter a number: 1111 is a prime number!循环条件循环条件?循环的结束条件循环的结束条件? 1385811513217break 语句语句while(exp) 语句语句1 if (expb) break; 语句语句2真真假假 exp 语句语句1假假ex

13、pb 语语 句句2循环体循环体真真for (i = 2; i m/2 ) printf(Yes); else printf(No!n); 当循环有多个出口时:当循环有多个出口时: 区分与处理结束条件区分与处理结束条件for(i = 2; i = m/2; i+) if(m%i = 0) printf(No!n); break; printf(Yes); 1385811513218continue 语句语句while(exp) 语句语句1 if (expb) continue; 语句语句2真真假假 exp 语句语句1假假expb 语语 句句2循环体循环体真真跳过跳过continue后面的语句,继

14、续下一次循环后面的语句,继续下一次循环 1385811513219break 和和 continue#include stdio.hint main(void) char c; int i; for (i = 0; i 10; i+) c = getchar(); if (c = n) break; putchar(c); abc efgh 123 abcabcefgh1continue; 13858115132204.4 求求1! + 2! + . + 100!for (i = 1; i = 100; i+) item = i ! sum = sum + item;4.4.1 程序解析程序解

15、析调用函数调用函数 fact(i) 计算计算 i 的阶乘的阶乘4.4.2 嵌套循环嵌套循环用循环计算用循环计算 i 的阶乘的阶乘 1385811513221#include double fact (int n); int main(void) int i; double sum; sum = 0; for(i = 1; i = 100; i+ ) sum = sum + fact (i); printf(1! + 2! + 3! + + 100! = %en, sum); return 0;double fact (int n) int i; double result = 1; for (

16、i = 1; i = n; i+) result = result * i ; return result ; 4.4.1 程序解析程序解析 求求1! + 2! + . + 100! 13858115132224.4.2 嵌套循环嵌套循环for (i = 1; i = 100; i+) item = i ! sum = sum + item;for(i = 1; i = 100; i+) item = 1; for (j = 1; j = i; j+) item = item * j; sum = sum + item; 1385811513223例例4-6 源程序源程序#include in

17、t main(void) int i, j;double item, sum; /* item 存放阶乘存放阶乘 */sum = 0; for(i = 1; i = 100; i+) item = 1; /* 每次求阶乘都从每次求阶乘都从1开始开始 */ for (j = 1; j = i; j+) /* 内层循环算出内层循环算出 item = i! */ item = item * j; sum = sum + item; printf(1! + 2! + 3! + + 100! = %en, sum); 1385811513224内层循环的初始化内层循环的初始化for(i = 1; i =

18、 100; i+) item = 1; for (j = 1; j = i; j+) item = item * j; sum = sum + item; 求求1! + 2! + . + 100!item = 1;for(i = 1; i = 100; i+) for (j = 1; j = i; j+) item = item * j; sum = sum + item; 求求1! + 1!*2! + + 1!*2!*100! 1385811513225分析嵌套循环的执行过程分析嵌套循环的执行过程for(i = 1; i = 100; i+) item = 1; for (j = 1; j

19、= i; j+) item = item * j; sum = sum + item; n 外层循环变量外层循环变量 i 的每个值的每个值内层循环变量内层循环变量 j 变化一个轮次;变化一个轮次;n 内外层循环变量不能相同内外层循环变量不能相同分别用分别用 i 和和 1385811513226i = 1j = 1输出 1 1 (第1次输出)j = 1输出 2 1 (第2次输出)i = 2j = 2输出 2 2 (第3次输出)j = 1输出 100 1 (第4951次输出)j = 2输出 100 2 (第4952次输出)i = 100j = 100输出 100 100 (第5050次输出)for

20、 (i = 1; i = 100; i+) for (j = 1; j = i; j+) printf (%d %dn, i, j ); 13858115132274.5 循环程序设计循环程序设计n循环程序的实现要点:循环程序的实现要点:归纳出归纳出哪些操作需要反复执行?哪些操作需要反复执行? 循环体循环体这些操作在什么情况下重复执行这些操作在什么情况下重复执行? 循环条件循环条件n选用合适的循环语句选用合适的循环语句for while do-whilen循环具体实现时考虑(循环条件):循环具体实现时考虑(循环条件):事先给定循环次数,首选事先给定循环次数,首选for通过其他条件控制循环,考虑

21、通过其他条件控制循环,考虑while或或do- 1385811513228#include int main(void) int i, mark, max, n; printf(Enter n: ); scanf (%d, &n); printf(Enter %d marks: , n); scanf (%d, &mark); /* 读入第一个成绩读入第一个成绩 */ max = mark; /* 假设第一个成绩是最高分假设第一个成绩是最高分 */ for (i = 1; i n; i+ ) scanf (%d, &mark); if (max mark) max =

22、mark; printf(Max = %dn, max); return 0;例例4-7 输入一批学生的成绩,求最高分输入一批学生的成绩,求最高分(for)mark maxmaxmarkEnter n: 5Enter 5 maks:67 88 73 54 82Max = 88Enter n: 1385811513229#include int main(void) int mark, max; printf(“Enter marks:); scanf (%d, &mark); /* 读入第一个成绩读入第一个成绩 */ max = mark; /* 假设第一个成绩最高分假设第一个成绩最高

23、分 */ while (mark = 0) if(max mark) max = mark ; scanf (%d, &mark ); ; printf(Max = %dn, max); return 0;例例4-7 输入一批学生的成绩,求最高分输入一批学生的成绩,求最高分(while)Enter marks:67 88 73 54 82 -1Max = 88Enter marks:- 1385811513230#include int main(void) int mark, max; max = -1; /* 给给max赋一个小初值赋一个小初值 */ printf(“Enter m

24、arks: ); do scanf (%d, &mark ); if (max = 0); printf(Max = %dn, max);例例4-7 输入一批学生的成绩,求最高分输入一批学生的成绩,求最高分(do-while)Enter marks: 67 88 73 54 82 -1Max = 88Enter marks: - 1385811513231例例4-8 将一个正整数逆序输出将一个正整数逆序输出确定:确定:循环条件循环条件和和循环体循环体(循环不变式循环不变式) 12345 5 4 3 2 112345 % 10 = 5 12345 / 10 = 1234 1234 % 1

25、0 = 4 1234 / 10 = 123 123 % 10 = 3 123 / 10 = 12 12 % 10 = 2 12 / 10 = 1 1 % 10 = 1 1 / 10 = 0 结束结束循环不变式循环不变式 x%10 x=x/10循环结束条件循环结束条件 x=0scanf( “%d”, &x);while (x != 0) digit = x %10; x = x/10 ; printf( %d , digit);用用do-while实现?实现? 1385811513232例例4-9 求求500以内的全部素数,每行输出以内的全部素数,每行输出10个个for (m = 2;

26、m = 500; m+) if (m是素数是素数) printf( %d, m);n = sqrt(m);for(i = 2; i n) printf(yesn)else printf(non”);for (m = 2; m = 500; m+) n=sqrt(m); for(i = 2; i n) printf(%d, m) 1385811513233例例4-9 源程序源程序#include #include int main(void) int count, i, m, n; count = 0; for (m = 2; m = 500; m+) n = sqrt(m); for (i =

27、 2; i n) /* 如果如果m是素数是素数 */ printf(%6d, m); count+; if (count %10 = 0) printf(“n”); 1385811513234例例4-10 求求Fibonacci序列:序列:1,1,2,3,5,8,13, 1, 1, 2, 3, 5, 8, 13, x1 x2 x x1 x2 xx1 = x2 = 1;x = x1 + x2;x1 = x2;x2 = x;x1 = 1;x2 = 1;printf (%6d%6d, x1, x2 ); /* 输出头两项输出头两项 */for (i = 1; i = 8; i+) /* 循环输出后循

28、环输出后8项项 */ x = x1 + x2; /* 计算新项计算新项 */ printf(%6d, x); x1 = x2; /* 更新更新x1和和x2 */ x2 = x; 1385811513235例例4-11古典算术问题搬砖头古典算术问题搬砖头某地需要搬运砖块,已知男人一人搬某地需要搬运砖块,已知男人一人搬3块,女人块,女人一人搬一人搬2块,小孩两人搬一块。块,小孩两人搬一块。问用问用45人正好搬人正好搬45块砖,有多少种搬法?块砖,有多少种搬法?for (men = 0; men = 45; men+) for (women = 0; women = 45; women+) for (child = 0; child = 45; child+) if (men+women+child=45) & (men*3+women*2+child*0.5=45) printf(men=%d women=%d child=%dn, men, women, child); 1385811513236例例4-11 源程序源程序(2)for (men = 0; men = 15; men+)for (women = 0; wom

温馨提示

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

评论

0/150

提交评论