【问题标题】:for loop with counter not working after adding input添加输入后,带有计数器的for循环不起作用
【发布时间】:2021-08-23 04:46:47
【问题描述】:

我有这个基于 C# 面向对象编程的计数器程序和 计数器有一个增量方法,它从 0..1...2.. 增加到 30。

for 循环工作得非常好,但后来我决定添加一个包含两个方法的类,这些方法可以以奇数步数或偶数步数进行计数,这些方法也可以正常工作。唯一的问题是,在更改主类之后,它在 30 之前不再循环工作,所以我必须单独输入每个步骤。

这是我的主要代码(我很确定问题是由于Console.ReadLine 和一般输入,但我不知道究竟是什么问题)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Counter
{
    class Program
    {
        static void Main(string[] args)
        {
            char confirm;
            int input;

            do
            {
                //int inNum;
                Console.Clear();
                ModusCounter b = new ModusCounter(0, 30);

                for (; ; )
                {
                    b.Display(19, 7);
                    Console.Write("do you want (1)odd // (2) even // (0)standard ? ");
                    
                    input = Convert.ToInt32(Console.ReadLine());
                    if (input == 1)
                    {
                        b.OddCount();
                    }
                    else if (input == 2)
                    {
                        b.EvenCount();
                    }
                    else
                        b.Increment();

                    System.Threading.Thread.Sleep(300);
                    if (Console.KeyAvailable) break;
                }

               //b.Increment();
                b.Display(19, 7);

                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine("do you want to restart? (J // N) ");
                confirm = Convert.ToChar(Console.ReadLine());
            }
            while (confirm == 'J');

            Console.ReadLine();
        }
    }
}

模式计数器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Counter
{
    public class ModusCounter:CCounter
    {
        private int wholenum;

        public int Wholenum
        {
            get => wholenum;
            set
            {
                wholenum = value;
            }
        }

        public ModusCounter(int start, int limit) : base(start, limit)
        { }

        public void EvenCount() //2
        {
            Wholenum = 2;
            Level += Wholenum;
            if (Level % 2 == 0)
            {
                Level += Wholenum - 2; 
            }
            else
            {
                Level += Wholenum -1;
            }
            if (Level > Limit)
                Level = Start;
        }

        public void OddCount() //1
        {
            Wholenum = 1;
            Level += Wholenum;
            if (Level % 2 == 0)
            {
                Level += Wholenum;
            }
            else
            {
                Level += Wholenum + 1;
            }
            if (Level > Limit)
            Level = Start;
        }
    }
}

基类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Counter
{
    public class CCounter
    {

        private int start;
        private int limit;
        private int level;

        public int Start
        {
            get => start;
            protected set
            {
                start = value;
            }
        }

        public int Limit
        {
            get => limit;
            protected set
            {
                limit = value;
            }
        }

        public int Level
        {
            get => level;
            protected set
            {
                if (value < Start)
                    level = Start;
                else if (value > Limit)
                    Level = Limit;
                else
                    level = value;
            }
        }

        public CCounter(int start_, int limit_)
        {
            Start = start_;
            Limit = limit_;
            Level = Start;
        }

        public void Increment()
        {
            int level = Level + 1;
            if (level > Limit9
                Level = Start;
            else
                Level = level;
        }

        public void Display(int x_, int y_)
        {
            Console.SetCursorPosition(x_, y_);
            Console.Write(Level.ToString("00"));
        }
    }
}

【问题讨论】:

    标签: c# loops for-loop counter


    【解决方案1】:

    首先,欢迎来到 S/O。希望您在明显的学习曲线进入开发过程中获得良好的信息。有几件事可以简化,但这会随着学习而来,所以我不会猛烈抨击,但随着时间的推移,你会看到你的技能会提高。

    首先,您的for(;;) 循环。这本身就导致了无限循环。用于获取输入的控制台读取行始终在等待提示中的下一个选项,要求输入奇数、偶数或标准,因此它会不断循环。

    我认为您的 Console.KeyAvailable 不会真正被触发以跳出 for 循环以使您进入下一个提示,即允许用户重试 J/N 选项。你有 console.ReadLine 读取整个缓冲区,直到你按下回车键。到那时,您正在增加您的周期,显示结果并从您的 Thread.Sleep(300) 调用中延迟 300 毫秒,其中您可能没有在短时间内单击一个键来中断循环。现在,如果您更改了Thread.Sleep(2000),您将在显示后给用户 2 秒(1 秒 = 1000 毫秒)来按任意键来中断循环。

    我要给你的下一个项目/问题。你增加你似乎对这个功能没问题,但是你想打破什么/为什么。什么时候达到极限?如果是这样,则在增量过程完成后进行测试,例如(在 Thread.Sleep 调用之前)

                if (b.Level >= b.Limit)
                    break;
    

    进入你的CCounter 类并查看它的Increment 方法。您可以检查本地“级别”变量是否大于设置 level = START 值的限制。这是有意的,还是无意的。此外,使用与类中的属性同名的新 int 值(int 级别与属性级别)不是一个好的做法,并且会增加混乱。

    public void Increment()
    {
        int level = Level + 1;
        if (level > Limit)
            Level = Start;
        else
            Level = level;
    }
    

    您似乎正在尝试使用局部临时变量,但这不是必需的。只需稍作改动就可以轻松完成,如下所示。

    public void Increment()
    {
        if (Level +1 > Limit)
            Level = Start;
        else
            Level = Level +1;
    }
    

    因为我没有为“Level”公共属性分配值,所以它本质上是在与 LIMIT 属性进行比较之前执行 +1。我只在 ELSE 条件下赋值。

    此外,添加到变量或减去的快捷方式可以被视为

    Level++
    

    Level--
    

    希望这有助于让您更清楚地了解您想要解决的问题,并帮助您进一步发展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 2015-01-01
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      相关资源
      最近更新 更多