四章循环结构.ppt

上传人:本田雅阁 文档编号:3206895 上传时间:2019-07-31 格式:PPT 页数:38 大小:379.05KB
返回 下载 相关 举报
四章循环结构.ppt_第1页
第1页 / 共38页
四章循环结构.ppt_第2页
第2页 / 共38页
四章循环结构.ppt_第3页
第3页 / 共38页
四章循环结构.ppt_第4页
第4页 / 共38页
四章循环结构.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《四章循环结构.ppt》由会员分享,可在线阅读,更多相关《四章循环结构.ppt(38页珍藏版)》请在三一文库上搜索。

1、第 四 章 循环结构,4.1 用格里高利公式求的近似值 (while语句) 4.2 统计一个整数的位数 (do-while语句) 4.3 判断素数 (break 和 continue 语句) 4.4 求1!+2!+.+100! (循环嵌套) 4.5 循环结构程序设计,本章要点,什么是循环? 为什么要使用循环? 如何实现循环? 实现循环时,如何确定循环条件和循环体? 怎样使用while 和do-while语句实现次数不确定的循环? while 和do-while语句有什么不同? 如何使用break语句处理多循环条件? 如何实现多重循环?,4.1 用格里高利公式求的近似值,使用格里高利公式求的近似

2、值,要求精确到最后一项的绝对值小于104。 4.1.1 程序解析 4.1.2 while语句 4.1.3 输入一批学生的成绩,统计平均分,#include int main(void) int denominator, flag; double item, pi; flag = 1; denominator = 1 ; item = 1.0; pi = 0; while(fabs (item) = 0.0001) item = flag * 1.0 / denominator; pi = pi + item; flag = -flag; denominator = denominator +2

3、; pi = pi * 4; printf ( “pi = %fn”, pi); return 0; ,4.1.1 程序解析求的近似值,pi = 3.141613,item=0.0 ?,fabs(item) 0.0001,4.1.2 while 语句,while (条件) 循环体语句;,循环条件,循环体,一条语句,while 语句和for语句 都是在循环前先判断条件,while 语句说明,表达式1; while (表达式2) for的循环体语句; 表达式3; ,把for语句改写成while语句 for(表达式1; 表达式2; 表达式3) 循环体语句,while 和 for 的比较,for (i

4、 = 1; i = 10; i+) sum = sum + i;,i = 1; 循环变量赋初值 while (i = 10) 循环条件 sum = sum + i; i+; 循环变量的改变 ,循环体,例4-2 从键盘输入一批学生的成绩,计算平均分。 分析: 求累加和 确定循环条件 不知道输入数据的个数,无法事先确定循环次数 用一个特殊的数据作为正常输入数据的结束标志,比如选用一个负数作为结束标志。,4.1.3 统计输入的一批学生的平均成绩,#include Int main(void) int num; double grade, total; num = 0; total = 0; prin

5、tf(“Enter grades: n“); scanf(“%lf“, ,Enter grades: 67 88 73 54 82 -1 Grade average is 72.80,Enter grades: -1 67 88 73 54 82 Grade average mark is,4.2 统计一个整数的位数,从键盘读入一个整数,统计该数的位数。 4.2.1 程序解析 4.2.2 do - while语句 4.2.3 循环语句的选择,int main(void) int count, number; count = 0; printf(“Enter a number: “); scan

6、f (“%d“, ,4.2.1 程序解析统计一个整数的位数,Enter a number: 12534 It contains 5 digits.,Enter a number: -99 It contains 2 digits.,Enter a number: 0 It contains 1 digits.,while (number != 0) number = number / 10; count +; ,4.2.2 do - while 语句,do 循环体语句 while (表达式),先循环,后判断,真,假,表达式,循环体语句,do-while的下一条语句,while 是先判别条件,再

7、决定是否循环; do-while 是先至少循环一次,然后再根据循环的结果决定是否继续循环。,while 和 do-while 的比较,4.2.3 循环语句的选择,if(循环次数已知) 使用for语句 else /* 循环次数未知 */ if (循环条件在进入循环时明确) 使用while语句 else /* 循环条件需要在循环体中明确 */ 使用do-while语句,4.3 判断素数,输入一个正整数m,判断它是否为素数。 4.3.1 程序解析 4.3.2 break语句 和continue语句,4.3.1 程序解析判断素数,算法:除了1和m,不能被其它数整除。 设 i 取值 2, m-1 如果m

8、不能被该区间上的任何一个数整除,即对每个i,m%i 都不为0,则m是素数 只要找到一个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, ,for(i = 2; i m/2) printf(“yesn“) else printf(“non”);,int main(void) int i, m; printf(“Enter a number: “); scanf (“%d“, ,例4-4源程序判断素数,Enter a number:

9、 9 No,Enter a number: 11 11 is a prime number!,for (i = 2; i = m/2; i+) if (m % i = 0) printf(“No!n“); else printf(“%d is a prime number! n“, m);,循环条件? 循环的结束条件?,break 语句,while(exp) 语句1 if (expb) break; 语句2 ,for (i = 2; i m/2 ) printf(“Yes“); else printf(“No!n“);,当循环有多个出口时: 表示循环条件 区分结束条件,for(i = 2; i

10、 = m/2; i+) if(m%i = 0) printf(“No!n“); break; printf(“Yes“);,continue 语句,while(exp) 语句1 if (expb) continue; 语句2 ,跳过continue后面的语句,继续下一次循环,break 和 continue,#include “stdio.h“ int main(void) char c; int i; for (i = 0; i 10; i+) c = getchar(); if (c = n) break; putchar(c); ,abc efgh 123 ,abc,abcefgh1,c

11、ontinue;,4.4 求1! + 2! + . + 100!,for (i = 1; i = 100; i+) item = i ! sum = sum + item; 4.4.1 程序解析 调用函数 fact(i) 计算 i 的阶乘 4.4.2 嵌套循环 用循环计算 i 的阶乘,#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“,

12、 sum); return 0; double fact (int n) int i; double result = 1; for (i = 1; i = n; i+) result = result * i ; return result ; ,4.4.1 程序解析 求1! + 2! + . + 100!,4.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

13、= sum + item; ,例4-6 源程序,#include int 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); ,内层循环的初始化,for(i = 1; i

14、= 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!,分析嵌套循环的执行过程,for(i = 1; i = 100; i+) item = 1; for (j = 1; j = i; j+) item = item

15、 * j; sum = sum + item; ,外层循环变量 i 的每个值 内层循环变量 j 变化一个轮次; 内外层循环变量不能相同 分别用 i 和 j,for (i = 1; i = 100; i+) for (j = 1; j = i; j+) printf (“%d %dn“, i, j );,4.5 循环程序设计,循环程序的实现要点: 归纳出哪些操作需要反复执行? 循环体 这些操作在什么情况下重复执行? 循环条件 选用合适的循环语句 for while do-while 循环具体实现时考虑(循环条件): 事先给定循环次数,首选for 通过其他条件控制循环,考虑while或do-whi

16、le,#include int main(void) int i, mark, max, n; printf(“Enter n: “); scanf (“%d“, ,例4-7 输入一批学生的成绩,求最高分(for),max,mark,Enter n: 5 Enter 5 maks:67 88 73 54 82 Max = 88,Enter n: 0,#include int main(void) int mark, max; printf(“Enter marks:“); scanf (“%d“, ,例4-7 输入一批学生的成绩,求最高分(while),Enter marks:67 88 73

17、 54 82 -1 Max = 88,Enter marks:-1,#include int main(void) int mark, max; max = -1; /* 给max赋一个小初值 */ printf(“Enter marks: “); do scanf (“%d“, ,例4-7 输入一批学生的成绩,求最高分(do-while),Enter marks: 67 88 73 54 82 -1 Max = 88,Enter marks: -1,例4-8 将一个正整数逆序输出,确定:循环条件和循环体(循环不变式),12345 5 4 3 2 1 12345 % 10 = 5 12345

18、/ 10 = 1234 1234 % 10 = 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=0,scanf( “%d”, ,用do-while实现?,例4-9 求500以内的全部素数,每行输出10个,for (m = 2; m = 500; m+) if (m是素数) printf( “%d“, m);,n = sqrt(m); for(i = 2; i n) printf(“yesn“) else

19、 printf(“non”);,for (m = 2; m n) printf(“%d“, m) ,例4-9 源程序,#include #include int main(void) int count, i, m, n; count = 0; for (m = 2; m n) /* 如果m是素数 */ printf(“%6d“, m); count+; if (count %10 = 0) printf(“n”); ,例4-10 求Fibonacci序列:1,1,2,3,5,8,13,1, 1, 2, 3, 5, 8, 13, x1 x2 x x1 x2 x,x1 = x2 = 1; x =

20、 x1 + x2; x1 = x2; x2 = x;,x1 = 1; x2 = 1; printf (“%6d%6d“, x1, x2 ); /* 输出头两项 */ for (i = 1; i = 8; i+) /* 循环输出后8项 */ x = x1 + x2; /* 计算新项 */ printf(“%6d“, x); x1 = x2; /* 更新x1和x2 */ x2 = x; ,例4-11古典算术问题搬砖头,某地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬一块。 问用45人正好搬45块砖,有多少种搬法?,for (men = 0; men = 45; men+) for

21、(women = 0; women = 45; women+) for (child = 0; child = 45; child+) if (men+women+child=45) ,例4-11 源程序(2),for (men = 0; men = 15; men+) for (women = 0; women = 22; women+) child = 45 women men; if (men * 3 + women * 2 + child * 0.5 = 45) printf(“men=%d women=%d child=%dn“, men, women, child); ,for (

22、men = 0; men = 45; men+) for (women = 0; women = 45; women+) for (child = 0; child = 45; child+) if (men+women+child=45) ,比较循环次数,4.5 循环程序设计习题,习题4-9 输入一个整数,从高位开始逐个数字输出。,12345 /10000 = 1 12345 %10000 =2345 2345 /1000 = 2 2345%1000 =345 345 /100 = 3 345%100 =45 45 /10 = 4 45%10 =5 5/1= 5 5%1=5,(1) 如何得到10000 找输入数据对应的幂 pow=1; temp = x; while (x != 0) pow = pow * 10; x =x /10; pow = pow /10; (2) 每次循环pow缩小1/10 (3) pow=0 结束,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1