Как сделать пока l oop для каждого пользовательского ввода? - PullRequest
0 голосов
/ 12 апреля 2020

Не могу понять, как заставить l oop работать непрерывно для каждого входа. Спасибо за любую помощь:)

Не уверен, если время (true) необходимо или нет, я все еще новичок во всем этом: D

private static void AddToStock()
    {
        //Confirm item id is greater than 0
        int itemid = ReadInteger("\nItem ID:");
        string itemname = ReadString("Item Name:");
        int itemquantity = ReadInteger("Quantity:");
        double itemprice = ReadDouble("Price Paid:");
        DateTime itemdate = ReadDate("Date Added:");

        while (true)
            {
            if (itemid <= 0)
            {
                Console.WriteLine("Item ID Cannot Be Less Than 1, Please Try Again");
                itemid = ReadInteger("Item ID:");
                break;
            }

            //Confirm item quantity is greater than 0
            if (itemquantity <= 0)
            {
                Console.WriteLine("Quantity Cannot Be Less Than 1, Please Try Again");
                itemquantity = ReadInteger("Quantity:");
                break;
            }

            //Confirm item price is greater than 0.01
            if (itemprice < 0.01)
            {
                Console.WriteLine("Item Price Cannot Be Less Than 0, Please Try Again");
                itemprice = ReadDouble("Item Price:");
                break;
            }
        }

        //Add item to stock
        Employee_UI.AddToStock(itemid, itemname, itemprice, itemquantity, itemdate);
        Console.WriteLine("\nItem Added To Stock!");
    }

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Я бы разделил для каждого значения, которое вы хотите проверить индивидуально:

            int itemid = ReadInteger("\nItem ID:");
            string itemname = ReadString("Item Name:");
            int itemquantity = ReadInteger("Quantity:");
            double itemprice = ReadDouble("Price Paid:");
            DateTime itemdate = ReadDate("Date Added:");

            while (itemid <= 0)
            {
                Console.WriteLine("Item ID Cannot Be Less Than 1, Please Try Again");
                itemid = ReadInteger("Item ID:");
            }
            //Confirm item quantity is greater than 0
            while (itemquantity <= 0)
            {
                Console.WriteLine("Quantity Cannot Be Less Than 1, Please Try Again");
                itemquantity = ReadInteger("Quantity:");
            }

            //Confirm item price is greater than 0.01
            while (itemprice < 0.01)
            {
                Console.WriteLine("Item Price Cannot Be Less Than 0, Please Try Again");
                itemprice = ReadDouble("Item Price:");
            }
            //Add item to stock
            Employee_UI.AddToStock(itemid, itemname, itemprice, itemquantity, itemdate);
            Console.WriteLine("\nItem Added To Stock!");

РЕДАКТИРОВАТЬ

Обычно не рекомендуется иметь некоторое время (true) l oop, и разрыв внутри до конечного sh этого, лучше иметь oop с условием, а внутри l oop способ выполнить sh это условие и завершить l oop .

0 голосов
/ 13 апреля 2020

Если вы хотите, чтобы каждый вход равнялся l oop, пока не будет выполнено определенное требование, вам потребуется более одного l oop.

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

Если вы не знакомы с рекурсивными методами, это в основном метод, который вызывает себя внутри метода. Используя умные параметры, вы можете использовать рекурсивный метод как al oop. Например, простой рекурсивный метод

void loop(int index) {

   if(index == 10) { //recursive methods needs a terminating condition or else it would loop forever
       return;   //End loop
   } 
   System.out.println(index);
   loop(index++); //note that the method is called inside itself here
}

путем вызова loop(1) будут напечатаны числа от 1 до 9.

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

Инициализация нерекурсивного метода

private static void AddToStock() 
{
   int itemid = ReadInteger("\nItem ID:");
   string itemname = ReadString("Item Name:");
   int itemquantity = ReadInteger("Quantity:");
   double itemprice = ReadDouble("Price Paid:");
   DateTime itemdate = ReadDate("Date Added:");

   AddToStockLoop(itemid, itemquantity, itemprice); //start the recursive loop with the initial values of the three parameters
}

и рекурсивный метод цикла

private static void AddToStockLoop(int itemid, int itemquantity, double itemprice) 
{

   if (itemid <= 0)
   {
      Console.WriteLine("Item ID Cannot Be Less Than 1, Please Try Again");
      itemid = ReadInteger("Item ID:");
      AddToStockLoop(itemid, itemquantity, itemprice); //Recursive call now with a new value of the paramter itemid
   }

   if (itemquantity <= 0)
   {
      Console.WriteLine("Quantity Cannot Be Less Than 1, Please Try Again");
      itemquantity = ReadInteger("Quantity:");
      AddToStockLoop(itemid, itemquantity, itemprice); //Recursive call now with a new value of the paramter itemquantity     
   }

   if (itemprice < 0.01)
   {
      Console.WriteLine("Item Price Cannot Be Less Than 0, Please Try Again");
      itemprice = ReadDouble("Item Price:");
      AddToStockLoop(itemid, itemquantity, itemprice); //Recursive call now with a new value of the paramter itemprice
   }
}

Написание рекурсивных методов для небольших и простых программ не обязательно полезно, но они могут быть очень мощными для более сложных программ, где полезно обратное отслеживание.

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