Проблемы ввода при использовании цикла do-while - PullRequest
0 голосов
/ 14 июля 2020

Всякий раз, когда ввод выходит за пределы диапазона 1-4, предполагается, что он будет выдавать недопустимый текст ввода и запрашивать другой ввод, однако, когда вы вводите другой ввод, ошибка программы прекращается. Я не уверен, что ошибаюсь. Я использую C#, и это задание требует, чтобы я использовал do while l oop для этого раздела.

static void Main(string[] args)
{
  Write("Enter a salespersons name: ");
  string salesPerson = ReadLine();

  int intItem;
  int intQuantity;
  double item1 = 239.99;
  double item2 = 129.75;
  double item3 = 99.95;
  double item4 = 350.89;
  double dblItemSales;
  double dblTotalSales;

  do
  {
    Write("Enter an item number between 1 and 4 or -1 to quit: ");
    intItem = Convert.ToInt32(ReadLine());

    if ( intItem < 1 || intItem > 4 )
    {
      WriteLine("Invalid Entry");
      Write("Enter an item number between 1 and 4 or -1 to quit: ");
      intItem = Convert.ToInt32(ReadLine());
    }
    else if ( intItem == -1 )
    {
      WriteLine("Salesperson " + salesPerson + " sold a total of ");
      break;
    }
    else
      Write("Enter the quantity sold: ");

    intQuantity = Convert.ToInt32(ReadLine());
  } 
  while ( intItem != -1 );

  WriteLine("Press Enter to Continue.");
  ReadLine();
}

Ответы [ 4 ]

0 голосов
/ 14 июля 2020

Если вы не хотите менять текущий код. Краткое исправление:

  1. Переместите эту intQuantity = Convert.ToInt32(Console.ReadLine()); строку внутри оператора else.
  2. Удалите эти коды внутри оператора if:
    Write("Enter an item number between 1 and 4 or -1 to quit: ");
    intItem = Convert.ToInt32(ReadLine());

Должно получиться так:

    do
    {
        Console.Write("Enter an item number between 1 and 4 or -1 to quit:");
        intItem = Convert.ToInt32(Console.ReadLine());

        if (intItem< 1 || intItem> 4)
        {
            Console.WriteLine("Invalid Entry");
        }
        else if (intItem == -1)
        {
            Console.WriteLine("Salesperson " + salesPerson + " sold a total of ");
            break;
        }
        else 
        {
            Console.Write("Enter the quantity sold: ");
            intQuantity = Convert.ToInt32(Console.ReadLine());
        }
                

    }
    while (intItem != -1);

    Console.WriteLine("Press Enter to Continue.");
    Console.ReadLine();
0 голосов
/ 14 июля 2020

Начиная с -1 < 1, это самая первая ветка

 if ( intItem < 1 || intItem > 4 )  // true when intItem == -1 
 {
     ...
 }
 else if ( intItem == -1 )         // this branch will never be executed  

, которая запускается. Скажем так:

 while (true) { // keep looping until explicit quit
   Write("Enter an item number between 1 and 4 or -1 to quit: ");

   if (!int.TryParse(ReadLine(), out var intItem)) // what if user put "bla-bla-bla"? 
     Write("Syntax error. Integer 1..4 expected");
   else if (intItem == -1) {                       // quit
     WriteLine("Salesperson " + salesPerson + " sold a total of ");
     break; 
   } 
   else if (intItem < 1 || intItem > 4) {         // invalid range 
     WriteLine("Invalid Entry");
     Write("Enter an item number between 1 and 4 or -1 to quit:");
   }
   else {                                         // main routine 
     // intItem is integer in 1..4 range
     Write("Enter the quantity sold: ");

     //TODO: put relevant code here  
   }
 } 
0 голосов
/ 14 июля 2020
    static void Main(string[] args)
    {
        Write("Enter a salespersons name: ");
        string salesPerson = ReadLine();

        int intItem;
        int intQuantity;
        double item1 = 239.99;
        double item2 = 129.75;
        double item3 = 99.95;
        double item4 = 350.89;
        double dblItemSales;
        double dblTotalSales;

        do
        {
            Write("Enter an item number between 1 and 4 or -1 to quit: ");
            if (Int32.TryParse(ReadLine(), out intItem))
            {
                if (intItem == -1)
                {
                    WriteLine("Salesperson " + salesPerson + " sold a total of ");
                    break;
                }
                else if (intItem < 1 || intItem > 4)
                {
                    WriteLine("Invalid Entry");
                }
                else
                {
                    Write("Enter the quantity sold: ");
                    if (!Int32.TryParse(ReadLine(), out intQuantity))
                    {
                        intQuantity = 0; // or whatever
                    }
                }
            }
        }
        while (intItem != -1);

        WriteLine("Press Enter to Continue.");
        ReadLine();
    }
0 голосов
/ 14 июля 2020

Вы можете попробовать такую ​​вещь, в зависимости от того, что вы хотите делать с введенными количествами, поэтому я помещаю что-то для образца:

bool isValid;
do
{
  Console.Write("Enter an item number between 1 and 4 or -1 to end: ");
  int.TryParse(Console.ReadLine(), out intItem);
  if ( intItem == -1 ) break;
  if ( intItem < 1 || intItem > 4 )
  {
    Console.WriteLine("Invalid entry: try again, please.");
    continue;
  }
  dblItemSales++;
  do
  {
    Console.Write("Enter the quantity sold: ");
    isValid = int.TryParse(Console.ReadLine(), out intQuantity) && intQuantity >= 0;
    if ( !isValid )
      Console.WriteLine("Invalid entry: try again, please.");
  }
  while ( !isValid );
  dblTotalSales += intQuantity;
}
while ( true );

Console.WriteLine($"Sales person {salesPerson} sold a total of {dblTotalSales}" +
                  $" for {dblItemSales} items");

Console.WriteLine("Press Enter to Continue.");

Мы используем TryParse, чтобы убедиться, что в противном случае введено число равно 0, и метод возвращается false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...