1

C#用の簡単なスペルチェッカーを作成しています。特定の回答をランダムに選択された単語と比較してみます。

最初の文字を回答に記載されているすべての文字と比較して、それが正しいかどうか、文字の交換、削除、または追加された文字があったかどうかを確認したいと思います。最終的には、置換が使用されたのを確認するために1文字だけが間違っていたかどうかを確認できるようにしたいと思います。

たとえば、正解はhelloです。

    checking first letter ~H 
    h e l l o
    1 0 0 0 0

    h h e l l o
    1 1 0 0 0 0

    e l l o 
    0 0 0 0

次に、2番目の文字を確認します。

C#に関してはまったくわかりません。

私はもう試した

int CheckErrors(string Answer, string Guess)
        {
            if (Answer == Guess)
            {
                return 1;
            }

            if (Answer == null || Guess == null)
            {
                return -1;
            }

            for (int i = 0; i <= Answer.Length; i++)
            {

                if (Guess[i] != Answer[i])
                {
                    count++;

                    //substitution = -4
                    //deletion = -5
                    //transposition = -6
                    //insertion = -7
                }
                return count;
            }
            return -9;
        }

しかし、私はそれ以上進むことができません。

アップデート:

さらに調査すると、私がやろうとしていたことは次のようなものだと思います。

STRING answer = answer_given
STRING input = correct_answer

int check = 0;

FOR (int i = 0; i < input.Length; i++)
{
   FOR (int ii = 0; ii < answer.Length; ii++)
   {
     if (input[i] == answer[i])
     {
        int check++;
     }
   }
}

明らかに、これがチェックを追加し続けることを私は知っていますが、他にそれを行う方法を推測することはできません。

別の更新!

私はこれを使うことができます-

int CheckErrors(string Answer, string Guess)
        {
            int[,] d = new int[Answer.Length + 1, Guess.Length + 1];
            for (int i = 0; i <= Answer.Length; i++)
                d[i, 0] = i;
            for (int j = 0; j <= Guess.Length; j++)
                d[0, j] = j;
            for (int j = 1; j <= Guess.Length; j++)
                for (int i = 1; i <= Answer.Length; i++)
                    if (Answer[i - 1] == Guess[j - 1])
                        d[i, j] = d[i - 1, j - 1];  //no operation
                    else
                        d[i, j] = Math.Min(Math.Min(
                            d[i - 1, j] + 1,    //a deletion

                            d[i, j - 1] + 1),   //an insertion

                            d[i - 1, j - 1] + 1 //a substitution

                            );
            return d[Answer.Length, Guess.Length];
        }

しかし、各エラーが使用された回数をカウントする方法が必要ですか?

4

3 に答える 3

1

関数に関するいくつかの問題:

  • 単一の戻り値を使用して、その値の意味が一貫していない複数のシナリオを処理しようとしています。関数が状態(一致、一方または両方の値がnull、一致しないなど)とカウンターの両方を返すことができるようにすることはお勧めできません。
  • 戻り状態を表すために数字を使用する場合は、を使用enumして読みやすくします。
  • forループは毎回returnステートメントにヒットするため、ループは常に1回の反復後に終了します。returnステートメントはforループの後に移動する必要があります。
  • if (Guess[i] != Answer[i])iがの長さより大きい場合は例外をスローしますGuess
  • カウントが何を表すのかが明確ではなく、関数で定義されていません。

関数が何をするのかを正確に定義する必要があります。答えが「こんにちは」で、推測が「こんにちは」の場合、何を返しますか?一致しない文字の数(1)?エラーが何であったかを表すコード(挿入)?エラーはどこにありますか?これらが複数必要な場合は、別の関数が必要です。

于 2013-03-21T20:00:36.453 に答える
1

ウィキペディアStackOverflowの近似文字列マッチングを見ると、インスピレーションを得ることができます。

于 2013-03-21T23:57:09.367 に答える
0

string.Compare(...)を試すことを検討しましたか?

http://msdn.microsoft.com/en-us/library/zkcaxw5y.aspx

于 2013-03-21T19:49:55.430 に答える