摘要:C语言的技能题让许多同学心里打悚,可谓是望虎生畏。怎么让学生打破心里的畏惧,去接受、学习、探索C语言的内在的奥妙,发现学习它的乐趣呢?让我们当学生的导游,学习的领航者,带着学生一起去发现内在规律,去一点点发现它,理解它,领会它,应用它。
关键词:C语言;发现;内在奥妙
数组部分的知识是C语言的大头,C的技能必考题,也是许多学生害怕的题型,但实际上它有基本固定的模式,有一定的规律,最常见就是排序、查找、插入(右移)、删除(左移)、矩阵的问题、数制的问题等,一般都有一定的规律,如果找到了内在的规律,再去做题,就能举一反三,就能找到学习的乐趣,学习的信心了。我在讲到数组的同步的练习的时候就带学生去探索寻找规律,然后表示规律,应用规律,巧解了很多题,我主要从以下几个方面来尝试的:
一、 根据题干提供的线索,巧找内在规律
大家看看下面的图形,要我们产生并输出如下图形,有什么样的规律?乍一看起来,好复杂呀!
其实不要紧,还是那句话,填空把难的都屏蔽掉了,它会给我们思路,根据题干给的思路我们来分析一下:
我们来逐个击破,先看第一个空,什么情况下,a[i][j]=1;很显然,这是个送分题,两条对角线上,行号列号相等时,也就是我所标两条红、绿线的位置,规律是:主对角线上i=j;次对角线i+j=6。所以根据题干轻而易举地就划出了这两道线,继续来找规律:(绿线)主对角i=j;绿线的左边满足的条件是i>j;绿线的右边满足的条件是i
值为2:i 值为3:i>j&&i;+j<6 值为4:i 值为5:i>j&&i;+j>6 最后一个空也是送分题,换行,大家显而易见,每行的各列输出完毕了,换行。 从本题可以看出,整个图形被两条对角线划分成了四块,两两条件相交就写出了各块的规律。这样做是不是最好的方法呢,不是,为什么? 二、 根据程序蕴藏的暗示,巧用数据带入 刚刚的题目,如果让我们写整个程序,我们那样做非常透彻,也拎得非常清晰,但现在仅仅是个填空题,需要这么大费周折吗?不需要,还有什么方法吗?巧用数据带入。 else if(i else if(i>j&&i;+j<6)a[i][j]=3; 题中的这两句暗示我们,找个特殊的数带入看看行列之间的关系,还有行列和与6之间的关系。例如第一行的第三列a[0][2]=2,行号<列号,行号+列号<6,那这一个空值是2,同理,找个数值是4的位置,如a[3][6]=4,亦可推出行号<列号,行号+列号>6的条件。 用数字带入不仅仅是解数学书上的选择题的方法,在我们C语言的图形上也是可以用的,用得巧了,同样可以化难为易,同样可以节省时间。当然了,数的选择,条件的拎出离不开我们以前知识的积累,特别是在现在后期的复习阶段,这就是我所提到和第三种技巧。 三、 根据以往学习的知识,巧构知识体系 比如在做题的时候遇到这样一道题:将S所指字符串的正序和反序进行连接,形成一个新串放在t所指的数组中。例如:当s串为“ABCD”时,则t串的内容为“ABCDDCBA”。通过审题我们可以看出这也考了两个知识点:一是逆序,二是连接。逆序的问题我们以前遇到的,有这样两种情况:一是逆序后放入原数组,二是逆序放入另一数组。连接的问题我们上面也讲道过,所以我是这样引导学生的: (1) 同一数组中数据的逆序存放a[i]=a[n-1-i] 引导学生回顾相约在高校中的同一数组逆序的存放问题,学生很快就答出来了。接着我又提出,若是放在另一数组中呢,学生很快写出了下面的第二步:t[i]=s[n-1-i] (2) 把数据逆序存放到另一的数组中t[i]=s[n-1-i] 那如果是逆序后存放在另一数组之后呢,要先求出那个数组原来的长度,然后通过下标的同步变化就可以得到第三步。我又拿出了一题刚刚讲到的连接的问题,如下: JOIN(S1,S2) char s1[80];s2[40]; {int i,j; /***************SPACE*************/ for(i=0;[?]'\\0';i++) s1[i+j]=s2[i]; /***************SPACE*************/ s1[i+j]=[?]; }通过s1[i+j]=s2[i];这条语句可以看出是把s2放入s1中,所以空填“s2[i]!=”同时也可以看出变化的下标是i,j是不变的,那么j是什么,这是个连接问题,那么j就是s1的长度。最后所有的数都取完了,怎么办,人为的结束s1。这就解决了连接的问题。 (3) 把数据逆序连接到另一数组中t[d+i]=s[n-1-i] 这样就把我们学过知识都复习了,同时还联系到了一起,以后学生再做这类题的时候就知道慢慢地转接,一步步地嫁接,最后问题就迎刃而解了。 四、 根据前后程序的联系,巧套函数调用 随着这两年学生基础的薄弱,越来越多的同学放弃编程题,还有一类是比较容量得分的,只要学生够细心,能找到,一一对应起来就可以得分,这就是用户定义函数的调用,要么考用户定义的函数名,要么考在主函数中函数调用的语句。做题时只要看看参数的作用,主程序的意图,模仿着写,对应着就行了。例如:有这样一个程序,在主程序中,给出了数组a的值,想把它顺时针转90度输出。在用户定义的函数中有这样一句:b[i][j]=a[n-1-j][i];说明是把a转成b,且用户定义的函数名为void chang(int a[][N],intb[][M]);那主函数套用就行了肯定是chang(a,b)。所以我们在任何时候都不要畏惧,都不要放弃,用心地静心地去看去做一些题,我们就会发现不像我们想象的那样难,我们会发现只要我们细心我们就能看出出题者的意图,顺着他的思路写下去,做出来。 让我们再细心一点,再耐心一点,再多付出一点工夫,我相信我们一定可能在C中找到更多的乐趣,找到更多的技巧。 作者简介:倪艳芬,江苏省徐州市,江苏省徐州市张集中等专业学校。