“文本比对程序”可以用来观察、对照2个文本之间的差异——【展示差异】。比如“文本修改前后对照”、“样张与打字文本的对照”等等。程序先要“搜索差异”、“储存差异”才能“展示差异”。
主程序是CmdMore ,用于“搜索差异”和“储存差异”
它跟递归函数LCS()的结构很像,只是增加了关于 QS()、CD() 的2个数组。为什么要用这2个数组呢?因为,我们要想“展示差异”,就需要【知道】各个差异的“位置”(起始位置QS)和各个差异的“长度”(CD)。这样,当程序在上下两边的“原文档”里自动选中了“差异字符串”时,就会非常醒目。
(这个部分的设计思路、流程图等等,可以参看我在本网...
程序是把2个字符串中的1个(我用下行txt2)从左到右逐个判断“留”或“去”,从而最终求得“最长公共子序列”的。而要求得“最长公共子串”,解题的思路是:★在每个公共子串结束时,测量该公共子串的长度,将其与储存的“最大值”比较……这是最常用的求最大值的方法,这里不赘述了,可以看代码。关键是,什么叫做“公共子串结束时”?
为此,设置1个Boolean 数据类型的变量:Righ,用以记录“上一个字符的判断结果”(也就是当前的★状态):如果它是“留下”的(①或③1),就记录 Righ = True 状态,(当然同时要累加公共子串的字数);如果它是“不留”的(②或③2),就记录 Righ = F...
前一个公共子串结束后,上下两个字(位置是n1和n2)不相同,并且在n1的右面找到了与n2相同的字(图一中的“罗”--“罗”)。(插图二)里“上部的那条绿色横线”就表示:从n1(含n1)到“罗”之前(n1+r-1)(不含“罗”)的那个区域。这是一个关键区域。
我是这样分析的:如果下面的“罗”字因为不符合“最长”的缘故而不保留的话,那么在txt1(上面的字符串)里,★“最优的公共子串首字”一定在那个区域内(英白)!(因为,如果2个字都在“罗”的★右面(红色横线里),怎么可能比‘罗--罗’更长呢?)
于是,通过双重(For)循环和调用函数必然可以在“两条绿色横线”内找到“最优的公共子串首字...
我们知道:公共子序列是由一个个公共子串顺序连接而成的。为了求“最长公共子序列”,可以把字符串中的字分成2类:一类是要留下的(组成公共子串),另一类是要出列的。我们可以编程,把字符串(我取下面一行,txt2)从头到尾逐字鉴定该留还是该出列。
别看字符串五花八门、长长短短,鉴定起来却只有4种情况。而且并不是每一种都需要调用递归函数的。
我在【图一】中的每个公共子串的右面画一根蓝色竖线,表示原公共子串结束,新公共子串开始。
(下面所说的“情况一、情况二”,都可以用我们熟悉的、简单的编程语句来完成的。)
情况一:看第1个字“他”,上下2个字一样,“他”就留下,这情况我称为①。后面...
程序一“开始”,文本第一行就显示在文本框的底行。光标反复从底行的左端移动到右端。每当光标到达右端时,文本就上移一行。仔细观察还可以发现:当光标遇到逗号(,)或者句号(。)时,还会“略作停顿”。如果照着光标指示朗读(当前行始终在底行),那么光标移动的速度就是“语速”。可以通过改变Timer控件的Interval属性值来改变语速,因为两者是“反比例”关系。(Timer.Interval=60000\S,其中S是语速)。程序没有使用OCX控件,也没有用到API函数。代码很一般,稍有VB基础的读者,看代码比看我的文字描述更顺畅。(附件里漏了一个文件夹 “TEXT”,与程序放在一起,里面是要...
1.我觉得“按句突出显示”,比“按行突出显示”的可读性更好。这里的“突出显示”,是指:用红色显示当前的句子。用什么方法来把文本按“指定的标点”分割为“句”呢?
在VB里,现成的语句是: RT1.Span ",。?!;", True, True
其中RT1是 “RTF文本框”,Span 是它的方法, 双引号内是“指定的字符”。功能是:寻找指定的字符(标点),并选中经过的字。
例如: ……午茶和晚茶。早茶通常清晨4时开市,很多顾客……
当起始点(光标)在“。”和“早”之间时,执行这行语句后,会★自动选中 “早茶通常清晨4时开市”这...
同事说很想体验一下那个程序,主要是看看评分后的“正误对照”部分,也想检验一下其评分结果的正确性、程序的实用性、大致计算时间、有无BUG等等。但是,如果每次都要先“打字15分钟”,就会让人兴致索然。能否考虑编个“专用”的程序。
于是,我在程序中加了2个功能:1.允许复制粘贴,然后可以对粘贴进来的文本进行有针对性的编辑修改,以观后效。2.设置一个按钮:可以直接“穿越15分钟”。如果你是真想测试一下自己的打字水平,那只要踏踏实实打完15分钟就是了。
写这篇博文是为了达到三个目的:检验、体验和实用。如发现问题和不足,请在我这篇博文下留言,真诚感谢!
3个界面插图是:打字前、打字...
第一部分 发现错、漏、多
批改就是把“打字文本”和“样张文本”进行比对。
批改的最起码的要求,就是在2个文本中,每个字都须定性为“正确”或“不正确”(样张中的“不正确”,意思是指“没有被正确地打出来,”,就是“被漏打”和“被打错”)。(例3中的绿色“带儿子”),(例4中的红色“莫斯科去”);在录入中,不正确的字也可以分为2类:,一类叫做“多打”(例2中的蓝色“的”),另一类叫做“打错”(例4中的红色“墨西哥”)
“正确”的3个原则是:1.两个文本中的正确字一一对应。 2.不能颠倒顺序。3.选“给分最多”的方案。
例1:样张是“他叫英白罗”,打字是“他...
在主过程中,“txt3 = txt3 & Mid$(txt2, Ldot, n2 - Tmp - Ldot)”共出现了3次,而且这几乎就是“主过程”与“函数LCS()”的唯一区别。函数只须求出一串“参与字串”的长度,而主过程还要输出其内容。这句语句起什么作用呢?
我们说,“子序列”是由原字符串剔除了某些字符后所剩下字符按原来的顺序组成的。这“剩下字符”就是一段段连续的字符。我把每一段“剩下字符”称为“参与字串”[在图中用红色细框标出,下同],剔除的字串称为“不参与字串”[在图中用浅蓝色粗横线标出,下同]。
这行语句的作用就是:在下行的字符串(txt2,下同)中,剔除一...
主过程与函数几乎一样:(请参考2个附图)
把A、B两个字符串中的B、按从头到尾的顺序,逐个在A中寻找相同的字。会有3种结果:
1.直接找到(流程图中的“A”),于是这个字可以加入“最长序列”,然后n1+1、n2+1。这2个数的递增,保证了“一一对应”和“不颠倒顺序”。
2.从n1直到L1(A串的长度)都没有相同的字(流程图中的“Q”),那么这个字排除,且N2+1,而n1不增加,这样也遵守了上面的2个原则。
3.在A串的“延后几个字”(n1+k,k是延后的字数)找到(流程图中的“E”),这是必须按“最长”原则来定夺的,这正是“疑点”。函数中的“>”就是由此引起的。
下面重...
为什么这个程序既可以验证一些网上LCS论文中举出的“短字符例题”(图一),也可以对代码稍作更改后,在1秒内求出近千字的“(无提醒打错的)中文打字测验”文本的“正确字数”(图二)。相信你在看了我下面的的描述后,应该可以有所明白。
两个字串的“最长公共子序列”可以从这样的角度描述:有上下两个字串,把下字串从左到右每一个字在上面“找到相同的字”并“连线”。
有2个要求:1.连线不许交叉。2.连线数“最多”。于是,在两个字串中“剔除”了“无法连线”的字之后,剩下的字串就是“最长公共子序列”了。
★连线有3种情况,2种非常简单,1...
我们先看一个“不用计算机批改的例子”:
样张:“昨天小明带了一个变形金刚到小华家做客” 打字:“昨天小明明带了变形金刚一个到小华家做客” 。请你用肉眼批改有几个“正确字”。
你肯定会说:“正确字”的标准是什么?
根据一般的“共识”,我们会给出3个原则:1:一一对应。2:不颠倒顺序。3:“最长”原则。上述题目的批改结果是:“昨天小明带了变形金刚到小华家做客”(16个字)。
为什么不是“昨天小明带了一个到小华家做客”(14个字)呢?这也符合原则1和原则2呀?这是因为:还有原则3呢。这其实不正是样张和录入的“最长公共子序列”吗?
在一些编程语言中,都有现成的相关代码,...
借助“流程图”,用你熟悉的编程语言做出这个程序,应该不会太难。试试看。
图一
图二
关于“错字数”的说明:
把“他到沈阳去了”打成“他到哈尔滨去了”,我这里是“错3”,有些批改程序为“错2多1”,这不影响“正确字数”。(它相当于我这里把 Tmp 拆成错和多两部分)
欢迎指出错误或不妥的地方,也欢迎交流和切磋。
新版的改动主要是:在“时间到”后,不再出现第3个窗口,而是出现一个“对照(下拉)列表”,这样一来界面简洁多了。对比操作也更加简单。(见3个插图)
程序特点:
1.“对照结果”的展示“别出心裁”:既可以在“导航窗口”纵览改动的“全局”,也可以“选中某个修改标记”来观察该修改处的详情。巨细兼顾。(图1,图2))
2.可以反复进行“对照--编辑修改”,直至满意,保存修改结果(全选后复制,粘贴到记事本保存)。
3.仅1个 52K 的.exe程序,不需要RTF控件。解压后就可以运行。
4.不采用那种“对比后彩色标注文字、对比的文字左右紧挨”的界面,那种界面虽然对照明显,但“可阅性”荡然无存,给著者的“斟字酌句”和现场编辑反而带来不便。
说明:程序中的“悬浮菜单”仅用于“操作提示”和“操作结果的信息反馈”,没有其他功能。单击菜单和单...
一、软件特点:
1.小巧(1个exe程序72k)、免安装、不需要外加 OCX 控件。
2.界面贴近实际(图1)。与众多的“打字测试软件”不同,既不会在样张上用“变色”来标出“已经打过的字”,也不会自动将录入光标对准“此刻该打的字”。更不会用“变色”来提示“打错了”。这个程序就像用“记事本”将“稿纸上”的文字录入到计算机里一样,不小心还有可能“漏字”和“多字”。这样的“测试”,才是贴近实际工作环境的。
3.阅卷方式很新颖(图2):选中1个“特殊字符”(◆、■、●)后,可以观察错、多、漏的细节。既不改动“样张”和“录入”的原貌,又能直观地现出“左右对照”。
4.样张就像“纸张”,不仅...
这个程序是用VB6编制的,不需任何ocx控件。软件大小56k(含1个.exe程序和1个样张文件(yang.txt)。
特点:更贴近实际,无任何提示。犹如看着样纸,用“记事本”录入文字。如果你不认真看清样张,不仅可能打错,还会漏打和多打。阅卷操作也很方便、直观:只要选中一个“特殊字符”(◆、■、●)就可以看清错、漏、多的细节。
我用VB做了一个需要 外接 OCX 控件的程序。 如果把它放在另一台计算机上运行,很可能因为缺少相应的OCX 控件而报错。我采取如下的方法:
添加一个模块,见代码
Attribute VB_Name = "Module1"
Option Explicit
Private Sub Main()
Dim r%
r = Shell("regsvr32.exe " & App.Path & "\TEXT\RICHTX32.OCX /s", 1)
DoEvents
r = Shell("regsvr32.exe " & App.Pa...
我在11月14日的博客中提到“左右正误对照”的方法:批改后,当你在“标准文本”里选中一个“错字”或“漏字”时,程序会立即在“打字文本”那里找到相应的文字或位置,这时,两边都有“选中”;同样,当你在“打字文本”里选中一个“错字”或“多字”时,程序也会立即在“标准文本”那里找到相应的文字或位置。可见,“两边都有选中”的效果,使“正误对照”很醒目。
在这个程序的上2个版本中,我没有办法让左右两边“都选中”,只能用“一边选中、另一边加粗”来解决。但是这样处理,不仅“加粗”远不及“选中”来得醒目,而且后面还要“取消加粗”。
现在我知道了,只要把左右2个文本框的“HideSelection”属性都设置为“False”就行了。(现在再上传一次修改后的程序,以示补过。)