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

如何解决如果满足 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

这不应该发生

解决方法

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

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 循环。以这种方式嵌套循环没有意义。

,

这里有 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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-