`
yuanlanxiaup
  • 浏览: 857400 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

【程 计】<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1、实现281016进制数之间的相互转换,一共有种<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 60pt; HEIGHT: 30.75pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image001.wmz"></imagedata></shape>转换方式,即:2--->82--->102--->168--->28--->108--->1610--->210--->810--->1616--->216--->816--->10,这样12种转换方式

2、双击模块moduel1,进入代码编辑模式,开始编写这12种转换方式的模块函数。核心代码如下(以逗号开始的为注释内容):

Option Explicit

'2进制转换为10制数

Public Function BinToDec(bin As String) As Long

Dim i As Long

For i = 1 To Len(bin)

BinToDec = BinToDec * 2 + Val(Mid(bin, i, 1))

Next

End Function

'10进制转换为2制数

Public Function DecToBin(dec As Long) As String

DecToBin = ""

Do While dec > 0

DecToBin = (dec Mod 2) & DecToBin

dec = dec / 2

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><place w:st="on">Loop</place>

End Function

'16进制数转换为10进制数

Public Function HexToDec(str2 As String) As Long

Dim i As Long, a As Variant, k As Long

k = 0

For i = Len(str2) - 1 To 0 Step -1

a = Asc(LCase(Mid(str2, Len(str2) - i, 1))) '统一求得各个字符的小写状态下的字符所对应的ASCII

a = IIf(a >= 48 And a <= 57, a - 48, a - 87)

'0ASCII码为48,字母aASCII码为97,16进制下的A对应为10进制下的10

'如果a16进制下为 0 9 的数,则-------

'如果a16进制下为 a f 的数,则-------

k = k + (16 ^ i) * a '累加,就像 12345=1*10^4+2*10^3+3*10^2+4*10^1+5*1^0

Next

HexToDec = k '得到的这个返回值 K 就是转换后的10进制数

End Function

'10进制转换成16进制数

Public Function DecToHex(X As Long) As String

Dim a As String

Dim r As String

Do While X > 0

r = X Mod 16

X = X / 16

r = IIf(r > 9, Chr(Asc(r - 9) + 16), r)

'如果这里不减9,一旦r11,12,13,14,15时,就只得到 1 ASCII码值,得到了一个错误的结果。

a = r + a

<place w:st="on"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; mso-bidi-font-size: 12.0pt">Loop</span></b></place>

DecToHex = a

End Function

'10进制转换为8进制

Public Function DecToOct(dec As Long) As String

DecToOct = ""

Do While dec > 0

DecToOct = (dec Mod 8) & DecToOct

dec = dec / 8

<place w:st="on">Loop</place>

End Function

'8进制转换为10进制

Public Function OctToDec(str2 As String) As Long

Dim i As Long, a As Variant, k As Long

k = 0

For i = Len(str2) - 1 To 0 Step -1

a = Asc(Mid(str2, Len(str2) - i, 1)) '统一求得各个字符的小写状态下的字符所对应的ASCII

a = a - 48

k = k + (8 ^ i) * a '累加,就像 12345=1*10^4+2*10^3+3*10^2+4*10^1+5*1^0

Next

OctToDec = k '得到的这个返回值 K 就是转换后的10进制数

End Function

'8进制转换为16进制

Public Function OctToHex(Oct As String) As String

Dim dec As Long

dec = OctToDec(Oct) '8进制转10进制

OctToHex = DecToHex(dec) ' 10进制转16进制

End Function

'8进制转为2进制

Public Function OctToBin(Oct As String) As String

Dim dec As Long

dec = OctToDec(Oct) '8进制转10进制

OctToBin = DecToBin(dec) ' 10进制转2进制

End Function

'16进制转为8进制

Public Function HexToOct(Hex As String) As String

Dim dec As Long

dec = HexToDec(Hex) '16进制转10进制

HexToOct = DecToOct(dec) '10进制转8进制

End Function

'16进制转为2进制

Public Function HexToBin(Hex As String) As String

Dim dec As Long

dec = HexToDec(Hex) '16进制转10进制

HexToBin = DecToBin(dec) '10进制转2进制

End Function

'2进制转化为16进制

Public Function BinToHex(bin As String) As String

Dim dec As Long

dec = BinToDec(bin) '2进制转为10进制

BinToHex = DecToHex(dec) '10进制转为16进制

End Function

'2进制转化为8进制

Public Function BinToOct(bin As String) As String

Dim dec As Long

dec = BinToDec(bin) '2进制转化为10进制

BinToOct = DecToOct(dec) '10进制转化为8进制

End Function

3、如何判断文本框中是否输入了无效的数据,以及如何防止这种行为?

比如:2进制数只能由01构成,8制数只能由01----7构成,10进制数只能由01-------9构成,16进制数只能由01------9ab-----fAB------F构成。

所以我们需要一个keypress事件来控件这种形为,让各自对应的文本框只能按受对应的按键值。text1keypress事件代码:

Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)

Select Case Index '这个文本框为一个控件数组,即依次为text1(0),text1(1),text1(2),text1(3)

Case 0 '第一个文本框,这个文本框只能输入2进进制的数,仅由0,1组成 退格键的ASCII码为8

If Not (KeyAscii >= 48 And KeyAscii <= 49 Or KeyAscii = 8) Then

KeyAscii = 0 ' 取消键的ASCII码为0,即此次输入的无效内容被屏蔽

End If

Case 1 '第二个文本框,这个文本框只能输入8进进制的数,仅由0,1,----7组成

If Not (KeyAscii >= 48 And KeyAscii <= 55 Or KeyAscii = 8) Then

KeyAscii = 0

End If

Case 2 '这个文本框只能输入8进进制的数,仅由0,1,----9组成

If Not (KeyAscii >= 48 And KeyAscii <= 57 Or KeyAscii = 8) Then

KeyAscii = 0

End If

Case 3 '这个文本框只能输入8进进制的数,仅由0,1,----9,a-----f,A-----F组成

If Not (KeyAscii >= 48 And KeyAscii <= 57 Or KeyAscii >= 97 And KeyAscii <= 102 Or KeyAscii >= 65 And KeyAscii <= 70 Or KeyAscii = 8) Then

KeyAscii = 0

End If

End Select

End Sub

4、当用户点击“开始转换”按钮时,大致会有4种情况:

1),如果这四个文本框都为空值,则应该能够给出相应的提示信息:不能全部为空值------

2),如果用户只是在其中一个文本框中输入数据,程序必须自己判断是哪一个文本框,然后调用相应的转换函数来完成转换。

3),如果用户在这四个文本框中都输入数据,程序应该给出一个对话框,让用户选择到底从哪一种数据开始,转换为其它的三种类型数据。

4),在转换过程中,如果用户输入的数据过大,或其它某种未知的原因,而造成程序出现错误,程序应该能够给出相应的错误处理机制来响应用户的操作。

Command1click事件:

Private Sub Command1_Click()

Dim X As Integer, i As Integer, Y As Integer

Dim result '定义后面弹出对话框的处理结果为变体类型

On Error Resume Next '如果出现错误,后面有专门的程序来处理

For i = 0 To 3

If Text1(i) <> "" Then

X = i '如果是哪一个文本框中有内容,那么文本框的下标值就给后面的x,并且退出这里的循环

Exit For

Else

X = 4 '这时所有的文本框都为空

End If

Next

'如果至少有两个文本框有数据,那么下面11行程序就开始工作;否则,程序会路过下面的这11

Y = -1

For i = 0 To 3

If Text1(i) <> "" Then Y = Y + 1

Next

If Y >= 1 Then

CheckValue: X = Val(InputBox("至少两个文本框有数据,你希望从第几个文本框的内容转换为其它数据? 输入:1,2,3,4(你选一个数)", "巍威提示你!", "1", Screen.Width / 2, Screen.Height / 2)) - 1

End If

If Not (X >= 0 And X <= 4) Then

MsgBox "您这次操作不正确,请按照提示来", vbOKOnly, "巍威提示你!"

GoTo CheckValue '程序转至上面的CheckValue标记处 ,x的值限定在04之间

End If

Select Case X

Case 0 ' 这时,第一个文本框不为空,从第一个文本框的内容开始向其它进制数开始转换

Text1(1) = BinToOct(Text1(0)) '2进制转为8进制,并显示出来

Text1(2) = BinToDec(Text1(0)) '2进制转为10进制

Text1(3) = BinToHex(Text1(0)) '2进制转为16进制

Case 1 ' 这时,第一个文本框为空,第二个文本框不为空,从第二个文本框的内容开始向其它进制数开始转换

Text1(0) = OctToBin(Text1(1)) '8进制转为2进制

Text1(2) = OctToDec(Text1(1)) '8进制转为10进制

Text1(3) = OctToHex(Text1(1)) '8进制转为16进制

Case 2 ' 这时,第一/二个文本框都为空,第三个文本框不为空,从第三个文本框的内容开始向其它进制数开始转换

Text1(0) = DecToBin(Text1(2)) '10进制转为2进制

Text1(1) = DecToOct(Text1(2)) '10进制转为8进制

Text1(3) = DecToHex(Text1(2)) '10进制转为16进制

Case 3 '这时,第一//三个文本框都为空,第四个文本框不为空,从第四个文本框的内容开始向其它进制数转换

Text1(0) = HexToBin(Text1(3)) '16进制转为2进制

Text1(1) = HexToOct(Text1(3)) '16进制转为8进制

Text1(2) = HexToDec(Text1(3)) '16进制转为10进制

Text1(3) = UCase(Text1(3)) '将本身全部转化为大写状态

Case 4

MsgBox "不能让所有的文本框为空,请你在任一个文本框中输入相应数据,然后回车", vbOKOnly, "巍威提示你!"

Text1(0).SetFocus '让第一个文本框获取焦点

Exit Sub

End Select

Text1(0).SetFocus '让第一个文本框获取焦点

Timer1.Enabled = False '关闭记时器

Label5.Visible = False '隐藏警告标语

'如果出现了错误,

If Err.Number > 0 Then

'弹出一个对话框,告诉用户当前的错误所在

result = MsgBox("很抱歉,你的操作造成了 '" + Err.Description + "'" + vbCrLf + "要清空所有的文本框,重新输入吗?", vbYesNo, "巍威提示你!")

If result = 6 Then ' 如果用户回答"",则点击清空按钮

Command2.Value = True

Else ' 如果用户回答"",则启动记时器,显示警告标语,并且转换功能的按钮不可用

Timer1.Enabled = True

Command1.Enabled = False

Exit Sub '退出这个过程

End If

End If

End Sub

5、至此这个“进制数转换器”大致成型。但是还有很多的细节,也值得你关注,因为作为一个软件,人机交互界面就显得非常重要。例如:把“开始转换”按钮的Default属性为true,当用户直接按Enter键时,就相当于已用鼠标点击了这个按钮;把“退出”按钮的Cancel属性设为true,当用户直接按Esc键时,就相当于已用鼠标点击了这个按钮;在timer2timer事件中设置 form1.caption=“进制数转换器”+str(now),并且把timer2interval设置为1000毫秒,即每秒触发一次,这样,当你运行这个程序时,你就会看到窗体的标题栏显示一个动态的电子时钟

分享到:
评论

相关推荐

    格西烽火串口助手2.0

    4.3支持CRC8/CRC16/CRC32计算器,支持各项参数自定义,支持16进制、字符串和文件3种数据计算,附带常用CRC标准算法表供选择使用; 4.4支持MD5/SHA1/SHA256/SHA384/SHA512哈希值计算器,支持16进制、字符串和文件3种...

    格西烽火串口助手1.5

    4.3支持CRC8/CRC16/CRC32计算器,支持各项参数自定义,支持16进制、字符串和文件3种数据计算,附带常用CRC标准算法表供选择使用; 4.4支持MD5/SHA1/SHA256/SHA384/SHA512哈希值计算器,支持16进制、字符串和文件3种...

    Visual.C#.编程精彩百例

    实例54 摄氏温度与华氏温度间相互转换(2) 实例55 使用FileSystemWatcher组件监视Web服务器 实例56 由颜色名字产生对应颜色 实例57 使用索引指示器分析域名 实例58 C#版本的PingC 实例59 DNS客户程序 实例60 ...

    java源码包2

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    asp.net知识库

    实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP...

    java源码包---java 源码 大量 实例

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包3

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包4

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    《Visual.C#.编程精彩百例》配套光盘.part2

    ” 实例7 组件化“Welcome”程序 实例8 网络上的“Hello World” 实例9 Ref、Out与Params描述符的应用 实例10 C#自动内存管理的应用 实例11 一个有趣栈类的实现 实例12 垃圾收集器管理与...

    net学习笔记及其他代码应用

    抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。 41.构造器Constructor是否可被override? 答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

    vc++ 开发实例源码包

    6.右边窗口停止抓包后显示十六进制数 hyperlink 自绘CStatic,实现超链接。 iconbutton_demo 演示了多种自绘Button。 IDocHostUIHandler Extended CHtmlView 如题。 IM_毕业设计 聊天系统,操作了数据库,有...

    《Visual.C#.编程精彩百例》配套光盘part1

    ” 实例7 组件化“Welcome”程序 实例8 网络上的“Hello World” 实例9 Ref、Out与Params描述符的应用 实例10 C#自动内存管理的应用 实例11 一个有趣栈类的实现 实例12 垃圾收集器管理与...

Global site tag (gtag.js) - Google Analytics