- 2021-06-24 发布 |
- 37.5 KB |
- 14页
申明敬告: 本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
文档介绍
高考数学专题复习(精选精讲)练习8-算法习题精选精讲
1.计算 ,写出算法的程序. 解:s=1 n=2 i=1 WHILE i<=63 s=s+n∧i i=i+1 WEND PRINT “1+2+2∧2+2∧3+…+2∧63=”;s END i = 1 S = 1 n = 0 DO S < = 500 S = S + i i = i + 1 n = n + 1 WEND PRINT n + 1 END 2.写出已知函数 输入的值,求y的值程序. 解:INPUT “请输入x的值:”;x IF x>0 THEN y=1 ELSE IF x=0 THEN y=0 ELSE y=-1 END IF END IF PRINT “y的值为:”;y END 3.新课标B版数学必修3教材41页第7题:用100元钱买100只鸡,公鸡每只5元, 母鸡每只3元,小鸡3只一元,问能买多少公鸡,母鸡和小鸡? 程序如下: for x=1:20 for y=1:33 z=100-x-y; if 5*x+3*y+z/3<>100 else x y z end end end 4.(本小题满分14分)根据下面的要求,求满足1+2+3+…+n > 500的最小的自然数n。 (1)画出执行该问题的程序框图;(2)以下是解决该问题的一个程序,但有几处错误,请找出错误并予以更正。 开始 开始 解:(1)程序框图如图所示: 或者: S=0 S=0 i=1 i=1 i=i+1 S=S+i S=S+i i=i+1 是 S<=500 否 S>500 否 是 输出i-1 输出i-1 结束 结束 8分 (2)①DO应改为WHILE; 10分 ②PRINT n+1 应改为PRINT n; 12分 ③S=1应改为S=0 14分 5. 儿童乘坐火车时,若身高不超过1.1 m,则不需买票;若身高超过1.1 m但不超过1.4 m,则需买半票;若身高超过1.4 m,则需买全票.试设计一个买票的算法,并画出相应的程序框图及程序。 解:程序是:INPUT “请输入身高h(米):”;h IF h<=1.1 THEN PRINT “免票” ELSE IF h<=1.4 THEN PRINT “买半票” ELSE PRINT “买全票” END IF END IF END 6.意大利数学家菲波拉契,在1202年出版的一书里提出了这样的一个问题:一对兔子饲养到第二个月进入成年,第三个月生一对小兔,以后每个月生一对小兔,所生小兔能全部存活并且也是第二个月成年,第三个月生一对小兔,以后每月生一对小兔.问这样下去到年底应有多少对兔子? 试画出解决此问题的程序框图,并编写相应的程序. 解: 分析: 根据题意可知,第一个月有1对小兔,第二个月有1对成年兔子,第三个月有两对兔子,从第三个月开始,每个月的兔子对数是前面两个月兔子对数的和,设第N个月有两F对兔子,第N-1个月有S对兔子,第N-2个月有Q对兔子,则有F=S+Q,一个月后,即第N+1个月时,式中变量S的新值应变第N个月兔子的对数(F的旧值),变量Q的新值应变为第N-1个月兔子的对数(S的旧值),这样,用S+Q求出变量F的新值就是N+1个月兔子的数,依此类推,可以得到一个数序列,数序列的第12项就是年底应有兔子对数,我们可以先确定前两个月的兔子对数均为1,以此为基准,构造一个循环程序,让表示“第×个月的I从3逐次增加1,一直变化到12,最后一次循环得到的F”就是 开始 输出F 结束 I=I+1 Q=S S=F F=S+Q I≤12 I=3 S=1 Q=1 N Y S=1 Q=1 I=3 WHILE I<=12 F=S+Q Q=S S=F I=I+1 WEND PRINT F END 7.设计算法求的值。要求画出程序框图,写出用基本语句编写的程序。 解:这是一个累加求和问题,共99项相加,可设计一个计数变量,一个累加变量,用循环结构实现这一算法。程序框图如图所示: DO LOOP UNTIL PRINT END 开始 结束 输出 是 否 程序如下: 8.求100以内的所有勾股数。 for i=1:100 for j=1:100 for k=2:100 if i*i+j*j<>k*k else i j k end end end end 9. 计算 ,写出算法的程序. 解:s=1 n=2 i=1 WHILE i<=63 s=s+n∧i i=i+1 WEND PRINT “1+2+2∧2+2∧3+…+2∧63=”;s END 10. 写出已知函数 输入的值,求y的值程序. 解:INPUT “请输入x的值:”;x IF x>0 THEN y=1 ELSE IF x=0 THEN y=0 ELSE y=-1 END IF END IF PRINT “y的值为:”;y END 11. 2000年我国人口为13亿,如果人口每年的自然增长率为7‰,那么多少年 后我国人口将达到15亿?设计一个算法的程序. 解:A=13 R=0.007 i=1 DO A=A*(1+R) i=i+1 LOOP UNTIL A>=15 i=i-1 PRINT “达到或超过15亿人口需要的年数为:”;i END 12.1982年我国大陆人口10亿3千万,编程上机计算,若人口增长率r=1%,则哪一年我国人口增长到12亿,若r=O.5%,r=O.2%又是何年? INPUT r=O.01 i=O p=10.3 y=1982 WHILE P≤12 i=i+1 p=p※(1+ r) y=y+1 WEND PRINT y,p END 13.假定在银行中存款10000元,按11.25%的利率,一年后连本带息将变为11125元,若将此款继续存人银行,试问多长时间就会连本带利翻一番?请用直到型和当型两种语句写出程序. 用直到型 INPUT“money=”,10000 x=mOney r=11.25/100 y=O WHILE x≥2r y=y+1 s=0; h=100; s=s+h for i=2:1:10 h=h/2; s=s+2*h; end x=x+r*x WEND PRINT y END 用当型 INPUT m=10000 X=m y=O r=11.25/100 Do m<2*x y=y+1 x=x + r*x 算法语句常见错误解析 夏 文 凯 人教版必修3第一章《算法初步》是新课程标准中的新增内容,是高考考查的内容。程序的设计是本章的一个难点和重点,此难点主要体现在语句的选择、语句的使用、语句的衔接三方面。如果概念不清、运用不当就容易出错,哪怕一个极细小的错误都会导致整个程序无法被计算机运行而宣告失败,所以,我们在设计程序时,一定要时时小心,处处留意,确保准确无误。为帮助同学们防错、识错、纠错,笔者搜集了教学中一些常见的错误,望同学们加深对它们的理解,引以为戒。 一 输入语句常见错误解析 例 判断下列给出的输入语句是否正确,为什么,怎样改正? (1)INPUT a ; b ; c (2) INPUT x = 2 解:(1)错误,变量之间应该用“,”隔开,应改为:INPUT a,b,c 备注:输入语句的一般格式是 INPUT “提示内容”;变量 如果是输入一个变量,一般可以写成 INPUT “a=”;a INPUT “b=”;b INPUT“x=”;x 也可以简写为INPUT x ,如果是两个变量,一般可以写为 也可以简写为INPUT a, b 变量中间要用“,”分隔,三个或三个以上的变量以此类推。 (2)错误,输入语句又称“键盘输入语句”,在程序运行过程中,停机等候用户由键盘输入数据,而不需要在写程序时指定,所以INPUT后面只能是变量,不能是表达式,应改为:INPUT“请输入x的值”;x或INPUT x 二 输出语句常见错误解析 例 判断下列给出的输出语句是否正确,为什么,怎样改正? (1)PRINT A=3 (2)PRINT A;B 解:(1)错误,输出语句的格式为 PRINT “提示内容”;表达式 PRINT语句不能用赋值号“=”,应改为:PRINT A (2)错误,输出语句可以输出多个表达式,不同的表达式之间用“,”分隔,不能用“;”分隔。所以应改为:PRINT A,B 三 赋值语句常见错误解析 例 判断下列给出的赋值语句是否正确,为什么,怎样改正? (1) 3=A (2)x+y+z=0 (3)A=B=4 解:(1) 错误,赋值语句的一般格式是 变量=表达式 , 赋值号的左边只能是变量,右边是一个常数或表达式,所以应改为:A=3 A=4 B=4 (2) 错误,赋值语句不能给表达式赋值。 (3)错误,一个赋值语句只能给一个变量赋值,所以应改为: 例 某同学编了一个交换两个变量A和B的值的程序(图一),错在哪里?为什么? 3 9 9 3 3 9 9 9 INPUT A, B PRINT A, B A=B B=A PRINT A, B END 解:按照此程序运行,如果输入3,9输出的结果不是 ,,而是 A=B表示把变量B的值9赋给变量A, A的初始值3被“覆盖”, A的值变为9,变量B的值保持不变;B=A表示把刚才变量A的值9赋给变量B, 变量B的值被 3 9 9 9 “覆盖”,变为9 ,所以最后输出的是 (赋值语句可以先后给一个变 (图一) 量赋多个不同的值,但是变量的取值总是取最近被赋予的值),所以要交换两个变量的值,必须引如一个 x=A A=B B=x 中间变量x,暂时存放变量A的值,并把其传递给变量B,所以中间应改为: 。 四 条件语句常见错误解析 例:编写一个程序,对于函数输入x的值,输出相应的函数的值。某同学编写了一个程序(图二),正确吗?如果不对,错在哪里?为什么? IF 条件 THEN 语句体 END IF INPUT x IF x<0 THEN y=-x+1 ELSE IF x=0 THEN y=0 ELSE y=x+1 END IF PRINT y END (图三) IF 条件 THEN 语句体1 ELSE 语句体2 END IF (图四) (图二) 解析:条件语句的格式有两种,一个是只有一个“分支”的条件语句,它的格式见图三,一个是有两 个“分支”的条件语句,它的一般格式见图四,这个同学编写的程序实际上两次运用了两个分支的条件语句,但是第一个条件语句实际上并不完整,少了一个END IF,所以应在PRINT y前加一个END IF. 例:闰年是指年份能被4整除但是不能被100整除,或者能被400整除的年份,编写一个程序,判断输入的年份是否为闰年。 错解:依题意设计的程序如下: INPUT “请输入一个年份”;x IF x MOD 4=0 AND x MOD 100<>0 OR x MOD 400=0 THEN PRINT “输入的年份是闰年” ELSE PRINT “输入的年份不是闰年” END IF END END INPUT “请输入一个年份”;x a=x MOD 4 b=x MOD 100 c=x MOD 400 IF a=0 AND b<>0 THEN PRINT “输入的年份是闰年” ELSE PRINT “输入的年份不是闰年” END IF IF c=0 THEN PRINT “输入的年份是闰年” ELSE PRINT “输入的年份不是闰年” END IF END (图六) 解析:本题是教材上的一道习题,这个错解是教师教学用书给出的答案,错误的原因在于,本程序有两套条件语句,当我们输入一个年份后,要被执行两次判断,结果会输出两次,对有些年份会输出两个相反的结果。如:输入年份2008,按照第一套条件语句,2008是闰年,但是按照第二套条件语句,2008不是闰年。 (图五) 正解:依题意设计的程序如图六。 WHILE型 备注:本程序把三个判断的条件集中在一起,对输入的年份只判断一次,便见分晓,有效地避免了错解中自相矛盾的现象,同时本解法还将错解中的赋值语句省略,集中到条件语句中说明是一个十分简捷程序。 五 循环语句常见错误解析 例:分别用WHILE型语句和UNTIL型语句设计一个求的值的程序。 错解:设计程序如下: WHILE型 UNTIL型 i=1 sum=1 WHILE i<=100 Sum=sum+1/i i=i+1 WEND PRINT sum END i=1 sum=0 DO Sum=sum+1/i i=i+1 LOOP UNTIL i>=100 PRINT sum END (图八) (图七) 错解分析:在WHILE型程序里面i=1、sum=1,控制循环的条件为i100,按此算法最后得到的结果应为,而不是题目要求的,改正的方法是将sum=1改为sum=0;在UNTIL型程序里面i=1、sum=0,控制条件为,按此算法最后得到的结果是,而不是题目要求的,改正的方法是将改为。 备注:①在含有循环语句的程序里面,变量的初始值和控制循环的条件是两个关键点,它们直接影响程序的输出的结果,在这两点上,同学们一定要注意辨析,谨防出错。一般情况下,把累加变量sum的初始值定为0,这样,如果是WHILE型程序,循环的条件一般可以写为,如果是UNTIL型程序,循环条件一般可以写为,其中就是数列的总项数,操作简单省心。 ②当型循环结构,先要在判断框中对循环条件进行判断,保证条件满足就执行循环体,否则就停止;直到型循环结构,就要先执行一次循环体,然后在判断框中对循环条件进行判断,保证条件不满足就执行循环体,满足就停止。 ③对同一算法来说,当型循环和直到型循环的条件互为反条件,如果WHILE型程序的循环条件是,则UNTIL型程序的循环条件是。 例 自然对数的底数的近似计算公式为。(其中),的值越大,愈越近的真值。某同学编写了一个时计算的程序。正确吗?为什么? e=1 a=1 i=1 WHILE i<=10 e=e+a a=a/i i=i+1 WEND PRINT e END 解析:该循环语句的循环体有错误,按照此程序运行得到的结果是 ,所以要把循环体中的a=a/i改为a=a/(i+1). 备注:一个程序编写完成之后,最好在草稿纸上“运行”一下,看自己编写的程序是否满足题意,不行,就要找问题,进行调整修改。 浅谈算法在数值计算题中的应用 解决各式各样的问题,着重计算,而计算的方法、过程以及步骤就是算法。由于算法是解决一类问题,因此利用算法我们很容易解决函数和数列相综合的问题,因为这类型问题往往涉及利用函数表达式或数列的通项公式进行数值计算。 对于这类问题,一般涉及选择结构与循环结构,其中应特别注意两种循环语句:“For循环”和“While循环”语句,一般“For循环”是在循环次数已知(循环终止值已知即后测试)时使用(当循环变量不小于“初值”且不大于“终值”时,执行循环体),而“While循环”在循环次数未知时使用(前测试)。要注意三个环节:一是循环变量的设置,二是循环体中语句的构造,三是循环结构的控制。 常见的问题有: 一、增长率、复利问题: 例1、某城市现有人口总数为100万人,如果年自然增长率为1.2%,试解答下列问题: (1)写出该城市人口数y(万人)与年份x(年)的函数关系式; (2)用伪代码及流程图表示计算10年以后该城市人口总数的算法; 开始 结束 S<120 输出x N Y 题(3) (3)用伪代码及流程图表示如下算法:计算大约多少年以后该城市人口将达到120万人。 开始 结束 x>10 输出S N Y 题(2) 解;(1) (2)伪代码如下: (3)伪代码如下: 开始 结束 i<1000 输出S N Y 二、整除与余数问题: 例1、请设计一个算法求1~1000内所有能被3整除的数的和。 分析:符合条件的数有3,6,9,…,999,共333个数的和。 S←0 i←3 While i<1000 S←S+I i←i+3 End While Print S 例1 解:伪代码与流程图如下: 例2、设计一个算法,计算100以内被3除余1的所有正数的积。 S←1 m←1 For I From To 34 S←SI m←m+3 End For Print S 例2 分析:符合条件的数为1、4、7、…、100共34个数的积,因为循环次数已定,因此考虑用For循环。 评注:For循环结构比较简单,往往通过计数变量来控制循环结构,但应注意在此结构中,不能对计数变量重复赋初值,其中i的功能表示求和次数。 三、数列中的求和与积问题 例1、设计算法:求的值。 分析:本题已知终止值,故用For循环。 解:因为循环变量的取值为从1到99,以2为步长, 故伪代码及其流程图可表示如下: 开始 结束 I>99 输出S N Y S←0 For I From 1 To 99 Step 2 S←S+I2 End For Print S 例1 评析:在这个循环语句中,I为循环变量,其取值在 循环体中自动出现,不需要对其初值进行赋值。本题的算法具有通用性,若计算只要将I=1,改为I=2即可,若计算,只要将,变为即可。 例2、设计算法,求使成立的最大正整数n的值。 分析:因为具体的n的值是需要探求的,所以可以采用前测试的当型循环结构以判断条件是否满足。因为该循环的终值不知道,所以采用While循环语句表示此算法。 S←0 n←1 While S<1000 S←S+I2 n←n+2 End While Print n 例2 评注:当退出循环体S是第一个不小于1000的值,因此应该取其前一个S所对应的n,要注意到,在得到第一个不满足循环体条件的S值后,n的值又被加了2,故使S小于1000的值n应该为退出循环时的n值减去4。 如果将流程图改为下列两种,在第一个流程图中,初始值应改为多少?输出值又是多少?若改为第二个又应该是多少? 开始 结束 S<1000 输出n N Y 开始 结束 S<1000 输出n N Y 开始 结束 S≥1000 输出n N Y 输入n 结束 i<=n 输出S N Y 开始 例3、设计一个算法求。 分析:本题涉及连续两个自然数的积的倒数的和,可以设计如下的算法,当然也可以使用裂项相消法设计算法也比较简单。 INPUT “n=”;n S←0 i←1 While i<=n S←S+1/(i*(i+1)) i←i+1 End While Print S 例3 输出S 结束 N I← I+1 aI←aI×I Y |S-2.718|>0.001 S←S+ 开始 I←1 aI←1 S←2, 例4、在科学技术中,常常使用以e为底的对数, 常数e是一个无理数,它的计算公式是: (1)请设计一个e的近似值算法,要求结果与2.718差的绝对值不超过0.001; (2)画出流程图; (3)写出伪代码. 解:(1)算法步骤: S1 I←1; S2 S←2; S3 aI←1; S4 如果|S-2.718|>0.001,那么I←I+1, aI←aI×I,S←S+,重复S4; S5 输出S. (2)流程图 (3)伪代码: I←1 S←2 aI←1 While |S-2.718|>0.001 I←I+1 aI←aI×I S←S+ End While Print S 例5、设计一个算法求的值。 分析:这是一个求正负相间的问题,关键是如何使用选择结构与循环结构,这涉及嵌套问题。 解:设计如下三种算法: S←0 i←1 While i<=1000 n←MOD(i,2) IF n=1 THEN S←S+(i/i) ELSE S←(1/i) END IF i←i+1 End While Print S End S←1 i←1 For I from 2 to 1000 a←a(-1) S←S+a/i End for Print S End S←1 i←2 While i<=1000 a←a(-1) S←S+a/i i←i+1 End While Print S End S←1 i←1 While S<=1000 i←i+2 S←Si End while Print i End 例6 评注:注意算法的简捷与操作的简单,计算步骤要少。 例6、设计一个算法求满足下面条件的最小正整数。 分析:本题涉及从1开始连续奇数的积大于10000时的最小正整数问题,由于不知道该数是多少(即不知道循环的次数),因此使用“当型循环”。 开始 结束 i<=10 输出n N Y 解:算法如下: 例7、一球从100m的高度落下,每次落地后又反跳回原来高度的一半,再落下,在第10次落地时,小球共经过多少路程? 分析:根据题意,可知有如下递推关系:,到第10次落地时,共经过的路程为,故可将s作为累加变量,i为计数变量。 解:流程图与伪代码如下: a←1 b←1 For I from 3 to 12 c←a+b a←b b←c End for Print c End 例8 S←0 h←100 i←1 While i<=10 S←S+2h h←h/2 i←i+1 End While s←s-100 Print s End 例7 例8、(Fibonacci数列)设有一对新生兔子,从第三个开始它们每个月都生一对兔子,按此规律,并假设没有兔子死亡,试设计算法计算一年后兔子的对数。 分析:根据题意可以发现,每月的兔子数组成的数列为:1,1,2,3,5,8,…,其中的规律在于:每个月的兔子数由两部分组成,即上个月的老兔子数与这个月刚生下的新兔子数,而这个月刚生下的兔子数就是上上月兔子数,也就是说从第3个数开始,每个数都是其前面两个相邻数之和,直到第12个数为止,因此在构造循环体的过程中,可依次设定三个变量a,b,c,循环体的语句设定为c←a+b,但注意到变量a,b的值在向变量c赋值后要更新,因此循环体中还必须增加语句对两变量重新赋值。 开始 结束 i>30 输出s N Y 解:伪代码如图 训练题: 1、已知算法(1)、(2)试根据要求分别完成下列两道题: 算法(1) 算法(2) 根据算法(1)的伪代码,指出相应 画出算法(2)的流程图,指出相应算法 算法功能并画出相应的流程图。 功能并求出a=423时S值; 解:功能是求满足不等式 的最大正整数。 (或的最小正整数的前一个) (2)求整数a的所有比它小的正因数的和 开始 结束 i>=30 输出s N Y 2、设计一个算法,输入一个数n,求的值。 x←0 g←2*x+3 f←g*g-1 y1←f x←2 f←x*x-1 g←2*f+3 y2←g y←y1+y2 Print y End 例1 Read n s←0 For I from 1 to n s←s+ End for Print s End 训练题2 3、给出30个数:1,2,4,7,…,其规律是:第一个数是1,第二个数比第一个大1,第三个比第二个大2,第四个数比第三个数大3,依次类推,要计算这30个数的和。 解:流程图为: 四、求函数值、解方程 例1、(1)已知函数,设计一个 算法求的值; (2) 已知函数 试设计一个算法求。 x←4 y←x*x*x-2*x+1 Print “f(4)=”;y End 例2 例2、某铁路客运部门规定甲、乙两地之间旅客托运行李的费用为 ,其中w(单位:kg)为行李的重量. 计算费用(单位:元)的算法可以用怎样的算法结构来表示? 分析:这是一个分段函数的问题,要使用选择结构。 解:其算法为: Sl 输入行李的重量w; S2 如果w≤50,那么, 否则; S3 输出行李重量w和运费.上述算法用流程图表示如图所示. 例3、设计求解一元二次方程 的一个算法.并用流程图表示。 For x from 1 to 10 For y from 1 to 10 If Then Print x,y End for End 例4 分析:因为一元二次方程未必总有实数根.所以求方程时先计算判别式,然后比较判别式与0的大小,再决定能否用求根公式进行求解.因此,在算法中应含有选择结构. 解 算法如下: S1 输入; S2 ; S3 如果,那么输出“方程无实数根”, 否则, S4 输出;.根据上述步骤,可以画出流程图查看更多