/ / VB - Zámena písmen - vb.net, Zámena

VB - Náhrada listov - vb.net, substitúcia

takže vyrábam dešifrovací softvér, ktorý umožňujepoužívateľ môže zadať text a potom môže v programe vymieňať písmená. Existuje napríklad rozbaľovacie pole, ktoré vám umožňuje zameniť všetky „O“ vo vstupe používateľa za „W.“ Takže vo vstupe „Stack overflow“ bude výstup „Stack wverflww“.

Môj problém však je, že keď je užívateľzvolí druhé písmeno na zmenu, ktoré už bolo vymenené, spôsobuje problém. Napríklad po tom, čo dôjde k prvému vyššie uvedenému príkladu, ak by užívateľ potom chcel zmeniť všetky „W“ vo svojom vstupe na „A“, výstup by bol „stack averflaa“. To, čo hľadám, je urobiť iba výstup „Stack wverflwa". Takže iba pôvodné „W" "vstupy používateľa sa zmenia na písmeno" A ".

Dúfam, že vyššie uvedené má zmysel.

Niekto navrhol použiť dvojrozmerné poleprerozdeliť písmenám nové písmená a som schopný to urobiť, ale netuším, ako to potom vložiť do môjho kódu a uviesť ho do činnosti. Ďalej je uvedený môj kód a ďakujem všetkým, ktorí mi môžu pomôcť.

    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

poznámka: selectLetterCombo.Text je písmeno vybrané používateľom, ktoré chce nahradiť, a nahradiťLetterCombo. Text je písmeno vybrané používateľom, ktorým chce zameniť prvé vybrané písmeno. TextInputBox.text je tiež text, ktorý zadal používateľ.

Ďakujem!

odpovede:

1 pre odpoveď č. 1

Mali by ste byť schopní viesť zoznam indexov znakov, ktoré sa zmenili, a skontrolovať to pred ďalšou zmenou.

"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 pre odpoveď č. 2

mám e odpoveď, ale naozaj sa ti nebude páčiť:

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

... pokiaľ sa nechcete dozvedieť viac o Trieda slovníka aby sme pochopili, ako to funguje. Použil som jednoduchý regulárny výraz analyzovať vstupy používateľov, ale ak na výber písmen používate rozbaľovacie ponuky, potom by to bolo len bonusové učenie, ak ich preskúmate.

Podstatnou vlastnosťou je, že si ponecháte pôvodný reťazec (t vo vyššie uvedenom kóde) a aplikujte transformáciu (pomenoval som ju DoSwaps) do že zakaždým, nie na predtým transformovaný reťazec.


0 pre odpoveď č. 3

Tieto dve funkcie urobia prácu, aj keď tu nie je dovolené interpunkčné znamienko, iba medzery.

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

Ak ich chcete použiť, deklarujte reťazec, ktorý uchová návratovú hodnotu každej funkcie

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

má za následok, že etext bude „faplrsajxlzayt ap zkg oyyz yh lee gcae“

a

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

má za následok „disambiguácia je koreňom všetkého zla“