3

ループで Y/N または y/n を実装するのに問題があります。ユーザーが Y と N の大文字と小文字の両方をループ内の回答に使用できるように設計しました。ところで、ここに私のコードがありますが、それを機能させることができないようです:

do
        {
            Console.WriteLine("\nSelect additional topping/s\n");

            Console.WriteLine("1 - Extra meat: 200");
            Console.WriteLine("2 - Extra cheese: 100");
            Console.WriteLine("3 - Extra veggies: 80\n");

            int selectedTopping = Convert.ToInt32(Console.ReadLine());

            switch (selectedTopping)
            {
                case 1:
                    pizza = new MeatToppings(pizza);
                    break;

                case 2:
                    pizza = new CheeseToppings(pizza);
                    break;

                case 3:
                    pizza = new VeggieToppings(pizza);
                    break;

                default:
                    break;
            }

            Console.WriteLine("\nAdd more toppings? Y/N");
            

        }

        while ((Console.ReadLine() == "Y") || (Console.ReadLine() == "y"));
4

6 に答える 6

6
while ((Console.ReadLine() == "Y") || (Console.ReadLine() == "y"));

ReadLine()2 回呼び出しているため、これは 2 つの異なる行を読み取ります。一度呼び出して値を保存する必要があります。

于 2013-01-15T06:56:56.783 に答える
6

使用できますToUpper

while ((Console.ReadLine().ToUpper() == "Y") );
于 2013-01-15T06:57:10.817 に答える
6

とを使用String.EqualsしてみてくださいStringComparison

String.Equals(Console.ReadLine(), "y", StringComparison.CurrentCultureIgnoreCase);

MSDN から:

CurrentCultureIgnoreCase: カルチャに依存した並べ替え規則、現在のカルチャを使用し、比較対象の文字列の大文字と小文字を区別せずに文字列を比較します。

OrdinalIgnoreCase: 序数の並べ替え規則を使用し、比較される文字列の大文字と小文字を無視して、文字列を比較します。

于 2013-01-15T07:00:38.183 に答える
5

大文字と小文字をチェックYまたはy無視するには、string.Equals(string,StringComparison)オーバーロードを使用する必要があります。

while (Console.ReadLine().Equals("Y", StringComparison.InvariantCultureIgnoreCase));

大文字と小文字を区別しない文字列の比較については、トルコ語の İ 問題と使用前に注意する必要がある理由を参照してください。ToUpperToLower

現在のコードはコンソールから行を 2 回読み取っています。そのため、コードは 2 番目の値を保持しています。

于 2013-01-15T07:02:07.297 に答える
1

オースティンが指摘したように、while ループ ステートメントで ReadLine を 2 回使用しています。

言及する価値のあることの 1 つは、モジュール性のルールに従うようにすることです。これにより、コードの実装とデバッグが高速化されます。

C# プログラミングを久しぶりに行ったので、これを Java スタイルで sudo コーディングしました。

これはコマンド ライン プログラミングであるため、おそらくユーザー入力を複数回検証する必要があります。私がすることの 1 つは、ユーティリティ クラスを作成して、一般的なユーザー入力タスクを含めることです。

public class TerminalUtil {
    private TerminalUtil() {}

    public static boolean isYes(String msg){ return (msg.ToUpper() == "Y" || msg.ToUpper() == "YES"); }
    public static boolean isNo(String msg){ return (msg.ToUpper() == "N" || msg.ToUpper() == "NO"); }
   // You also might want basic conditionals to check if string is numeric or contains letters.

    // I like using recursion for command line utilities so having a method that can re-print messages is handy
    public static void display(String[] messages){
        for(String msg : messages){
            Console.WriteLine(msg);
        }
    }

    public static boolean enterYesOrNo(String[] messages, String[] errorMessages){
        display(messages)
        String input = Console.ReadLine();
        if( isYes(input) ){
            return true;
        } else if( isNo(input) ){ 
            return false; 
        } else {
             display(errorMessages); // Maybe something like, you didn't enter a yes or no value.
             enterYesOrNo(messages, errorMessages); // Recursive loop to try again.
        }

    }
}

ピザを注文するコードは次のようになります

public class OrderPizza{
    public static int selectToppings(){
        String[] message = new String[4];
        message[0] = ("\nSelect additional topping/s\n");
        message[1] = ("1 - Extra meat: 200");
        message[2] = ("2 - Extra cheese: 100");
        message[3] = ("3 - Extra veggies: 80\n");

       int option =  TerminalUtils.entryNumeric(message, {"You entered an non-numeric character, try again"} );
       if( option > 0 && option <= 3 ){
           return option;
       } else {
          Console.WriteLine("Number must be between 1 - 3, try again.");
          return selectToppings();
       }
    }

    public static Pizza order(){
        Pizza pizza = new Pizza();

        while(true){
            int toppingCode = selectTopping();
            pizza.addTopping(toppingCode);
            if(!TerminalUtil.enterYesOrNo({"\nAdd more toppings? Y/N"}, {"Please enter a 'Y'es or 'N'o"}) ){
                break;
            }
        }
    }
}

これの主な利点は、while ループのビジネス ロジックが削減され、TerminalUtils でコードを再利用できることです。また、これは決してエレガントなソリューションではありません。私は怠け者で、現在午前 3 時の IRL ですが、ボールが転がるには十分なはずです。

おそらく再考すべきことの 1 つは、トッピングを表すために整数コードを使用することです。列挙型を使用すると、実装が容易になる場合があります。

また、3 つの異なるタイプのピザを追加していることにも気付きました。これは、3 つの別個のオブジェクトであると想定しています。

ピザにトッピングを追加するためにループしているので、ピザの抽象クラスを作成します。このようにして、ペパロニやチーズなどの一般的な事前構築済みのピザを拡張し、顧客に注文をカスタマイズしてもらいたい場合は、抽象的なピザ クラスを使用できます。

于 2013-01-15T07:49:53.580 に答える
0

私はより良い方法を見つけられませんでした:

while ( str!="N" )
{
    str = Console.ReadLine();
    str = str.ToUpper();
    if (str == "Y");
       break;
};
于 2015-04-15T23:30:11.340 に答える