Main()に戻るための関数のエスケープ

.net c# main return return-value
Main()に戻るための関数のエスケープ

私は、内部にほとんどプログラムを持たないプログラムを作成していますが、ジレンマに陥りました。 これらの数字から最大の数字を見つけるために数字を並べ替える私の最初のミニプログラムでは、ユーザーが終了するかどうかを尋ねます。 それらが「はい」と応答した場合、関数はmain(string [] args)メソッドで評価される0を返します。 私の問題は、ユーザーが「いいえ」と言ったときはいつでも、ミニプログラムが継続しないことです。 ここに私のソースがあります:

    namespace ACSL_Competition
    {
        class Program
        {
    static int DigitRearranger()
    {
        string[] mainString = {};
        Console.WriteLine("---------Welcome to the Digit Re-arranger!---------");
        Console.WriteLine("I take a positive number up to 10000, and find the highest number that can be made out of its digits.");
        Console.WriteLine("Instructions: Enter a number up to 10000, and see the results!");
        drLabel:
        Console.Write("Your Number: ");

        string input = Console.ReadLine();
        int inputNumber = 0;
        try { inputNumber = int.Parse(input); }
        catch (Exception ex) { Console.WriteLine("Error: {0}", ex.Message); goto drLabel; }

        /*Placeholder code for the moment*/Console.WriteLine(inputNumber.ToString());
        evaluate:
        Console.Write("Do you want to exit? Yes/No: ");
        if (Console.ReadLine().Equals("Yes"))
            return 1;
        else if (Console.ReadLine().Equals("No"))
        {
            goto drLabel;

        }
        else
        {
            return 1;
        }

    }
    static void Main(string[] args)
    {
        Console.WriteLine("Welcome to the ACSL Competition Program. Choose a program to begin:");
        Console.Write("\n\t");
        Console.WriteLine("1\tDigit Re-arranger");
        label:
        Console.Write("\nProgram: ");
        string input = Console.ReadLine();
        int number = 0;
        try { number = int.Parse(input); }
        catch (Exception ex) { Console.WriteLine("Error: {0}", ex.Message); goto label; }
        if (number == 1)
        {
            Console.WriteLine("\n");
            if (DigitRearranger() == 1)
            {
                goto label;
            }
            else if (DigitRearranger() != 1)
            {
                DigitRearranger();
            }
        }
        else if (!number.Equals(1))
        {
            Console.WriteLine("Not a valid program.");
            goto label;
        }
        //----------------
        Console.ReadLine();
    }
}

}

  0  0


ベストアンサー

根本的な問題は、readlineを2回呼び出すことです。 入力された値を初めて取得するとき、つまり はい、2回目に呼び出したときに読み取るデータがないため、 “”が返されます。 同じ入力を再利用する必要がある場合は、変数に保存します。

 string inputVal = Console.ReadLine();

goto文は嫌いです。コードをwhileループに再構築できます。

bool exit = false;
while(!exit)
{
    Console.Write("Your Number: ");
    //Your main code
    Console.Write("Do you want to exit? Yes/No: ");
    if(Console.ReadLine() != "No")
      exit = true;
}

実際、exit変数を削除し、while(true)を実行して、ユーザーがno以外を入力した場合に戻ることができます。

4


いくつか提案があります。

  1. 読みやすさを向上させるために、よりモジュール化されたコードを記述してください。 メイン()
    メソッドは外側のUIループのみを駆動する必要があり、各モジュールは独自のUIを提供します。

  2. gotoステートメントを使用しないでください。

  3. if条件内でConsole.Readline()を使用しないでください(「はい」でない場合、
    2回呼び出されました)。

ここにあなたのコードのリファクタリングされたバージョンがあります:

    class Program {
    static void DigitRearranger()
    {
        string response = "";
        int num;
        do
        {
            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("---------Welcome to the Digit Re-arranger!---------");
            Console.WriteLine("I take a positive number up to 10000, and find the highest number that can be made out of its digits.");
            Console.WriteLine("Instructions: Enter a number up to 10000, and see the results!");
            Console.ResetColor();

            Console.Write("Your Number: ");
            if (!int.TryParse(Console.ReadLine(), out num))
            {
                Console.WriteLine("Not a number.  Press any key to continue");
                Console.ReadKey();
                continue;
            }
            //todo:  reaarrange the number & print results
            /*Placeholder code for the moment*/
            Console.WriteLine(num);

            Console.Write("Do you want to exit? Yes/No: ");
            response = Console.ReadLine();

        } while (response.ToLower() != "yes");
    }

    //UI driver only in Main method:
    static void Main(){
        string response = "";

        do
        {
            Console.Clear();
            Console.WriteLine("Welcome to the ACSL Competition Program. Choose a program to begin:");
            Console.WriteLine("\n\t1\tDigit Re-arranger");
            Console.WriteLine("\tq\tQuit");

            Console.Write("\nProgram: ");

            response = Console.ReadLine();
            switch(response)
            {
                case "1":
                    DigitRearranger();
                    break;
                case "q":
                    break;
                default:
                    Console.WriteLine("Not a valid program.  Press any key to continue");
                    Console.ReadKey();
                    break;
            }
        } while (response.ToLower() != "q");
        Console.ReadLine();
    }}

0


タイトルとURLをコピーしました