版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 C 语言程序设计 Lecture 5 2 l 循环循环:就是在给定的条件成立时反复执 行某一程序段,被反复执行的程序段称为 循环体循环体。 l 在C语言中可以用以下语句来实现循环: 1、用while语句;(“当”循环) 2、用do-while语句;(“直到”循环) 3、用for语句;(计数循环) 4、用goto语句和if语句构成循环。 3 1、while 语句 常称为“当型”循环语句。 4 2 、while 语句的形式: while (表达式)表达式) 循环体;循环体; l特点:先判断表达式,后执行语句。 l说明: 循环体有可能一次也不执行 循环体可为任意类型语句 下列情况,退出while
2、循环 条件表达式不成立(为零) 循环体内遇break,return,goto 无限循环: while(1) 循环体循环体; 5 6 break语句 一般形式: break; 功能: 跳出所在的多分支switch语句 跳出所在的while、do-while、for循环语句(提前结束 循环)。 continue语句 一般形式: continue; 功能: 提前结束本次(本轮)循环体的执行,接着进行下一次 循环条件的判别。 7 for( e1;e2;e3) if(e) continue; for( e1;e2;e3) if(e) break; 非0 0 非0 0 0 非0 0 非0 语句语句 循循
3、环环 体体 8 9 1、do-while语句 常称为“直到型直到型”循 环语句。 10 2、do-while的形式: do 循环体;循环体; while (表达式);表达式); l特点:先执行,后判断。 l说明: 至少执行一次循环体 dowhile可转化成while结构 例:用dowhile求 1+2+3+4+5+100。 (ch5_03.c) 11 1. 循环体如果包含一个以上的语句,应该用 花括号括起来,以复合语句形式出现。 2. 循环体中应有使循环趋于结束的语句。 例:分析下列三个程序段 12 直到循环结构:直到循环结构: main() int i,sum=0; i=1; do sum=
4、sum+i; i+; while(i=100); printf(“%dn”,sum); 13 q 可以用于循环次数确可以用于循环次数确 定的情况;定的情况; q 可以用于循环次数不可以用于循环次数不 确定的情况;确定的情况; q 可实现可实现while和和 do-while语句所有功能。语句所有功能。 14 2、for的形式:的形式: for (表达式表达式1;表达式;表达式2;表达式;表达式3) 循环体循环体 l说明:说明: for语句中语句中expr1, expr2 ,expr3 类型任意,都类型任意,都 可省略,但分号不可省可省略,但分号不可省. 无限循环无限循环: for ( ; ;
5、) for语句可以转换成语句可以转换成while结构结构 循环变量循环变量 赋初值赋初值 循环终止循环终止 条件条件 循环变量循环变量 控制控制 15 sum=0; for(i=1;i=100;i+) sum=sum+i; 它相当于以下语句: i=1; while (i=100) sum=sum+i; i+; 16 (1)for语句一般形式中的语句一般形式中的“表达式表达式1”可以可以 省略;省略; 如:如: sum=0;i=1; for ( ; i=100;i+) sum=sum+i; (2)表达式)表达式2省略,即不判断循环条件,循省略,即不判断循环条件,循 环无终止地进行下去;环无终止地
6、进行下去; 如:如: for(sum=0,i=1;i+) sum=sum+i; 17 (3)表达式)表达式3也可以省略,但此时保证循环能正常结束。也可以省略,但此时保证循环能正常结束。 如:如:for(sum=0,i=1;i=100;) sum=sum+i; i+; (4) 可以省略表达式可以省略表达式1和表达式和表达式3,只有表达式,只有表达式2。 如:如:i=1; sum=0;i=1;sum=0; for (;i=100;) while (i100) break; sum=sum+i; i+; 19 (6)循环体为空语句)循环体为空语句 对对for语句,循环体为空语句的一般形式为语句,循环
7、体为空语句的一般形式为: for (表达式表达式1;表达式;表达式2;表达式;表达式3) ; 如:如:for(sum=0,i=1;ib ) 3.字符表达式字符表达式: for (; (c=getchar() != n;) printf(“%c”,c); (cal8.c;totl5f.c;cent.c) 23 解题思路解题思路 1. 每当我们读入一张选票,只有每当我们读入一张选票,只有6种种 情况,将它们加到相应的人选上。情况,将它们加到相应的人选上。 2. -1结束循环结束循环 3. case语句作为开关。语句作为开关。 例 统计选票。现有选票如下 3,1,2,1,1,3,3,2,1,2,3,
8、3,2,1,1, 3,2,0,1,4,-1. -1是结束标志。设1选李, 2选张,3选王, 0和4为废票,谁会当选? 24 main() int vote,l_vote,z_vote,w_vote, invalidvote; l_vote=0; z_vote=0; w_vote=0; invalidvote=0; scanf(“%d”, while (vote!=-1) switch (vote) case 1: l_vote+;break; case 2: z_vote+;break; case 3: w_vote+;break; case 0: case 4: invalidvote+;b
9、reak; scanf(“%d”, printf(Li%2d,zhang%d2d,wang%2d,invalid%2d”, l_vote,z_vote,w_vote,invalidvote); 25 例 输入一个整数,计算它的位数.并反向输出. 分析:设一个数13579,一位一位地切下末位 l循环结束条件: num=0; l同时计数 count=count+1; bit=num%10 num=num/10 count=0;输入输入num num!=0 输出输出num%10 count+ num=num/10 输出输出count 26 27 1、 无条件转移语句; 形式:goto 标号; 2、有
10、标号的语句称为标号语句; 形式: 标号:语句; 3、 goto语句在使用时只能转移到goto所在的函数 内的标号处,不能转移到该函数外; 4、 可以从多重循环的内层转移到最外层,而break 只能跳出一层循环。 28 main() int i=1,sum=0; loop: if (i101) sum=sum +i; i+; goto loop; printf(“SUM = %fn”,sum); loop: sum=sum+i; i+; if(i101) goto loop; 29 (1) while() while() . (2) do do while( ); . while( ); (3)
11、 while() do while( ); . l三种循环可互相嵌套三种循环可互相嵌套,层数不限层数不限 l外层循环可包含两个以上内循环外层循环可包含两个以上内循环 l嵌套循环的执行流程嵌套循环的执行流程 l嵌套循环的跳转嵌套循环的跳转 禁止:禁止: 从外层跳入内层从外层跳入内层 跳入同层的另一循环跳入同层的另一循环 (4) for( ; ;) do while(); while() . 30 31 例例1: main() int i,j; for(i=0; i3;i+) for(j=1;j=4;j+) printf( %d,j); printf(n); 运行后输出:运行后输出: 1 2 3
12、4 1 2 3 4 1 2 3 4 例例2: main() int i,j; for(i=0; i3;i+) for(j=1;j=4;j+) printf( %d,j); if( ! (j%3) ) break; printf(n); 运行后输出:运行后输出: 1 2 3 1 2 3 1 2 3 32 例例4: main() int i, j; for( i=0; i3; i+) printf( %d, i ); printf(n ) ; for( i=1; i=4; i+) printf(%d, i ) ; 运行后输出:运行后输出: 例例3 3: main() int i, j; for(
13、i=0; i3; i+) for( j=1;j=4;j+) printf( %d,j); if( ! (j%3) ) goto K; printf(n); K: ; 运行后输出:运行后输出: 1 2 3 0 1 2 1234 33 分析: l 求累加和s s=0 for(k=1;k=n;k+) 求累乘积tk s=s+tk l 求累乘积tk=k! tk =1 for(i=1;i=k;i+) tk=tk*i main( ) int i,k; long s, t; printf(nInput n:); scanf(%d, s=0; for(k=1;k=n;k+) t=1; for(i=1;i=k;i
14、+) t=t*i; s=s+t; printf(ns=%ld,s); 34 35 36 37 写循环,先要发现循环。注意计算中的重复性动 作,引进循环可能统一描述和处理。 重复动作的常见例子: l累积一批可按规律算出的数据(如累加等); l反复从一个结果算出下一结果(递推等); l对一批数据做同样的加工处理;等。 38 I.循环涉及哪些变量,引进什么临时性变量? II.这些变量在循环正式开始前应给什么初值? 循环如何开始? III.每次循环中变量的值应如何改变? IV.什么情况下继续循环(什么情况下终止)? V.循环终止后如何得到所需结果? 39 循环中常出现几类变量,了解这些有助于思 考和分
15、析。这也是写循环程序的经验总结。 1)循环控制变量(循环变量):循环前设初值,循 环递增/递减,达到/超过界限时循环结束。控制 循环的进行/结束。 for中常有这类变量。 for(n = 0; n 10; n+). for(n = 2; n 52; n += 4) . 40 2)累积变量:循环中常用+=或*=等更新。初值常 用运算的单位元(加用0;乘用1为初值)。循环 结束时变量终值被作为循环计算结果。 3)递推变量:前两类变量的推广形式。复杂循环 常用几个协同的变量,每次由一个/几个变量推出 一个新值,其余依次更新。 对变量x1、x2、x3,循环体可能有序列: x1 = x0.; x2 =
16、x1.; x3 = . x1 . x2 .; 41 三种循环语句while, do-while和for 建立循环通常有以下情况: 1. 给定次数, for比较适用 for(i=1;i100;i+) 2. 给定条件, while比较适用 while(x+y)a for(k=3;kb) t=a;a=b; b=t; for(x=a;x1000) break; printf(s=%d,n=%d,s,n); 47 5. main() int i,n=0; float score30,aver=0.0; for(i=0;i100|scorei0) printf(Error! );goto aa; aver
17、+=scorei; aver=aver/30; for(i=0;iaver)n+; printf(aver=%f,n=%dn,aver,n); 48 7. main() int i; long n=1; for(i=1;i=1.0e-6) pi=pi+t; n=n+2; s=-s; t=s/n; pi=pi*4; printf(“pi=%10.6fn”,pi); 50 方法一:数列是正、负相间的,在这里可用一方法一:数列是正、负相间的,在这里可用一 个个“开关开关”变量变量 t 来解决符号的问题。来解决符号的问题。 main() float s=0; int t=1,i ; for(i=1;i
18、101;i+) s+=1.*t / i ; t= -t ; printf(s=%fn,s); 在处理循环时应注意在处理循环时应注意 初、终值的设定!初、终值的设定! 51 方法二:分别求出方法二:分别求出正项和正项和s1(奇数倒数奇数倒数)与负项与负项 和和s2(偶数倒数偶数倒数),则则s=s1-s2 main() float s,s1=0,s2=0; int i; for(i=1;i101;i+=2) s1+=1.0/ i; s2+=1.0/(i+1); s=s1-s2; printf(s=%fn,s); 52 f(x)= (4-x2)dx b a 53 main() float a,b,h
19、,n1,n2,s=0; int i; printf(“请输入积分限a和b:”); scanf(“%f%f”, h=(b-a)/1000; for(i=0;i1000;i+) n1=4-(a+i*h)*(a+i*h); n2=4-(a+(i+1)*h)*(a+(i+1)*h); s+=(n1+n2)*h/2; printf(“s=%10.2fn”,s); 54 #include #define GOAL 39 main() int i; printf(“Please input a integer number:n); do scanf(%d, if(iGOAL) printf(%d is to
20、o big,input again.n,i); else if(iGOAL) printf(%d is too samll,input again.n,i); else printf(OK!n); while(i!=GOAL); 55 #include #include main() int i; int GOAL,num=0; printf(Please input a number from 0 to 99, or -1 to exit:n); GOAL=random(100); /*产生0到99的随机数*/ do scanf(%d, if(i=-1) printf(nExit game!
21、); break; 56 num+; if(iGOAL) printf(%d is too big, input again.n,i); else if(iGOAL) printf(%d is too samll, input again.n,i); else printf(OK!n); printf(You take %d times to pass!,num); while(i!=GOAL); 57 例例 枚举问题枚举问题或称为或称为穷举法穷举法。一般用于不。一般用于不 定方程求非负整数解的问题。它将方程中定方程求非负整数解的问题。它将方程中 未知数可以取的到的非负整数逐个进行验未知数可以
22、取的到的非负整数逐个进行验 证找出所有满足方程的解。证找出所有满足方程的解。 例如:例如:一元人民币兑换成一元人民币兑换成1分、分、2分、分、5分共有分共有 多少种方法?多少种方法? 若若5分、分、2分、分、1分的个数分别为分的个数分别为x个、个、y个、个、z 个,则个,则x的取值为的取值为020,y的取值为的取值为050,z 的取值为的取值为0100。 于是有不定方程:于是有不定方程: 5x+2y+z=100。 58 main() int i,j,k,m=0; for(i=0;i21;i+) for(j=0;j51;j+) for(k=0;k101;k+) if(5*i+2*j+k=100)
23、 m+=1; printf(m=%dn,m); 59 上面程序的循环次数超过上面程序的循环次数超过10万次,且大量的循环万次,且大量的循环 都不满足方程。可对程序进行优化,由于随着都不满足方程。可对程序进行优化,由于随着5分个数分个数 的增加,的增加,2分个数就会减少,因此循环变量分个数就会减少,因此循环变量j可控制在可控制在 (100-5i)/2以内以内,这样使得这样使得5i+2j=100。若不足。若不足100 则补充则补充1分,分,将问题转换成为求循环次数的问题了将问题转换成为求循环次数的问题了。 main() int i,j,m=0; for(i=0;i21;i+) for(j=0;jE
24、, W-A。非字母字符忽略。 l思路: 1.建立循环, 循环结束以输入回车符为准 while (c=getchar()!=n) 2. 判断输入是否是字符,否则忽略 if (c=a int counter; total=0;counter=0; average = 0; scanf (“%d”, while (value !=-1) total = total + value; counter + +; scanf (“%f”, if (counter = 0) printf (“No data entered.n”); else average = total / counter; print
25、f (The average of %d values is %f”, counter,average) 23.9 85.68 227E02 0.00863 75 93.44 71 14.7E-05 66 -1 The average of 9 values is 2568.336412 63 本例还是要考虑每行的空格数、和星本例还是要考虑每行的空格数、和星 号数问题,但要关注号数问题,但要关注空格数与星号数空格数与星号数在增在增 加到一定的时候又要减少的规律。加到一定的时候又要减少的规律。 64 for(i=0;i4;i+) for(j=0;j20-i;j+) printf(“ ”); /*
26、空格递减空格递减*/ for(k=0;k2*i+1;k+) printf(“*”); /*星号递增星号递增 */ #include main() int i,j,k; for(i= -2;i=2;i+) for(j=1;j=18+fabs(i);j+) printf( ); for(k=1;k=5-2*fabs(i);k+) printf(*); printf(n); fabs(i)变化规律是:变化规律是: 2,1,0,1,2。 每行的空格数是:每行的空格数是: 20,19,18,19,20。 每行的星号数是:每行的星号数是: 1,2,3,2,1。 注意初终值从注意初终值从-2到到 2的目的。
27、的目的。 65 例 汽车里程表上的读数是95859,7小时之 后里程表的读数是一个对称数(最大是5 位数),问汽车的速度(是一个整数)。 解题思路: l检查所有的在95859到99999之间的对称 数,如果它与95859的差能被7整除,则商 是速度。 66 /* 第一种算法*/ main() long i95859,a,b,c,e,d; flaot f,g; while (i=99999 ) a=i/10000; b=(i-a*10000)/1000; c=(i-a*10000-b*1000)/100; d=(i-a*10000-b*1000-c*100)/10; e=i-a*10000-b*
28、1000-c*100-d*10; if (a=e) i+; 该程序需要执行循环该程序需要执行循环 99999-95859次!次! 67 /*第二种算法*/ main() long i,distance,a,b,c,d; (for i=1;i=200;i+) distance=95859+i*7; a=distance/10000 b=(distance-a*10000)/1000; c=(distance-a*10000-b*1000)/100; d=(distance-a*10000-b*1000-c*100)/10; e=distance-a*10000-b*1000-c*100-d*10
29、; if (a=e) and (b=d) printf(“The speed is %d”,i); 68 /*第三种算法*/ main() long i,j,distance,speed:real; for(i=6;i=9;i+) for (j=0;j=9;j+) distance=90000+i*1000+j*100+i*10+9; if (distanc%7)=0) printf(“The speed is %d”,distance/7); distance = distance-95959 if (distance%7)=0) printf(“The speed is %d”,dista
30、nce/7); 该程序需要循环该程序需要循环(9-6)*10+1次!次! 69 分析分析: ( 1 ) 因 为 新 出 现 的 数 (因 为 新 出 现 的 数 ( d c b c d ) 是 :) 是 : 个位数字(个位数字(d)与万位数字、十位数字()与万位数字、十位数字(c)与)与 千位数字相同,而百位数字(千位数字相同,而百位数字(b)只能是)只能是, 表示万位和千位的变量表示万位和千位的变量a取值范围为:取值范围为:9599。 所以,要将所以,要将a分隔出的十位数字和个位数字分别分隔出的十位数字和个位数字分别 赋予赋予d和和c 。 (2)约束条件是:公里数对称且车速为整数。)约束条件
31、是:公里数对称且车速为整数。 70 循环循环a=95;a=99;a+ 求出万、千位上的数字求出万、千位上的数字 循环百位数字循环百位数字b=0;b=99 找出对称的数字找出对称的数字 计算路程、车速计算路程、车速 车速为整且路程车速为整且路程 为正为正 跳出并输出跳出并输出 71 main() int a,b,c,d,n,v; long int m; for(a=95;a=99;a+) d=a/10; c=a-d*10; /*分别求出万、千位上的数字分别求出万、千位上的数字 */ for(b=0;b0) goto loop; loop: printf(v=%dkm/h m=%ldkmn,v,m); 车速为整数且路程为正车速为整数且路程为正 时转出循环并输出结果时转出循环并输出结果 找出对称找出对称 的数字的数字 72 在本例这样的情况下,从内循
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 剧本创意与创新-深度研究
- 智能制造与刚性产业升级-深度研究
- 新兴技术在地学应用-深度研究
- 创新政策与企业绩效-深度研究
- 2025年应天职业技术学院高职单招职业适应性测试近5年常考版参考题库含答案解析
- 二零二五年度中标项目安全管理居间服务合同4篇
- 2025年广西自然资源职业技术学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 2025年汽车销售退换货服务合同范本4篇
- 暗物质与黑洞关系解析-深度研究
- 2025年广州珠江职业技术学院高职单招数学历年(2016-2024)频考点试题含答案解析
- DL-T-1642-2016环形混凝土电杆用脚扣
- 平安产险陕西省地方财政生猪价格保险条款
- 铜矿成矿作用与地质环境分析
- 30题纪检监察位岗位常见面试问题含HR问题考察点及参考回答
- 询价函模板(非常详尽)
- 《AI营销画布:数字化营销的落地与实战》
- 麻醉药品、精神药品、放射性药品、医疗用毒性药品及药品类易制毒化学品等特殊管理药品的使用与管理规章制度
- 一个28岁的漂亮小媳妇在某公司打工-被老板看上之后
- 乘务培训4有限时间水上迫降
- 2023年低年级写话教学评语方法(五篇)
- DB22T 1655-2012结直肠外科术前肠道准备技术要求
评论
0/150
提交评论