0

私はc#でテストしていて、「小さな」問題に遭遇しました。Web を 1 時間検索しましたが、動作しないコードが見つかりました :(

私はc#でテストしており、コマンドプロンプトでちょっとしたクイズをしようとしています

    //variables questions, Vraag is question, Solution is the solution, and Keuze is the three choices (a,b and c)

    string Vraag1 = ("Wat is de hoofstad van Oostenrijk?");
    string Solution1 = ("Wenen");
    string Keuze1 = ("a: Wenen b: Rome c: Kiev");
    string Vraag2 = ("Hoe heet de hoogste berg van Afrika?");
    string Solution2 = ("De Kilimanjaro");
    string Keuze2 = ("a: De Mount-everest b: De Kilimanjaro c: De Aconcagua");
    string Vraag3 = ("Wie was de uitvinder van de gloeilamp?");
    string Solution3 = ("Edison");
    string Keuze3 = ("a: Thomas Edison b: Albert Einstein c: Abraham Lincoln");

    //Other variables

        //entered1, 2 and 3 are variables that the user typed in
//code

    //Question 1
    Console.WriteLine("Vraag 1:");
    Console.WriteLine();
    Console.WriteLine(Vraag1);
    Console.WriteLine();
    Console.Read();
    Console.WriteLine(Keuze1);
    Console.Read();
    string entered1 = Console.ReadLine();

    Boolean enteredbool1 = !entered1.Equals("a");

    if (enteredbool1)
    {
        Console.ForegroundColor = (ConsoleColor.Green);
        Console.WriteLine("Goedzo, op naar de volgende!");
    }
    else
    {
        Console.WriteLine("FOUT!");
    }

私の問題は、ユーザーが "a" と答えた場合、それは良い (goedzo) と表示されますが、b と入力すると、間違っていない (fout) と同じ結果が返されることです。

文字列からブール値への変換と関係があると思います。「!」を削除しようとしました。しかし、それは逆の効果をもたらします(質問が間違っていたと言うだけです)。

誰かが助けてくれることを願っています!

ギース

4

6 に答える 6

2

問題は、Readline の前に 'Read' を 2 回実行することです。Equals で検証する値は常に空 ("") になります。これは機能します:

        string Vraag1 = ("Wat is de hoofstad van Oostenrijk?");
        string Solution1 = ("Wenen");
        string Keuze1 = ("a: Wenen b: Rome c: Kiev");
        string Vraag2 = ("Hoe heet de hoogste berg van Afrika?");
        string Solution2 = ("De Kilimanjaro");
        string Keuze2 = ("a: De Mount-everest b: De Kilimanjaro c: De Aconcagua");
        string Vraag3 = ("Wie was de uitvinder van de gloeilamp?");
        string Solution3 = ("Edison");
        string Keuze3 = ("a: Thomas Edison b: Albert Einstein c: Abraham Lincoln");

        //Other variables

        //entered1, 2 and 3 are variables that the user typed in
        //code

        //Question 1
        Console.WriteLine("Vraag 1:");
        Console.WriteLine();
        Console.WriteLine(Vraag1);
        Console.WriteLine();
        Console.WriteLine(Keuze1);
        string entered1 = Console.ReadLine();

        Boolean enteredbool1 = entered1.Equals("a");

        if (enteredbool1)
        {
            Console.ForegroundColor = (ConsoleColor.Green);
            Console.WriteLine("Goedzo, op naar de volgende!");
            Console.ReadLine();
        }
        else
        {
            Console.WriteLine("FOUT!");
            Console.ReadLine();
        }
于 2013-10-13T15:38:00.940 に答える
1

Boolean enteredbool1 = entered1.Equals("a");正しい条件の否定を使用したため、 、または短く書くことができますbool enteredbool1 = entered1 == "a";

より堅牢にするために、たとえばTrim()、文字列の前後にあるスペース、タブ、およびその他のノイズを削除することができます。ToLower()のように大文字を変換Aa、最後StartsWithに文字列が他のノイズ (たとえば"a: Wenen") を無視して正しい答えで始まるかどうかを確認します。最終的な条件は次のようになります。

Boolean enteredbool1 = entered1.ToLower().Trim().StartsWith("a");

さらに、いくつかのコーディングのアドバイス:

  • エイリアスを使用、Boolean等しいbool
  • 演算子のオーバーロードがサポートされているため、文字列の等価性はC#で表現できます。strA == "a\n"
  • あなたが提案するアルゴリズムはうまくスケーリングしません。クイズを作成したい場合は、すべての質問/回答に対してコードを記述する必要があります。
于 2013-10-13T15:28:41.190 に答える
1

その他のオプションは、「 a 」や「 A 」などのユーザーの入力も正しく処理されるように、 startwith を trim および tolower とともに使用することです。

    // try to find "a" using StartsWith 
    if (entered1.Trim().ToLower().StartsWith("a")) { 
   }
于 2013-10-13T15:30:40.450 に答える
0

私は自由にいくつかのものを書き直して、別のやり方を提示しました(それはその場で行われたので、いくつかの改善が必要かもしれません):

Dictionary<int, Dictionary<string, string>> answers = new Dictionary<int, Dictionary<string, string>>()
            {
                {1,new Dictionary<string,string>()
                       {
                           {"a","Wenen"},{"b","Rome"},
                           {"c","Kiev"},{"correct","a"}
                       }},
                 {2,new Dictionary<string,string>()
                       {
                           {"a","De Mount-everest"},{"b","De Kilimanjaro"},
                           {"c","De Aconcagua"},{"correct","b"}
                       }},
                  {3,new Dictionary<string,string>()
                       {
                           {"a","Thomas Edison"},{"b","Albert Einstein"},
                           {"c","Abraham Lincoln"},{"correct","a"}
                       }}
            };
            List<string> quiz = new List<string>()
            {
                "Wat is de hoofstad van Oostenrijk?",
                "Hoe heet de hoogste berg van Afrika?",
                "Wie was de uitvinder van de gloeilamp?"
            };           

            bool IsDone = false;
            int question = 1;
            while (!IsDone)
            {
                Console.WriteLine(question + "º: Vraag 1:");
                Console.WriteLine();
                Console.WriteLine(quiz[question - 1]);
                Console.WriteLine();
                Console.ReadKey();
                Console.WriteLine(string.Format("a: {0} b: {1} c: {2}", answers[question]["a"], answers[question]["b"], answers[question]["c"]));
                string entered1 = Console.ReadLine();

                if (entered1.ToLower() == answers[question]["correct"])
                {
                    ConsoleColor col = Console.ForegroundColor;
                    Console.ForegroundColor = (ConsoleColor.Green);
                    Console.WriteLine("Goedzo, op naar de volgende!");
                    Console.WriteLine("Continue playing?  [y] [n]");
                    if (Console.ReadLine() == "y")
                    {
                        question++;
                        Console.ForegroundColor = col;
                        continue;
                    }
                    else
                        IsDone = true;
                }
                else
                {
                    Console.WriteLine("FOUT!");
                    Console.WriteLine("Continue playing?  [y] [n]");
                    if (Console.ReadLine() == "y")
                    {
                        question++;
                        continue;
                    }
                    else
                        IsDone = true;
                }

            }
于 2013-10-13T16:25:28.107 に答える
0

!entered1.Equals("a")を意味しNOT "a"ます。

答えは常に a、b、c などなので、最初の文字だけをテストします。これは簡単にテストでき'a''A'

于 2013-10-13T15:32:28.120 に答える
-1

これがあなたの問題です:ブール値のenteredbool1 = !entered1.Equals( "a");

それを次のように置き換えます。

        string Vraag1 = ("Wat is de hoofstad van Oostenrijk?");
        string Solution1 = ("Wenen");
        string Keuze1 = ("a: Wenen b: Rome c: Kiev");
        string Vraag2 = ("Hoe heet de hoogste berg van Afrika?");
        string Solution2 = ("De Kilimanjaro");
        string Keuze2 = ("a: De Mount-everest b: De Kilimanjaro c: De Aconcagua");
        string Vraag3 = ("Wie was de uitvinder van de gloeilamp?");
        string Solution3 = ("Edison");
        string Keuze3 = ("a: Thomas Edison b: Albert Einstein c: Abraham Lincoln");

        Console.WriteLine("Vraag 1:");
        Console.WriteLine(Vraag1);
        Console.WriteLine();
        Console.WriteLine(Keuze1);
        string entered1 = Console.ReadLine();
        Boolean enteredbool1 = entered1.Equals("a");
        if (enteredbool1)
        {
            Console.ForegroundColor = (ConsoleColor.Green);
            Console.WriteLine("Goedzo, op naar de volgende!");
        }
        else
        {
            Console.WriteLine("FOUT!");
        }

        Console.Read();
    }
}
于 2013-10-13T15:44:08.843 に答える