版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、循环程序设计,5,目录,5.1 概述,计算机程序由若干语句顺序组成。顺序结构的程序只能按照语句的先后顺序从前向后依次执行,分支结构程序虽然允许在执行了某个判断后跳过某些语句执行后面的语句,但也只能按语句的前后次序执行。有时,需要在程序中重复执行某个语句或语句块,就需要循环结构。,生活中的例子,击鼓传花:大家坐成一个圈,鼓声响起的时候将花束顺序交到下一个人的手里,依次向下传递,当鼓声突然中断时停止传花,花束落在谁的手里便成为输家 4100米接力赛跑:第1个人跑完100米后将接力棒传给第2个人,第2个人再跑100米,然后是第3个人,直到第4个人跑完最后一个100米,计算sum=1+2+3+100,
2、1,计算sum=1+2+3+100,1,#include void main( ) int i=1, sum=0 ; while ( i = 100 ) sum = sum + i ; i+ ; printf ( “Sum = %d n”, sum ) ; ,循环体,循环控制条件,循环控制变量,循环的初始化,计算sum=2+4+6+100,2,#include void main( ) int i=0, sum=0 ; while ( i = 100 ) sum = sum + i ; i+=2 ; printf ( “Sum = %d n”, sum ) ; ,循环次数取决于循环控制变量,5
3、.2 while语句和do-while语句,格式: while( 表达式 ) 语句 do 语句 while( 表达式 ) ;,说明: 括号中的“表达式”是循环控制条件,但不限于关系表达式和逻辑表达式 “语句”是单一语句,但可以是复合语句 如果while语句的括号后面只有“;”,则循环体为空。如果do-while语句的括号后面(分号前面)还有其他符号,则出现语法错误,while语句的执行过程,while语句的执行过程是: 计算“表达式”的值; 若“表达式”的值不时0,为“真”,继续执行;否则,结束循环,转到while语句后面的语句继续执行程序; 执行“语句”部分,即执行循环体; 返回继续执行。,
4、do-while语句的执行过程,循环语句的特点,while循环是“先判断后循环”,如果开始时循环条件不满足,循环体就一次也不执行 do-while循环是“先循环后判断”,即使第一次判断的结果为“假”,循环体也已经执行了一次 但不论哪种循环,循环体中必须包含能够使循环条件变为“假”的运算,循环的变化形式计算sum=1+2+3+100,3,#include void main( ) int i=1, sum=0 ; while ( i= 100 ) sum = sum + i+ ; printf ( “Sum = %d n”, sum ) ; ,#include void main( ) int
5、i=1, sum=0 ; do sum = sum + i ; i+; while ( i= 100 ); printf ( “Sum = %d n”, sum ) ; ,循环的嵌套,如果在一个循环的循环体内包含另一个完整的循环则称为循环的嵌套,其中被嵌套的循环称为内循环,而嵌套了内循环的是外循环 内循环还可以嵌套循环,形成多级(层)嵌套,顺序打印110的阶乘,即1!、2!、10!,4,本题的关键是求阶乘 数学上,n!=123(n-1)n,外循环,内循环,#include void main( ) int i=1, j ; float f ; while( i = 10 ) j = 1; f
6、= 1; while( j = i ) f = f * j; j + ; printf( “ %2d! = %.0f n”, i, f ); i + ; ,对比程序: #include void main( ) int i=1; float f = 1; while( i = 10 ) f = f * i; printf( %2d! = %.0f n, i, f ); i + ; ,循环的嵌套不仅可以发生在相同语句之间,如while嵌套while、do-while嵌套do-while,while语句和do-while语句也可以互相嵌套 (1)while(.)(2)while() while()
7、do while(); (3)do(4)do while()do while() ; while() ;,错误的嵌 套形式,循环必须是完整的,不允许内外循环交叉嵌套 f = 1; while( i 10) i=1; do f = f * i; i +; while( i10 );,混乱的控 制条件,内外循环的循环控制条件通常是分开的,相对独立的 i=1; s=0; while ( i 3 ) s = s + f; i = 1; f=1; while( i5) i +=2; f = f * i; i+ ;,应用举例,方法一:将输入的5位数看作是5个独立的数字字符,依次读取每一个数字字符,将其转化
8、为对应的数字后再求和 将数组字符ch转化为数字的方法为ch-0,输入一个5位数,计算并输出各位的和,5,#include void main( ) char ch ; int i=0, sum = 0; printf(“Enter a number with 5 digits: ”); while( i 5 ) ch = getchar( ); sum += ch - 0 ; /* 将数字字符转化为对应的数字 */ i+ ; printf( “Sum of these 5 digits is %dn”, sum ) ; ,几种常见运算: 如果ch为数字字符,则表达式ch - 0的值为对应的数字
9、 如果ch为大写字母,则表达式 ch-A+z 为对应的小写字母 如果ch为小写字母,则表达式 ch-a+A 为对应的大写字母,方法二:将输入的5位数看作一个整数,先读取该整数,再分离出各位数字 对于整数x,其个位数为 x%10 要求整数x的十位数,可以先令x=x/10,再求x的个位数,输入一个5位数,计算并输出各位的和,5,#include void main( ) int x, x1, r, sum = 0; printf(Enter a number: ); scanf( %d, ,任意输入一行字符,统计字母a和A的个数,6,#include void main( ) char ch; i
10、nt count=0; printf( Enter characters: ); do ch = getchar( ); if( ch=A | ch=a ) count+; while( ch != n ); printf( Counter of a or A: %dn , count ); ,利用公式 求 的近似值,7,分析:等式右边的第n项为 因此可将公式变形为 如何计算(-1)n+1 呢?可能首先想到的是用指数运算,其实大可不必,可以取f的初值为-1,那么第1项为f=-f,第2项也是f=-f,,#include void main( ) int f = -1, n =1 ; float
11、t, pi = 0 ;/* t为最后一项的值 */ do f = -f ;/* 第n项的符号 */ t = 1.0 / ( 2*n -1 ) ;/* 用1.0是为了避免整除 */ pi += f * t ; n+ ; while( t 1e-5 ); pi = 4 * pi ; printf( PI = %.4f n, pi ) ; ,5.3 for语句,for语句是最常用的循环控制语句。for语句的功能强大,使用灵活,变化多样,for语句的用法,for( 表达式1 ; 表达式2 ; 表达式3 ) 语句 “表达式1”用于循环的初始化 “表达式2”是for语句的循环控制条件,可以是任何形式的表达
12、式 “表达式3”用于修改循环控制变量的值,目的是使“表达式2”的值变为0,以结束循环 “语句”部分是for语句的循环体,可以是单一语句,也可以是复合语句,for语句的执行过程,使用for语句编程计算sum=1+2+3+100,8,#include void main( ) int i, sum=0 ; for( i =1 ; i=100 ; i+) sum += i ; printf( Sum = %d n, sum ); ,任意输入10个数,求平均值,9,#include void main( ) int i ; float x, sum=0 ; printf( Enter 10 numbe
13、rs one by one: n ); for( i =1 ; i=10 ; i+) scanf( %f, ,循环的嵌套,for语句可以嵌套for语句构成循环的嵌套,也可以与while语句、do-while语句互相嵌套,顺序打印110的阶乘,即1!、2!、10!,10,#include void main( ) int i, j ; float f ; for( i=1; i = 10 ; i+ ) f = 1; for( j=1; j = i ; j+ ) f = f * j; printf( %2d! = %.0f n, i, f ); ,#include void main( ) int
14、 i=1, j ; float f ; while( i = 10 ) j = 1; f = 1; while( j = i ) f = f * j; j + ; printf( “ %2d! = %.0f n”, i, f ); i + ; ,打印几何图形,11,对于这类问题,每行中星号的个数、总行数等都应该用循环结构进行控制,而不是直接输出若干行字符串,#include void main( ) int i, j ; for(i=1; i = 4; i+ ) for( j = 0; ji ; j+ ) putchar( ); for( j = 1; j=6 ; j+ ) putchar(*
15、); putchar(n); ,甲、乙两个会计进行点钞票比赛,甲的速度为5张/秒,乙为8张/秒。乙在甲已经点了100张钞票后才开始,问:要多长时间乙就可以超过甲?,12,经过 t 秒,甲点过的钞票数有 x=100+5t 张,乙的为 y=8t 张 问题就是求 yx 时的 t 值,#include void main( ) int t ; int x=100, y=0 ; for( t=0 ; x y ; t+ ) x = 100+5*t ; y = 8 * t; printf( Time is %d secondsn, t); ,for语句的变化形式,可以省略for语句的“表达式1”或“表达式3
16、”,也可以都省略(相当于while语句),#include void main( ) char ch ; for( ; (ch=getchar( ) ) !=n ; ) putchar( ch ) ; ,将用键盘输入的若干字符顺序输出到屏幕上,13,如果省略“表达式2”,则循环控制条件总为“真”,下面的语句是“合法”的,但构成了“死循环”: for( i=1; ; i+) sum += i ;,下面的程序在运行时会因为“除以零”而出错: #include void main( ) char i ; int sum=0 ; for( i=1; ; i+)sum += 1000 / i ; pri
17、ntf( sum=%d n, sum); ,5.4 循环的控制,复杂的循环控制条件 对循环的控制问题,不仅仅是防止“死循环”,还包括选择恰当的时机,正确地结束循环有的时候,循环控制条件是复杂的,还可能是多种条件的综合,假设每个班最多有30个人,依次输入每个人的成绩,如果输入的不是0100之间的数,或者已经输入了30个数,则结束输入,计算平均成绩,14,#include void main( ) int i = 0, flag=1 ; float score, ave = 0 ; printf( Enter scores one by one:n ); while ( i 100 ) flag
18、= 0; else ave += score; i+ ; if( i 0 ) ave = ave / i; printf(Average: %.2fn, ave); ,【例】 输入两个正整数 m 和 n,求其最大公约数和最小公倍数。,分析: 1. 用辗转相除法求最大公约数。 m 对 n 求余数为 a,若a0,则 m n,n a,继续求余;否则 n 为最大公约数。 例如,设 m=12, n=21,次数被除数 除数 余数,1122112,2,21,12,9,3,12,9,3,4,9,3,0,3,注意 保留m、n的原始值,以便求最小公倍数,#include main ( ) int m, n, m1
19、, n1, a; printf (输入两个正整数:); scanf (%d, %d, ,【例】 输入两个正整数 m 和 n,求其最大公约数和最小公倍数。,【例5.3 】用Newton迭代法求下面方程在1.5附近的近似根。 2x3 - 4x2 + 3x - 6 = 0,1.5 附近意为取初值 x0 = 1.5,2. 把 xn 存于变量 x 中,x存于 y 中,则容易求得 y: y = - f(x) / f (x) f(x) 应自己求,计算机不会求导,xn+1 = xn +x 即等于 x + y 此后 x 值已无用,可将 xn+1 的值存于 x 中。语句 x = x + y,xn+1,xn,x,3
20、. y是相邻两次迭代的差,可用 |y| 作迭代终止条件。,#include #include main ( ) float x, y, y1, eps ; printf (输入 : ) ; scanf (%f, ,【例】 打印九九乘法口诀。,#include main ( ) int m, n; m = 1; while ( m =9 ) n = 1; while ( n = m ) printf (%1d%1d=%-4d, m, n, m*n ); n+; printf (n); m+; ,?,#include main ( ) int m, n; for ( m =1; m =9 ; m+
21、 ) for ( n = 1; n = m; n+ ) printf (%1d%1d=%-4d, m, n, m*n ); printf (n); m+; ,一. break 语句 用 break 语句可以结束 switch 结构和三种循环。,【例5.6】 判断整数 m 是否为素数。,因此,判断 m 是否为素数的算法是: 1、依次用 2 k 之间的数整除 m,如果找到某个整数 r 能整除 m,则 m 必不是素数; 2、如果找不到 r,则可以断定 m 为素数。,分析: 素数是能被其他整数整除的数,即如果 m 是素数,则必然存在 r、t(1 r、t m)使得 m = r t 成立,#include
22、 #include main ( ) int m, i, k; printf (输入一个整数:); scanf (%d, ,结束循环,即转到 for 循环的下一个语句 break 总是与 if 的一起使用,二. continue 语句 用 continue 语句可以结束本次循环,即忽略循环体中剩余的语句。,【例】 打印 100200 之间不能被 3 整除的整数。,#include main ( ) int n; for ( n = 100; n = 200; n+) if ( n%3 = 0) continue; printf (%d , n); ,能整除,不打印,main() int i,j
23、,x=0; for(i=0;i2;i+) x+; for(j=0;j=3;j+) if(j%2) continue; x+; x+; printf(“x=%d”,x); ,第一次循环 第二次循环 x=1 j=0 x=1 x=5 j=1 j=2 x=2 j=1 j=3 j=3 x=6 x=7 x=3 x=4 x=8,X=8,main(0 int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0: a+; break; case 1: b+; break; case 2: a+; b+;break; case 3: a+;b+; printf(
24、“a=%d,b=%d”,a,b); ,a=2,b=1,【例】 按照下面的递推公式,求 Fibonacci 数列1,1,2,3,5,8的前40项: F1 = 1n 1 F2 = 1n 2 Fn = Fn-1 + Fn-2n 3,分析,(4) 此数列增长很快,宜用长整型。每行输出4个数,即每输出4个数后输出一个换行符。,(1) F1、F2 直接赋值并输出;,(2) 进行 19 次循环,每次计算并输出两项;,(3) F3 = F1+ F2,此后 F1已无用,F3可存于 F1,即用语句F1 = F1+ F2,F4 = F2+ F3,F3已在 F1中,此后F2已无用,F4可存于F2,即用语句 F2 =
25、F2+F1,依此类推算出f5、f6直至f39、f40,#include main ( ) int i; long int f1, f2; f1 = 1; f2 = 1; printf (%16ld%16ld, f1, f2 ); for ( i = 2; i = 20; i+) f1 = f1 + f2; f2 = f2 + f1; printf (%16ld%16ld, f1, f2 ); if ( i % 2 = 0 ) printf (n); ,【例】 判断m是否为素数,【例】 求100200之间的全部素数。,#include #include main ( ) int m, i, k;
26、 printf (输入一个整数:); scanf (%d, else printf (%d不是素数n, m); ,int n=0;,for ( m = 101; m 200; m = m + 2 ) if ( n % 10 = 0 ) printf (n);,if ( i k ) printf (%6d, m ); n+; ,#include #include main ( ) int m, i, k, n = 0; for ( m = 101; m k ) printf (%6d, m); n+; ,【例】张丘建的“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、母
27、、雏各几何 ?,#include main ( ) int cocks = 0, hens, chicks; while (cocks = 19 ) hens = 0; while ( hens = 33 ) chicks = 100 - cocks - hens; if ( 5 * cocks + 3 * hens + chicks / 3 = 100 ) printf ( %d %d %dn, cocks, hens, chicks ); hens = hens + 1; cocks = cocks +1; ,顺序打印1001000之间所有9的倍数,如果一个数同时也是7的倍数则停止打印,1
28、6,#include void main( ) int i ; for( i=100; i1000; i+) if( i % 9 !=0 ) continue ; printf( %5d, i ) ; if( i % 7 =0 ) break; ,goto语句,goto语句是从早期程序设计语言遗留下来的一个语句,称为无条件跳转语句,已被淘汰 goto语句的使用格式是: goto 语句标号 ; “语句标号”是一个特殊的标识符,由字母、数字或下划线组成(第一个字符不能是数字),后面跟冒号“:”,放在语句行的最前头,#include void main( ) int i =100; while( i
29、1000 ) if( i % 9 !=0 ) goto Next ; printf( “%5d”, i ) ; Next:i +; ,打印所有的1001000之间的9的倍数,18,谷角猜想:对于任意一个自然数 n,若n为偶数,则将其除以2;若n为奇数,则将其乘以3,然后再加1。如此反复,经过有限次运算后,总可以得到自然数1。试编程验证之。,21,#include void main( ) int n ; printf( Enter a number: ) ; scanf( %d, ,5.6 程序调试,对于程序设计而言,即使优秀的程序员也不能保证不会犯错误 一个优秀的程序,不在于使用了先进的算法
30、,而在于仅仅包含少量的错误 程序中的错误是在所难免的,关键是发现并纠正错误 初学程序设计的人有必要从一开始就养成良好的习惯,培养严谨的工作作风,并逐步掌握一些编程技巧,程序调试的一般策略,程序中的错误一般可分为 语法错误比较容易发现,通常,有语法错误的程序不能通过编译和连接,也就不能生成可执行的程序 逻辑错误又叫语义错误,也就是不能正确地表达所需要的功能,是较常见的错误之一。其外部表现为,程序可以运行,但有时出错,有时又不出错。逻辑错误通常比较难于被发现,查错和纠错对任何程序员来说都是挑战 设计错误比较少见,通常是由于对问题的分析不彻底造成的,纠正这类错误需要重新设计程序,调试程序的一般步骤为
31、: 静态检查,也就是人工检查,是在完成程序设计后,在上机调试前,仔细地对程序代码进行全面的检查通过静态检查,不仅可以发现程序中的语法错误,也可以发现逻辑错误,甚至发现设计上的缺陷为便于查错,应力求做到编码的标准化、文档化,增强编码的可读性、可理解性、可维护性要做到:采用结构化方法,划分功能模块和程序段,采用必要的缩进和对齐,简化表达式,每行只有一个语句,尽量使用注释,使用有意义的标识符, 动态检查,是指通过上机调试发现错误的过程。完成编码后,可以借助编译程序检查隐藏的语法错误,如错误标识符、非法的表达式、错误的函数调用等。利用连接程序,可以检查连接错误,如调用了未定义的函数、缺乏必要的函数定义等。通过试运行程序,可以发现一些逻辑错误,如错误的计算、有问题的输入和输出等,程序中的错误有两种,即Error和WarningError是必须要纠正的,任何Error都会导致编译或连接失败Warning一般不影响生成可执行的“程序”,但程序有缺陷合格的程序员不仅要纠正致命Error,也要纠正Warn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老人消费营销策略研究报告
- 境外民间舆论场景研究报告
- 家具摆件市场研究报告
- IT运维服务行业现状与发展趋势
- 2026年制造业智能排班系统优化方案创新报告
- 2026青海海西州大柴旦矿区人民检察院招聘4人备考题库附答案详解(培优a卷)
- 2026江苏南通市海安经济技术开发区西场办事处招聘公益性岗位人员3人备考题库含答案详解(培优a卷)
- 2026桂林恭城宏源投资集团有限公司招聘1人备考题库有答案详解
- 2026浙江杭州市萧山区中医院编外人员招聘18人备考题库含答案详解(突破训练)
- 2026福建泉州丰泽区城东街道社区卫生服务中心编外工作人员招聘备考题库及答案详解(各地真题)
- 企业研发准备金内部制度
- 2026天津师范大学第二批招聘 (辅导员、专业技术辅助岗位)27人考试参考题库及答案解析
- 第6课 少让父母操心 第1课时 课件+视频 2025-2026学年道德与法治三年级下册统编版
- 医院保安工作考核制度
- 物联网技术在小学环境教育中的应用效果课题报告教学研究课题报告
- 砌体墙体裂缝处理方案
- 罪犯评估中心制度规范
- 装备维护保养规范制度
- 营销2.0系统培训课件
- 新能源汽车高压系统检修课件 任务二新能源汽车高压电控总成故障检修 学习活动1 电机控制器故障检修
- (2025)精索静脉曲张中西医结合诊断治疗指南解读课件
评论
0/150
提交评论