4.3语 句
——进制转换的程序实现
Warming up
程序的功能?
程序功能
字符串逆序(反转)输出
最先输入的字符最后输出,最后输入的字符最先输出。
Private Sub Command1_Click()
Dim s as string,c as string, res as string
s=text1.text
res=“”
for?i=1?to?len(s)
????c=mid(s,i,1)
????_①_________________
Next i
Text2.text=res
End Sub
程序功能
字符串逆序(反转)输出
最先输入的字符最后输出,最后输入的字符最先输出。
Private Sub Command1_Click()
Dim s as string,c as string, res as string
s=text1.text
res=“”
for?i=1?to?len(s)
????c=mid(s,i,1)
????_res=c+res____________
Next i
Text2.text=res
End Sub
算法思想
字符串逆序(反转)输出的算法:
For?i=1? to? len(s)
????c=mid(s,i,1)
????res=c+res
Next i
思考:若res=res+c能实现字符串逆序,程序要怎样修改?
程序1:十进制正整数转换成二进制数
用什么算法实现?
算法描述:对十进制数x用2辗转相除获取余数r,直至商为0为止,最后将余数r从下往上输出。
主要采用哪种算法结构?(顺序,分支,循环)
需要哪些表达式?
程序1:十进制正整数转二进制
Private Sub Command1_Click()
Dim x As Integer, r As Integer, res As String
x = Val(Text1.Text)
res = ""
Text2.Text = res
End Sub
虚位以待
{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}样例输入
13
样例输出
1 1 0 1
算法思想
十进制数x转换成二进制的算法:
res=“”
do while x<>0
r=x mod 2 ‘①
x=x\2 ‘②
res=str(r)+res ‘③
loop
思考:
1.语句1能否与语句2调换位置?
2.若十进制数转换成十六进制,怎样修改程序?
十进制转换成十六进制
{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}十进制
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
十六进制
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
do while x<>0
r=x mod 16 ①
x=x\16 ②
res=str(r)+res ③
loop
else
If r<10 then
res=数字字符+res
res=字母字符+res
endif
十进制转换成十六进制算法1
Do While x <> 0
r = x Mod 16
x = x \ 16
If r < 10 Then
res = + res
Else
res = + res
End If
Loop
{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}十进制
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
十六进制
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
十进制转换成十六进制算法1
Do While x <> 0
r = x Mod 16
x = x \ 16
If r < 10 Then
res = + res
Else
res = + res
End If
Loop
Str(r)
chr(r+55)
chr(asc(“A”)+r-10)
{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}十进制
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
十六进制
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
十进制转换成十六进制算法2
s=“0123456789ABCDEF”
res=“”
Do While x <> 0
r = x Mod 16
res= +res
x = x \ 16
Loop
十进制转换成十六进制算法2
s=“0123456789ABCDEF”
res=“”
Do While x <> 0
r = x Mod 16
res= +res
x = x \ 16
Loop
mid(s,r+1,1)
程序2:十进制负数转换成二进制数
转换成补码的算法:
1.将对应的正数转换为8位二进制数,最高位作为符号位为1,其余不足7位时高位补0
2. 除符号位外,按位取反(1变成0,0变成1)
3. 末位加1
负数在计算机中以补码的方式存储
程序2:十进制负数转换成二进制
Private Sub Command1_Click()
Dim a(1 to 8) As Integer, x As Integer, b As String
x = Abs(Val(Text1.Text))
For i = 1 To 7
a(i) = x Mod 2
x = x \ 2
Next i
For i = 1 To 7 ‘按位取反
①
Next i
a(1) = a(1) + 1
i = 1
Do While a(i)=2
a(i) = 0
②
i = i + 1
Loop
a(8)= 1 ‘符号位为1
For i = 8 To 1 Step -1
b = b + Trim(Str(a(i))) 'trim()函数去除字符前后空格
Next i
Text2.Text = b
End Sub
{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}样例输入
-1
-12
样例输出
11111111
11110100
程序2:十进制负数转换成二进制
Private Sub Command1_Click()
Dim a(1 to 8) As Integer, x As Integer, b As String
x = Abs(Val(Text1.Text))
For i = 1 To 7
a(i) = x Mod 2
x = x \ 2
Next i
For i = 1 To 7 ‘按位取反
Next i
a(1) = a(1) + 1
i = 1
Do While
a(i) = 0
i = i + 1
Loop
a(8) = 1 ‘符号位为1
For i = 8 To 1 Step -1
b = b + Trim(Str(a(i))) 'trim()函数去除字符前后空格
Next i
Text2.Text = b
End Sub
a(i)=1-a(i)
a(i)= 2
a(i+1)=a(i+1)+1
这个程序的编程思维你能接受吗?
②a(i)=abs(a(i)-1)
③a(i)= (a(i)+1)mod 2
程序2:十进制负数转换成二进制
Private Sub Command1_Click()
Dim a(1 to 8) As Integer, x As Integer, b As String
x = Abs(Val(Text1.Text))
For i = 1 To 7 ‘转换为二进制
a(i) = x Mod 2
x = x \ 2
Next i
For i = 1 To 7 ‘按位取反
Next i
a(1) = a(1) + 1 ‘末尾加1
i = 1
Do While ‘逢二进一
a(i) = 0 ‘低位变为0
‘向高位进1
i = i + 1
Loop
a(8) = 1 ‘符号位为1
For i = 8 To 1 Step -1
b = b + Trim(Str(a(i))) 'trim()函数去除字符前后空格
Next i
Text2.Text = b
End Sub
a(i)=1-a(i)
a(i)= 2
a(i+1)=a(i+1)+1
思考:你还有其他算法思路吗?
程序2:十进制负数转换成二进制2
Private Sub Command1_Click()
Dim a(1 to 8) As Integer, x As Integer, b As String
x = Abs(Val(Text1.Text))
For i = 1 To 7 ‘转换为二进制
a(i) = x Mod 2
x = x \ 2
Next i
For i = 1 To 7 ‘按位取反
Next i
a(1) = a(1) + 1 ‘末尾加1
i = 1
Do While ‘逢二进一
a(i) = 0 ‘低位变为0
‘向高位进1
i = i + 1
Loop
a(8) = 1 ‘符号位为1
For i = 8 To 1 Step -1
b = b + Trim(Str(a(i))) 'trim()函数去除字符前后空格
Next i
Text2.Text = b
End Sub
a(i)=1-a(i)
a(i)=2
a(i+1)=a(i+1)+1
改写:
i=1
Do While a(i)=1
a(i) = 0
i = i + 1
Loop
a(i)=1
题型的变化
[2017.4]奇偶校验是一种校验数据传输正确性的方法。其中奇校验方法:统计二进制数据的数位中“1”的个数,若个数为奇数,则校验位值为0,否则校验位值为1。小李编写了一个计算奇校验位值得VB程序,功能如下:在文本框Text1中输入1~255十进制待校验数,单击“计算”按钮Command1后,在文本框Text2中显示该数对应的二进制值,并在标签Label3中显示该数的校验位值。程序运行界面如图所示。
Private Sub Command1_Click()
Dim a As Integer, s As String
Dim n As Integer, t As Integer, v As Integer
n = Val(Text1.Text)
t = 0
s = ""
Do While n > 0
a = n Mod 2
n = n \ 2
t = ①
s = Str(a) + s
Loop
v = t Mod 2
Text2.Text = s
Label3.Caption = "校验位值:" + ②
End Sub
复习建议
多思考,多总结,积累题型,抽象模型
熟练应用基本算法和基本工具,多尝试改写算法