如果满足 while 条件则退出循环

时间:2021-04-06 08:46:27

标签: c# do-while

我有一个将用户输入存储在数组中的程序。 每次存储用户输入时,int var Counter 都会增加 1。 我的问题是,如果我存储 25 个变量,循环结束但可以说我输入了无效的内容,即使在存储了 25 个变量之后,循环也会继续。我想确保循环在满足 while 条件后结束,即使程序捕获了错误,如果有任何意义。

不,我想使用数组而不是列表!

谢谢

        void AddPassenger()
    {
        //Counts total passengers on the bus to determin if the buss is empty
        Passenger.TotalPassengers = 0;

        //Variable for loops
        int Counter = 0;

        do
        {
            //Adds 25 passengers with a loop
            for (int i = 0; i < Passenger.Age.Length; i++)
            {
                Console.Clear();
                Logo();
                Console.WriteLine("\nEnter Age for passenger {0}", Counter + 1);
                Counter++;

                try
                {
                    Passenger.Age[i] = Convert.ToInt32(Console.ReadLine());
                }
                catch
                {
                    Console.WriteLine("Did you enter a number?\n");
                    Console.WriteLine("Press any key to try again...");
                    Counter--;
                    Console.ReadKey();
                    break;
                }
                //Checks if user enters a valid age
                if (Passenger.Age[i] < 0 || Passenger.Age[i] > 130)
                {
                    Console.WriteLine("Try a different age");
                }
                Console.WriteLine("\nEnter Gender for passenger {0}", Counter);
                Console.WriteLine("1) Male");
                Console.WriteLine("2) Female");
                Console.WriteLine("3) Other");

                //Using a temp variable to run switch for selecting gender
                int temp = 0;

                try
                {
                    temp = Convert.ToInt32(Console.ReadLine());
                    Console.Clear();
                    Passenger.TotalPassengers++;
                }
                catch
                {
                    Console.Clear();
                    Logo();
                    Console.WriteLine("\nNot a valid choice");
                }

                switch (temp)
                {
                    case 1:
                        Passenger.Gender[i] = "Male";
                        break;
                    case 2:
                        Passenger.Gender[i] = "Female";
                        break;
                    case 3:
                        Passenger.Gender[i] = "Other";
                        break;
                    default:
                        Console.WriteLine("Did you enter a number?\n");
                        Console.WriteLine("Press any key to try again...");
                        Console.ReadKey();
                        Counter--;
                        break;
                }
            }

        } while (Counter < 25);

This is not suppose to happen

这不应该发生

2 个答案:

答案 0 :(得分:2)

在您的问题范围内,您可以执行以下类似操作(请注意,这尚未运行,但很快就收到了评论)

void AddPassenger()
    {
        //Counts total passengers on the bus to determin if the buss is empty
        Passenger.TotalPassengers = 0;

        //Variable for loops
        int Counter = 0;

        do
        {
            //Adds 25 passengers with a loop
            for (int i = 0; i < Passenger.Age.Length; i++)
            {
                // ensure we're not leaving the scope of the `while`
                if(Counter >= 25)
                    break;
                Console.Clear();
                Logo();
                Console.WriteLine("\nEnter Age for passenger {0}", Counter + 1);
                
                try
                {
                    Passenger.Age[i] = Convert.ToInt32(Console.ReadLine());
                }
                catch
                {
                    Console.WriteLine("Did you enter a number?\n");
                    Console.WriteLine("Press any key to try again...");
                    Console.ReadKey();
                    break;
                }
                
                //Checks if user enters a valid age
                if (Passenger.Age[i] < 0 || Passenger.Age[i] > 130)
                {
                    Console.WriteLine("Try a different age");
                    break; // you needed to break here I assume
                }
                Console.WriteLine("\nEnter Gender for passenger {0}", Counter);
                Console.WriteLine("1) Male");
                Console.WriteLine("2) Female");
                Console.WriteLine("3) Other");

                //Using a temp variable to run switch for selecting gender
                int temp = 0;

                try
                {
                    temp = Convert.ToInt32(Console.ReadLine());
                    Console.Clear();
                    Passenger.TotalPassengers++;
                }
                catch
                {
                    Console.Clear();
                    Logo();
                    Console.WriteLine("\nNot a valid choice");
                    break; // you needed to break here I assume
                }

                switch (temp)
                {
                    case 1:
                        Passenger.Gender[i] = "Male";
                        break;
                    case 2:
                        Passenger.Gender[i] = "Female";
                        break;
                    case 3:
                        Passenger.Gender[i] = "Other";
                        break;
                    default:
                        Console.WriteLine("Did you enter a number?\n");
                        Console.WriteLine("Press any key to try again...");
                        Console.ReadKey();
                        break;
                }
                Counter++; //move counter to here to only increment at the end if successful
            }

        } while (Counter < 25);

但是,我要么更改 Passenger 的名称,要么更改模型本身,因为尚不清楚为什么 Passenger 有一个年龄或性别数组。当然,每个乘客都应该是拥有这些字段的自己的实体,不是吗?

类似于:

public Bus
{
    public Passenger[] Passengers { get; set; }
    public int TotalPassengers { get; set; }
}

public Passenger
{
    public int Age { get; set; }
    public string Gender { get; set; }
}

应该重新考虑 while 中的 for 循环。以这种方式嵌套循环没有意义。

答案 1 :(得分:1)

这里有 2 个循环,一个 for 循环和一个 do-while 循环。 for 循环仅在 i 达到数组的限制时停止,而 do-while 循环仅在 Counter 达到 25 时停止。

您提到即使存储了 25 个变量,循环仍会继续。这是因为每次有无效输入时,for 循环都会从 0 重新开始。将 int i = 0 换成 int i = Counter,这样,它会从停止的地方继续。

另外:

您不需要 2 个循环,特别是 for 循环。您可以删除它,然后将所有提及的 i 替换为 Counterbreakcontinue 相同。 (结合@Tubs 的回答)在这种情况下您也不需要 if(Counter >= 25) break;。这样做有效地合并了 2 个循环,而不是具有相同功能的 2 个循环。

Console.WriteLine("\nEnter Gender for passenger {0}", Counter); 不会将 1 添加到 Counter,这将导致 Enter Gender for passenger 0

扩展@Tubs 的回答: 此外, Counter 仅在所有 break 之后递增,这意味着它无法访问。您必须转移到每个成功案例(1、2 和 3)。 生成的代码是:

        void AddPassenger()
    {
        //Counts total passengers on the bus to determin if the buss is empty
        Passenger.TotalPassengers = 0;

        //Variable for loops
        int Counter = 0;

        //Adds 25 passengers with a loop
        do
        {
            Console.Clear();
            Logo();
            Console.WriteLine("\nEnter Age for passenger {0}", Counter + 1);

            try
            {
                Passenger.Age[i] = Convert.ToInt32(Console.ReadLine());
            }
            catch
            {
                Console.WriteLine("Did you enter a number?\n");
                Console.WriteLine("Press any key to try again...");
                Console.ReadKey();
                continue;
                // Continue while loop instead of breaking it
            }
            //Checks if user enters a valid age
            if (Passenger.Age[i] < 0 || Passenger.Age[i] > 130)
            {
                Console.WriteLine("Try a different age");
                continue;
                // Continue while loop instead of breaking it
            }
            Console.WriteLine("\nEnter Gender for passenger {0}", Counter + 1);
            Console.WriteLine("1) Male");
            Console.WriteLine("2) Female");
            Console.WriteLine("3) Other");

            //Using a temp variable to run switch for selecting gender
            int temp = 0;

            try
            {
                temp = Convert.ToInt32(Console.ReadLine());
                Console.Clear();
                Passenger.TotalPassengers++;
            }
            catch
            {
                Console.Clear();
                Logo();
                Console.WriteLine("\nNot a valid choice");
                continue;
                // Continue while loop instead of breaking it
            }

            switch (temp)
            {
                case 1:
                    Passenger.Gender[i] = "Male";
                    // Increment after success
                    Counter++;
                    continue;
                    // Continue while loop instead of breaking it
                case 2:
                    Passenger.Gender[i] = "Female";
                    // Increment after success
                    Counter++;
                    continue;
                    // Continue while loop instead of breaking it
                case 3:
                    Passenger.Gender[i] = "Other";
                    // Increment after success
                    Counter++;
                    continue;
                    // Continue while loop instead of breaking it
                default:
                    Console.WriteLine("Did you enter a number?\n");
                    Console.WriteLine("Press any key to try again...");
                    Console.ReadKey();
                    continue;
                    // Continue while loop instead of breaking it
            }

        } while (Counter < 25);