循环嵌套结构的实现_第1页
循环嵌套结构的实现_第2页
循环嵌套结构的实现_第3页
循环嵌套结构的实现_第4页
循环嵌套结构的实现_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

1、1第二讲循环嵌套结构的实现2主要内容n模块化程序设计方法模块化程序设计方法nwhile语句语句ndo.while语句语句n循环嵌套结构的实现循环嵌套结构的实现n复合复合嵌套结构的实现嵌套结构的实现nbreak和和continuen参考教材参考教材4.1、3.3.2、3.3、3.4、3.5、3.63模块化程序设计方法 P84n模块化设计思想是将系统进行分解成若干功能独模块化设计思想是将系统进行分解成若干功能独立的,能分别设计、编程和测试的模块。立的,能分别设计、编程和测试的模块。n实际上是一种实际上是一种“分而治之分而治之”的思想,把一个大任的思想,把一个大任务分为若干个子任务,每一个子任务相对

2、简单。务分为若干个子任务,每一个子任务相对简单。n在拿到一个程序模块以后,根据程序模块的功能在拿到一个程序模块以后,根据程序模块的功能将它划分为若干个子模块,如果这些子模块的规将它划分为若干个子模块,如果这些子模块的规模还嫌大,还再可以进一步划分更小的模块。这模还嫌大,还再可以进一步划分更小的模块。这个过程采用自顶向下方法来实现。个过程采用自顶向下方法来实现。模块化设计模块化设计自顶向下自顶向下5划分子模块的原则n模块化程序设计特点模块化程序设计特点:(:(1)()(6)P84n子模块一般不超过子模块一般不超过50行。行。n划分子模块时应注意模块的独立性,即:划分子模块时应注意模块的独立性,即

3、:一个模块完成一项功能,模块间耦合性愈一个模块完成一项功能,模块间耦合性愈少愈好。少愈好。n通过编写独立函数实现模块化程序设计通过编写独立函数实现模块化程序设计P26while 语句 P57while (表达式表达式) 循环体语句循环体语句; 真真假假while下一条语句下一条语句表达式表达式循环体语句循环体语句循环条件循环条件循环体循环体一条语句,分号结束一条语句,分号结束7实例实例1n使用格里高利公式求使用格里高利公式求的近似值,要求的近似值,要求精确到精确到最后一项的绝对值小于最后一项的绝对值小于104。n程序解析程序解析nwhile语句的使用语句的使用 111143578#includ

4、e #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; pi = pi * 4; printf (pi = %fn, pi); return 0;程序解析程序解析求求的近似值的近似值sa

5、mple22_15.cpp运行结果:运行结果:pi = 3.141793 /4=1-1/3+1/5-1/7 P87Denominatordnmnet fabs(item)求:浮求:浮点数点数item绝对值绝对值小于小于104 例例4-3(a) 定义一个函数,实现用公式定义一个函数,实现用公式 求求的值。的值。 71513114/* 定义一个函数定义一个函数 ,求,求Pi的近似值的近似值*/#include float SelPi(void) /求求pi int nSign=1; float fNumber=1.0,fTerm=1,fPi=0; while(fabs(fTerm)1e-6) fP

6、i=fPi+fTerm; fNumber=fNumber+2; nSign=-nSign; fTerm=nSign/fNumber; return(4*fPi);#include void main() float SelPi(void);/函数声明 printf(pi=%.5fn,SelPi();编写编写main函数调用函数调用P87/绝对值小于绝对值小于10610while 语句和for语句都是在循环前先判断条件while 语句说明把把for语句改写成语句改写成while语句语句for(表达式表达式1; 表达式表达式2; 表达式表达式3) 循环体语句循环体语句表达式表达式1;while (

7、表达式表达式2) for的循环体语句的循环体语句; 表达式表达式3;11while 和 for 的比较for (i = 1; i = 10; i+) sum = sum + i; i = 1; 循环变量赋初值循环变量赋初值while (i = 10) 循环条件循环条件 sum = sum + i; i+; 循环变量的改变循环变量的改变循循环环体体12标识性循环n特点:特点:n循环次数在运行前是不缺定的循环次数在运行前是不缺定的n根据某个变量的值确定循环是否终止根据某个变量的值确定循环是否终止n该变量该变量标识性循环控制变量标识性循环控制变量13标识性循环变量分析n标识性循环变量三要素标识性循环

8、变量三要素初值初值终值终值改变变量的值改变变量的值nitem1.0fabs (item) 0.0001(终止终止)item = flag * 1.0 / denominator;14n从键盘输入一批学生的成绩,计算平均分。从键盘输入一批学生的成绩,计算平均分。sample22_16.cppn分析:分析:求累加和求累加和确定循环条件确定循环条件n不知道输入数据的个数,无法事先确定循环次数不知道输入数据的个数,无法事先确定循环次数n用一个用一个特殊的数据特殊的数据作为正常输入数据的结束标志,作为正常输入数据的结束标志,比如选用一个负数作为结束标志比如选用一个负数作为结束标志。实例实例215循环控制

9、分析:n循环控制变量循环控制变量 grade初值:初值:n键盘输入第一个成绩键盘输入第一个成绩终值:终值:ngrade= 0) scanf (“%lf”, &grade);n分析:分析:p变量变量total:累加和:累加和p变量变量num:计数计数n编程实现编程实现16#include int main(void) int num; double grade, total; num = 0; total = 0;printf(Enter grades: ); scanf(%lf, &grade); /*输入第输入第1个成绩个成绩*/ while ( grade = 0) /* 输入负数,循环结

10、束输入负数,循环结束 */ total = total + grade; num+; scanf (%lf, &grade); /*输入下输入下1个成绩个成绩*/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: -1Grade average is 017实例3 取位算法 sample22_17.cppn从键盘读入一

11、个整数,统计该数的位数。例从键盘读入一个整数,统计该数的位数。例如,输入如,输入12534,输出,输出5;输入;输入99,输出,输出2;输入输入0,输出,输出1。思路:。思路:1.被被10整除减少一位个位数,组成一个新数,整除减少一位个位数,组成一个新数,位数位数+1。 12534/10=12532.循环控制:每次被循环控制:每次被10整除后构造一个新数,整除后构造一个新数,直到该数为直到该数为0。1253/10、 125/10、 12/10、1/10=018循环控制分析n循环控制变量:循环控制变量: number计数:计数:count初值:初值:number终值:终值:0改变变量的值:改变变

12、量的值:number/=10while(number) number/=10; count+; number!=0number=number/10写出写出while语句!语句!编写程序实现!编写程序实现!19/* 统计一个整数的位数统计一个整数的位数 */#include int main(void) int count, number; /*count 记录整数记录整数number的位数的位数 */ count = 0; printf(“Enter a number:”); scanf (%d, &number); if(number 0) number = -number; /* 将输入的

13、负数转换为正数将输入的负数转换为正数 */ while(number != 0) number = number / 10; /* 整除后减少一位个位数,组成一个新数整除后减少一位个位数,组成一个新数 */ count +; /* 位数加位数加1 */ printf(It contains %d digits.n, count); return 0;Enter a number: 12534It contains 5 digits.Enter a number: -99It contains 2 digits.Enter a number: 0It contains 0 digits.20思考

14、n输入一个输入一个正正整数,求整数,求计算其中计算其中a的个数:的个数:20221中有中有3个个2逆序输出每一位数:逆序输出每一位数:12202每一位数之和:每一位数之和:7正序输出每一位数正序输出每一位数n水仙花数:每一位的立方和就是数本身水仙花数:每一位的立方和就是数本身输出输出100-400之间的水仙花数之间的水仙花数21do.while语句n第一次不验证循环条件,直接执行循环体第一次不验证循环条件,直接执行循环体的语句的语句22#includeint main(void) int count, number; count = 0;printf(Enter a number: );sca

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

16、hile (number != 0) number = number / 10; count +;Enter a number: 0It contains 0 digits.23do - while 语句 P60do 循环体语句循环体语句 while (表达式表达式);先执行循环体先执行循环体后判断后判断真真假假表达式表达式循环体语句循环体语句do-while的下一条语句的下一条语句24while 和 do-while 的比较真真假假表达式表达式循环体语句循环体语句do-while的下一条语句的下一条语句真真假假while的下一条语句的下一条语句表达式表达式循环体语句循环体语句nwhile 是

17、先判别条件,再决定是否循环;是先判别条件,再决定是否循环;ndo-while 是先至少循环一次,然后再根据循是先至少循环一次,然后再根据循环的结果决定是否继续循环。环的结果决定是否继续循环。25如何选择合适的循环语句?如何选择合适的循环语句?P67if(循环次数已知)(循环次数已知) 使用使用for语句语句else /* 循环次数未知循环次数未知 */if (循环条件在进入循环时明确循环条件在进入循环时明确)使用使用while语句语句else /* 循环条件需要在循环体中明确循环条件需要在循环体中明确 */使用使用do-while语句语句26循环嵌套结构n循环结构体里包含其它循环结构体里包含其

18、它顺序语句顺序语句选择语句选择语句n循环结构体里包含其它循环结构体里包含其它循环结构循环结构n复合嵌套复合嵌套选择结构和循环结构相互嵌套选择结构和循环结构相互嵌套n参考参考3.527循环嵌套结构(一)画图形n画图形:n行 n分析“行”号与“*”、空格个数关系n i 空格空格 星号星号1 5 12 4 33 3 54 2 75 1 96 0 11归纳归纳 n-i 2*i-1n=628分析过程n循环i从1到n行,step 1输出一行输出一行:输出一行:1.输出空格输出空格2.输出星号输出星号3.回车回车输出空格:输出空格:循环变量循环变量j从从1到到n-1 输出一个空格输出一个空格输出星号:输出星

19、号:循环变量循环变量j从从1到到2*i-1 输出一个星号输出一个星号29算法 sample02_06.cpp循环循环i从从1到到n行行, step 1 1.输出空格输出空格 循环循环j从从1到到n-i 输出一个空格输出一个空格 2.输出星号输出星号 循环循环j从从1到到2*i-1 输出一个星号输出一个星号 3.回车回车n写出循环语句写出循环语句n编程实现编程实现/循环循环i从从1到到n行行 step 1for(i=1;i=n;i+) / 1.输出空格输出空格 for(j=1;j=n-i;j+) printf( ); / 2.输出星号输出星号 for(j=1;j=2*i-1;j+) printf

20、( *); / 3.回车回车 printf(n); #include int main()int n,i,j;/输入输入nprintf(Input n:);scanf(%d,&n);/循环循环i从从1到到n行行 step 1for(i=1;i=n;i+) / 1.输出空格输出空格 for(j=1;j=n-i;j+) /循环循环j从从1到到n-i printf( ); / 输出一个空格输出一个空格/ 2.输出星号输出星号 for(j=1;j=2*i-1;j+)/循环循环j从从1到到2*i-1 printf( *); / 输出一个星号输出一个星号/ 3.回车回车 printf(n); return

21、 0;31循环嵌套结构(二)统计n输入输入n个学生的学号和个学生的学号和5门课的成绩,求每位同学门课的成绩,求每位同学5门课的总分和平均分,最后输出班级平均总分、门课的总分和平均分,最后输出班级平均总分、最高总分和学号最高总分和学号n分析分析每位同学的总分每位同学的总分 sum班级总分班级总分 total最高总分最高总分 max最高分学号最高分学号maxno32算法算法sample02_05.cpp1.初值:初值: total=0,max=-1,maxno=-12.外循环:外循环:i从从1到到n,step 1。( n个学生)个学生) (1) 输入学号输入学号 (2) sum=0 (3) 内循环

22、:内循环:j从从1到到5,step 1。( 5门课)门课) 输入一个成绩输入一个成绩x, sum=sum+x (4) 输出该学生的学号,总分和平均分输出该学生的学号,总分和平均分 (5) total=total+sum (6) 若该学生的总分比若该学生的总分比max高,修正高,修正max和和maxno值值3. 输出班级总分和平均分,最高分学生的学号和总分输出班级总分和平均分,最高分学生的学号和总分按要求编程,实现功能按要求编程,实现功能! !#include void main() int n;/班级人数班级人数 int no;/学生学号学生学号 int x; /学生成绩学生成绩 int su

23、m;/学生总分学生总分 int total;/班级总分班级总分 int max;/班级最高总分班级最高总分 int maxno;/班级最高总分学生学号班级最高总分学生学号 int i,j;/循环变量循环变量 printf(input n:); scanf(%d,&n);/输入学生人数输入学生人数 total=0,max=-1,maxno=-1; /1.初值初值 /2.外循环外循环i从从1到到n step 1 for(i=1;i=n;i+) printf(ninput no:); / (1)输入学号输入学号 scanf(%d,&no); sum=0;/ (2) 学生总分学生总分sum=0 for

24、(j=1;jmax) max=sum; maxno=no; /3.输出班级总分和平均分,最高分学生的学号和总分输出班级总分和平均分,最高分学生的学号和总分 printf(nclass sum=%d,class average=%.2f, maxno=%d,maxsum=%d, total,total*1.0/n,maxno,max);34复合嵌套结构n选择结构和循环结构相互嵌套35实例 sample21_12.cpp假设自动售货机出售假设自动售货机出售4种商品,薯片种商品,薯片(crisps)、爆米花、爆米花(popcorn)、巧克力、巧克力(chocolate)和可乐和可乐(cola),售价

25、分,售价分别是每份别是每份3.0、2.5、4.0和和3.5元。在屏幕上显示以下菜元。在屏幕上显示以下菜单,单,用户可以连续查询商品的价格,当查询次数超过用户可以连续查询商品的价格,当查询次数超过5次时,自动退出查询;不到次时,自动退出查询;不到5次时,用户可以选择退出次时,用户可以选择退出。当用户输入编号当用户输入编号14,显示相应商品的价格;输入,显示相应商品的价格;输入0,退出查询;输入其他编号,显示价格为,退出查询;输入其他编号,显示价格为0。1 Select crisps2 Select popcorn 3 Select chocolate4 Select cola 0 Exit上机编

26、程,调试实现!上机编程,调试实现!36#include Int main(void) int choice, i; double price; for( i = 1; i m-1m-1:一直没有找到能被整除:一直没有找到能被整除m m的的i i,则,则是素数是素数算法解析判断素数算法:除了算法:除了1和和m,不能被其它数整除。,不能被其它数整除。设设 i 取值取值 2, m-1 n如果如果m不能被该区间上的任何一个数整除,即对不能被该区间上的任何一个数整除,即对每个每个i,m%i 都不为都不为0,则,则m是素数是素数n只要找到一个只要找到一个i,使使m%i为为0,则,则m肯定不是素数肯定不是素

27、数m %2 %3 %4 %5 %(m-1)非非素数素数 | =0 =0 是素数是素数 & !=0 !=0 m不可能被大于不可能被大于 m/2 的数整除,如:的数整除,如:13/7,14/8 i 取值范围:取值范围: 2, m-1 、 2, m/2 、 2, sqrt(m)n能不能写出嵌套结构?能不能写出嵌套结构?mfor(i = 2; i m/2) printf(“yesn”); /循环正常结束循环正常结束else printf(non”);写出源程序!写出源程序!#include int main(void) int i, m;printf(Enter a number: );scanf (

28、%d, &m);for (i = 2; i m/2 ) printf(%d is a prime number! n, m); else printf(No!n); 源程序Enter a number: 9NoEnter a number: 1111 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);#include int main(void) int i, m;print

29、f(Enter a number: );scanf (%d, &m);for (i = 2; i = m/2; i+) if (m % i = 0) printf(No!n); else printf(%d is a prime number! n, m);40Enter a number:77 is a prime number!7 is a prime number! i i= m/2=3 7%i=02 真真 假假 7 is a prime number! 3 真真 假假 7 is a prime number!4 假退出循环假退出循环41break和continuencontinue:跳

30、出本次循环,开始下一次循:跳出本次循环,开始下一次循环环 P70nbreak:跳出循环体:跳出循环体 P6842break 和 continue#include void main(void) char c; int i; for (i = 0; i =0&c n 则是则是素数素数,输出,输出n编程实现!编程实现!每行输出每行输出10个素数个素数参考程序参考程序/*判断判断m是否为素数是否为素数*/#include int main(void) int i, m;printf(Enter a number: );scanf (%d, &m);for (i = 2; i m/2 ) printf

31、(%d is a prime number! n, m); else printf(No!n); /* 使用嵌套循环求使用嵌套循环求100以内的全部以内的全部素数,每行输出素数,每行输出10个。个。 */#include /* 调用求调用求平方根函数平方根函数,需要包含数,需要包含数学库学库 */#include int main(void) int count, i, m, n; /* count:个数,控制输出格式:个数,控制输出格式 */ count = 0; for(m = 2; m = 100; m+) n = sqrt(m); for(i = 2; i n) /*若若m是素数是素数

32、 */ printf(%6d, m); /* 输出输出m */ /* 累加已经输出的素数个数累加已经输出的素数个数 */ count+; if(count % 10 = 0) /* 如果如果count是是10的倍数,换行的倍数,换行 */ printf(n); printf(n); return 0; 2 3 5 7 11 13 17 19 23 2931 37 41 43 . 7173 79 83 89 9746复合嵌套结构(二)穷举法n穷举(枚举)所有可能的方案,对每一种穷举(枚举)所有可能的方案,对每一种方案检查是否符合约束条件。找出所有可方案检查是否符合约束条件。找出所有可能的解。能的

33、解。47穷举法举例搬砖问题n某工地需要搬运砖块。已知男人某工地需要搬运砖块。已知男人men一人搬一人搬3块,块,女人女人women一人搬一人搬2块,小孩块,小孩child两人搬一块。问两人搬一块。问用用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) p

34、rintf(men=%d women=%d child=%dn, men, women, child);三重循三重循环环循环次数循环次数46*46*4648解决方案(2) sample22_08.cppfor (men = 0; men = 15; men+)for (women = 0; women p1 (m1是素数是素数) 则则 (i) m2=i-m1 (ii) p2=sqrt(m2) (iii)循环循环j从从2到到p2 如果如果 m2能被能被j整除则跳出整除则跳出 (iiii)如果如果jp2( m2 是一个素数是一个素数) 则则 i 验证成功验证成功 输出,输出,n+,跳出,跳出(1.的循环的循环) 2. 如果如果n%5 为为0则换行则换行判断素数判断素数程序复杂!程序复杂!分而治之!分而治之!51嵌套结构函数结构示例sample02_10.cpp(1)编写函数编写函数int isPrim

温馨提示

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

评论

0/150

提交评论