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ď č. 1Mali 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“