2016-09-29 18 views
0

ユーザが入力した文字がレター配列であるかどうかを確認しようとしています。そしてその手紙をモールス配列であるモールス符号に翻訳する。ユーザー入力を順番に表示するには、char配列を使用する必要がありましたが、モールス符号をアルファベット順に表示します。正しく表示を停止するにはどうしたらいいですか?前もって感謝します。char配列を別の配列に対してチェックするvb.net

Dim strCode As String = txtCode.Text.ToUpper 'What the user enters must be letters it can also be - or = 
    Dim strText() As Char = strCode.ToCharArray 

    Dim strLetter() As String = {"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"} 
    Dim strMorse() As String = {"*=", "=***", "=*=*", "=**", "*", "**=*", "==*", "****", "**", "*===", "=*=", "*=**", "==", "=*", "===", "*==*", "==*=", "*=*", "***", "=", "**=", "***=", "*==", "=**=", "=*==", "==**"} 

    For Each letter As Char In strText 
     For x As Integer = 0 To strLetter.Length - 1 
      If strCode.Contains(strLetter(x)) Then 
       MessageBox.Show(strMorse(x)) 
      End If 
     Next 
    Next 
End Sub 

答えて

2

ただ、辞書を使用して文字列内のすべての文字を反復処理し、あなたは文字を見つけ、正しい順序でそれらを翻訳する心配する必要はありません。その後、あなただけのテキストを通過し、このような各文字を翻訳することができます...キー、および値としてモールス信号としてアルファベットを使用します。

Dim translate As New Dictionary(Of String, String) From {{" ", " "}, _ 
                  {"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", "==**"}} 
    Dim translatedMsg As String = Nothing 
    For Each c As Char In txtCode.Text.ToUpper 
     translatedMsg += translate(c) & " " 
    Next 
    Debug.Print(translatedMsg.TrimEnd) 

    'Output for "Hello World": **** * *=** *=** === *== === *=* *=** =** 

編集:まあ、行きますキーから値への逆戻りは、キーから値へ行くほどきれいではありません。なぜなら、ネイティブ関数がないからですが、Linqはこれでうまく動作します...正直なところ、私はスペースが最初に戻ってくる。スペースのために辞書に特殊文字を追加すると、翻訳がずっと楽になります。それにもかかわらず、私は例のために私の最初の例に固執し、ここでメッセージを翻訳する方法があります。私は再び "Hello World"を使用してスペースの問題を回避するために、スペースのアンダースコアを置き換えたので、メッセージを正しくデコードすることができました(もちろん、モールスコードは2):

+0

ニースのソリューションは、その辞書が何のためにあるのかを正確です。あなたは文字の間にスペースも必要であることに注意してください。そうでなければ、受信者は '*** 'が' EEE'、 'EI'、' IE'または 'S'を意味するかどうかを知りません。 – Heinzi

+0

ああ、非常に良い点! – soohoonigan

+0

@Heinzi私はそれを二番目に!辞書を使って、コードのポイントが何であるかを簡単に知ることができ、必要があると感じたら翻訳をチェックする方法をすぐに知ることができます。 –

2

「BA」などの単純なコードを使用してコードをステップ実行すると、論理エラーが表示されます。外側のループの文字を内側のループの文字と比較することは決してありません。代わりに、あなたのIfステートメントは "ねえ、私の入力は私のstrLetter配列の最初の文字を含んでいますか?"うん、 "A"がそこにある(それは最初の文字ではないが)。

文字を範囲(AとZの間)に入れると、代入のはるかに簡単な解法では、 "A"からの文字のASCII値のオフセットが使用されます。これにより、strLetterを定義する必要がなくなります。また、入力テキストの文字配列への変換を省略することもできます。文字列ですでに文字を列挙できます。

Dim strCode As String = txtCode.Text.ToUpper 'What the user enters must be letters it can also be - or = 

Dim strMorse() As String = {"*=", "=***", "=*=*", "=**", "*", "**=*", "==*", "****", "**", "*===", "=*=", "*=**", "==", "=*", "===", "*==*", "==*=", "*=*", "***", "=", "**=", "***=", "*==", "=**=", "=*==", "==**"} 

For Each letter As Char In strCode 
    If letter >' "A"c AndAlso letter <= "Z"c Then 
    MessageBox.Show(strMorse(AscW(letter) - AscW("A"c))) 
    End If 
Next 
+0

ありがとうございます。私はそれを試みます。それでも、このすべてに新しいので、助けに感謝します。 – StudentNeedsHelp

0
Sub Main() 
    Dim codes() As String = { _ 
     "*=", "=***", "=*=*", "=**", "*", "**=*", "==*", "****", "**", _ 
     "*===", "=*=", "*=**", "==", "=*", "===", "*==*", "==*=", "*=*", _ 
     "***", "=", "**=", "***=", "*==", "=**=", "=*==", "==**" _ 
    } 

    Dim input As String = Console.ReadLine().ToUpper() 

    ' Convert characters to values that can be used as indexes in the code array 
    Dim indexes = input.[Select](Of Integer)(Function(l As Char) Asc(l) - 65) 
    ' limit the values to based on the range of possible values 
    Dim boundsCheck = indexes.Where(Function(l As Integer) l >= 0 And l <= 26) 
    ' map the valid inputs to codes fro myour array 
    Dim outCodes = boundsCheck.[Select](Of String)(Function(l As Integer) codes(l)) 
    ' concatenate the codes into a string and display 
    Console.WriteLine(String.Join(" ", outCodes)) 
End Sub 
関連する問題