c#:优化输入控制台的错误预防

本文关键字:错误 控制台 优化 输入 | 更新日期: 2023-09-27 18:16:37

我刚刚开始使用Rob Miles的《c#编程黄皮书》和他网站上的一些相关实验练习来学习c#。我做了其中一个,并提出了一个有效的解决方案……(没有提供)。我希望它不会在用户输入无意义的答案或无法转换为整数的字符串时崩溃(我搜索了这个并找到了TryParse方法)。教科书简要地教授了try/catch方法,但这对于用户界面(即让程序在错误输入后继续运行)似乎没有用。我还设置了它,以便在其中一种情况下,它发出替代消息。我已经结束了一个有点长的代码…A do/while在A do/while内和A do/while在A while内。如果你有什么建议来简化这个,我将不胜感激。

最好的,艾略特

using System;
using System.IO;
static class Cinema
{
    static void Main()
    {
    int[] selection = new int[] //array for the age requirements of each film
        {
        15, 15, 12, 18, 0
        };
    string filmNumberText; //console input for the film number 
    int filmNumber; //input string parsed as integer 
    string ageText; //console input for age
    int age; //parsed age string
    int ageLimit; //age requirement for selected film
    Console.Write("Welcome to our Multiplex.'n'n");
    Console.WriteLine(@"We are presently showing:
    1. Rush (15) 
    2. How I Live Now (15)
    3. Thor: The Dark World (12A)
    4. Filth (18)
    5. Planes (U)");
    do  //loops as long as input is not between 1 and 5
    {
        do //loops as long as the input is not an integer
        {
            Console.Write("'nEnter the number of the film you wish to see: ");
            filmNumberText = Console.ReadLine();
        }
        while (int.TryParse(filmNumberText, out filmNumber) == false);
    } while (filmNumber < 1 || filmNumber > 5);
    filmNumber = filmNumber - 1; //changes input from 1-5 to 0-4
    ageLimit = selection[filmNumber]; //selects age requirement from array
     //loops as long as input is not an integer
        do
        {
            Console.Write("'nEnter your age: ");
        ageText = Console.ReadLine();
        } while (int.TryParse(ageText, out age) == false); // repeats if input is not an integer

    while (age < 0 || age > 125) //if integer is is too small or too large...
    {
        do
        {
            Console.Write("'nInvalid age. Please enter an age between 0 and 125: ");
            ageText = Console.ReadLine();
        } while (int.TryParse(ageText, out age) == false); //check again if input is an integer
    }
    if (age < ageLimit) //if too young for the given film
        {
            Console.WriteLine("'nAccess denied - you are too young");
        }
    else
        {
            Console.WriteLine("'nPlease call our office at 888-999-2928 to reserve tickets.");
        }
        }
}

c#:优化输入控制台的错误预防

我试图从你的代码中删除一些do while循环。你在找这个吗?

public static void Main()
{
    int[] selection = new int[] //array for the age requirements of each film
    {
    15, 15, 12, 18, 0
    };
    string filmNumberText; //console input for the film number 
    int filmNumber; //input string parsed as integer 
    string ageText; //console input for age
    int age; //parsed age string
    int ageLimit; //age requirement for selected film
    Console.Write("Welcome to our Multiplex.'n'n");
    Console.WriteLine(@"We are presently showing:
1. Rush (15) 
2. How I Live Now (15)
3. Thor: The Dark World (12A)
4. Filth (18)
5. Planes (U)");
    do  //loops as long as input is not between 1 and 5
    {
        Console.Write("'nEnter the number of the film you wish to see: ");
        filmNumberText = Console.ReadLine();
    } while (int.TryParse(filmNumberText, out filmNumber) == false || (filmNumber < 1 || filmNumber > 5));
    filmNumber = filmNumber - 1; //changes input from 1-5 to 0-4
    ageLimit = selection[filmNumber]; //selects age requirement from array
    //loops as long as input is not an integer
    do
    {
        Console.Write("'nPlease enter an age between 0 and 125:");
        ageText = Console.ReadLine();
    } while (int.TryParse(ageText, out age) == false || (age < 0 || age > 125)); //check again if input is an integer
    if (age < ageLimit) //if too young for the given film
    {
        Console.WriteLine("'nAccess denied - you are too young");
    }
    else
    {
        Console.WriteLine("'nPlease call our office at 888-999-2928 to reserve tickets.");
    }
    Console.Read();
}

你可以考虑以下重构:

  static class Cinema
    {
        static void Main()
        {
            string[] titles = new string[] {"Rush", "How I Live Now", "Thor: The Dark World", "Filth", "Planes" };//array for the age requirements of each film
            int[] selection = new int[] { 15, 15, 12, 18, 0 };//array for the age requirements of each film
            int filmNumber; //parsed film number string 
            int age; //parsed age string
            Console.WriteLine("Welcome to our Multiplex.'n'nWe are presently showing:");
            for (int i = 0; i < titles.Length; i++)
            {
                Console.WriteLine("{0}. {1} ({2})",i+1, titles[i],selection[i]);
            }

            filmNumber = GetIntNumber(1, 5, "'nEnter the number of the film you wish to see: ", "'nPlease enter a number between 1 and 5: ");
            //loops as long as input is not an integer
            age = GetIntNumber(0, 125, "'nEnter your age: ", "'nPlease enter an age between 0 and 125: ") - 1; 
            if (age < selection[filmNumber-1]) //if too young for the given film
            {
                Console.WriteLine("'nAccess denied - you are too young");
            }
            else
            {
                Console.WriteLine("'nPlease call our office at 888-999-2928 to reserve tickets.");
            }
            Console.ReadLine();
        }
        static int GetIntNumber(int min, int max, string prompt, string inputPrompt)
        {
            int number;
            Console.Write(prompt);
            do  //loops as long as input is not between 1 and 5
            {
                Console.Write(inputPrompt);
                while (!int.TryParse(Console.ReadLine(), out number)) //loops as long as the input is not an integer
                {
                    Console.Write("'nYou must enter an integer number!");
                } 
            } while (number < min || number >max);
            return number;
        }

编辑选项1用于GetInNumber()方法提示处理:

    static int GetInNumber(int min, int max, string prompt, string inputPrompt)
    {
        int number;
        Console.Write(prompt);
        do  //loops as long as input is not between 1 and 5
        {
            while (!int.TryParse(Console.ReadLine(), out number)) //loops as long as the input is not an integer
            {
                Console.Write("'nYou must enter an integer number!: ");
            }
            if (number < min || number > max) Console.Write(inputPrompt); //<--| write input prompt if number out of range
        } while (number < min || number > max);
        return number;
    }