2016-12-14 7 views
0

, поэтому я делаю дешифрование, которое позволяет пользователю вводить текст, а затем они могут заменять буквы в программе. Например, есть раскрывающийся список, который позволяет вам поменять все «O» на вход пользователя на «W». Таким образом, на вкладке «Переполнение стека» выход будет «Stack wverflww».VB - Замена букв

Однако моя проблема заключается в том, что, когда пользователь выбирает вторую букву для изменения, которая уже была заменена, это вызывает проблему. Например, после того, как первый вышеприведенный пример произошел, если пользователь затем захотел изменить все «W» на своем входе на «A», выход будет «stack averflaa». Тем не менее, я ищу код, который нужно сделать, это вывести «Stack wverflwa». Таким образом, только оригинальные «W» пользовательского ввода меняются на букву «A».

Я надеюсь, что это имеет смысл.

Кто-то предложил использовать двумерный массив для переназначения букв новыми буквами, и я могу это сделать, но я понятия не имею, как потом поместить это в свой код и заставить его работать. Ниже мой код и спасибо всем, кто может мне помочь.

Dim chooseLetter, replaceLetter, words2 
    chooseLetter = selectLetterCombo.Text 
    replaceLetter = replaceLetterCombo.Text 
    words2 = UCase(textInputBox.Text) 
    Dim replaceList As New List(Of String) 
    For Each z In words2 
     If z = chooseLetter Then 
      replaceList.Add(replaceLetter) 
     Else 
      replaceList.Add(z) 
     End If 
    Next 
    letterReplaceBox.Text = "" 
    For Each f In replaceList 
     letterReplaceBox.Text = letterReplaceBox.Text & f 
    Next 

Примечание: selectLetterCombo.Text это письмо, выбранное пользователем, что они хотят, чтобы заменить и replaceLetterCombo.Text является письмо, выбранное пользователем, что они хотят, чтобы поменять первую выбранную букву с. Кроме того, textInputBox.text - это текст, введенный пользователем.

Спасибо!

+3

Почему бы просто не вспомнить исходное слово в переменной где-нибудь и всегда выполнять замены вместо исходного слова. Кроме того, я надеюсь, что это «шифрование» предназначено для теста или домашней работы, а не для того, чтобы на самом деле обмануть кого-то :) – Jeremy

+0

@ Жереми благодарю вас за ваше предложение, но я уже пробовал это, и каждый раз он просто перезагружает слово. Я пытаюсь получить все замены для вывода в одно и то же время; если я делаю это против оригинала каждый раз, когда он не будет объединять все замены как один выход. И «дешифрование» программного обеспечения является частью работы A Level, которую я установил. – Lauren

ответ

1

Вы должны иметь возможность сохранить список индексов персонажа, который изменился, и проверить это, прежде чем делать другое изменение.

'List to keep track of changed character index 
Dim replacedCharsList As New List(Of Integer)'member variable 

Dim chooseLetter, replaceLetter, words2 
chooseLetter = selectLetterCombo.Text 
replaceLetter = replaceLetterCombo.Text 
words2 = UCase(textInputBox.Text) 

Dim replaceList As New List(Of String) 
Dim i As Integer 
For i = 1 To Len(words2) 
    'remove the for each and go with a straight for loop to keep track if the index 
    If Mid(words2, i, 1) = chooseLetter Then 
     'check to see if we have already replaced this character via the index position 
     If replacedCharsList.Contains(i) = False Then 
      'we have not changed this so add the replacement letter and update our index list 
      replaceList.Add(replaceLetter) 
      replacedCharsList.Add(i) 
     Else 
      'we have already changed this character so just add it as is 
      replaceList.Add(Mid(words2, i, 1)) 
     End If 
    Else 
     replaceList.Add(Mid(words2, i, 1)) 
    End If 
Next 

letterReplaceBox.Text = "" 
For Each f In replaceList 
    letterReplaceBox.Text = letterReplaceBox.Text & f 
Next 
+0

привет, большое вам спасибо за ваш ответ! Теперь я проверю ваш код (: – Lauren

0

У меня есть в ответ, но вы действительно не понравится:

Option Infer On 
Option Strict On 

Imports System.Text.RegularExpressions 

Module Module1 

    Dim swaps As New Dictionary(Of Char, Char) 

    Function DoSwaps(originalText As String, swapLetters As Dictionary(Of Char, Char)) As String 
     Dim newText As String = "" 
     For Each c In originalText 
      If swapLetters.ContainsKey(c) Then 
       newText &= swapLetters(c) 
      Else 
       newText &= c 
      End If 
     Next 

     Return newText 

    End Function 

    Sub Main() 
     Console.Write("Enter the text to be altered: ") 
     Dim t = Console.ReadLine() 

     Dim exitNow = False 

     Do 
      Console.Write("Enter the letter to swap from and the letter to swap to, or a blank line to quit: ") 
      Dim s = Console.ReadLine() 
      If s.Trim().Length = 0 Then 
       exitNow = True 
      Else 
       Dim parts = Regex.Matches(s, "([A-Za-z])") 
       If parts.Count >= 2 Then 
        Dim letter1 = CChar(parts.Item(0).Value) 
        Dim letter2 = CChar(parts.Item(1).Value) 

        If swaps.ContainsKey(letter1) Then 
         swaps.Item(letter1) = letter2 
        Else 
         swaps.Add(letter1, letter2) 
        End If 

        Console.WriteLine(DoSwaps(t, swaps)) 

       End If 
      End If 

     Loop Until exitNow 

    End Sub 

End Module 

... если вы не хотите узнать о Dictionary class, чтобы понять, как это работает , Я использовал простой regular expression, чтобы проанализировать ввод пользователя, но если вы используете выпадающие списки для выбора букв, то это будет просто бонусное обучение, если вы изучите его.

Существенной особенностью является то, что вы держите исходную строку (t в коде выше) и применить преобразование (я назвал его DoSwaps) в , что каждый раз, а не ранее преобразованной строки.

0

Эти две функции выполнят эту работу, хотя для пунктуации нет пробелов, просто пробелов.

Private Function EncryptText(str As String) As String 
    Dim swapletters() As String = {"l", "s", "d", "f", "g", "h", "j", "k", "a", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "z", "x", "c", "v", "b", "n", "m"} 
    Dim encryptedText As String = "" 
    For Each letter As Char In str 
     If letter = " "c Then 
      encryptedText = encryptedText & " " 
     Else 
      Dim charactercode As Integer = Asc(letter) - 97 
      encryptedText = encryptedText & swapletters(charactercode) 
     End If 
    Next 
    Return encryptedText 
End Function 

Private Function DecryptText(str As String) As String 
    Dim swapletters As New List(Of String) From {"l", "s", "d", "f", "g", "h", "j", "k", "a", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "z", "x", "c", "v", "b", "n", "m"} 
    Dim decryptedText As String = "" 
    For Each letter As Char In str 
     If letter = " "c Then 
      decryptedText = decryptedText & " " 
     Else 
      Dim character As String = Chr(swapletters.IndexOf(letter) + 97) 
      decryptedText = decryptedText & character 
     End If 
    Next 
    Return decryptedText 
End Function 

Чтобы использовать их, объявить строку для хранения возвращаемого значения каждой функции

Dim etext As String 
etext = EncryptText("disambiguation is the root of all evil") 

результатов в Etext является "faplrsajxlzayt ар ZKG oyyz YH подветренной gcae"

и

Dim dtext As String 
dtext = DecryptText("faplrsajxlzayt ap zkg oyyz yh lee gcae") 

результаты «Целостность - корень всего зла»

 Смежные вопросы

  • Нет связанных вопросов^_^