Сдвиговый шифр Visual Basic
У меня проблема с моей программой шифрования смены Ceasar. Код работает нормально, когда мне нужно зашифровать текст с n шифрами сдвига. Но когда я хочу расшифровать некоторый текст, индекс массива становится отрицательным, и я получаю ошибку: произошло необработанное исключение типа 'System.IndexOutOfRangeException'.
Public Class Form1
Dim alfabet() As Char = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "æ", "ø", "å"}
Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click
Me.Close()
End Sub
Private Sub btnKod_Click(sender As Object, e As EventArgs) Handles btnKod.Click
Kod(txtDekodet.Text, txtTrylletal.Text, True)
End Sub
Private Sub btnDekod_Click(sender As Object, e As EventArgs) Handles btnDekod.Click
Kod(txtKodet.Text, -txtTrylletal.Text, False)
End Sub
Function Kod(tekst As String, trylletal As Integer, skalKodes As Boolean)
Dim nyeCharVaerdier(tekst.Length) As Char
For i As Integer = 0 To tekst.Length - 1
Dim nytTal As Integer = findIndex(tekst(i), trylletal)
If nytTal = -1 Then
nyeCharVaerdier(i) = tekst(i)
Else
nyeCharVaerdier(i) = alfabet(nytTal)
End If
Next
If skalKodes = True Then
txtKodet.Text = nyeCharVaerdier
Else
txtDekodet.Text = nyeCharVaerdier
End If
Return Nothing
End Function
Function findIndex(tegn As Char, trylletal As Integer) As Integer
For alfabetTaeller As Integer = 0 To alfabet.Length - 1
If tegn = alfabet(alfabetTaeller) Then
Dim nytIndex As Integer = (alfabetTaeller + trylletal) Mod alfabet.Length
Return nytIndex
End If
Next
Return -1
End Function
End Class
3 ответа
Ваша подпрограмма работает. Однако массив, который вы используете в качестве таблицы поиска, объявлен как char, но вы пытаетесь заполнить его строками. Если у тебя есть Option Strict
на, вы бы видели каждую строку с волнистой линией под ней, что указывает на ошибку. Положить c
после закрытия "для каждого персонажа и ваша подпрограмма будет работать.
Dim alfabet() As Char = {"a"c, "b"c, "c"c, "d"c, "e"c, "f"c, "g"c, "h"c, "i"c, "j"c, "k"c, "l"c, "m"c, "n"c, "o"c, "p"c, "q"c, "r"c, "s"c, "t"c, "u"c, "v"c, "w"c, "x"c, "y"c, "z"c, "æ"c, "ø"c, "å"c}
На боковой ноте. Если вы не собираетесь возвращать какие-либо значимые данные, объявите процедуру как Sub
а не как Function
, Если вы собираетесь вернуть данные, используйте As
предложение, чтобы указать, какой тип данных будет возвращен.
Единственное, что может вызвать эту ошибку, это когда индекс массива слишком велик или меньше нуля. Попробуйте запустить программу в Visual Studio. Когда он получит ошибку, отобразите значение всех переменных в строке кода, на которой он остановился. (Используйте меню отладки). Вы должны увидеть проблему тогда.
Я понял, что если я добавлю длину моего массива alfabet() к новым отрицательным индексам - все будет отлично работать:-)
if nytTal < 0 Then
nytTal += nytTal + alfabet.Length
End If