#java
#java
Вопрос:
Я не могу понять, как заставить программу выполнить цикл через меню преобразования, а затем вернуться в главное меню из выбора «4 Возврата», как показано в примере.
Пример того, как может выглядеть вывод программы:
Главное меню
-
Введите расстояние
-
Завершите работу программы
Пожалуйста, укажите ваш выбор: 1
Введите расстояние в метрах: 500
Меню преобразования
-
Преобразовать в километры
-
Преобразовать в дюймы
-
Преобразовать в футы
-
Возврат
Введите свой выбор: 1
500 метров — это 0,5 километра
Меню преобразования
-
Преобразовать в километры
-
Преобразовать в дюймы
-
Преобразовать в футы
-
Возврат
Введите свой выбор: 3
500 метров — это 1640,5 футов
Меню преобразования
-
Преобразовать в километры
-
Преобразовать в дюймы
-
Преобразовать в футы
-
Возврат
Введите свой выбор: 4
Главное меню
-
Введите расстояние
-
Завершите работу программы
Пожалуйста, укажите ваш выбор: 2
До свидания!
Я нашел несколько решений для программы, когда она не включает главное меню и возврат к нему, но, похоже, я ничего не могу найти по этому поводу.
Вот что у меня есть:
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
int choice;
int option;
double meters = 0;
conversionControl();
choice = keyboard.nextInt();
switch (choice) {
case 1:
System.out.println("nEnter a Distance in Meters:");
meters = keyboard.nextDouble();
break;
case 2:
quitProgram();
break;
default:
showError("Please Enter a Valid Option");
conversionControl();
option = keyboard.nextInt();
if (option == 1) {
System.out.println("nEnter a Distance in Meters:");
meters = keyboard.nextDouble();
}
else if ( option == 2) {
quitProgram();
}
break;
}
do{
menu();
choice = keyboard.nextInt();
switch (choice) {
case 1:
showKilometers(meters);
break;
case 2:
showInches(meters);
break;
case 3:
showFeet(meters);
break;
case 4:
conversionControl();
option = keyboard.nextInt();
if (option == 1) {
System.out.println("nEnter a Distance in Meters:");
meters = keyboard.nextDouble();
}
else if ( option == 2) {
quitProgram();
}
break;
default:
showError("Please Enter a Valid Option");
menu();
choice = keyboard.nextInt();
break;
}
} while(choice != 0); {
}
}
Думаю, я нашел свой собственный выход, но я продолжаю думать, что это неправильный способ или есть более простой способ. Кроме того, при тестировании некоторых входных данных возникают некоторые ошибки (в основном, вызовы метода showError выводят либо неправильное меню, либо просто закрывают программу после такого количества неправильных входных данных).
Будем признательны за любую помощь / конструктивную критику. Я несколько новичок в кодировании (знаю HTML), а также новичок на этом сайте.
Спасибо! Боб
Комментарии:
1. Вам было бы намного проще разбить ваш код на несколько небольших методов, чем на этот большой блок. т.Е. метод для отображения каждого меню, один для чтения входных данных, один для обработки выбора для меню и т.д.. Также у вас мог бы быть класс Menu.
Ответ №1:
Поскольку это выглядит как упражнение, я не буду приводить вам полный код, а приведу псевдокод, который поможет вам понять стратегию здесь.
Для пояснения я назову ваше первое меню как mainMenu
, а второе как convMenu
.
Вы уже внедрили хорошую стратегию для convMenu
. Идея состоит в том, чтобы создать цикл и существовать только тогда, когда пользователь скажет вам об этом. Чего вам не хватает, так это сделать то же самое для mainMenu
и думать convMenu
о mainMenu
как о подменю The, включенном в Stack Overflow. Это означает, что когда вы находитесь в convMenu
, вы не находитесь за пределами mainMenu
.
//That's pseudo code
do {
displayMainMenu();
readUserInput();
switch(userInput) {
case 1 :
//here you put your convMenu
do {
displayConvMenu();
readUserInput();
switch(userInput) {
case 1, 2, 3 :
doConvertion();
case 4 :
exitConvMenu = true;
default :
//wrong input display a message and loop
}
} while(!exitConvMenu)
case 2:
exitMainMenu = true;
default :
//wrong input display a message and loop
}
} while(!exitMainMenu)
Комментарии:
1. @MauricePerry Это псевдокод, вот почему я не вставлял никаких
break;
2. @MauricePerry что вы имеете в виду?
3. это вводит в заблуждение
4. Я так не думаю, потому что я ясно дал понять, что это псевдокод, в котором будет отсутствовать много инструкций, это просто для того, чтобы показать структуру. Или я ошибаюсь, и я все еще не понимаю, что вы имеете в виду… Почему отсутствующая
break;
инструкция вводит в заблуждение в случае 1, но не вводит в заблуждение во всех остальных случаях?
Ответ №2:
Разбиение кода на небольшие фрагменты обычно облегчает его понимание и отладку. Разделяй и властвуй! Вот как я бы это сделал:
Сначала создайте Menu
класс, который представляет меню, он может распечатать меню на экране и проверить правильность выбора:
class Menu {
private String title;
private List<String> choices;
private String prompt;
public Menu(String title, List<String> choices, String prompt) {
this.title = title;
this.choices = choices;
this.prompt = prompt;
}
public boolean isChoiceAllowed(int i) {
return i > 0 amp;amp; i <= choices.size();
}
public void show() {
System.out.println(title);
for(int i=0; i<choices.size(); i ) {
System.out.println(" " (i 1) ". " choices.get(i));
}
System.out.println(prompt);
}
}
Затем определите ваши 2 меню:
private static final Menu mainMenu = new Menu(
"Main Menu",
Arrays.asList("Enter Distance", "Quit the program"),
"Please enter your choice");
private static final Menu conversionMenu = new Menu(
"Conversion Menu",
Arrays.asList("Convert to kilometers", "Convert to inches", "Convert to feet", "Return"),
"Please enter your choice");
Есть способ считывать пользовательский ввод:
private static int readUserInput() {
int input = keyboard.nextInt();
// Check if input is valid, if not call back readUserInput() until a valid input is given
if(!currentMenu.isChoiceAllowed(input)) {
System.out.println("Please Enter a valid option");
return readUserInput();
}
return input;
}
Есть метод для обработки вариантов в главном меню
private static void handleMainMenuChoice(int choice) {
switch (choice) {
case 1:
System.out.println("nEnter a Distance in Meters:");
meters = keyboard.nextDouble();
// Set the current menu to be the Conversion Menu
currentMenu = conversionMenu;
break;
case 2:
quitProgram();
break;
}
}
Есть метод для обработки вариантов в меню преобразования
private static void handleConversionMenuChoice(int choice) {
switch (choice) {
case 1:
showKilometers(meters);
break;
case 2:
showInches(meters);
break;
case 3:
showFeet(meters);
break;
case 4:
// Set the current menu to be the Main Menu
currentMenu = mainMenu;
break;
}
}
Есть метод для обработки пользовательского выбора и отправки его соответствующему методу выше:
private static void handleChoice(int choice) {
if(currentMenu == mainMenu) {
handleMainMenuChoice(choice);
} else {
handleConversionMenuChoice(choice);
}
}
Затем свяжите это вместе:
private static double meters;
private static Menu currentMenu;
private static Scanner keyboard = new Scanner(System.in);
<Insert menu definitions here>
public static void main(String[] args) {
currentMenu = mainMenu;
int choice;
while (true) {
// Show the current menu
currentMenu.show();
// Read the user input
choice = readUserInput();
// Handle the user choice
handleChoice(choice);
}
}
Ответ №3:
public static void main(String[] args) {
int choice = 0;
int option;
double meters = 0;
Scanner keyboard = new Scanner(System.in);
boolean exit = false;
while(!exit) {
System.out.println("nEnter your choice :Enter Distance.. click1rn"
"rn"
"Quit the program.. click2");
choice = keyboard.nextInt();
switch (choice) {
case 1:
System.out.println("nEnter a Distance in Meters:");
meters = keyboard.nextDouble();
System.out.println("Conversion Menurn"
"rn"
"Convert to kilometers .. click1rn"
"rn"
"Convert to inches .. click2rn"
"rn"
"Convert to feet .. click3rn"
"rn"
"Return.... .. click4");
int choice1 = keyboard.nextInt();
switch(choice1) {
case 1:
showKilometers(meters);
break;
case 2:
showInches(meters);
break;
case 3:
showFeet(meters);
break;
case 4:
exit = true;
break;
}
break;
case 2:
exit = true;
break;
default:
break;
}
}
}
Комментарии:
1. это может быть простым решением вашей проблемы