【问题标题】:Range in for loop using Array使用数组的for循环范围
【发布时间】:2021-01-24 11:01:24
【问题描述】:

我是 C# 的新手,希望用户能够写 1 到 25 之间的 5 个数字。我遇到的问题是我不希望用户输入超过 25 或小于 1 的数字。

这也是我的学习任务,我的老师希望我们使用数组,所以我不能使用 List。

        int[] usernum = new int[4];

        for (int i = 0; i < usernum.Length; i++)
        {
            usernum[i] = Convert.ToInt32(Console.ReadLine());
        }

【问题讨论】:

  • 欢迎使用 StackOverflow,如果您希望您的用户不能输入低于 1 或高于 25 的数字,您需要检查一下。
  • 如果你想要 5 个值,你的数组长度应该是 5,而不是 4。
  • 我建议您先查看 If 语句 docs.microsoft.com/en-us/dotnet/csharp/language-reference/… 并尝试了解如何自己解决问题,而不是寻求帮助。
  • 另外,不要使用Convert.ToInt32,使用int.TryParse

标签: c# arrays for-loop numbers integer


【解决方案1】:

好的,首先,对您的代码进行一些注释:

int[] usernum = new int[4]; // should be: new int[5];

for (int i = 0; i < usernum.Length; i++)
{
    usernum[i] = Convert.ToInt32(Console.ReadLine()); // use int.TryParse instead
}

现在,我不想只给你代码,因为这显然应该是一种学习体验。

您需要,不过是集成一个“验证”循环。这意味着:

  1. 从用户处读取字符串
  2. 尝试将字符串解析为数字
    如果失败:返回 1。
  3. 检查if号码25
    如果是这样:回到 1。
  4. 如果您在这里,您通过了两项检查并且可以 设置 usernum[i] = number
  5. 下一个“i”

显然,在你如何扭转和转动你的支票和安排同样有效的循环方面存在一些细微的变化。

例如:您可以决定是否要检查数字是否在 inside 边界或是否要检查数字是否在 outside 边界并跳转或不跳转相应地...


为什么是int.TryParse 而不是Convert.ToInt32

有一些经验法则可以使您免于严重头痛:

  • “从不相信用户输入”
  • “不要对控制流使用异常”

在此处使用 Convert 会破坏两者。

首先,如果字符串不表示整数值(除 +-0..9 以外的字符,值 > int.Max 或

然后,它抛出意味着:用户(可能只是打错字)没有提供有效输入的情况正在控制您的错误处理流程。但这种情况根本不是“例外”。事实上,您应该期待它。 int.TryParse 使这成为可能,因为它返回一个标志(布尔值),通知您转换尝试的成功或失败(而不是抛出)。

【讨论】:

  • 谢谢伙计。我会试试这个,看看我能不能弄明白。
【解决方案2】:

虽然我建议你先学习 if else loop https://www.w3schools.com/cs/cs_conditions.asp

如果需要,这里是代码

int[] usernum = new int[4];
        for (int i = 0; i < usernum.Length; i++)
        {
            var result = Console.ReadLine();
            int currentResult;
            if (!int.TryParse(result, out currentResult))
            {
                Console.WriteLine("Invalid input - must be a valid integer value");
                i--;
                continue;
            }
            if(currentResult < 1 || currentResult > 25)
            {
                Console.WriteLine("Invalid input - must be between 1 & 25");
                i--;
                continue;
            }
            usernum[i] = currentResult;
        }

【讨论】:

  • 感谢传奇。这很有帮助,我知道 if/else 是如何工作的。我不太了解你给我的所有代码,所以我将有一些学习要做。
【解决方案3】:

for-loop 可能不是您需要有条件地增加索引的用例的理想解决方案。

这应该可以解决问题:

int[] userNumbers = new int[5];

int i = 0;

while (i < userNumbers.Length)
{
    string rawInput = Console.ReadLine();
    
    bool isNumberValid = int.TryParse(rawInput, out int inputNumber); // as suggested by @Fildor
    
    if(isNumberValid && inputNumber >= 1 && inputNumber <= 25) // increment counter only if 1 <= input <= 25
    {
        userNumbers[i] = inputNumber;
        i++;
    }
}

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多