如果输入无效数据如何重复代码

How to repeat code if invalid data is entered

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

    /* 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());

    }

    }
}

}

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

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

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

 /* 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;
            }
        }
    }
}

我想你只需要这个:

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;(移动到循环的下一次迭代)来控制流程。

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);