您的位置:首页 > 编程语言 > VB

进制数转换器的VB算法实现(2/8/10/16进制数可以相互转换)

2008-12-15 21:08 531 查看
在VB6中新建一个工程,当前窗体默认为form1,添加一个框架控件frame、几个文本框控件text、几个标签控件label、两个timer计时器、三个按钮控件、添加一个窗体form2、一个模块module1、几个菜单项。然后将form1上的各个控件调至适当位置,并且更改它们的标题属性。注意:那四个文本框为文本框控件数组,分别为text1(0),text1(1),text1(2),text1(3)。



【程
[/b]序[/b] [/b]设[/b] [/b]计】[/b][/b]
1[/b]、实现[/b]2[/b]、[/b]8[/b]、[/b]10[/b]、[/b]16[/b]进制数之间的相互转换,一共有种[/b] [/b]转换方式,即:[/b]2--->8[/b],[/b]2--->10[/b],[/b]2--->16[/b],[/b]8--->2[/b],[/b]8--->10[/b],[/b]8--->16[/b],[/b]10--->2[/b],[/b]10--->8[/b],[/b]10--->16[/b],[/b]16--->2[/b],[/b]16--->8[/b],[/b]16--->10[/b],这样[/b]12[/b]种转换方式[/b][/b]
2[/b]、双击模块[/b]moduel1[/b],进入代码编辑模式,开始编写这[/b]12[/b]种转换方式的模块函数。核心代码如下(以逗号开始的为注释内容):[/b][/b]
Option Explicit[/b]
'2[/b]进制转换为[/b]10[/b]制数[/b][/b]
Public Function BinToDec(bin As String) As Long[/b]
Dim i As Long[/b]
For i = 1 To Len(bin)[/b]
BinToDec = BinToDec * 2 + Val(Mid(bin, i, 1))[/b]
Next[/b]
End Function[/b]
'10[/b]进制转换为[/b]2[/b]制数[/b][/b]
Public Function DecToBin(dec As Long) As String[/b]
DecToBin = ""[/b]
Do While dec > 0[/b]
DecToBin = (dec Mod 2) & DecToBin[/b]
dec = dec / 2[/b]
Loop[/b]
End Function[/b]
'16[/b]进制数转换为[/b]10[/b]进制数[/b][/b]
Public Function HexToDec(str2 As String) As Long[/b]
Dim i As Long, a As Variant, k As Long[/b]
k = 0[/b]
For i = Len(str2) - 1 To 0 Step -1[/b]
a = Asc(LCase(Mid(str2, Len(str2) - i, 1))) '[/b]统一求得各个字符的小写状态下的字符所对应的[/b]ASCII[/b]值[/b][/b]
a = IIf(a >= 48 And a <= 57, a - 48, a - 87)[/b]
'0[/b]的[/b]ASCII[/b]码为[/b]48[/b],字母[/b]a[/b]的[/b]ASCII[/b]码为[/b]97,[/b]而[/b]16[/b]进制下的[/b]A[/b]对应为[/b]10[/b]进制下的[/b]10[/b]
'[/b]如果[/b]a[/b]在[/b]16[/b]进制下为[/b] 0 [/b]至[/b] 9 [/b]的数,则[/b]-------[/b]
'[/b]如果[/b]a[/b]在[/b]16[/b]进制下为[/b] a [/b]至[/b] f [/b]的数,则[/b]-------[/b]
k = k + (16 ^ i) * a '[/b]累加[/b],[/b]就像[/b] 12345=1*10^4+2*10^3+3*10^2+4*10^1+5*1^0[/b]
Next[/b]
HexToDec = k '[/b]得到的这个返回值[/b] K [/b]就是转换后的[/b]10[/b]进制数[/b][/b]
End Function[/b]
'10[/b]进制转换成[/b]16[/b]进制数[/b][/b]
Public Function DecToHex(X As Long) As String[/b]
Dim a As String[/b]
Dim r As String[/b]
Do While X > 0[/b]
r = X Mod 16[/b]
X = X / 16[/b]
r = IIf(r > 9, Chr(Asc(r - 9) + 16), r)[/b]
'[/b]如果这里不减[/b]9[/b],一旦[/b]r[/b]为[/b]11,12,13,14,15[/b]时,就只得到[/b] 1 [/b]的[/b]ASCII[/b]码值,得到了一个错误的结果。[/b][/b]
a = r + a[/b]
Loop[/b][/b]
DecToHex = a[/b]
End Function[/b]
'10[/b]进制转换为[/b]8[/b]进制[/b][/b]
Public Function DecToOct(dec As Long) As String[/b]
DecToOct = ""[/b]
Do While dec > 0[/b]
DecToOct = (dec Mod 8) & DecToOct[/b]
dec = dec / 8[/b]
Loop[/b]
End Function[/b]
'8[/b]进制转换为[/b]10[/b]进制[/b][/b]
Public Function OctToDec(str2 As String) As Long[/b]
Dim i As Long, a As Variant, k As Long[/b]
k = 0[/b]
For i = Len(str2) - 1 To 0 Step -1[/b]
a = Asc(Mid(str2, Len(str2) - i, 1)) '[/b]统一求得各个字符的小写状态下的字符所对应的[/b]ASCII[/b]值[/b][/b]
a = a - 48[/b]
k = k + (8 ^ i) * a '[/b]累加[/b],[/b]就像[/b] 12345=1*10^4+2*10^3+3*10^2+4*10^1+5*1^0[/b]
Next[/b]
OctToDec = k '[/b]得到的这个返回值[/b] K [/b]就是转换后的[/b]10[/b]进制数[/b][/b]
End Function[/b]
'8[/b]进制转换为[/b]16[/b]进制[/b][/b]
Public Function OctToHex(Oct As String) As String[/b]
Dim dec As Long[/b]
dec = OctToDec(Oct) '8[/b]进制转[/b]10[/b]进制[/b][/b]
OctToHex = DecToHex(dec) ' 10[/b]进制转[/b]16[/b]进制[/b][/b]
End Function[/b]
'8[/b]进制转为[/b]2[/b]进制[/b][/b]
Public Function OctToBin(Oct As String) As String[/b]
Dim dec As Long[/b]
dec = OctToDec(Oct) '8[/b]进制转[/b]10[/b]进制[/b][/b]
OctToBin = DecToBin(dec) ' 10[/b]进制转[/b]2[/b]进制[/b][/b]
End Function[/b]
'16[/b]进制转为[/b]8[/b]进制[/b][/b]
Public Function HexToOct(Hex As String) As String[/b]
Dim dec As Long[/b]
dec = HexToDec(Hex) '16[/b]进制转[/b]10[/b]进制[/b][/b]
HexToOct = DecToOct(dec) '10[/b]进制转[/b]8[/b]进制[/b][/b]
End Function[/b]
'16[/b]进制转为[/b]2[/b]进制[/b][/b]
Public Function HexToBin(Hex As String) As String[/b]
Dim dec As Long[/b]
dec = HexToDec(Hex) '16[/b]进制转[/b]10[/b]进制[/b][/b]
HexToBin = DecToBin(dec) '10[/b]进制转[/b]2[/b]进制[/b][/b]
End Function[/b]
'2[/b]进制转化为[/b]16[/b]进制[/b][/b]
Public Function BinToHex(bin As String) As String[/b]
Dim dec As Long[/b]
dec = BinToDec(bin) '2[/b]进制转为[/b]10[/b]进制[/b][/b]
BinToHex = DecToHex(dec) '10[/b]进制转为[/b]16[/b]进制[/b][/b]
End Function[/b]
'2[/b]进制转化为[/b]8[/b]进制[/b][/b]
Public Function BinToOct(bin As String) As String[/b]
Dim dec As Long[/b]
dec = BinToDec(bin) '2[/b]进制转化为[/b]10[/b]进制[/b][/b]
BinToOct = DecToOct(dec) '10[/b]进制转化为[/b]8[/b]进制[/b][/b]
End Function[/b]
3[/b]、如何判断文本框中是否输入了无效的数据,以及如何防止这种行为?[/b][/b]
比如:[/b]2[/b]进制数只能由[/b]0[/b]和[/b]1[/b]构成,[/b]8[/b]制数只能由[/b]0[/b]、[/b]1----7[/b]构成,[/b]10[/b]进制数只能由[/b]0[/b]、[/b]1-------9[/b]构成,[/b]16[/b]进制数只能由[/b]0[/b]、[/b]1------9[/b],[/b]a[/b]、[/b]b-----f[/b]、[/b]A[/b]、[/b]B------F[/b]构成。[/b][/b]
所以我们需要一个[/b]keypress[/b]事件来控件这种形为,让各自对应的文本框只能按受对应的按键值。[/b]text1[/b]的[/b]keypress[/b]事件代码:[/b][/b]
Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)[/b]
Select Case Index '[/b]这个文本框为一个控件数组[/b],[/b]即依次为[/b]text1(0),text1(1),text1(2),text1(3)[/b]
Case 0 '[/b]第一个文本框[/b],[/b]这个文本框只能输入[/b]2[/b]进进制的数[/b],[/b]仅由[/b]0,1[/b]组成[/b] [/b]退格键的[/b]ASCII[/b]码为[/b]8[/b]
If Not (KeyAscii >= 48 And KeyAscii <= 49 Or KeyAscii = 8) Then[/b]
KeyAscii = 0 ' [/b]取消键的[/b]ASCII[/b]码为[/b]0,[/b]即此次输入的无效内容被屏蔽[/b][/b]
End If[/b]
Case 1 '[/b]第二个文本框[/b],[/b]这个文本框只能输入[/b]8[/b]进进制的数[/b],[/b]仅由[/b]0,1,----7[/b]组成[/b][/b]
If Not (KeyAscii >= 48 And KeyAscii <= 55 Or KeyAscii = 8) Then[/b]
KeyAscii = 0[/b]
End If[/b]
Case 2 '[/b]这个文本框只能输入[/b]8[/b]进进制的数[/b],[/b]仅由[/b]0,1,----9[/b]组成[/b][/b]
If Not (KeyAscii >= 48 And KeyAscii <= 57 Or KeyAscii = 8) Then[/b]
KeyAscii = 0[/b]
End If[/b]
Case 3 '[/b]这个文本框只能输入[/b]8[/b]进进制的数[/b],[/b]仅由[/b]0,1,----9,a-----f,A-----F[/b]组成[/b][/b]
If Not (KeyAscii >= 48 And KeyAscii <= 57 Or KeyAscii >= 97 And KeyAscii <= 102 Or KeyAscii >= 65 And KeyAscii <= 70 Or KeyAscii = 8) Then[/b]
KeyAscii = 0[/b]
End If[/b]
End Select[/b]
End Sub[/b]
4[/b]、当用户点击“开始转换”按钮时,大致会有[/b]4[/b]种情况:[/b][/b]
([/b]1[/b]),如果这四个文本框都为空值,则应该能够给出相应的提示信息:不能全部为空值[/b]------[/b]
([/b]2[/b]),如果用户只是在其中一个文本框中输入数据,程序必须自己判断是哪一个文本框,然后调用相应的转换函数来完成转换。[/b][/b]
([/b]3[/b]),如果用户在这四个文本框中都输入数据,程序应该给出一个对话框,让用户选择到底从哪一种数据开始,转换为其它的三种类型数据。[/b][/b]
([/b]4[/b]),在转换过程中,如果用户输入的数据过大,或其它某种未知的原因,而造成程序出现错误,程序应该能够给出相应的错误处理机制来响应用户的操作。[/b][/b]
Command1[/b]的[/b]click[/b]事件:[/b][/b]
Private Sub Command1_Click()[/b]
Dim X As Integer, i As Integer, Y As Integer[/b]
Dim result '[/b]定义后面弹出对话框的处理结果为变体类型[/b][/b]
On Error Resume Next '[/b]如果出现错误[/b],[/b]后面有专门的程序来处理[/b][/b]
[/b]
For i = 0 To 3[/b]
If Text1(i) <> "" Then[/b]
X = i '[/b]如果是哪一个文本框中有内容[/b],[/b]那么文本框的下标值就给后面的[/b]x,[/b]并且退出这里的循环[/b][/b]
Exit For[/b]
Else[/b]
X = 4 '[/b]这时所有的文本框都为空[/b][/b]
End If[/b]
Next[/b]
[/b]
'[/b]如果至少有两个文本框有数据[/b],[/b]那么下面[/b]11[/b]行程序就开始工作[/b];[/b]否则[/b],[/b]程序会路过下面的这[/b]11[/b]行[/b][/b]
Y = -1[/b]
For i = 0 To 3[/b]
If Text1(i) <> "" Then Y = Y + 1[/b]
Next[/b]
If Y >= 1 Then[/b]
CheckValue: X = Val(InputBox("[/b]至少两个文本框有数据[/b],[/b]你希望从第几个文本框的内容转换为其它数据[/b]? [/b]输入[/b]:1,2,3,4([/b]你选一个数[/b])", "[/b]巍威提示你[/b]!", "1", Screen.Width / 2, Screen.Height / 2)) - 1[/b]
End If[/b]
If Not (X >= 0 And X <= 4) Then[/b]
MsgBox "[/b]您这次操作不正确[/b],[/b]请按照提示来[/b]", vbOKOnly, "[/b]巍威提示你[/b]!"[/b]
GoTo CheckValue '[/b]程序转至上面的[/b]CheckValue[/b]标记处[/b] ,[/b]把[/b]x[/b]的值限定在[/b]0[/b]至[/b]4[/b]之间[/b][/b]
End If[/b]
[/b]
Select Case X[/b]
Case 0 ' [/b]这时[/b],[/b]第一个文本框不为空[/b],[/b]从第一个文本框的内容开始向其它进制数开始转换[/b][/b]
Text1(1) = BinToOct(Text1(0)) '2[/b]进制转为[/b]8[/b]进制[/b],[/b]并显示出来[/b][/b]
Text1(2) = BinToDec(Text1(0)) '2[/b]进制转为[/b]10[/b]进制[/b][/b]
Text1(3) = BinToHex(Text1(0)) '2[/b]进制转为[/b]16[/b]进制[/b][/b]
Case 1 ' [/b]这时[/b],[/b]第一个文本框为空[/b],[/b]第二个文本框不为空[/b],[/b]从第二个文本框的内容开始向其它进制数开始转换[/b][/b]
Text1(0) = OctToBin(Text1(1)) '8[/b]进制转为[/b]2[/b]进制[/b][/b]
Text1(2) = OctToDec(Text1(1)) '8[/b]进制转为[/b]10[/b]进制[/b][/b]
Text1(3) = OctToHex(Text1(1)) '8[/b]进制转为[/b]16[/b]进制[/b][/b]
Case 2 ' [/b]这时[/b],[/b]第一[/b]/[/b]二个文本框都为空[/b],[/b]第三个文本框不为空[/b],[/b]从第三个文本框的内容开始向其它进制数开始转换[/b][/b]
Text1(0) = DecToBin(Text1(2)) '10[/b]进制转为[/b]2[/b]进制[/b][/b]
Text1(1) = DecToOct(Text1(2)) '10[/b]进制转为[/b]8[/b]进制[/b][/b]
Text1(3) = DecToHex(Text1(2)) '10[/b]进制转为[/b]16[/b]进制[/b][/b]
Case 3 '[/b]这时[/b],[/b]第一[/b]/[/b]二[/b]/[/b]三个文本框都为空[/b],[/b]第四个文本框不为空[/b],[/b]从第四个文本框的内容开始向其它进制数转换[/b][/b]
Text1(0) = HexToBin(Text1(3)) '16[/b]进制转为[/b]2[/b]进制[/b][/b]
Text1(1) = HexToOct(Text1(3)) '16[/b]进制转为[/b]8[/b]进制[/b][/b]
Text1(2) = HexToDec(Text1(3)) '16[/b]进制转为[/b]10[/b]进制[/b][/b]
Text1(3) = UCase(Text1(3)) '[/b]将本身全部转化为大写状态[/b][/b]
Case 4[/b]
MsgBox "[/b]不能让所有的文本框为空[/b],[/b]请你在任一个文本框中输入相应数据[/b],[/b]然后回车[/b]", vbOKOnly, "[/b]巍威提示你[/b]!"[/b]
Text1(0).SetFocus '[/b]让第一个文本框获取焦点[/b][/b]
Exit Sub[/b]
End Select[/b]
Text1(0).SetFocus '[/b]让第一个文本框获取焦点[/b][/b]
Timer1.Enabled = False '[/b]关闭记时器[/b][/b]
Label5.Visible = False '[/b]隐藏警告标语[/b][/b]
[/b]
'[/b]如果出现了错误[/b],[/b]
If Err.Number > 0 Then[/b]
'[/b]弹出一个对话框[/b],[/b]告诉用户当前的错误所在[/b][/b]
result = MsgBox("[/b]很抱歉[/b],[/b]你的操作造成了[/b] '" + Err.Description + "'" + vbCrLf + "[/b]要清空所有的文本框[/b],[/b]重新输入吗[/b]?", vbYesNo, "[/b]巍威提示你[/b]!")[/b]
If result = 6 Then ' [/b]如果用户回答[/b]"[/b]是[/b]",[/b]则点击清空按钮[/b][/b]
Command2.Value = True[/b]
Else ' [/b]如果用户回答[/b]"[/b]否[/b]",[/b]则启动记时器[/b],[/b]显示警告标语[/b],[/b]并且转换功能的按钮不可用[/b][/b]
Timer1.Enabled = True[/b]
Command1.Enabled = False[/b]
Exit Sub '[/b]退出这个过程[/b][/b]
End If[/b]
End If[/b]
End Sub[/b]
5、至此这个“进制数转换器”大致成型。但是还有很多的细节,也值得你关注,因为作为一个软件,人机交互界面就显得非常重要。例如:把“开始转换”按钮的Default属性为true,当用户直接按Enter键时,就相当于已用鼠标点击了这个按钮;把“退出”按钮的Cancel属性设为true,当用户直接按Esc键时,就相当于已用鼠标点击了这个按钮;在timer2的timer事件中设置 form1.caption=“进制数转换器”+str(now),并且把timer2的interval设置为1000毫秒,即每秒触发一次,这样,当你运行这个程序时,你就会看到窗体的标题栏显示一个动态的电子时钟[/b][/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息