2014-11-03 3 views
3

Я создал программу как часть моей вычислительной работы для проверки запаса, и она отлично работает, однако, после того, как пользователь прошел через программу после проверки запаса одного элемента, им задают вопрос, хотят ли они проверять запас другого товара в котором одна и та же строка печатается дважды, и я не могу понять, почему ?. Это код:Почему эта строка печатается дважды?

import java.util.*; 

public class stock { 

public static void main(String[] args) { 

    //initialising the scanners 

    Scanner stock = new Scanner(System.in); 
    Scanner levels = new Scanner(System.in); 
    Scanner bar = new Scanner(System.in); 
    Scanner choice = new Scanner(System.in); 

    //initialising the string variables 

    String chocolate; 
    String chocolate2; 
    String change; 
    String choiceb; 

    //initialising the integer variables 

    int mars = 200; 
    int twix = 200; 
    int bounty = 200; 
    int doubled = 200; 
    int galaxy = 200;   
    int change2;   
    int counter = 1; 
    int a = 1; 


    //asking the user what chocolate bar they want to check stock of 

    System.out.println("Enter the chocolate bar to check stock of: Mars, Twix, Bounty, Double and Galaxy"); 
    System.out.println("***********************************"); 
    chocolate = stock.nextLine(); 
    System.out.println("***********************************"); 

    //depending on the users choice, this switch statement outputs the appropriate stock level of the bar entered 

    switch (chocolate.toLowerCase()) { 
     case ("mars"): 
      System.out.println("There is currenty " + mars + " in stock"); 
      break; 
     case ("twix"): 
      System.out.println("There is currenty " + twix + " in stock"); 
      break; 
     case ("bounty"): 
      System.out.println("There is currenty " + bounty + " in stock"); 
      break; 
     case ("double"): 
      System.out.println("There is currenty " + doubled + " in stock"); 
      break; 
     case ("galaxy"): 
      System.out.println("There is currenty " + galaxy + " in stock"); 
      break; 
     default: 
      System.out.println("Your an idiot, try again"); 
      chocolate = stock.nextLine(); 
    } 

    //the user is then asked if they want to change stock level of any of the chocolate bars 

    System.out.println("Do you want to change stock levels?"); 
    System.out.println("***********************************"); 
    change = levels.nextLine(); 
    System.out.println("***********************************"); 

    //if the answer is yes it carries on with the program and ignores this if statement. if the answer is no, the program closes   

    if (change.equals("no")) { 
     System.exit(0); 
    } 

    //this while loop and switch statement is used to check what chocolate bar stock level the user wants to change. 1 is subtracted from the counter 
    // on the users first input so that the message of checking if the user wants to change any more appears. this 

    while (a == 1){ 

     if (counter == 0) { 
      System.out.println("Do you want to change the stock of any more"); 
      choiceb = choice.nextLine(); 
      counter = counter + 1; 

     }else{ 
     System.out.println("Which chocolate do you want to change stock levels of?"); 
     System.out.println("***********************************"); 
     chocolate2 = bar.nextLine(); 
     System.out.println("***********************************"); 

     switch (chocolate2.toLowerCase()) { 
      case ("mars"): 
       System.out.println("Enter the amount of Mars Bars currently in stock"); 
       mars = bar.nextInt(); 
       System.out.println("There is now " + mars + " in stock"); 
       counter = counter - 1; 

       break; 
      case ("twix"): 
       System.out.println("Enter the amount of Twix currently in stock"); 
       twix = bar.nextInt(); 
       System.out.println("There is now " + twix + " in stock"); 
       counter = counter - 1; 
       break; 
      case ("bounty"): 
       System.out.println("Enter the amount of Bounty Bars currently in stock"); 
       bounty = bar.nextInt(); 
       System.out.println("There is now " + bounty + " in stock"); 
       counter = counter - 1; 
       break; 
      case ("double"): 
       System.out.println("Enter the amount of Double Bars currently in stock"); 
       doubled = bar.nextInt(); 
       System.out.println("There is now " + doubled + " in stock"); 
       counter = counter - 1; 
       break; 
      case ("galaxy"): 
       System.out.println("Enter the amount of Galaxy currently in stock"); 
       galaxy = bar.nextInt(); 
       System.out.println("There is now " + galaxy + " in stock"); 
       counter = counter - 1; 
       break; 

     } 

    } 
    } 
} 

} 

Это выход, когда программа RAN:

output

+5

Хорошим задание для публикации этого короткого, компилируемого примера. – christopher

+1

Я думаю, что проблема связана с 4-мя различными сканерами, все из которых читаются из System.in, добавляют инструкцию по умолчанию к вашему предложению switch и кладут шоколад2.toLowerCase(). Я мог бы представить, что шоколад2 также содержит вход «да», и это не признано в разделе switch – Michael

+0

. Хорошо, я могу использовать один сканер для ввода всех пользователей? – haroldj97

ответ

0

Я думаю, что проблема с 4-х различных сканеров, все чтения из System.in, добавить инструкцию по умолчанию для вашего switch-clause и вытащить chocolate2.toLowerCase(). Я мог себе представить, что chocolate2 имеет вход «да», а, и это не распознается пунктом переключателя :)

один сканер должен сделать это

+0

Просто попробовал использовать один сканер, и теперь строка не печатается дважды, однако у пользователя нет выбора, хотите ли они проверить уровень запасов больше https://imageshack.com/i/eyaBJA30p – haroldj97

+0

ты уверен? Pls отправляет ваш код снова, с одним сканером. должен работать тогда – Michael

0

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

3

Проблема заключается сочетание чтения линий и целых:

System.out.println("Which chocolate do you want to change stock levels of?"); 
    System.out.println("***********************************"); 
    chocolate2 = bar.nextLine(); 
    System.out.println("***********************************"); 

    switch (chocolate2.toLowerCase()) { 
     case ("mars"): 
      System.out.println("Enter the amount of Mars Bars currently in stock"); 
      mars = bar.nextInt(); 

Во-первых, вы читаете из bar с помощью nextLine(). Пользователь будет ввести mars\r\n (\r\n это LINEBREAK вызвано ударяя возвращением), и сканер считывает mars\r\n

Тогда вы читаете nextInt() (!) От bar. Пользователь вводит 2\r\n, но nextInt() прочтет 2 только, оставляя \r\n на bar сканера, с помощью курсора только впереди \r\n.

Ваша логика входит в второй цикл, перепечатывает сообщение, но когда ваш bar сканер снова попадает в nextLine(), он будет просто исходящее и прочитать \r\n - выключатель не будет работать на этом и логика входит в третий цикл (Сообщение печатается второй раз)

Теперь bar снова пуст, поэтому bar.readLine() будет ждать ввода пользователя еще раз.

Чтобы устранить эту проблему, убедитесь, что вы пропустите текущую строку, после прочтения целого числа, так что, когда ваш сканер попадет nextLine() снова, запрашивая тип это будет не только потреблять LineBreak .:

mars = bar.nextInt(); 
bar.nextLine(); 
+0

Спасибо !!!. Это сработало отлично. Лучше ли использовать один сканер вместо использования 4, как я? – haroldj97

+0

@ haroldj97, так как вы подключаете их все к 'system.in', да, одного сканера достаточно. – dognose

Смежные вопросы