Я пытаюсь закончить этот код для этого меню и не могу понять, почему он не будет зацикливаться правильно?

#java #loops #while-loop

#java #циклы #цикл while

Вопрос:

У меня есть этот код, который я делаю, и я ни за что на свете не могу понять, почему он неправильно зацикливается и добавляет количество продуктов вместе. кажется, что он считывает только первый оператор в цикле while и это все данные, которые он извлекает. Мне нужно, чтобы он также не возвращался к первому оператору while, а продолжал с той же фразой «Пожалуйста, введите другой пункт из меню выше: » любая помощь приветствуется, спасибо, ребята.

 import java.util.Scanner;
public static void main(String[] args) {        //Declare Variables

    Scanner input = new Scanner(System.in);
    int nProduct = 0;           //Stores the value entered by the user
    int nPrice = 0;             //Stores sum of values entered
    int nCount = 0;
    int nSum = 0;
    double dTax = 0.0;
    double dTotal = 0.0;

    final int SENTINEL = 10; //Used to end loop
    final double TAX = .065;


    System.out.print("Please enter the your name: ");
        String sName = input.nextLine( );

    System.out.println("");

    System.out.println("BEST PURCHASE PRODUCTS: ");
    System.out.println("1. Smartphone          $249");
    System.out.println("2. Smartphone Case     $39");
    System.out.println("3. PC Laptop           $1149");
    System.out.println("4. Tablet              $349");
    System.out.println("5. Tablet Case         $49");
    System.out.println("6. eReader             $119");
    System.out.println("7. PC Desktop          $889");
    System.out.println("8. LED Monitor         $299");
    System.out.println("9. Laser Printer       $399");
    System.out.println("10.Complete my order");

    while (nProduct != SENTINEL) {
        nSum = nPrice   nSum;
        nCount  ; 
        System.out.print("Please enter item from the menu above: ");
        nProduct = input.nextInt();

        if (nProduct == 1) {
            nPrice  = 249;
            System.out.print("Please enter another item from the menu above: ");
            nProduct = input.nextInt();
        }

        else if (nProduct == 2) {
            nPrice  = 39;
            System.out.print("Please enter another item from the menu above: ");
            nProduct = input.nextInt();
        }

        else if (nProduct == 3 ) {
            nPrice  = 1149; 
            System.out.print("Please enter another item from the menu above: ");
            nProduct = input.nextInt();
        }

        else if (nProduct == 4 ) {
              nPrice  = 349;
              System.out.print("Please enter another item from the menu above: ");
            nProduct = input.nextInt();
        }

        else if (nProduct == 5 ) {
            nPrice  = 49;
            System.out.print("Please enter another item from the menu above: ");
            nProduct = input.nextInt();
        }

        else if (nProduct == 6 ) {
            nPrice  = 119;
            System.out.print("Please enter another item from the menu above: ");
            nProduct = input.nextInt();
        }

        else if (nProduct == 7 ) {
            nPrice  = 899;
            System.out.print("Please enter another item from the menu above: ");
            nProduct = input.nextInt();
        }

        else if (nProduct == 8 ) {
            nPrice  = 299;
            System.out.print("Please enter another item from the menu above: ");
            nProduct = input.nextInt();
        } 

        else if(nProduct == 9 ) {
            nPrice  = 399;
            System.out.print("Please enter another item from the menu above:  ");
            nProduct = input.nextInt();
        }
    }    

    dTax = (nPrice * TAX);
    dTotal = dTax   nPrice;

    System.out.println("");
    System.out.println("Thank you for ordering with Best   Purchase," sName);
    System.out.println("Total Items Ordered: "   nCount);
    System.out.println("Price of items ordered: $"   nSum);
    System.out.println("Sales Tax: $"   dTax);
    System.out.println("Total amount due: $"   dTotal);
}
 

Комментарии:

1. Просто чтобы вы знали, Java и JavaScript — это совершенно разные языки.

Ответ №1:

Дополнительное input.nextInt() в каждом if блоке здесь не имеет смысла. Таким образом, вы должны вводить два числа на каждой итерации. Следующий цикл должен делать то, что вы хотите:

 System.out.print("Please enter item from the menu above: ");
while ((nProduct = input.nextInt()) != SENTINEL) {
    nSum = nPrice   nSum;
    nCount  ;
    System.out.print("Please enter another item from the menu above:  ");

    if (nProduct == 1) {
        nPrice  = 249;
    }
    else if (nProduct == 2) {
        nPrice  = 39;
    }
    else if (nProduct == 3 ) {
        nPrice  = 1149; 
    }
    else if (nProduct == 4 ) {
          nPrice  = 349;
    }
    else if (nProduct == 5 ) {
        nPrice  = 49;
    }
    else if (nProduct == 6 ) {
        nPrice  = 119;
    }
    else if (nProduct == 7 ) {
        nPrice  = 899;
    }
    else if (nProduct == 8 ) {
        nPrice  = 299;
    } 
    else if(nProduct == 9 ) {
        nPrice  = 399;
    }
}
 

Я не уверен, чего вы хотите достичь с помощью инструкции nSum = nPrice nSum; . Это вычисляет сумму всех частичных сумм.

Комментарии:

1. Цикл выполнения во время выполнения также может быть рассмотрен, поскольку бессмысленно оценивать условия цикла while перед обработкой цикла.

2. Это потрясающе, спасибо, за исключением того, что теперь он добавляет дополнительную строку после того, как я заканчиваю цикл, введя 10, и nCount подсчитывает ее

3. @NicholasNPeck: Правильно, отредактировал мой ответ и переместил ввод непосредственно в условие цикла. Может быть немного сложнее для чтения, но не будет печатать дополнительный вывод.

Ответ №2:

Я согласен с Фрэнком … но похоже, что NSum здесь не выйдет правильно.

Вместо…

 nPrice  = xxx;
 

в каждом операторе…вы должны просто поставить

 nSum  = xxx;
 

и снова прекратите вычислять сумму вверху. Как у вас есть сейчас, вы постоянно увеличиваете значение nPrice . Другой вариант — просто установить nPrice в каждом операторе if и вычислить NSum в верхней или нижней части цикла.

 nPrice = xxx;
 

Вы также получаете дополнительный счетчик, потому что вы обрабатываете nCount ДО того, как фактически прочитаете элемент. Это означает, что если вы наберете «10» для выхода, вы уже добавили элемент.

Вы могли бы попробовать что-то вроде этого. Это грязно и заняло у меня 5 минут, и, вероятно, это не лучший способ, но он должен работать:

 System.out.print("Please enter item from the menu above: ");
nProduct = input.nextInt()

while (nProduct != SENTINEL) {
    nProduct = input.nextInt()

    if (nProduct == 1) {
        nSum  = 249;
        System.out.print("Please enter another item from the menu above:  ");
        nCount  ;
    }
    else if (nProduct == 2) {
        nSum  = 39;
        System.out.print("Please enter another item from the menu above:  ");
        nCount  ;
    }
    else if (nProduct == 3 ) {
        nSum  = 1149;
        System.out.print("Please enter another item from the menu above:  ");
        nCount  ;
    }
    else if (nProduct == 4 ) {
        nSum  = 349;
        System.out.print("Please enter another item from the menu above:  ");
        nCount  ;
    }
    else if (nProduct == 5 ) {
        nSum  = 49;
        System.out.print("Please enter another item from the menu above:  ");
        nCount  ;
    }
    else if (nProduct == 6 ) {
        nSum  = 119;
        System.out.print("Please enter another item from the menu above:  ");
        nCount  ;
    }
    else if (nProduct == 7 ) {
        nSum  = 899;
        System.out.print("Please enter another item from the menu above:  ");
        nCount  ;
    }
    else if (nProduct == 8 ) {
        nSum  = 299;
        System.out.print("Please enter another item from the menu above:  ");
        nCount  ;
    } 
    else if(nProduct == 9 ) {
        nSum  = 399;
        System.out.print("Please enter another item from the menu above:  ");
        nCount  ;
    }
}
 

Комментарии:

1. спасибо, что это помогло, теперь все вычисления верны, за исключением nCount после того, как я завершаю цикл, введя 10, он добавляет еще одну строку и считает ее в последний раз перед фактическим завершением

2. Пожалуйста, введите пункт из меню выше: 1 Пожалуйста, введите другой пункт из меню выше: 2 Пожалуйста, введите другой пункт из меню выше: 10 Пожалуйста, введите другой пункт из меню выше: / * эта строка здесь добавляется после завершения* Спасибо за заказ с лучшей покупкой, укажите Общее количество заказанных товаров: 3 * / и подсчитайте это здесь*

3. Отредактировано. Тем не менее, Фрэнк в основном вас понял. Его решение намного элегантнее.

4. Отлично, спасибо!

Ответ №3:

Вы могли бы переместить приглашение для amp; чтения ввода после всего процесса if / else, так что (а) вам нужно будет написать его только один раз и (б) это будет сделано, даже если nProduct не соответствует продукту. Но вам нужно было бы переместить первое приглашение и прочитать непосредственно перед началом цикла.

Ответ №4:

Я согласен с решением @scott-hunter, но альтернативный метод изменения приглашения, чтобы у вас было что-то вроде этого:

 String prompt = "Please enter item from the menu above: ";
while (nProduct != SENTINEL) {
    // Some code ...
    System.out.println(prompt);
    // ... more code
    prompt = "Please enter another item from the menu above: ";
}
 

Ответ №5:

Вы должны вынуть

 System.out.print("Please enter another item from the menu above: ");
nProduct = input.nextInt();
 

из каждого оператора if это должно решить вашу проблему.

В принципе, вы делаете это:

  1. Попросите номер.
  2. Проверьте номер, попросите номер.
  3. Попросите номер.

Если вы удалите приведенный выше код из каждого оператора if, вы будете выполнять

  1. Попросите номер.
  2. Проверьте номер.
  3. Попросите номер.
  4. Проверьте номер.

Именно так вы этого и хотите.