博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

信息学分区联赛初赛教学策略

Posted on 2010-10-22 21:44  桃子在路上  阅读(438)  评论(0编辑  收藏  举报

青少年信息学奥林匹克及其分区联赛活动,它能激发广大青少年对计算机及其应用的兴趣,开阔眼界,扩大知识面,培养他们的逻辑思维、创造思维以及应用计算机解决实际问题的能力。信息学奥林匹克的核心是程序设计+算法,因此首先必须扎实的掌握一门计算机语言。现可选用PASCAL或C语言(因从2004年开始,取消使用BASIC参加竞赛)。近年来,每省都有千人以上参加此项竞赛活动。对推广、普及计算机知识起到了重大的推动作用。
    但综观信息学奥林匹克及分区联赛普及组初赛,总体实力还是偏低。主要表现在学生重书面知识,轻动手实践,重题海战术轻能力培养,重题型轻思维训练。根据这些情况,结合信息学分区联赛命题新大纲,这就要求我们认真分析试题的最新趋势,以改变我们的教学策略,全面提高学生的信息素养及创新能力。
    一、注重紧跟命题新趋势,灵活应用数据结构
典型题例是选择题。近年来初赛基础知识的考查范围有了很大变化,越来越紧跟时代潮流,它需要有比较广泛的计算机基础知识,包括计算机硬件,软件,网络,数据结构等内容。现在的基础部分已经基本上放弃了DOS这块内容。取而代之的是计算机网络及数据结构的栈、队列、树、图、查找、排序等内容。
例1:IP地址是(  )位二进制码。(A) 8  (B) 16  (C)32  (D)64
分析:IP地址是计算机内由8位二进制数组成,用英文句点隔开的4个0-255的数学表示,共有4*8=32位。因此IP是由32位二进制码组成。
例2:下列计算机设备中,既是输入设备,又是输出设备的是(   )。
  (A)键盘 (B)触摸屏 (C)扫描仪 (D)投影仪 (E)数字化仪
分析:通过该设备能把信息传递给计算机的就是输入设备,反之通过该设备能把信息传递给人的输出设备,通过分析得出答案是触摸屏。
例3:一个高度为h的二叉树最小元素数目是( )。 (A)2h+l (B)h (C)2h-1 (D)2h (E)2h-l
分析: 此题主要考查二叉树的概念。根据二叉树的特点,每一个结点有且仅有一个前继,每个结点最多有两个后继。得出最小元素数目是h.
例4:若已知一个栈的入栈顺序是1,2,3,…,n,其输出序列为P1,P2,P3,…,Pn,若P1是n,则Pi是( ) A)i  B)n-1  C)n-i+1  D)不确定。
分析:根据栈的先进后出的特点,则Pi的值为n-i+1.
教学策略:我们必须注重基本概念的理解,紧跟时代潮流,掌握最新的计算机软硬件知识及网络应用知识。根据命题的方向,灵活应用数据结构中的线性表、树、图论、串等知识,在实践中多问多听多尝试新鲜事物。
    二、注重培养学生逻辑思维和抽象思维能力
    这类题目主要是问题求解。此类题目对数学要求比较高,往往考查的是代数变形,数列(一般是考递推),排列组合、也考查一些算法和数据结构知识。具体例子如下:
例1.有2×n的一个长方形方格,用一个1×2的骨牌铺满方格。例如n=3时,为2×3方格。
 此时用一个1×2的骨牌铺满方格,共有3种铺法:如下图:

试对给出的任意一个n(n>0),求出铺法总数的递推公式。
分析:本题考查学生的递推能力和面对问题求解的思维能力。
当n=1?时,只有一种铺法,可能表示为F(1)=1
当n=2时,只有二种铺法,铺法总数为F(2)=2
当n=3时,只有三种铺法,铺法总数为F(3)=3
当n=4时,只有五种铺法,铺法总数为F(4)=5
当n=5时,只有八种铺法铺法总数为F(5)=8
 根据结果可以看出:推出公式
F(N)=F(N-1)+F(N-2)

例2、有红、黄、黑、白四色球各一个,放置在一个内存编号为1、2、3、4四个格子的盒中,每个格子放置一只球,它们的顺序不知。甲、乙、丙三人猜测放置顺序如下:
 甲:黑编号1,黄编号2;
 乙:黑编号2,白编号3;
 丙:红编号2,白编号4 。
结果证明甲乙丙三人各猜中了一半。
写出四色球在盒子中放置情况及推理过程。
分析:(1)本题是数学推理问题,考察学生推理分析问题的能力,根据题意:如果甲的后半部分对即,则黄编号为2,那么乙必定是白编号3为正确,丙只能选择红编号2,这样红与黄色编号冲突,推理出错。
    (2)事实上甲猜中的前新半部分黑编号1,乙则选择猜中的是白编号3,丙则选择猜中号为红色编号2,那么黄则是编号4,推理正确。

例3、平面上有三条平行直线,每条直线上分别有7,5,6个点,且不同直线上三个点都不在同一条直线上,问用这些点为顶点,能组成多少个不同三角形。
分析:解1:此题主要考核了组合数学知识,每条直线上取一个点能组成**个三角形,一条直线上取两个点,另一条直线上取两个点共有*(+)+*(+)+*(+)这样,共有210+231+180+130=751种
解法2:共有18个点能组成个三角形,减去同一条直线上三点的情况即
---=816-10-20-35=751种

例4、如下图,有一个无穷大的的栈S,在栈的右边排列着1,2,3,4,5共五个车厢。其中每个车厢可以向左行走,也可以进入栈S让后面的车厢通过。现已知第一个到达出口的是3号车厢,请写出所有可能的到达出口的车厢排列总数(不必给出每种排列)。

分析:此题主要考查栈的先进后出及队例先进先出的概念,给合枚举,因为3要最先出去,肯定要把1,2依次压入栈中,所以出队列的时候,2肯定在1的前面。共有9种。排列如下几种
3 2 1 4 5   3 2 4 1 5   3 2 5 4 1
3 2 1 5 4   3 2 4 5 1
3 5 4 2 1
3 4 5 2 1    3 4 2 1 5  3 4 2 5 1
教学策略:加强逻辑思维和抽象思维训练,尝试一题多解,能从不同角度分析问题,往往会得到意想不到的效果,如第三题中的解法2,是一种逆向思维的方法,使问题变的更加清析。在平常教学中加强逻辑推理、组合数学、递推与归纳及离散数学等内容的训练。
    三、注重培养学生的数学运算和归纳能力
    这类题型主要是读程序写结果。解决这类问题的关键在于能够分析程序的结构以及程序段的功能。常见的有列表法、画流程图法等。完成这类题目的方法和步骤如下:
    (1)从头到尾通读程序,大致把握程序的算法、找出这个题目的即这个程序想干什么。迄今为止考过的题目还没有“乱写”的,总有一点“写作目的”的。抓住了它,不仅得出答案变得较容易,而且对自己的结果也会比较有信心。
    (2)通过给程序分段、理清程序的结构和层次,达到读懂程序的目的
    (3)阅读程序中特别注意跟踪主要变量的值的变化,可以用列表的方法,了解变量变化和程序的运行结果,注意发现规律。所谓列表法, 就是将各变量名作为表头,在程序的执行过程中,将各变量值的变化记录在相应变量的下方。
    (4)按照程序中输出格式的要求,写出运行结果:
    (5)带着得到程序结果回到程序进行检查。
    在阅读程序时,要特别注意过程、函数所完成的子任务以及和主程序之间的参数传递关系。在阅读程序中,比较好的方法是首先阅读主程序,看其需要调用的过程或函数是什么,最后要求输出变量是什么;其次在阅读程序中,将较长的程序分成几个程序段(特别注意循环结构、判断结构),阅读理解各程序段的功能以及各程序之间的关联。
例1 program chu3;
var i,j,p,n,q,s:integer;
a :array[1..20]of integer;
begin
   readln(p,n,q);j :=21;
   while (n>0)do
   begin
     j:=j-1;a[j]:=n mod 10;n:=n div 10;
   end;
   s:=0;
   for i:=j t0 20 do s:=s*p+a[i];
   writeln(s);j :=21;
   while (s>0)do
   begin
    j:=j-1; 
   a[j]:=s mod q;
   s:=s div q;
   end;
   for i:=j to 20 do write(a[i]);readln;
end.
输入:7 3051 8
分析:此程序不含子程序。这个程序主要由两个FOR语句和while语句,第一个for控制s的求和次数,第二个for 语句控制输出数组a[i]。从第一个WHILE语句可以看出它的主要功能是把数字n分离存在数组a[j]中,第二个while语句的功能是把S由十进制数转成q进制数。
列表计算如下:

从中可以得出,输出为  1065
            2051
因此这个程序其实就是把数N分离,然后通过相应转换变成新数s,然后把数S转成八进制数输入出。但考试中有些同学由于不仔细往往会变成:1065 2051  等错误答案。

例2 program exp;
const n=10;
var  s,I:integer;
function co(i1:integer):integer;
   var j1,s1:integer;
 begin
s1:=n;
for j1:=(n-1) downto (n-i1+1) do
    s1:=s1*j1 div (n-j1+1);
co:=s1;
end;
   begin
s:=n+1;
for I:=2 to n do s:=s+co(i);
writeln(‘s=’,s);
end.
分析(1)在阅读程序中,如果有过程或函数,一般先阅读主程序,了解主程序中是如何调用过程和函数。本程序中的主程序是通过了一个循环结构(n-1)次累加函数的值。
    (2)再阅读过程或函数,了解过程或函数的功能。本题调用一个函数,其函数的功能是通过一个循环结构完成累乘和累除的计算。
    (3)通过列表了解变量变化的趋势,以便很快掌握函数所要计算的表达式,快速得到程序运行结果。
  S初始化为 S=11
当I=2,计算要S:=S+CO(2),CO(2)的值:10*9/2,所以S=11+10*9/2
当I=3,计算要S:=S+CO(3),CO(3)的值:10*9/2+10*9*8/2/3,所以
S=11+10*9/2+10*9/2+10*9*8/2/3=11+10*9/(2!)+10*9*8/(3!) ……
    (4)由以上计算,可以发现它的一般规律,该程序计算的表达式是我们非常熟悉的组合计算公式:
  =m!/(n!*(m-n)!)=m*(m-1)*…*(m-n+1)/n!
    (5)按要求输出及检查。
从此题看出,学生不仅要有良好的运算能力,也必须具有敏锐的洞察力,在运算中找到题目的规律。
教学策略:灵活运用列表法解题,运算过程中要善于揭示问题的发展规律。极度重视输出格式,如第一题,有些同学没注意WRITELN,就会导致全题失分。注重培养学生的数学运算能力和数学归纳能力。
    四、注重培养学生分析问题、理解问题的能力
    这类题型主要是完善程序填空。也是学生失分最多的题之一。常常让大家填的是:
    (1)初始化(i:=0; j:=0; for i:=1 to n do a[i]:=0之类的)
    (2)一些明显的动作:
    a.结果没有储存在需要的地方。
    b.累加器没有做加法
    c.输出
    (3)关键动作。在算法描述中出现的比较关键的步骤。例如交换排序程序的“交换”操作等很明显需要完成的操作。分析方法和写运行结果类似,注意分析变量和程序结构,理解变量和模块的作用是解题的关键。
例:1.输入n个0到100之间的整数,由小到大排序输出,每行输出8个
 程序清单:
 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.
    分析:首先从题目看到这是一个排序,但仔细一看程序,均不符合常见的排序方法。先填简单的,由每行输出8个,可见这5个空中必有两个空要填,一个是累加器的清零,另一个是每行输出8个,仔细分析应该是②填K:=0;⑤填k mod 8=0;关键动作,其它排序几乎都用交换,而这题没用到交换。使我想到筛选法求素数的方法里面的一个小技巧。即读入值的数组置1。然后从小到大(for I:=0 to 100 do )输出。所以①填B[X]:=B[X]+1③填B[I]<>0 ④填I:4再代入具体数值模拟运行,直至准确。
  
    教学策略:注重培养分析问题、解决问题的能力。教育学生解此类题尽可能要从出题者的角度出发,连读带猜的理解它的算法思想,先试探性的填些简单空。平时多读别人的程序并上机调试,尝试用不同的方法去解题,并尽可能从时间、效率上分析他为什么这样做。并及时吸取该程序的优点。