编码和解码VBA程序

时间:2018-05-15 17:56:18

标签: vb.net

在我的编程课程中,我必须创建一个程序,允许用户输入一个句子,使用按钮" Encode"和#34;解码"作为选择。因此,对于" Encode",你必须将句子翻译成Asc数字(已经这样做了)。但是,我目前仍然坚持使用解码器#34;部分,因为您必须使用For循环和数组来按空格分隔Asc数字,然后逐个将它们转换为字符。这就是我到目前为止所拥有的:

Public Class Form1
    Dim Message As String
    Dim NewMessage As String
    Dim Part As String
    Dim Part2 As Integer
    Dim Letter As String
    Dim Length As String
    Dim ints() As Integer
    Dim intlength As Integer

    Private Sub btn_Enter_Click(sender As Object, e As EventArgs) Handles btn_Enter.Click
        Message = txt_Message.Text
        Length = Message.Length() - 1

        If rbn_Encode.Checked = True Then
            For Num As Integer = 0 To Length
                Letter = Message(Num)
                Me.lbl_Code.Text = lbl_Code.Text & Asc(Letter) & " "
            Next
        End If

        If rbn_Decode.Checked = True Then
            For Num As Integer = 0 To intlength Step 1
                If Message(Num) <> " " Then
                    Part = Part & Message(Num)
                Else
                    NewMessage = NewMessage & ChrW(Part) & " "
                End If
            Next
            Me.lbl_Code.Text = NewMessage
        End If
    End Sub

    Private Sub ExitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExitToolStripMenuItem.Click
        Application.Exit()
    End Sub
End Class

我已经坚持了大约两个星期,我仍然无能为力。感谢您的帮助,祝您度过愉快的一天。

1 个答案:

答案 0 :(得分:0)

这可能似乎转移了问题的主题,但这一切都意味着更好的答案。

好的,您的代码存在一些问题。首先,确保&#34; Option Strict&#34;正在看 - 看看here。这将迫使您正确转换类型并减少出现问题的可能性。考虑到上述情况,

export const maxLenght = max => value => {

    let v;
    let result = value.length > max;

    if(result === false) {
        v = value;
    }
    return v;
};

<Field
      name="name"
      type="text"
      component={renderField}
      label="Nome Completo *"
      placeholder="Nome Completo"
      normalize={maxLenght(10)}
    />

应该是

Dim Length As String

到下一位

每个程序都应该承担一项责任。您的Dim Length As Integer 事件处理程序包含用于编码文本和解码数字的代码。这些应该分成他们自己的程序。在像你这样的相对较短的代码中,它并不是一个问题,但即使在这里,它也会让事情变得更加模糊。看看下面的代码。还有更多问题,但我们马上就会看一下。下面的代码更清晰,更易于维护。

btn_Enter.Click

下一步。

在将字符串编码为ASCII的代码中,您将结果数据直接存储在标签Private Sub btn_Enter_Click(sender As Object, e As EventArgs) Handles btn_Enter.Click Message = txt_Message.Text Length = Message.Length() - 1 If rbn_Encode.Checked = True Then EncodeTextToAscii() End If If rbn_Decode.Checked = True Then DecodeToText() End If End Sub Private Sub DecodeToText() For Num As Integer = 0 To intlength Step 1 If Message(Num) <> " " Then Part = Part & Message(Num) Else NewMessage = NewMessage & ChrW(Part) & " " End If Next Me.lbl_Code.Text = NewMessage End Sub Private Sub EncodeTextToAscii() For Num As Integer = 0 To Length Letter = Message(Num) Me.lbl_Code.Text = lbl_Code.Text & Asc(Letter) & " " Next End Sub 的文本属性中。永远不应将用户界面用作数据的主存储。这是不好的做法,并且可能允许用户意外地更改数据 - 例如在文本框中。对于标签而言,它并不重要,但要养成良好的习惯要好得多。

要存储编码的ASCII数字,您可以使用数组lbl_Code,但正如您的代码所代表的那样,ints的声明就是这样。阵列中没有空间来存储数据。因此,在ints过程中,您需要将Encode的大小调整为与字符串中的字符数相同。

所以现在我们有..

ints

最后谈到你的问题。 Private Sub EncodeTextToAscii() ReDim ints(Length) For Num As Integer = 0 To Length Letter = Message(Num) ints(Num) = Asc(Letter) Next End Sub 过程现在可以写成这个..

Decode

您可以使用Private Sub DecodeToText() NewMessage = "" For Each asciiNumber As Integer In ints NewMessage = NewMessage & ChrW(asciiNumber) & " " Next Me.lbl_Code.Text = NewMessage End Sub 语句简单地获取循环的长度并获取数组的每个元素中的ascii数字。你不需要知道数组的长度。它只是在整个长度上循环。更容易。

作为练习,请尝试将For Each想法应用于For Each程序。 : - )