1 / 19

程序填空

程序填空. 程序填空题的特点. 是初赛试题中最难的题目。这些程序都具有高效 , 规范的特点 , 如果你读懂了 , 会有一种“恍然大悟”的感觉。 题目中会明确交代程序的目的(功能),还有的问题会明确告诉所使用的算法。但也有些问题需要选手揣摩题目使用的算法,有时题目会独创一些算法,即在教科书中找不到的算法 . 将一些关键的语句或变量、函数等去掉,让选手去填写。

Download Presentation

程序填空

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 程序填空

  2. 程序填空题的特点 • 是初赛试题中最难的题目。这些程序都具有高效,规范的特点,如果你读懂了,会有一种“恍然大悟”的感觉。 • 题目中会明确交代程序的目的(功能),还有的问题会明确告诉所使用的算法。但也有些问题需要选手揣摩题目使用的算法,有时题目会独创一些算法,即在教科书中找不到的算法. • 将一些关键的语句或变量、函数等去掉,让选手去填写。 • 有的空不止一种填法,如i:=i+1,可以用inc(i)表示,i:=i-1可以用dec(i)表示,while p=true可以用 while p表示,a>b可以用not a<=b或b<a表示,填写时尽量简洁明了。

  3. 解题的一般方法 • 理解题意:  主要是根据问题的描述,确定问题的已知条件,并了解算法(程序)要达到的目的。通俗讲,就是要知道问题的输入和输出。 • 确定算法:   每个题目在前面都有描述,通过对描述的分析,要确定题目应该属于哪一类数据结构以及相应的算法。有些题目可能不属于任何数据结构,则它可能与某类算法有关;但也有一些算法纯粹是数学方法或数学问题。   在描述中同时要理解算法过程。在分析算法时,可以以某个具体实例来试验(类似于程序阅读中的“模拟法”)。 • 理解程序:   分析程序结构,如果有很多子函数,首先弄清楚各函数之间的关系和各函数的作用;如果程序较长,则应该根据算法过程,把每个程序段与算法的每个过程对应起来,确定相应的程序段功能。   在程序中,已经定义了某些变量,则在理解程序时,首先必须理解这些变量的含义 • 根据Pascal语言的语法填空,不能将平时写作文时或做数学题时的习惯写法带到Pascal中来。

  4. 小技巧 • 主程序或子程序的开始部分,往往涉及到变量的初始化,如整型变量初始为0或1等,一个数组所有元素全部初始为0或1等…… • 主程序或子程序的说明部分,往往涉及到变量的定义。 • 如果调用了子程序,注意传递了哪个(些)变量,是传值还是传地址。

  5. 例题1 题目描述:   方程ax^2+bx+c=0,要求给出它的实数解.   输 入:     三个实数:a,b,c,是方程的三个系数(a≠0).   输 出:    如果无实数解,则输出"No solution"; 如果有两个相等的实数解,则输出其中一个,四舍五入到小数点后面3位; 如果有两个不等的实数解,则解与解之间用逗号隔开,同样要四舍五入到小数点后3位   输入样例: l 2 1   输出样例: -1.000

  6. Program c200301; var a,b,c,m:real; begin read (a,b,c); m:=b*b -4*a*c; if ( ① )then begin write ( ②:0:3); write( ` , ` ); write ((-1*b-sqrt(m))/(2*a):0: ③ ); end else if ( ④ )then write( ⑤ ) else begin write (`No solution`); end end.

  7. 参考答案 (1) m>0 (2)(-b+sqrt(m)/(2*a)) (3)3 (4)m=0 (5)-b/(2*a)

  8. 例题2 三角形内切圆的面积 题目描述: 给出三角形三边的边长,求此三角形内切圆(如上图所示,三角形的内切圆是和三角形三边都相切的圆)的面积。 输入: 三个正实数a、b、c(满足a+b>c,b+c>a,c+a>b), 表示三角形三边的边长。 输出: 三角形内切圆的面积,结果四舍五入到小数点后面2位。 输入样例: 3 4 5 输出样例: 3.14

  9. 程序: program program1; var a, b, c, r, s, t: real; begin read(a, b, c); s := ( ① ) / 2; t := ② (s * (s - a) * (s - b) * (s - c)); r := t / s; writeln(3.1415927 * r * ③ : 0 : ④ ); end.

  10. 参考答案 • a+b+c • Sqrt • r

  11. 例题3 判断质数 题目描述: 给出一个正整数,判断这个数是否是质数。 输入: 一个正整数n(1 ≤ n ≤ 10000)。 输出: 如果n是质数,输出”YES”;否则,输出”NO”。 输入样例: 10 输出样例: NO

  12. 程序: var ① : integer; begin read(n); if n = 2 then writeln( ② ) else if ( ③ ) or (n mod 2 = 0) then writeln('NO') else begin i := 3; while i * i <= n do begin if ④ then begin writeln('NO'); exit; end; i := i + 2; {!为什么它不用i:=i+1?i是奇数还是偶数?} end; writeln('YES'); end; end. 附加问题:用的是什么算法?

  13. (1) i,n (2)’YES’ (3)n=1 (4)n mod i=0

  14. 例题4 输入n个0到100之间的整数,由小到大排序输 出,每行输出8个。

  15. 程序清单: program chu7_5; var i,j,k,n,x:integer; b:array[0..100]of integer; begin readln(n); for i:=0 to 100 do b[i]:=0; for i:=1 to n do begin readln(x); b[x]:=① {需要突破的重点} end; ② for i:=0 to 100 do while③do begin write(④); k:=k+1; b[i]:=b[i]-1; if⑤then writeln end; readln end.

  16. 参考答案 • b[x]+1 • K=0 • b[i]>0 或 b[i]<>0 • I • K mod 8=0 每输出8个后换一行 分析:数组b[x]指的是x输入的次数,如输入5个整数,分别是0,0,0,99,2,则b[0]=3,b[2]=1,b[99]=1,而b[1]等其余的98个数组元素全部为0 程序中的第三个空所涉及的while循环,输出重复的整数,如上述实例,b[0]=3,则将输出三个0

  17. 例题5,NOIP2006 由键盘输入一个奇数 P (P<100,000,000),其个位数字不 是5,求一个整数 S,使 P×S = 1111...1 ( 在给定的条件下, 解 S 必存在)。要求在屏幕上依次输出以下结果: (1)S 的全部数字。除最后一行外,每行输出 50 位数字。 (2) 乘积的数字位数。 例1:输入p=13,由于13*8547=111111,则应输出(1)8547,(2)6 例2:输入p=147,则输出结果应为 (1)755857898715041572184429327286470143613 (2)42,即等式的右端有42个1。 程序:

  18. program ex402; var p,a,b,c,t,n:longint; begin while (true) do begin writeln ('Input p, the last digit is 1 or 3 or 7 or 9:'); readln(p); if (p mod 2<>0)and(p mod 5<>0) then ① ; {如果输入的数符合要求,结束循环 } end; a:=0; n:=0; while (a<p) do begin a:=a*10+1; inc(n); end; t:=0; repeat b:=a div p; write(b:1); inc(t); if ( ② ) then writeln; c:= ③ ; a:= ④ ; inc(n); until c<=0; dec(n); writeln; writeln('n=', ⑤ ); end.

  19. 参考答案 ① break ② t mod 50=0 ③ a-p*b(或a-b*p) ④c*10+1 (或10*c+1) ⑤n

More Related