2

私はモールス コンバーターを構築しようとしていました。以下は C# のコードの一部ですが、実行するとインデックスが範囲外であることがわかります。誰か修正できますか? 私はプログラミングが初めてです:)

private void BTNconvert_Click(object sender, EventArgs e)
{           
    string input = TBinput.Text;
    string[] output=new string[input.Length];
    for (int index=0;index<input.Length;index++)
    {
        index=input.IndexOf('a',index);
        output[index]=".-";                                               
    }

    for (int index = 0; index < input.Length; index++)
    {
        index = input.IndexOf('b', index);
        output[index] = "-...";
    }

    LBcodes.Text = string.Join(" ",output); 
4

4 に答える 4

4

このエラーが表示される理由は、指定された検索用語が文字列内に見つからない場合に値IndexOf()が返されるため、設定しようとすると無効なインデックスになってしまうためです。-1output[-1]

于 2015-04-03T03:43:17.223 に答える
0
private void BTNconvert_Click(object sender, EventArgs e)
{      
   int index;     
    string input = TBinput.Text;
    string[] output=new string[input.Length];
       index = -1;
        do{
             index=input.IndexOf('a',index+1);
             if(index==-1)break;
             output[index]=".-";     
        }while(true);
        index = -1;
        do{
             index=input.IndexOf('b',index+1);
             if(index==-1)break;
             output[index]="-...";     
        }while(true);
    }

    LBcodes.Text = string.Join(" ",output);

また、すべてのキャラクターに対してこれらのループを作成する場合は、これを行うことをお勧めします。

private void BTNconvert_Click(object sender, EventArgs e)
{  

   int index;
   char[] source1 = {'a','b','c',....,'z'} //replace ... with characters
   string[] source2 = {".-","-...",....}   //replace .... with Morse equivalents
    string input = TBinput.Text;
    string[] output=new string[input.Length];
       for(int i=0;i<26;i++){
       index = -1;
        do{
             index=input.IndexOf(source1[i],index+1);
             if(index==-1)break;
             output[index]=source2[i];     
        }while(true);
        }
    }

    LBcodes.Text = string.Join(" ",output);
于 2015-04-03T03:46:45.943 に答える
0

指定されたテキストが入力文字列に見つからない場合、IndexOf() は -1 を返します。テキストボックスに特定の文字を入力した場合にのみ、コードは正常に機能します。そのため、2 番目のループを削除してテキスト ボックスにすべて a を入力すると、コードが正常に機能します。

それに加えて、2 つのループを使用する必要がある理由です。両方のループで同じことをしています。

于 2015-04-03T05:27:32.920 に答える
0

私だったら、各文字とそれに対応するモールス文字列の辞書マッピングを保持します。これにより、前後の変換が簡単になります。

例えば:

private static Dictionary<char, string> MorseMap = new Dictionary<char, 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', "--.."},{'1', ".----"}, {'2', "..---"}, 
    {'3', "...--"}, {'4', "....-"},{'5', "....."}, {'6', "-...."}, 
    {'7', "--..."}, {'8', "---.."},{'9', "----."}, {'0', "-----"},
    {'.', ".-.-.-"}, {',', "--..--"},{'?', "..--.."}, {'\'', ".----."},
    {'!', "-.-.--"}, {'/', "-..-."},{'(', "-.--."}, {')', "-.--.-"},
    {'&', ".-..."}, {':', "---..."},{';', "-.-.-."}, {'=', "-...-"},
    {'+', ".-.-."}, {'-', "-....-"},{'_', "..--.-"}, {'"', ".-..-."},
    {'$', "...-..-"}, {'@', ".--.-."}
};

さて、このマップのキーと値を使用すると、モールス信号へのエンコードとデコードがかなり簡単になります。

private static string ConvertToMorse(string input)
{
    var morse = new StringBuilder();

    foreach (var character in input)
    {
        var upperCaseChar = char.ToUpper(character);

        if (MorseMap.ContainsKey(upperCaseChar))
        {
            morse.Append(MorseMap[upperCaseChar]);
        }
        else
        {
            // If there's no mapping for this character, just add it
            morse.Append(character);
        }

        // Add a space between each morse string.
        morse.Append(' ');
    }

    return morse.ToString().Trim();
}

private static string ConvertToAlpha(string morse)
{
    var alpha = new StringBuilder();

    // Split words on double-spaces so we can add single spaces back where needed
    var morseCodeWords = morse.Split(new[] {"  "}, StringSplitOptions.None);

    foreach (var morseCodeWord in morseCodeWords)
    {
        var morseCodeStrings = morseCodeWord.Split(' ');

        foreach (var morseCodeString in morseCodeStrings)
        {
            if (MorseMap.ContainsValue(morseCodeString))
            {
                alpha.Append(MorseMap.First(item => item.Value == morseCodeString).Key);
            }
            else
            {
                // If there's no mapping for the string, just add it
                alpha.Append(morseCodeString);
            }
        }

        // Add a space between each word
        alpha.Append(' ');
    }

    return alpha.ToString();
}

使用例:

private static void Main()
{
    var test = "This is my test string.";

    var morseVersion = ConvertToMorse(test);
    var alphaVersion = ConvertToAlpha(morseVersion);

    Console.WriteLine("Original string ... {0}", test);
    Console.WriteLine("Morse version ..... {0}", morseVersion);
    Console.WriteLine("Alpha version ..... {0}", alphaVersion);
}
于 2015-04-03T04:42:30.667 に答える