第11讲 break语句和continue语句 循环结构程序举例1
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例5.11 百钱买百鸡问题
main() “鸡翁一,值钱三;鸡母一, {int x, y, z; 值钱五;鸡雏三,值钱一。百 for(x=0; x<=33; x++) 钱买百鸡,问鸡翁、鸡母、 for (y=0; y<=20; y++) 鸡雏各几何?”。 {z=100-x-y; 分析:设鸡翁x只、鸡母 if(x*3.0+y*5.0+z/3.0==100.0) y只、鸡雏z只。解题的思 printf("x=%d, y=%d, 路是:鸡翁数x的值可能是 z=%d\n", x, y, z); } [0,33]中的任何一个值; 该程序能从七百多种可能的组合情况 } 鸡母数y的值可能是[0,20] 中挑选出四种满足要求的答案。运行结 中的任何一个值;将所有 果如下: 可能出现的情况都一一进 z=84 x=4, y=12, 行测试,若满足要求就把 z=81 x=11, y=8, 这种情况输出,作为可能 z=78 x=18, y=4, 的一个解。 x=25, y=0, z=75
Enter m,n:14,8<CR> gcd=2
用穷举法求最大公约数
分析:两个数的最大公约数肯定不会比其中的小者大。
main( ) {int m, n, r ; printf("Enter m, n: "); scanf("%d,%d", &m, &n); r=m<n?m:n; /*取m, n中的小者*/ while (r>1) {if(m % r==0 && n % r==0 ) break; /*找到r即为最大公约数,中止循环。*/ r = r-1; /*从大到小穷举出所有可能的数*/ } printf("gcd(%d,%d)=%d\n",m,n, r); }
此数列的第一项和第二项为1,从第三项开始,每一 项的值是前两项的值之和;编程输出该数列的前15项。 main() 每行输出5个数。 { int i, f1=1, f2=1, f3; 分析:斐波那契数列的递推公式为:fn=fn-1+fn-2,用第 printf("\n%5d%5d",f1,f2); 1项和第2项的值求出第3项的值以后,再用第2项和第3 for(i=3; i<=15; i++ ) 项的值求出第4项的值,……
例5.6 在循环体中使用brห้องสมุดไป่ตู้ak语句。
main() {int i, s; s=0; for(i=1; i<=10; i++) {s= s+i; if(s>5) break; printf("s=%d\n", s); } 程序的输出结果如下: } s=1
s=3
注意
只能在do-while、for、 while循环语句或switch 语句体内使用break语句, 其作用是使程序提前终止 它所在的语句结构,转去 执行下一条语句;若程序 中有上述四种结构语句的 嵌套使用,则break语句 只能终止它所在的最内层 的语句结构。
例5.13猴子吃桃问题的程序
main() {int tao,n; tao=1; /*已知第8天的桃子数*/ for (n=7;n>=1;n=n-1) tao=(tao+1)*2; printf("tao(1)=%d\n",tao); }
程序执行后输出结果如下: tao(1)=382
例5.14 斐波那契数列:1,1,2,3,5,8…
{f3=f1+f2; printf("%5d",f3); if(i%5==0) 程序执行后输出结果如下: printf("\n"); 1 1 2 3 5 f1=f2; f2=f3; 8 13 21 34 55 89 144 233 377 610 } }
例5.15 求pi的近似值
题目: 用公式 pi/4=1-1/3+1/5-1/7… 求pi的近似 值,直到最后一项的绝对值小于10-4为止。 分析: 本题的递推公式比上面的两个例子复杂, 只能将分子和分母分别递推出新的值后再做除法 运算。其递推方法和求解的步骤如下: 1. 分母n的初值为1,递推公式:n=n+2; 2. 分子s的初值为1.0,递推公式:s=(-1)*s; 3. 公式中某项的值为: t=s/n。 从以上求pi的公式来看,不能决定n的最终值应 该是多少;但可以用最后一项t=s/n的绝对值小于 0.0001来作为循环的结束条件。
2. 递推法
“递推法”又称为“迭代法”,其基本思想是把一 个复杂的计算过程转化为简单过程的多次重复。
例5.13猴子吃桃问题:小猴在某天摘桃若干个,
当天吃掉一半,觉得还不过瘾,又多吃了一个。第二天 吃了剩下的桃子的一半又多一个;以后每天都这样吃下 去,直到第8天要吃时只剩下一个桃子了,问小猴子第 一天共摘下了多少个桃子? 分析:这是一个“递推”问题,先从最后一天的桃子 数推出倒数第二天的桃子数,再从倒数第二天的桃子数 推出倒数第三天的桃子数……。设第n天的桃子为xn, 那么它是前一天的桃子数的xn-1 的一半减1,递推公式 为:xn=xn-1/2 – 1 。即: xn-1 =( xn+1)×2。
第11讲
break语句和continue语句 循环结构程序举例。
5.6 break语句和continue语句
为了使循环控制更加灵活,C语言还 提供了break语句和continue语句。 break语句在循环控制中的作用是强 行结束该语句所在的整个循环结构,转 向执行循环体语句后的下一条语句。 continue语句的作用是提前结束多次 循环中的某一次循环,即跳过循环体语 句中位于continue语句之后的其余语句, 从而进入下一次循环。
2. continue语句
continue语句只能在do-while、for和while循环 语句中使用,其作用是提前结束多次循环中的某一 次循环。
例5.7 在循环体中使用continue语句。 在执行的8 main() 运行结果: 次循环中,当 { int i, s=0; i的值为偶数 i=1 s=1 for(i=1; i<=8; i++) i=2 时,执行 { s= s+i; i=3 s=6 continue语句, printf("\ni=%d ", i); i=4 其作用是跳过 if(i%2==0) i=5 s=15 printf(“s=% continue; i=6 d\n”, s); printf("s=%d\n", s); i=7 s=28 语句,继续执 } i=8 行下一次循环。 }
题目: 例5.12有一根长度为323米的钢材料,要将它截取成两种 长材料截取短料的最优化方法 规格a、b的长度分别为17米和27米的短料, 每种至少1段, 问分隔成a, b各多少段后,剩余的残料 r 最少? 分析: 规格a的钢材料的个数na可能为: 1、2、3、……(321-27)/17。 main( ) {int na, nb, a, b, r, rmin; na=1; nb=1; rmin=323-17-27; for (na=1; na<=(323-27)/17; na++) { nb=(323-na*17)/27; 运行结果如下: r =323-na*17-nb*27; a=11, b=5, min=1 if (r< rmin) {rmin=r; a=na; b=nb; } } printf("a=%d, b=%d, min=%d\n", a, b, rmin ); }
main() 例5.9 极值问题 运行结果如下:
{int x, max, min, n; Enter x(-1 to end): 87 76 53 99 58 -1<CR> float sum=0; 题目:从键盘 max=99, min=53, aver=74.599998 printf("Enter x(-1 to end): "); 输入全班的学 scanf("%d",&x); 习成绩,统计 max=x; min=x; n=0; 出最高分、最 while(x>=0) 低分和平均分。 {sum = sum + x; n= n+1; if(x>max) max = x; 分析:由于不 if(x<min) min = x; 知道学生人数, scanf("%d", &x); 程序中用一个 } 负数来作为结 if(max>0) 束输入成绩的 printf("max=%d, min=%d, 标志。 aver=%f\n", max, min, sum/n); }
5.7 选择结构程序举例 许多实际应用的程序都要用到循环处 理,在学习了本章的基本内容之后,我 们在这里着重介绍两个最基本、最常用 的循环处理算法----穷举法和递推法。
1. 穷举法
“穷举法”也称为“枚举法”或“试 凑法”, 即采用循环结构将所有可能 出现的情况一一进行测试,判断是否满 足给定的条件。
例5.10素数问题
素数是一个大于2,且 程序如下: 只能被1和它自己整除的 main() 整数。试编程求输入的某 { int m, i, flag; 个正整数是否为素数。若 printf("Enter a integer : "); 是,输出YES,若不是, scanf("%d", &m); 运行结果如下: 输出NO。 Enter a integer : 157 <CR> flag=1; /*先假定m是素数*/ 分析:判别某数m是否 for(i=2; i<=m-1; i++) 157: YES! 为素数的最简单方法是:穷 if(m%i==0) 实际上只要试除到m/2或 举出所有可能的除数2、3、 {flag=0; break; } sqrt(m)就足够了。 4、…一直到m-1,分别判 printf("%d:", m); 定m能否被它们整除,只 if(flag) printf(" YES!\n"); 要有一个能整除,m就不 else printf("NO!\n"); 是素数;只有全部都不能 } 整除时,m才是素数。
1. break语句 在第四章中已经介绍过,用break 语句可以使流程跳出由switch语句构 成的多分支结构。 当break语句用在do-while、for或 while循环语句中时, 也可以使程序终 止循环,跳出循环结构。通常break 语句总是与if语句配合使用,即当满 足某个给定的条件要求时便跳出循环。
例5.8 求n!。即计算1×2×3×…×n的值。
分析:把每一个参与乘积的数用循环变量一一 列举出来,并相乘。
程序如下: main() { int i, n; long s=1; printf("Enter n: "); 运行结果如下: scanf("%d",&n); Enter n: 6<CR> for(i=1; i<=n; i++ ) 6!=720 s=s*i; printf("%d!=%ld\n", n,s); }
pi/4=1-1/3+1/51/7+1/9……
例5.16 求两个正整数的最大公约数
分析:求最大公约 数的迭代步骤如下: (1) 输入两个正整 数m,n; (2) 用m除以n得到 一个余数r ; (3) 若r=0,则n为 最大公约数,程序结 束;否则用n取代m, 用r取代n,转去执行 第(2)步。
程序如下: main( ) {int m, n, r ; printf("Enter m, n: "); scanf("%d,%d", &m, &n); r= m%n; while(r!=0) {m=n ; n=r ; r = m%n ;} printf("gcd=%d\n", n); } 程序执行后输出结果如下:
#include "math.h" main( ) {int n; float t, s, pi; pi=0; /*变量pi用来存放累加和*/ n=1; /*第一项的分母值为1*/ s=1.0; /*第一项的分子值为+1*/ t= s/n; /*先求出第一项的值*/ while (fabs(t)>=0.0001) { pi=pi+t; n+=2; s= -1* s; t= s/n; /*递推出下一项的值*/ } printf("pi=%f\n", pi*4) ; 程序执行后输出以下结果。 pi=3.141397 }