巧用利器,提高效率
——谈Delphi在信息学竞赛辅导中的应用
◎ 张文传
目前信息学竞赛的教材、资料、网站仍以Pascal作为语言载体的为多,对于采用Pascal作为竞赛语言的学生而言,教师在辅导过程中若能应用Delphi[1]这一强大工具,将会大大提升辅导效率。
通俗地说,Delphi是面向对象的Pascal(Object Pascal)的可视化编程环境,是和VB、VC++等并驾齐驱的软件开发工具。当然我们用它仅作辅助教学,只需使用其中的一小部分功能,并不涉及实际软件开发的具体细节,因此不会增加学生的额外负担。相反,Delphi可以帮助学生体验程序设计的趣味性,降低算法的理解难度,从而大大提高学习效率,现举例讨论如下:
一、增加编程的趣味性
有些刚参加辅导的同学会认为所学的内容太枯燥古板,离实际软件开发距离太远,因此渐渐失去了兴趣。针对这种情况,教师可以用Delphi给同学们演示制作一些的小游戏、小软件,使其感受到编程的趣味性。
实例:简易的愚人小程序
操作方法:
Ø 启动Delphi,这时Delphi已自动建立了一个Application,在窗体中放入一个Button;
Ø 双击Button1,在var Form1: TForm1;下面输入i:integer;,建立一个全局变量;
Ø 在procedure TForm1.Button1Click(Sender: TObject);的过程体内输入如下代码:
inc(i);
if i<5 then
begin
Application.MessageBox('点击n次,试试你的运气如何','好运来');
end
else
begin
MessageDlg('愚人节快乐!',mtInformation,mbOKCancel,0);
end;
这样的小程序既增加了编程学习的趣味性,又使学生感受到:只有练好基本功,才能为未来从事实际软件开发奠定基础。
二、便于讲解示范
在无液晶投影仪的微机室内上课,教师主要采取远志、极域之类电子教室软件进行广播教学。而Pascal的IDE环境在全屏幕状态下无法被这些广播软件广播,即使切换到窗口状态下能广播,响应速度也较慢,给教师的编程示范带来不便。
另一方面,由于Pascal不能用汉字作注释,教师想在关键代码处进行注释,就得切换到Windows中用记事本等文本编辑工具打开编辑。程序有改动后还得再切换到Pascal中,此时汉字注释内容均显示为乱码,给学生的理解带来不便。
而采用Delphi可以很好地解决这些问题,Delphi的Console Application(控制台应用程序)与Pascal完全兼容(本是同根生吗),即使没用过Delphi的新手,也可按Pascal的几乎所有“习惯”在其中工作。那么教师讲解用Delphi,学生做题用Pascal,会不会增加学生的理解负担呢?现在让我们看一个小例子。
实例:在Delphi中编写Pascal程序。
操作方法:
Ø 启动Delphi,选择工具栏上的(New items)按钮,或菜单栏中的File→New→Other,在弹出的New items对话框内双击Console Application,生成程序框架,如下图。
Ø 为不不影响学生观察,关闭一些不必要的窗格,如上图所圈出的;将program Project1; {$APPTYPE CONSOLE} uses SysUtils;这几条语句合并到一行;删除{ TODO -oUser -cConsole Main : Insert code here }这一行。
Ø 好了,现在开始编写并运行你的程序,你可能会用到这几个快捷键:
Ctrl+S—保存;Ctrl+F9—编译;F9—编译并运行; Ctrl+F2—程序复位
注意:
1、在程序的结尾加上一条Readln;语句,以便观察运行结果。
2、默认情况下,Delphi中的integer相当于Pascal中的longint;Delphi中的string相当于Pascal的AnsiString;
3、Console Application的源代码文件类型为*.dpr,也是一个文本文件,可用记事本方便地打开编辑,或在直接在Free Pascal中运行,可见实现代码共享十分简便。
三、辅助算法理解
初学者对于像动态规划这样的算法往往觉得难于理解,若借助Delphi的调试跟踪功能加以解释,则会大大降低理解难度。
实例:礼品装箱问题
【问题描述】在建校一百周年庆祝活动中,学校将为每位参会校友赠发礼品,但礼品先要装入一个容量为V的箱子中,每个礼品有一定的体积。你的任务是从M个礼品中,任取若千个装入箱内,使箱子的剩余空间为最小。
【输入文件】
输入文件TBOX.IN有N+1行。第1行两个整数V,N (0≤V≤20000,0≤N≤50),V代表箱子的容量,N代表礼品数;第2行至第N+1行,每行一个礼品的体积Di(0≤Di≤20000)。
【输出文件】
输出文件TBOX.OUT只有一行。输出最小剩余空间的值。
样例:(略)
参考程序:
program beibao;{$APPTYPE CONSOLE} uses SysUtils;
var v,n,data,i,j:longint;
a,b:array[0..20000] of boolean;
begin
assign(input,'tbox.in');reset(input);
assign(output,'tbox.out');rewrite(output);
readln(v,n);
fillchar(a,sizeof(a),false);
fillchar(b,sizeof(b),false);
a[0]:=true;b[0]:=true;
for i:=1 to n do
begin
readln(data);
for j:=0 to v do
if (b[j]=true)and(j+data<=v) //如果该物品可以放进去
then a[j+data]:=true; //则记录一个放入标志
b:=a;
end;
i:=v;
while a[i]=false do i:=i-1; //从右往左查找“最大”的可放入标志
writeln(v-i);
close(input);close(output);
end.
操作方法:
1、依次选中程序中任意位置的i(外层循环)、j(内层循环)、data(读取值)等变量,按Ctrl+F5键(或其它等效方法),添加Watch,程序单步运行时,我们可以在Watch List中观察它们的数值变化;
2、按一次F8键,以进入单步运行状态,将鼠标指向程序中任意位置的数组a或b,并稍停留,数组中各元素的即时值立即显示出来;若按住Ctrl键的同时,将鼠标指向它们,鼠标指针变成“小手”形状,此时单击鼠标,将打开Debug Inspector窗口;我们发现,虽然数组中元素较多,但要找到某个元素进行观察也十分方便。
3、依次打开数组a和b的Debug Inspector窗口,重复按F8键,一边观察随i、j、data的变化,数组中各元素(标志位)的变化,一边作如下解释:
将箱子分成V个单位,对每个礼品,依次试探它能否(单个或累加地)放入箱中,如果该物品可以放进去,则记录一个放入标志,最后从右往左查找“最大”的可放入标志,即为一个最优解。
籍以Delphi的强大功能,我们感到学生的学习效率明显提高。
[1] 本文以Delphi7和Free Pascal为例进行阐述。
(作者单位:江苏省连云港市赣榆县外国语学校
