您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页读程序写结果之基础篇

读程序写结果之基础篇

来源:叨叨游戏网
读程序写结果之基础篇

读程序写结果,大致可以考察学生几方面的能力:一是程序设计语言的掌握情况;二是相关算法的掌握情况;三是数学的知识面及运算能力;四是细心、耐心的心理品质。在NOIP初赛中所占的分值,近几年一直维持在(4×8)分。对于参赛选手,又快又准地完成这类题,显得尤为重要。本系列文章将全面分析这类题的常用解题方法与技巧,敬请期待。

本讲,我们简要说明一下阅读程序写结果,或者说参与NOIP初赛,要了解并掌握的一些语言基础(以Pascal语言为例),以及解决此类型题目的最基本解法。 一、Pascal相关知识备忘(以free Pascal 2.04为语言载体)

熟练掌握并灵活使用以下Pascal语言相关知识: (一)、常用运算:

1、算术运算:+、-、*、/、DIV、MOD

2、字符串运算:+ (字符串连接) 3、集合运算:+(并集)、*(交集)、一(差集)、in 2、关系运算:>、<、=、<>、>=、<= 3、逻辑运算:NOT、AND、OR、XOR (二)、常用子程序

1、 求绝对值函数abs(x) 如:abs(3)返回值为3;abs(-3.1)返回值为:3.1 2、 取整函数int(x) 定义:function Int(X: Real): Real;

如 int(3.6)返回值为:3.0;int(-3.6)返回值为:-3.0

3、 截尾函数trunc(x) 定义:function Trunc(X: Real): Longint

如 trunc(3.6)返回值为:3;trunc(-3.6) 返回值为:-3

4、 四舍五入函数round(x)

如 R := round(123.456);{123} R := round(12.56);{13} R := round(-123.456);{-123} R := round(-12.56);{-13}

5、 取小数函数frac(x)

如R := Frac(123.456); { 0.456 }; R := Frac(-123.456); { -0.456 }

6、 求平方根函数sqrt(x)和平方函数sqr(x)

如:R := sqrt(4); { 2.0 }; R := sqr(4); { 16 }

7、 求以e为底幂函数exp(x) : e 8、 求以e为底对数函数ln(x) : logxex

9、 随机数函数function random[(range:word)]:

randomize 随机数初始化语句 random 返回[0,1) 之间的随机实数 random(range) 返回[0,range)随机整数

10、 11、 12、 13、 14、

求字符x对应序号函数ord(x) 如R := ord(‘A’); { 65 } 求序号x对应字符函数chr(x) 如R := chr(65); { ‘A’ }

将字符串小写转换为大写函数upcase(st) 如R := upcase(‘AbcD’); { ‘ABCD’ }

求前趋函数pred(x) 如R := pred(‘B’); { ‘A’ } 求后继函数succ(x) 如R := succ(‘B’); { ‘C’ }

第 1 页 共 5 页

15、 16、

判断x是否为奇数函数odd(x) 如R := odd(7); { TRUE }; 如R := odd(8); { FALSE }

字符转换为数值过程val(str,a,b)

如,执行语句val(‘2.4’,a,b); 后,a值为:2.4

执行语句val(‘2c4’,a,b); 后,a为:0,b为:2 数值转换为字符过程Str(a,st)

如,执行语句str(12, st); 后,st值为:’12’

求字串st长度函数length(st) 如R := length(‘ABC’); { 3 }

17、 18、 19、 20、 21、

函数Pos(st1,st):查找st1在st里的起始位置,整型。 如R := pos(‘cd’,’abcde”); {3}

函数Copy(st,a,b):提取st里第a个位置的b个字符。 如R := copy(‘abcdef’,2,3); { ‘bcd’ }

过程Delete(st,a,b):删除st中第a个位置的b个字符 如,执行语句:

st=’abcdef’; delete(st,2,3); 后,st值为:’aef’

过程Insert(st1,st,a):把st1插入st的第a个位置中 如,执行语句:

st=’abcdef’; insert(‘xy’,st,3); 后,st值为:’abxycdef’

22、

23、 24、

过程Fillchar(x,y,a) :按字节填充。常用Fillchar(a,sizeof(a),0)对数组的所有元素进行清零。

过程Inc(i) 使i:=i+1; Inc(I,b) 使I:=I+b;

25、 过程dec(i) 使i:=i-1;

dec(I,b) 使I:=I-b;

EOF:判断当前打开的文件是否已到文件尾

27、 EOLN:判断是否为行尾 (三)、位运算

26、

1、 SHR:x SHR n 把x换成二进制后向右移n位

a shr b表示二进制右移b位(去掉末b位),相当于a除以2的b次方(取整)。

我们也经常用shr 1来代替div 2,比如二分查找、堆的插入操作等等。想办法用shr代替除法运算可以使程序效率大大提高。最大公约数的二进制算法用除以2操作来代替慢得出奇的mod运算,效率可以提高60%。 2、 SHL:x SHL n 把x换成二进制后向左移n位

a shl b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 shl 2 = 400。可以看出,a shl b的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以2。

通常认为a shl 1比a * 2更快,因为前者是更底层一些的操作。因此程序中乘以2的操作请尽量用左移一位来代替。

3、 and :位与。(1可视为真;0为假)。在其它领域可用符号∧、·表示。 4、 or :位或。在其它领域可用符号∨、+表示 5、 xor:位异或。在其它领域可用符号表示 6、 not:按位取反。在其它领域可用符号表示

第 2 页 共 5 页

例:Var i,j:byte;

begin

i:=10; { (10)10= (0000 1010)2 } j:=12; { (12)10= (0000 1100)2 }

writeln(i shr 2); {(0000 1010)2向右移两位,高位补零:(0000 0010)2,输出2} writeln(i shl 2); {(0000 1010)2向左移两位,低位补零:(0010 1000)2,输出40} writeln(i and j); { (0000 1010)2 ∧ (0000 1100)2=(0000 1000)2 ,输出8} writeln(i or j); { (0000 1010)2 ∨ (0000 1100)2=(0000 1110)2,输出14} writeln(i xor j); { (0000 1010)2  (0000 1100)2=(0000110)2 ,输出6} writeln(not i); { (0000 1010)2 =(1111 0101)2,输出245}

end.

(四)、几个语句及几个符号

1、 break:退出循环

2、 continue:直接回到循环体顶部执行

3、 exit:退出当前子程序。若是主程序,结束运行。 4、 halt:结束运行,回到操作系统 5、 记录的定义及使用、开域语句with 6、 指针的定义与使用:

^ :定义指向某类型的指针变量,该变量存放内存地址。 取出该变量存放的内存地址所指向内存变量的值

@ :取变量的内存地址。常用于对指针变量赋值。

这些最基本的语言基础,是“读程序写结果”的立根之本。只有熟练掌握这些语言基础,才能看懂与之相关的程序。 二、基本解法

NOIP初赛“读程序写结果”有比较多的基础题,特别是近三四年,经常出现。这类题,只要在了解语言,特别是了解以上介绍的这些基础知识,再通过“人脑模拟程序”的方式,进行简单的数算,就可以得出答案。考查的是选手对语言基础的掌握情况,以及计算的细心与耐心。以下,选例讲解: [选例一 NOIP2008提高组第一题]

var

i,a,b,c,d:integer;

f:array[0..3] of integer; begin

for i:=0 to 3 do read(f[i]);

a := f[0] + f[1] + f[2] + f[3]; a := a div f[0];

b := f[0] + f[2] + f[3]; b := b div a;

c := (b * f[1] + a) div f[2]; d := f[(b div c) mod 4];

if (f[(a + b + c + d) mod 4] > f[2]) then begin

a := a + b; writeln(a); end else begin

第 3 页 共 5 页

解答过程如下: f[0] f[1] f[2] f[3] 9 19 29 39 a=9+19+29+39=96 a=96 div 9=10 b=9+29+39=77 b=77 div 10=7

c=(7*19+10) div 29=4

d=f[77 div 4 mod 4]=f[2]=19 f[(10+7+4+19) mod 4]=f[0] f[0]=9<29=f[2] 条件不成立

c := c + d; writeln(c); end; end. c=4+19=23 输出答案 23

输入:9 19 29 39

输出:___________

[简析]这种题,近三四年每年都出现,基本上可以说是增加选手信心的送分题。细心顺着语句,简单模拟一遍,答案自然就出来了。需要强调的是,解题过程中千万别“看轻”这类题,掉以轻心、粗心大意。务必仔细认真,特别是看清楚变量,不要张冠李戴、以桃代李。如果大家都能得分的,不小心失分了,那是最大的损失!建议,如上把解答的过程直接详尽清晰地写在程序的右边,不容易错,也便于检查。 [选例二 NOIP2007提高组第二题]

program s402; var a,b:integer;

x,y:^integer;

procedure fun(a,b:integer); var k:integer; begin

k:=a; a:=b; b:=k; end; begin a:=3; b:=6; x:=@a; y:=@b; fun(x^,y^);

write('No.1:',a,',',b,' '); fun(a,b);

writeln('No.2:',a,',',b); end.

输出:

[简析]主要考查的是指针的简单使用以及子程序的值参概念。@为取变量的内存地址,x:=@a,也即x 存放的就是变量a的内存地址。x^表示的是,内存地址为x的整型变量的值,其实也即变量a的值。所以,变量a与变量x^是完全等价的,也即两个调用是完全一样的。结合值参概念,容易知道其结果是:No.1:3,6 No.2:3,6

这题的关键是指针的基本使用,尤其是取地址@。

请思考以下程序的输出结果:

program s402; type point=^integer; var a,b:integer; x,y:point;

procedure fun(a,b:point); var k:integer; begin

k:=a^; a^:=b^; b^:=k; end; begin

第 4 页 共 5 页

a:=3; b:=6;

write('No.1:',a,',',b,' '); x:=@a; y:=@b; fun(x,y);

writeln('No.2:',a,',',b); end.

输出: [选例三 ]

Program ex3;

var n,i,j:Longint;

s:Array [1..100] of integer;

begin

readln(n);i:=0; Repeat

inc(i); if odd(n) then s[i]:=1 else s[i]:=0; n:=n SHR 1; Until n=0;

for j:=i downto 1 do write(s[j]);writeln;

end.

输入:2009

程序运行的结果是:

[简析]本题的关键是清楚子程序inc(i)、odd(n)的含义,以及运算符shr的运算结果,特别是运算符shr的含义,如果不知道,那这题就没得做了。函数odd(n)是判断n是否为奇数,而shr是按位右移,高位补零。“直译”程序的意思是:n为奇数s[i]为1,否则s[i]为0;接着用右移运算,消去n化为二制进后的最低位。直到n为零。 其实,每次消化的n的二进制位最低位,就直接保存在数组s中。由此可知,其实输出的就是n转换为二进制后的结果:11111011001.

小结:全面掌握语言基础,是“读程序写结果”的立根之本。如果碰到哪个函数不清楚,哪个运算符或符号不了解的,那么相关题目就会当场挂掉。“读程序写结果”,一题就是8分,因这种原因而失分是痛中之痛。基于这点,在NOIP初赛前,全面复习相关基础知识是必要的、也是重要的。

第 5 页 共 5 页

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务