2016-12-14 8 views
0

私はユーザーが何らかのテキストを入力できるようにする復号化ソフトウェアを作っており、プログラム内の文字を入れ替えることができます。たとえば、ユーザー入力のすべての「O」を「W」に置き換えることができるドロップダウンボックスがあります。したがって、入力 "スタックオーバーフロー"の出力は "Stack wverflww"になります。VB - 文字の置換

しかし、私の問題は、ユーザーが変更する2番目の文字を選択すると、その文字は既にスワップされているため、問題が発生するということです。たとえば、上記の最初の例が発生した後、ユーザが入力のすべての "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

@Jeremyはあなたの提案をありがとうが、私はすでにそれを試して、私はすべての置換えを同時に出力しようとしています。すべての置換を1つの出力としてマージしないたびに、元のものと逆にするとします。そして、 "解読"ソフトウェアは私が設定したAレベルの作品の一部です。 – 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

これらの2つの機能はジョブを実行しますが、句読点に余裕はありませんが、スペースだけです。

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 

etextに

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

結果が "faplrsajxlzaytのAP ZKG oyyz YHリーgcae" である各関数の戻り値を保持する文字列を宣言し、それらを使用する

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

「曖昧さ回避はすべての悪の根源です」