Как повторить код, если введены неверные данные - PullRequest
0 голосов
/ 29 августа 2018

Мне нужно, чтобы этот код, который вычисляет плату за парковку, выдавал ошибку и просил пользователя повторно ввести данные, если указано ложное число. Например, если пользователь вводит сумму, которая меньше 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());

    }

    }
}

}

Ответы [ 4 ]

0 голосов
/ 29 августа 2018
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);
0 голосов
/ 29 августа 2018
 /* 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;
            }
        }
    }
}
0 голосов
/ 29 августа 2018

Я думаю, вам просто нужно это:

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; (перейти к следующей итерации цикла) для управления потоком.

0 голосов
/ 29 августа 2018

Как вы уже знаете о концепции циклов, есть несколько возможностей, самый простой - цикл с break.

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

Это будет повторять ввод столько раз, сколько необходимо, и выходить из цикла после ввода допустимых значений.

...