第3节 字符串问题
模拟演练
1.编写VB程序代码,实现如下功能:在文本框Text1中输入金额(整数)后,点击“转换”按钮Command1,则在文本框Text2中显示该金额的大写,程序运行界面如下图所示:
/
(1)要使窗体标题上显示的文本改为“人民币大小写”,可在其属性窗口中将 属性的属性值改为“人民币大小写”。?
(2)为了实现以上程序功能,使程序正常运行,请完善以下两处代码。
Private Sub Command1_Click()
Dim dx As String, dw As String
Dim s As String, c As String
Dim ch As String,i As Integer
dx=“零壹贰叁肆伍陆柒捌玖拾”
dw =“亿仟佰拾萬仟佰拾元”
① ?
If Len(s) > 9 Then
Label2.Caption=“输入的数据超出所能转换的范围”
Else
For i = 1 To Len(s)
ch = Mid(s, i, 1)
c = c + Mid(dx, Val(ch)+1,1)+ ② ?
Next i
Label2.Caption = c +“整”
End If
End Sub
(3)由上述算法可知,若在文本框Text 1中输入“20”,则文本框Text3显示的结果为 。?
答案 (1)Caption (2)①s=Text1.Text ②Mid(dw, 9 - Len(s) + i, 1) (3)贰拾零元整
解析 本题考查字符串拼接。For 语句遍历数字字符串,字符变量c存放拼接字符。(1)略。(2)①输入字符串,存放到s中。②该累加部分由原值c+大写+单位构成,单位应该由金额位数映射到字符串dw,通过Mid获取。(3)略。
2.实现如下程序:输入一个非负数,将该数各位上的数字反转得到一个新数。得到的新数,除了原数为0外,反转得到的新数最高位不应为0。程序运行时,在文本框Text1输入数字,单击按钮Command1后在文本框Text2上输出结果。程序界面如图所示。实现上述功能的VB程序如下,在划线处填入合适的代码。
/
Private Sub Command1_Click()
Dim a As String, n As Integer
a = Text1.Text
① ?
Do While n > 1 And Mid (a, n, 1) = “0”
② ?
Loop
For i = n To 1 Step -1
Text2.Text = ③ ?
Next i
End Sub
答案 ①n = Len(a) ②n=n-1 ③Text2.Text + Mid(a, i, 1)
解析 本题考查数字反转,第一个Do While语句是尾部除零,接下来For语句是倒取数值。①分析Mid(a,n,1)=“0”得出n应为最后一个字符位置,也就是字符串长度。②Do While尾部除零,满足循环条件时,n左移1位。③现在n值表示为字符串最后非零位。因此只要把其从大到小遍历取出,新取的值位于原值右侧。
3.趣味填空题:给出用等号连接的两个整数,如“222 = 24”,让你在左边的整数中间某个位置插入一个加号,看有没有可能让等式成立。以上面的式子为例,可以写成2+22=24和22+2=24两种答案。现设计一个程序,实现该算法,程序运行界面如图所示。
/
(1)标题要显示“趣味数学”,需修改窗体的 (选填:Caption、Name、Text)属性。?
(2)实现上述功能的VB程序如下,请在程序划线处填入合适代码。
Private Sub Command1_Click()
Dim s As String, s1 As String, s2 As String
Dim c As Integer, k As Integer, i As Integer, flag As Boolean
flag = False: c = 0
s = Text1.Text
For i = 1 To Len(s)
If Mid(s, i, 1) = “=”Then Exit For
Next i
① ?
s2 = Mid(s,i+1,Len(s)- i)
k = Len(s1)
For i = 1 To k-1
If Val(Mid(s1, 1, i))+Val(Mid(s1, i + 1, k-i))=Val(s2) Then
② ?
List1.AddItem “第”+Str (c)+“种答案:”+Mid(s, 1, i)+“+”+Mid(s, i + 1, Len (s)-i)
flag = True
End If
Next i
If ③ Then List1.AddItem “没有答案!”?
End Sub
答案 (1)Caption (2)①s1 = Mid(s, 1, i - 1) ②c=c+1③Not flag 或 flag=False
解析 本题考查字符遍历截取。第一个For语句获取“=”位置,第二个For语句枚举遍历所有加法。(1)略。(2)①获取第一个数值,由变量i定位,通过Mid函数获得,存放到s1中。(2)②分析下方“第”+Str(c)+“种答案”可知,变量c作用是统计答案数。③由后面“没有答案”推导出,条件应为不满足,故flag=false。
4.用VB编写一个“加减法运算”程序,实现如下功能:在文本框Text1中输入多个正整数加减算式(只包含数字和“+ ”“-”字符,以“=”为结束符),单击“计算”按钮Command1,计算结果在标签Label1上显示。程序运行界面如图所示。
/
(1)程序运行时清空Label1上的内容,则可在Form_Load事件过程中添加语句 (单选,填字母:A.Forml.Caption= “”/ B.Forml.Text=“”/C.Label1.Caption=“”/D.Label1.Text=“”)。?
(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Private Sub Command1_Click()
Dim s As String, t As Integer
s = Text1.Text
t = 0: p = 0: flag = 1
For i = 1 To Len(s)
ch = Mid(s, i, 1)
If ch >=“0” And ch <= “9” Then
p = ① ?
Else
t= ② ?
p = 0
If ch = “-” Then
flag = -1
Else If ch = “+” Then
flag = 1
End If
End If
Next i
Label1.Caption = Str(t)
End Sub
(3)若文本框Text1中输入内容的结束符“=”缺失(即输入内容为12+28-15+50),单击“计算”按钮后, 标签Label1上显示的内容是 。?
答案 (1)C (2)①p*10 + Val(ch) ②t + flag*p (3)25
解析 本题的解题关键在于理解非数字字符的操作。For语句遍历字符串值,If语句判断字符类型,对应操作。(1)略。(2)①分析判断条件可知,要执行数字相连。原值p乘10加新出现的值val(ch)组成新值。②随着非数字符号出现,要把前值放入累加器t中,flag存放前值符号,因此要累加flag*p。(3)略。
5.情报员小王在工作时发现R国会用一些对称字符(如ABBA、ABA、123321)进行通信。R国为防止通信内容被破解,会在对称字符的头、尾加一些无关字符,如:12ABBA、ABAKK、5123432198。因此小王编写了一个VB程序,用于读取通信字符串中最长的对称字符。在文本框Text1中输入通信字符,单击“读取”按钮 Command1,在标签Label2中显示最长的对称字符,程序运行界面如图所示。请完善代码。
/
Private Sub Command1_Click()
Dim x As String, n As Integer, i As Integer
Dim k As Integer, start As Integer
Dim max As Integer
x = Text1.Text: n = Len(x)
max = 0: start = 1
For i = 1 To n
k = n
Do While k > i
If ① And k - i + 1 > max Then?
max = k - i + 1
start=i
End If
② ?
Loop
Next i
Label2.Caption =“最长回文字符串为” + Mid(x, start, max)
End Sub
Function isPa(t As String) As Boolean ’判断是不是回文数
Dim i As Integer
③ ?
For i = 1 To Len(t) 2
If Mid(t, i, 1) <> Mid(t, Len(t) - i + 1, 1) Then isPa = False
Next i
End Function
答案 ①isPa(Mid(x,i,k-i+1)) ②k=k-1 ③isPa = True
解析 函数isPa(t)的功能是判断t是不是回文,根据函数返回值,很容易得出答案isPa=True。寻找最长回文字符的方法是这样的:先确定i=1,k=n,依次减小k的值来确定[1,k]之间的回文字符串;然后i=2,k=n,依次减小k的值来确定[2,k]之间的回文字符串……即在[i,k]之间依次寻找回文字符串,所以①的答案是isPa(Mid(x,i,k-i+1)),②的答案是k=k-1。可以从语句Label2.Caption=“最长回文字符串为”+Mid(x,star,max)中了解star、max变量的用途。
6.输入一个表达式(运算符号只有加、减、乘、除和小括号,表达式是正确的,不需要检查),求表达式中最后一次计算的运算符号位置。比如表达式a*(b+c)-4+d最后一次运算的运算符号是在第10个位置的“+”,输出10。算法的思想是从表达式右边开始往左边查找,对碰到的字符分四种情况考虑:
1)若是运算符“+”,保存该位置并结束查找。
2)若是第一次碰到或“/”,保存该位置,若不是第一次碰到或“/”,继续往左边查找。
3)若是“)”,调用函数找到和它对应的位置,跳过该括号内容,继续往左查找。
4)若是非运算符,继续往左查找。
运行界面如下图:
/
(1)表达式c*a+(a+b),最后一次计算的运算符号位置是 。?
(2)实现上述功能的VB程序如下,根据算法将下列程序补充完整。
Function find(y As String, x As Integer) As Integer
’该函数的功能是返回表达式y中和位于第x位置的“)”配对的位置,代码略
Do While Mid(y, x, 1) <> “(”
① ?
Loop
find = x
End Function
Private Sub Command1_Click()
Dim s As String, t As Integer, ans As Integer, p As Integer
s = Text1.Text ’输入表达式
t = Len (s): p = 0
Do While t > 0
If Mid(s, t, 1) = “+” Or Mid(s,t, 1) = “-” Then ’处理+、-
ans = t
Exit Do
End If
If ② Then ’处理*、/?
ans=t
p=1 ’用来标记乘号或除号已经出现了
End If
If Mid(s, t, 1) =“)”Then ’处理括号
t = find(s, t)
End If
③ ?
Loop
Label2.Caption=“最后计算的运算符号位置为”+Str(ans)
End Sub
答案 (1) 4 (2)①x=x-1 ②(p=0) And (Mid(s, t, 1) = “*” Or Mid(s, t, 1) = “/”) ③t = t-1
解析 本题的算法按照题目描述的四种情况考虑即可。(1)表达式 c*a+(a+b),按照从右往左查找,先找到的是“)”,继续往左查找,找到配对的“(”,继续往左查找,找到“+”,结束查找,对应位置为 4,所以答案为 4。(2)函数 find(y, x)的功能已在题中有详细描述,就是要查找配对的括号,对应题目描述中的第 3 种情况,所以答案为①x=x-1。第②空对应的题目描述中的第 2 种情况,但要考虑首次碰到的情况,所以答案为②(p=0) And (Mid(s, t, 1) = “*” Or Mid(s, t, 1) = “/”)。整个查找过程是从右往左查找,所以③空的答案为 t = t-1。
7.写一个字符串压缩程序:对于2~9个相同字符组成字符串,用两个字符来编码:第一个字符表示这个字符串的长度值(即2~9);第二个字符表示相同字符的值。如字符串“AAAAA”可以压缩成“5A”,“AA”可以压缩成“2A”。如果存在某个字符串,其中没有一个字符连续重复出现,就表示成:以数字1开始,后面跟着这一字符串,再以数字1结尾。如字符串“BCE”可以表示成“1BCE1”,“A”可以表示成“1A1”。又如:“XXXXXXXXABCYYYZ”的压缩结果是“8X1ABC13Y1Z1”。
假设被压缩字符串中只会出现字母,连续相同字母不会超过 9个。以下程序在Text1中输入被压缩的字符串,在Text2中输出了压缩的结果。请回答以下问题。
(1)若Text1中输入的字符串为“XXXXXAXAAA”,那么压缩的结果是 。?
(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Private Sub Command1_Click()
Dim s As String
Dim n As Integer,i As Integer
s =Text1.Text
n = Len(s):i=1:result =“”
Do While i< = n
s1 = Mid(s,i,1)
numbers = 0
’扫描到的字符都和s1相同
Do While ① ?
i = i+1
numbers = numbers +1
Loop
If numbers>0 Then
result = result & ② & s1?
i = i+1
End If
start = i
s1 =Mid(s,i, 1)
numbers = 0
’扫描到的字符都和s1不同
Do While ③ ?
i = i+1
numbers = numbers +1
s1 = Mid(s,i,1)
Loop
If Mid(s,i+1,1)= s1 Then numbers = numbers -1
If numbers>= 0 Then result = result &“ 1” & ④ &“1”?
Loop
Text2.Text = result
End Sub
答案 (1)5X1AX13A (2)① Mid(s,i+1,1) = s1 ② numbers+1 ③ s1 <>Mid(s,i+1,1) ④ Mid(s,start,numbers+1)
解析 由题意知,程序的压缩规则有两条:第一,对相邻连续相同字符的压缩,第二,不同字符的压缩。注意到内层循环有两个并列的Do While循环,每个循环的末尾都是对输出结果变量result的构造,而由构造方式也可推测,第一个循环是解决连续相同字符的压缩过程,第二个循环是解决不同字符的压缩过程。于是,不难看出第①空应该是判断和前面字符是否相等,而第③空是判断是否不相等。第②空需要模拟程序的执行,这里变量numbers用于统计相同字符的个数,而初始值是0,因此统计完之后,相同字符个数应该是numbers+1。同样,第④空是需要截取从start开始,共numbers+1个不相同的字符。
课件9张PPT。
第3节 字符串问题 字符(包括字符串)在计算机中存储是每个字符的内码值。字符可以直接比较大小,实际上是比较内码的大小。如“a”<“b”,“ab”<“abc”,“abc”<“abd”,“acde”<“ad”,比较方法是先比较第一个字符,如果相同,则比较第二个字符,依次类推。
1.几个常用字符的内码值:教材研读 2.字符串处理相关函数: 3.字符相加:
(1)用“+”号:运算符两边必须都是字符串型,如“1”+“2”=“12”,而1+“2”则出错。
(2)用“&”号:会自动将两边的数据转成字符串型再拼接。如“1”&“2”=“12”,1&“2”=“12”。
注意:字符相加前后位置对调,结果不一样,“1”+“2” =“12”,而“2”+“1” =“21”。4.不同类型字符的判断:5.字符转换:6.字符串操作: