其他典型算法之文本处理-专项训练浙江2022届选考专用(教师版).docx
其他典型算法之文本处理【例1】 编写VB程序,实现如下功能:在文本框Text1中输入包含数字、字母的字符串,单击“统计”按钮Commandl,统计该字符串中数字字符的个数,并在标签Label1中输出结果。为实现上述功能,请在划线处填入合适代码或选项。Private Sub Commandl_Click()Dim s As String,c As StringDim i As Integer,n As Integer,num As Integers='(填程序代码) num=0n=Len(s)'(填字母:从下列A、B、C三个选项中选取一项) '(填字母:从下列A、B、C三个选项中选取一项)If c>= 0 And c<=9 Thennum=num+1End IfNext iLabell.Caption=str(num)End Sub划线、的选项:A.Do While i<=nB.c=Mid(s,i,1)C.For i=1 To n答案:Text1.TextCB解析:这是一个关于文本统计的题型,这类题型通常先是从文本框中获取待处理的字符串存入变量,然后通过循环,每次用Mid函数提取1个(或若干个)字符,对字符进行分析统计。循环次数一般是字符串的个数。因此,处是要从文本框中获取待处理的字符串,并将其存入变量,填Text1.Text。处设置循环,循环次数一般是字符串的个数,可填For i=1 To n或For i=1 To len(Text1.Text)。根据语句“If c>=0 And c<=9 Then”判断,变量c存的是一个字符,因此处需从s中提取1个字符。【例2】.要求从原文本(均为ASCII字符)中删除指定的单词(完整的单词),并将处理后的文本重新输出。程序界面如图所示,在文本框Text1中输入原文本,在文本框Text2中输入需要删除的单词,单击“删除”按钮(Command1)后,在文本框Text3中输出处理后的结果。实现上述功能的VB程序如下,但加框处有错,请更正。Function delstr(s1 As String, s2 As String) As StringDim n1 As Integer, n2 As Integer, i As Integer,ch As Stringn1 = Len(s1) : n2 = Len(s2) : i = 1Do While i <= n1word = Mid(s1, i, n2)ch = Mid(s1, i + n2, 1)If i = 1 Thenf = zm(ch)Elsef = zm(Mid(s1, i - 1, 1)And zm(ch)'End IfIf word = s2 And Not f Theni = i +1'Elses = s + Mid(s1, i, 1)i = i + 1End If Loop delstr = sEnd FunctionFunction zm(ch As String) As BooleanIf ch > a And ch <= z Or ch >= A And ch <= Z Thenzm = TrueElsezm = FalseEnd IfEnd FunctionPrivate Sub Command1_Click()Dim t1 As String, t2 As Stringt1 = Text1.Textt2 = Text2.TextText3.Text = delstr(t1, t2)End Sub答案: f =zm(Mid(s1, i - 1, 1) Or zm(ch)i = i + n2解析: 程序中变量word存放位置i开始的一个单词,ch存放单词word后的一个字符。处是判断单词word左右是否为字母,只要左右有一个是字母,则f=true。比如当i=8,word=tea,但其右边是字母c,说明这个“tea”只是单词“teacher”中的一部分,不能删除,得f=true。处所在的if语句功能为判断是否要删除单词,如果满足条件word = s2 And Not f,表明i位置开始的单词word就是要删除的单词s2,且该词左右都不是字母,则删除。否则不删除,把i位置的字母存入s,位置i的值加1指向下一个字母。所以处应填i = i + n2,表示略过n2个字母。课后训练1.编写“单词查询”程序,实现如下功能:在文本框Text1中输入一段英文文本(以“.”为结束符),在文本框Text2输入一个英文字母,单击“获取单词”按钮Command1,在列表框List1依次显示Text1中包含该英文字母的所有单词。程序运行界面如图所示。(1)实现上述功能的VB程序如下,请在划线处填入合适的代码。Private Sub Command1_Click()Dim s As String,tmp As String,c As StringDim n As Integer,i As Integer,flag As BooleanDim cnt As Integer'存储符合条件的单词数s=Text1.Text:n=Len(s):flag=False:cnt=0List1.ClearFor i=1 To nc=Mid(s,i,1)If c>=a And c<=z Or c>=A And c<=Z Then If c=Text2.Text Then flag=True:cnt=cnt+1ElseIf flag Then List1.AddItem tmptmp= End IfNext iIf cnt=0 ThenList1.AddItem 找不到符合条件的单词.End IfEnd Sub(2)若文本框Text2中输入“M”,单击“获取单词”按钮后,列表框List1中显示的单词个数是。 答案 (1)tmp=tmp+cflag=False(2)1解析 该算法查找的方法是:每次循环,从文本中取出一个字符c,若是字母,存入变量tmp,如果字符c等于要查找的字母,则flag=True,表示当前单词含有要查找的字母,同时cnt的值加1,变量cnt存放含有要查找的字母的单词的数量。如果字符c不是字母,说明当前单词结束,此时判断flag的值,如果flag=True,则输出当前单词。接下来要取出下一个单词,需把变量tmp设为空值,flag设为False。2.RLE(Run-Length Encoding行程长度编码)压缩算法是Windows系统中使用的一种图像文件压缩方法,用两个数据表示,第一个记录指定像素重复的次数;第二个记录具体像素的值。例如,有一表示颜色像素值的字符串RRRRGGBBB,用RLE压缩方法压缩后可用4R2G3B表示。小芳设计了一个VB程序实现RLE算法功能。在Text1中输入原始数据,点击“压缩”按钮Command1后,在Text2中显示经过压缩后的数据。程序运行界面如下图所示。(1)这里采用的压缩技术属于(选填有损压缩/无损压缩)。 (2)实现上述功能的VB程序如下,请在划线处填入合适的代码Private Sub Command1_Click()Dim s1 As String,s2 As String,c As Integer,p As Integers1=Text1.Texts2= :c=1: Do While p<=Len(s1)If Mid(s1,p,1)=Mid(s1,p-1,1) Thenc=c+1Elses2=s2+Str(c)+Mid(s1,p-1,1) End Ifp=p+1LoopText2.Text= End Sub答案 p=2c=1s2+Str(c)+Mid(s1,p-1,1)或s2+Str(c)+Mid(s1,len(s1),1)解析 程序中变量p指示取字符的位置,循环中比较的两个字符位置是p和p-1,说明p的初值应该是2,所以处填p=2。本程序压缩的具体算法是:比较p和p-1位置中的两个字符,若相等,则c加1,若不等,则把之前统计的相同字符数c和字符存入变量s2,同时c重新赋值为1,所以处填c=1。循环结束后,最后一串相同字符的信息未存入变量s2,所以处填s2+Str(c)+Mid(s1,p-1,1)或s2+Str(c)+Mid(s1,len(s1),1)。3.通常加密算法中密钥中的字符不能有重复,现编写一VB程序,检查密匙是否有重复。单击“检验”按钮Command1,若出现的是互不重复的一串大写字母,则在列表框List1中输出“该字符串符合加密条件!”,反之,则在列表框List1中输出重复的字母及该字母第二次出现的位置。程序运行界面如图所示。(1)为实现上述功能,请在划线处填入合适的代码。Private Sub Command1_Click()Dim s As String,i As Integer,a(1 To 26) As Integer,r As String,j As IntegerDim b(1 To 26) As String,c(1 To 100) As Integers=Text1.TextList1.ClearFor i=1 To 26a(i)=0Next ij=1For i=1 To Len(s)r=Mid(s,i,1) If a(Asc(r)-64)=2 Thenb(j)=r:c(j)=i:j=j+1End IfNext iIf j=1 Then List1.AddItem 该字符串符合加密条件!For i=1 To j-1 Next iEnd Sub(2)由上述算法可知,在文本框Text1中输入字符串“INTEGER”,在列表框中输出的值为。 答案 a(Asc(r)-64)=a(Asc(r)-64)+1List1.additem b(i)+ +Str(c(i)解析 程序中涉及3个数组,数组a存放各字母出现的次数,数组b存放第二次出现的字母,数组c存放字母第二次出现时的位置。本题难点在于如何把字母转换为对应的编号x,并把字母出现的次数存入数组a对应的元素a(x)中。即:如果是A,对应编号是1,则a(1)=a(1)+1;如果是B,对应编号是2,则a(2)=a(2)+1;以此类推。计算编号的表达式是Asc(r)-64或Asc(r)-Asc(“A”)+1,若a(Asc(r)-64)=2,说明该字母出现了2次,此时记录字母到b(j),位置i存入c(j)。4.用VB编写一个字符串分行程序,功能如下:单击“分行”按钮Command1,将文本框Text1中的英文文本在列表框List1中分行显示(分行时单词不得跨行,每行字符尽可能多但不超过40个),并在标签Label1中输出总行数,运行效果如下图所示。分行算法如下:(1)将文本框中的字符串保存到变量s中;(2)当s中字符个数超过40时,循环执行下列步,否则跳转到(3):如果第41个字符不是英文字母,则分行位置p=40;否则,向左逐个查找,直至找到第一个非英文字母,将其位置作为分行位置p;截取s的前p个字符,作为新增行显示在列表框List1中,同时总行数加1;将s中未分行部分重新赋值给变量s。(3)将s作为新增行显示在列表框List1中,同时总行数加1。实现上述功能的VB程序如下,请在划线处填入合适代码。Private Sub Command1_Click()Dim s As String, c As StringDim r As Integer, total As Integer, p As Integertotal= 0s = Do WhileLen(s)> 40r = 41c = Mid(s,r,1)If Not(c > = aAnd c < = z)Or (c>=AAnd c<=Z) Thenp = 40Else'从第41个字符开始向左找到第1个非英文字母,并将其位置值赋给pDo While (c >=aAnd c<=z)Or (c>=AAnd c<=Z)r= c=Mid(s,r,1)Loopp=rEnd IfList1.AddItem Mid(s,1,p)total=total+1s= LoopList1.AddItem stotal=total+1Label1.Caption=共+Str(total)+行End Sub在程序、划线处,填入适当的语句或表达式,把程序补充完整。答案: Text1.Textr-1Mid(s,p+1,Len(s)-p)或Mid(s,p+1)或Right(s,Len(s)-p)解析: 根据题目中自然语言的描述,本处是将文本框text1中输入的字符串保存到变量s中。变量r指示字符位置,从第41个字符开始向左找到第1个非英文字母,r每次循环递减1。将s中未分行部分重新赋值给变量s。5.小明编写某VB程序,其功能如下:文本框Text1里输入数学表达式(假设表达式的长度小于等于100),在列表框List1里输出所有配对括号在表达式中的位置。例如在文本框Text1里入:“12 (3-(1+2) 3”,程序运行效果如图所示。实现上述功能的VB代码如下,在划线的地方填入合适代码,完善程序。Private Sub Command1_Click()Dim s As String,i As Integer,top As Integer,a(1 To 100) As Integers=Text1.Text:i=1:top=0Do While i<=Len(s)If Mid(s,i,1)=( Thentop=top+1 End IfIf Mid(s,i,1)=) ThenList1.AddItem Str(a(top)+ +Str(i) End Ifi=i+1LoopEnd Sub答案 a(top)=itop=top-1解析 程序中,数组a存放左括号出现的位置,变量top存放数组a中未匹配的左括号数量。如果表达式第i个字符是(,则top=top+1,并把位置i存入a(top)中。如果表达式第i个字符是),则与位置是a(top)的左括号匹配,此时top的值减1。6.小明编写一个VB程序其功能为:在英文句子(以“.”结束)中查找包含指定字符串的单词,运行界面如图所示。文本框Text1为英文句子,文本框Text2中输入包含字符串,单击“运行”按钮Command1后,List1中显示符合条件的单词。实现上述功能的VB程序如下,但加框处代码有错,请改正。Private Sub Command1_Click()Dim k As Integer,b As Integer,h As Integer,c As String,key as StringDim w(1 To 1000) As Strings=Text1.Text:n=Len(s):key=Text2.Textj=0:k=1:b=1:i=1:h=0Do While i<=nc=Mid(s,i,1)If Not (c>=a And c<=z Or c>=A And c<=Z) ThenIf j<>0 Thenw(b)=Mid(s,k,j)'k=k+1:j=0End Ifb=i+1Elsej=j+1End Ifi=i+1LoopFor i=1 To k-1h=0For j=1 To Len(w(i)-len(key)+1If key=w (i) Then h=h+1'Next jIf h<>0 Then List1.AddItem w(i)Next iEnd Sub答案 w(k)=Mid(s,b,j)Mid(w(i),j,Len(key)解析 程序中,数组w保存每个单词,变量b记录单词的开始位置,j记录单词中字母的个数,k记录已保存的单词数。程序中的do while循环部分功能是把原文s中的单词取出来,存储到w数组中。具体实现方法是每次循环取一字符c,若是字母,说明当前单词尚未结束,字母个数j加1,若不是字母,表明当前单词结束,则把单词存入w(b)中,所以处填w(k)=Mid(s,b,j),同时k加1,j重置为0,b赋值为i+1,即为下一个单词的开始位置。处所在的二重循环,其功能是从每个单词里去找是否包含Text2中的字符串。检索方法是从单词w(i)中取len(key)个字符,第1次从第1位开始取,如果和key相等,则h加1;第2次从第2位开始取len(key)个字符,如果和key相等,则h加1,如此循环。那么当循环结束后,如果h>0,表明w(i)中含有查找单词,显示出来。