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

【程 计】

1、实现281016进制数之间的相互转换,一共有种转换方式,即: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

 Loop

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

Loop

 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

 Loop

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键时,就相当于已用鼠标点击了这个按钮;在timer2的timer事件中设置 form1.caption=“进制数转换器”+str(now),并且把timer2的interval设置为1000毫秒,即每秒触发一次,这样,当你运行这个程序时,你就会看到窗体的标题栏显示一个动态的电子时钟

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

  1. C# 中2,10,16进制及其ASCII码之间转化

    转载连接: http://blog.csdn.net/pengfeihe0123/article/details/7278221 C# 中2,10,16进制及其ASCII码之间转化           ...

  2. Python进制转换的完全实现——2/10/16进制原/补码互转

    一.需要转换的几种情况 不带符号位的整数 2进制 10进制 16进制 2进制 – bin2dec() bin2hex() 10进制 dec2bin() – dec2hex() 16进制 hex2bin ...

  3. 16进制转string java_java的2/10/16进制转换和字符串数字转换

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  4. 2,8,10,16进制转换

    先上个例子,方便以后复习,例子看不明白,说明算法已经忘了,再看详细分解 2->8 (1000)2 = 分解为001.000 左边=0*2^2+0*2^1+1*2^0=1 右边=0*2^2+0*2 ...

  5. python进制转换字符串转二进制对象整数转二进制对象16进制字符串转二进制对象(及其逆转换)

    (1)数字进制转换 int() 函数用于将一个字符串或数字转换为整型. x – 字符串或数字. base – 进制数,默认十进制. 如果是带参数base的话,要以字符串的形式进行输入 >> ...

  6. JS实现2,8,10,16进制的相互转换

    // 10进制转为16进制 var a=1234567890; console.log(a.toString(16)) //499602d2// 16进制转为10进制 var num=parseInt ...

  7. C#下2\10\16进制互转代码总汇

    1.十进制转换其他:Convert.ToString(十进制数字, 2|8|16进制模式) //十进制转二进制 Convert.ToString(69, 2); //十进制转八进制 Convert.T ...

  8. C语言之10/16进制字符串和数字转换(四)

    #include <stdio.h> #include <stdlib.h>int main() {//1.将10进制和16进制字符串转换成数字char a[] = " ...

  9. 16进制字符串转成字节数组、字节数组转16进制字符串、16进制字符串转成2进制字符串、中英文 字符串转16进制、16进制转换成中英文 字符串

    因为需要与硬件相互通讯 用到了这些方法 亲测可用 /*** 16进制表示的字符串 转换为字节数组** @param hexString 16进制表示的字符串* @return byte[] 字节数组* ...

最新文章

  1. Tensor基础实践
  2. 图像配准代码(包含matlab/opencv C++)
  3. 设计模式:程序员跳不开的坑
  4. python 正则表达式语法大全_Python 之父撰文回忆:为什么要创造 pgen 解析器?
  5. open external url via transaction launcher sina baidu google web
  6. 让你的单细胞数据动起来!|iCellR(二)
  7. linux 远程挂载摄像头_linux实现HUB分接两个摄像头读取视频
  8. Linux命令-用户和组管理
  9. paip.python 调用qt ui 总结
  10. [python]python生成md5
  11. MDK(keil5)的下载及安装教程
  12. 【编译原理】自下而上语法分析(C/C++源码+实验报告)
  13. pycocotools安装,简单易懂
  14. 【JavaScript】 一万字 JavaScript 笔记(详细讲解 + 代码演示 + 图解)
  15. SSL构建单双向https认证
  16. iOS 定位服务编程详解
  17. Linux驱动 | 加载.ko驱动模块的两种方法(insmod与modprobe)
  18. 2020年数二真题(重点题讲解)
  19. 简单的职工信息管理系统(运用了存储过程,和datagridview,dataset的设置)
  20. 【陈工笔记】SNN(Spiking Neural Network)的理解

热门文章

  1. python计算器 课程报告_使用Python开发实用计算器
  2. 一文纵览人工智能的23个分支技术(上)
  3. macOS系统,notion电脑端打不开,手机端正常
  4. echarts横坐标倾斜设置
  5. Node对象与Element对象
  6. ubuntu 查看GPU的信息(nvidia 品牌)
  7. 揭秘搜狗手机浏览器测试高效管理方法(二)
  8. 令牌桶限速C++实现
  9. 360浏览器的主页为什么无法修改?
  10. i5 12400性能怎么样 酷睿i512400核显相当于什么水平