Выход из функции для возврата в Main () - PullRequest
0 голосов
/ 08 июля 2011

Я делаю программу, в которой мало программ, и я столкнулся с дилеммой. В моей первой мини-программе, которая переставляет цифры, чтобы найти максимально возможное число из этих цифр, он спрашивает, хочет ли пользователь выйти. Если они отвечают «Да», то функция возвращает 0, который оценивается в методе main (string [] args). Моя проблема в том, что когда пользователь говорит «Нет», мини-программа все равно не запускается. Вот мой источник:

    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();
    }
}

}

Ответы [ 2 ]

4 голосов
/ 08 июля 2011

Основная проблема заключается в том, что вы вызываете readline дважды. При первом получении введенного значения, т. Е. При втором вызове, нет данных для чтения, поэтому возвращается «». Если вам нужно использовать один и тот же вход, сохраните его в переменной, т.е.

 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;
}

На самом деле, вы можете избавиться от переменной выхода, просто сделайте while (true) и вернитесь, если пользователь вводит что-то отличное от no.

0 голосов
/ 08 июля 2011

У меня есть несколько предложений:

  1. Напишите свой код, чтобы он был более модульным для улучшения читабельности. Метод Main () должен управлять только внешним циклом пользовательского интерфейса, каждый модуль имеет свой собственный пользовательский интерфейс.
  2. Никогда не используйте операторы goto.
  3. Не используйте Console.Readline () внутри условия if (если не «Да», оно вызывалось дважды).

Вот моя измененная версия вашего кода:

    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();
    }}
...