【问题标题】:How to repeat code if invalid data is entered如果输入无效数据如何重复代码
【发布时间】:2018-08-29 05:36:10
【问题描述】:

我需要让这个计算停车费的代码出错,如果提供了错误的数字,我会要求用户重新输入数据。例如,如果用户输入的金额小于 1 或大于 24,则会出现错误代码并要求用户重新输入有效金额。输入有效金额后,我希望它输出 parkFee。 我还没有更新我的伪代码,对此深表歉意。

    /* PSEUDOCODE */
    /* HOURLY_RATE=2.5
     * INPUT parkTime
     * parkFee = HOURLY_RATE * hours
     * OUTPUT parkFee */


        decimal parkTime;  // input - time in hour eg 1.5 for 1 and a half hours 
        const decimal HOURLY_RATE = 2.50m; // HOURLY_RATE * INPUT parkTime = parkFee
        const decimal MAX_FEE = 20.00m; // MAX_FEE is set as a payment cap and ignores any extra charges incurred over 8 hours
        decimal parkFee;
        Console.WriteLine("ParkingFee1 program developed by: Ryley Copeman");
        Console.WriteLine("Please enter your total time parked in hours: Eg 1.5 or 3.0");
        parkTime = decimal.Parse(Console.ReadLine());

        if (parkTime > 8)
        {
            Console.Write("Total fee is $" + MAX_FEE);
        }
        else
        {
            parkFee = Math.Ceiling(parkTime) * HOURLY_RATE;
            Console.Write("Parking Fee = $" + parkFee);
        }
        while(parkTime < 0 || parkTime > 24)    // validate... 
        //while (parkTime <= 0) )
        {
        Console.WriteLine("Error – Park Time out of range");
        Console.WriteLine("Enter - Park Time between 0 and 24 (HOURS):");
        parkTime = int.Parse(Console.ReadLine());

    }

    }
}

}

【问题讨论】:

  • 欢迎来到Stack Overflow :-) 根据tagging,我冒昧地从您的问题标题中删除了您的标签。

标签: c# repeat


【解决方案1】:

我想你只需要这个:

do
{
    Console.WriteLine("Please enter your total time parked in hours: Eg 1.5 or 3.0");
    parkTime = decimal.Parse(Console.ReadLine());

    if (parkTime < 1 || parkTime > 24)
    {
        Console.WriteLine("Error – Park Time out of range");
    }
}
while (parkTime < 1 || parkTime > 24);

if (parkTime > 8)
{
    Console.Write("Total fee is $" + MAX_FEE);
}
else
{
     parkFee = Math.Ceiling(parkTime) * HOURLY_RATE;
     Console.Write("Parking Fee = $" + parkFee);
 }

请注意,您可能需要调整代码以始终计算费用,然后应用最大值:

parkFee = Math.Min(MAX_FEE, Math.Ceiling(parkTime) * HOURLY_RATE);
Console.Write("Parking Fee = $" + parkFee);

这里Math.Min 将选择两个值中的最小值。

最后,请注意decimal.Parse 如果您输入了它不期望的内容(例如“1.2Hello”或“”)会出错,因此使用TryParse 可能会更好:

bool isValidTime = false;
do
{
    Console.WriteLine("Please enter your total time parked in hours: Eg 1.5 or 3.0");
    bool parsedOK = decimal.TryParse(Console.ReadLine(), out parkTime);
    isValidTime = parsedOK && parkTime >= 1 && parkTime <= 24;
    if (!isValidTime)
    {
        Console.WriteLine("Error – Park Time out of range");
    }
}
while (!isValidTime);

parkFee = Math.Min(MAX_FEE, Math.Ceiling(parkTime) * HOURLY_RATE);
Console.Write("Parking Fee = $" + parkFee);

这里循环将继续,直到输入有效值。请注意,在循环结构中,您还可以使用break;(离开循环)和continue;(移动到循环的下一个迭代)来控制流程。

【讨论】:

  • 非常感谢约翰的帮助。非常感谢!
  • 不客气 :) 如果您满意,请随时接受我的回答。
  • 嘿约翰 - 我有一个简单的问题。比方说 - 我输入了一个无效的数字并收到“停车时间超出范围”错误。然后我输入一个有效的数字,例如16 小时。如何让它输出正确答案(parkFee)。
  • 使用上面的第二个例子,一旦你输入了正确的时间,它应该退出循环,然后下面的代码将输出费用。
  • @RyC 我创建了一个使用队列来模拟用户输入的示例(因为 dotnetfiddle 不是交互式的):dotnetfiddle.net/myvchj
【解决方案2】:

正如您已经了解循环的概念,有几种可能性,最简单的一种是带有break 的循环。

for (;;) {
  // input
  if (condition ok)
    break;
  // output "wrong, try again"
}

这将根据需要重复输入,并在输入可接受的值后退出循环。

【讨论】:

    【解决方案3】:
    Console.WriteLine("ParkingFee1 program developed by: Ryley Copeman");
    Console.WriteLine("Please enter your total time parked in hours: Eg 1.5 or 3.0");
    parkTime = decimal.Parse(Console.ReadLine());
    do
    {
        if(parkTime < 1 || parkTime > 24)
        {
            Console.WriteLine("Error – Park Time out of range");
            Console.WriteLine("Enter - Park Time between 0 and 24 (HOURS):");
            parkTime = decimal.Parse(Console.ReadLine());
            continue;
        }
        if (parkTime > 8)
        {
            Console.Write("Total fee is $" + MAX_FEE);
        }
        else
        {
            parkFee = Math.Ceiling(parkTime) * HOURLY_RATE;
            Console.Write("Parking Fee = $" + parkFee);
        }
    } while(parkTime < 1 || parkTime > 24);
    

    【讨论】:

      【解决方案4】:
       /* PSEUDOCODE */
          /* HOURLY_RATE=2.5
           * INPUT parkTime
           * parkFee = HOURLY_RATE * hours
           * OUTPUT parkFee */
      
              bool mustRepeat = true;
              decimal parkTime = 0;  // input - time in hour eg 1.5 for 1 and a half hours 
              const decimal HOURLY_RATE = 2.50m; // HOURLY_RATE * INPUT parkTime = parkFee
              const decimal MAX_FEE = 20.00m; // MAX_FEE is set as a payment cap and ignores any extra charges incurred over 8 hours
              decimal parkFee;
              Console.WriteLine("ParkingFee1 program developed by: Ryley Copeman");
              Console.WriteLine("Please enter your total time parked in hours: Eg 1.5 or 3.0");
      
              while(mustRepeat)    // validate... 
              {
                  parkTime = decimal.Parse(Console.ReadLine());
      
                  if(parkTime < 1 || parkTime > 24)
                  {       
                      Console.WriteLine("Error – Park Time out of range");
                      Console.WriteLine("Enter - Park Time between 0 and 24 (HOURS):");
                      continue;
                  }
      
                  mustRepeat = false;
      
                  if (parkTime > 8)
                  {
                      Console.Write("Total fee is $" + MAX_FEE);
                      break;
                  }
                  else
                  {
                      parkFee = Math.Ceiling(parkTime) * HOURLY_RATE;
                      Console.Write("Parking Fee = $" + parkFee);
                      break;
                  }
              }
          }
      }
      

      【讨论】:

      • 我可以看到你在做什么,但最后三个 "Console.WriteLine("Error- Park Time out of Range"); 给出一个错误,说它无法访问。
      • 我没有发现任何问题,它工作正常。只是 parkTime 应该检查
      猜你喜欢
      • 2020-09-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2020-06-07
      • 2016-06-05
      相关资源
      最近更新 更多