Я хочу, чтобы меню повторялось после неверной опции?

1

Хорошо, я знаю, что это должно быть проще, чем я это делаю, но я не могу понять это. У меня есть меню. пользователь выбирает номер, который вызывает определенный метод.

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

Может кто-нибудь мне помочь?

import java.util.Scanner;


public class TestStringManip {
        //=================MAIN===============
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter a string: ");
        String input = in.nextLine();

        StringManipulation newString = new StringManipulation(input);

        String menu = "\n Please select an option to perform"
                + "\n1 (1) Get all uppercase letters."
                + "\n2 (2) Get every second letter."
                + "\n3 (3) Replace vowels with _ "
                + "\n4 (4) Get a count of all vowels."
                + "\n5 (5) Get position of all vowels.";
        System.out.println(menu);
        int option = in.nextInt();


        do
        {
            if (option == 1)
            {
                newString.getUpperCase(input);
            }

            else if (option == 2)
            {
                newString.getEverySecond(input);
            }

            else
            {
                System.out.println("Error must select 1-5");
                System.out.println(menu);
                option = in.nextInt();
            }
        }while (option < 1 || option > 5);
    }

}

Я обновил свой код, чтобы попробовать некоторые из предложенных ответов. Он работает для первых двух вариантов, но это все. Я также пытаюсь его повторить после выбора каждой опции, если не выбрано 0, которое должно завершиться программой. Вот мой обновленный код.

import java.util.Scanner;


public class TestStringManip {
        //=================MAIN===============
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter a string: ");
        String input = in.nextLine();

        StringManipulation newString = new StringManipulation(input);

        String menu = "\n Please select an option to perform"
                + "\n1 (1) Get all uppercase letters."
                + "\n2 (2) Get every second letter."
                + "\n3 (3) Replace vowels with _ "
                + "\n4 (4) Get a count of all vowels."
                + "\n5 (5) Get position of all vowels."
                + "\n0 (0) Exit Program";
        System.out.println(menu);
        int option = in.nextInt();

        int i = 0;
        do
        {   
            if (option == 1)
            {
                newString.getUpperCase(input);
                i = 1;
            }

            else if (option == 2)
            {
                newString.getEverySecond(input);
                i = 1;
            }

            else if (option == 3)
            {
                newString.replaceVowels(input);
                i = 1;
            }

            else if (option == 4)
            {
                newString.getNumberOfVowels(input);
                i = 1;
            }

            else if (option == 5)
            {
                newString.getVowelPosition(input);
                i = 1;
            }

            else if (option == 0)
            {
                break;
            }

            else
            {
                System.out.println("Error must select 0-5");
                System.out.println("Enter your option: ");
                option = in.nextInt();
            }
        }while (i == 0);

    }

}
  • 0
    возможный дубликат цикла оператора переключения
  • 0
    Вы должны изменить свою логику. Вы хотите ввести выбор только тогда, когда введен неправильный номер. Подскажите, пожалуйста, что будет, если пользователь введет правильную опцию? Если вы поместите его в цикл, он станет бесконечным циклом. Чтобы избежать этого, вам нужно запрашивать выбор пользователя на каждой итерации, чтобы он не входил в бесконечный цикл. Проверьте мой ответ.
Показать ещё 3 комментария
Теги:

5 ответов

1
Лучший ответ

Не уверен, что это то, что вы хотите сделать, повторите все меню, пока пользователь не нажмет 0, а затем выйдите.

Я сделал это с помощью switch вместо if-else. Но вы можете изменить этот кусок кода. Попробуйте и скажите, если это то, что вы искали.

Это проверяет входные данные перед его обработкой на коммутаторе

import java.util.Scanner;

class MyTest {
    public static void main(String args[]) {
        int option;
        Scanner in = new Scanner(System.in);
        do {
            do {
                String menu = "\n Please select an option to perform"
                                + "\n1 (1) Get all uppercase letters."
                                + "\n2 (2) Get every second letter."
                                + "\n3 (3) Replace vowels with _ "
                                + "\n4 (4) Get a count of all vowels."
                                + "\n5 (5) Get position of all vowels."
                                + "\n0 (0) Exit Program";
                System.out.println(menu);
                option = in.nextInt();
            } while(option < 0 || option > 5); // This will make the menu repeat if option is higher than 6 or lowen than 0.

            switch(option) {
                case 1:
                    System.out.println("Option 1");
                    break;
                case 2:
                    System.out.println("Option 2");
                    break;
                case 3:
                    System.out.println("Option 3");
                    break;
                case 4:
                    System.out.println("Option 4");
                    break;
                case 5:
                    System.out.println("Option 5");
                    break;
                default:
                    System.out.println("Hasta la vista Baby");
                    break; //I always use this break, even when not needed.
            }
        } while (option != 0);
    }
}

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

Как отметил GPRathour, вы можете сделать это с помощью простого цикла do-while while, поэтому он будет выглядеть так:

Этот проверяет ввод ПОСЛЕ обработки его на коммутаторе

import java.util.Scanner;

class MyTest {
    public static void main(String args[]) {
        int option;
        Scanner in = new Scanner(System.in);
        do {
            String menu = "\n Please select an option to perform"
            + "\n1 (1) Get all uppercase letters."
            + "\n2 (2) Get every second letter."
            + "\n3 (3) Replace vowels with _ "
            + "\n4 (4) Get a count of all vowels."
            + "\n5 (5) Get position of all vowels."
            + "\n0 (0) Exit Program";
            System.out.println(menu);
            option = in.nextInt();
            switch(option) {
                case 0:
                    System.out.println("Hasta la vista Baby");
                    break;
                case 1:
                    System.out.println("Option 1");
                    break;
                case 2:
                    System.out.println("Option 2");
                    break;
                case 3:
                    System.out.println("Option 3");
                    break;
                case 4:
                    System.out.println("Option 4");
                    break;
                case 5:
                    System.out.println("Option 5");
                    break;
                default:
                    System.out.println("Wrong option");
                    break; //I always use this break, even when not needed.
            }
        } while (option != 0);
    }
}
  • 0
    Я добавил свой конструктор перед циклом do. и я добавил вызовы методов к каждому классу, и я получаю ошибку, когда я запускаю его.
  • 0
    какую ошибку вы получили? Вы можете опубликовать это здесь?
Показать ещё 8 комментариев
1

То, как вы хотите, чтобы ваша логика работала, я считаю, что также должен быть выход. Итак, как насчет того, чтобы попробовать что-то вроде следующего,

do{
      String menu = "\n Please select an option to perform"
        + "\n1 (1) Get all uppercase letters."
        + "\n2 (2) Get every second letter."
        + "\n3 (3) Replace vowels with _ "
        + "\n4 (4) Get a count of all vowels."
        + "\n5 (5) Get position of all vowels."
        + "\n0 (0) To Exit.";
     System.out.println(menu);
     int option = in.nextInt();


    if (option == 1){
        newString.getUpperCase(input);
    }

    else if (option == 2){
        newString.getEverySecond(input);
    }
    ...
    ...
    else if(option == 0){
        break;
    }else{
        System.out.println("\n\nWrong Choice\n\n");
    }

}while(option != 0);

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

У Кика Бутовского было столько сомнений. Я создал два простых примера, просто запустил их самостоятельно и просмотрел вывод, так как у меня недостаточно времени для загрузки скриншотов из вывода обоих из них.

MyCode будет работать нормально

import java.util.Scanner;
class MyTest{
public static void main(String args[]){

    Scanner in = new Scanner(System.in);
 int option = 0;
    do{
  String menu = "\n Please select an option to perform"
    + "\n1 (1) Get all uppercase letters."
    + "\n2 (2) Get every second letter."
    + "\n3 (3) Replace vowels with _ "
    + "\n4 (4) Get a count of all vowels."
    + "\n5 (5) Get position of all vowels."
    + "\n0 (0) To Exit.";
 System.out.println(menu);

option = in.nextInt();



if (option == 1){
System.out.println("1");
}

else if (option == 2){
System.out.println("2");
}

else if(option == 0){
System.out.println("0");
    break;
}else{
    System.out.println("\n\nWrong Choice\n\n");
}

}while(option != 0);

}
}

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

import java.util.Scanner;
class MyTest2{
public static void main(String args[]){

    Scanner in = new Scanner(System.in);
 int option = 1;
    do{



if (option == 1){
System.out.println("1");
}

else if (option == 2){
System.out.println("2");
}

else if(option == 0){
System.out.println("0");
    break;
}else{
    System.out.println("\n\nWrong Choice\n\n");


  String menu = "\n Please select an option to perform"
    + "\n1 (1) Get all uppercase letters."
    + "\n2 (2) Get every second letter."
    + "\n3 (3) Replace vowels with _ "
    + "\n4 (4) Get a count of all vowels."
    + "\n5 (5) Get position of all vowels."
    + "\n0 (0) To Exit.";
 System.out.println(menu);

option = in.nextInt();



}

}while(option != 0);

}
}
  • 1
    просто не могли бы вы сказать мне, что не так с моим ответом?
  • 1
    @ KickButtowski Если вы спрашиваете меня, потому что вы получили -1, то, пожалуйста, позвольте мне сказать вам, что я не проголосовал за ваш ответ. Но сказать вам «неправильно с вашим ответом» Поскольку OP хочет написать логику для цикла, поэтому мы должны спрашивать в каждой итерации относительно выбора пользователя, но ваш lofic будет только запрашивать выбор, если пользователь вводит что-либо кроме 1 & 2, он не попросит пользователя ввести выбор, если он введет 1 или 2. Надеюсь, вы поняли, что я пытаюсь сказать.
Показать ещё 7 комментариев
1

Я бы добавил проверку на Scanner.hasNextInt(), чтобы убедиться, что пользователь набирает текст в int. Потому что прямо сейчас, если бы кто-то набрал "Hello", это сломало бы вашу программу. Я исправил код и, надеюсь, цикл.

Вот пример, используя измененную версию вашего кода: (извините за неудобный отступ - ваш странный, и я еще не исправил его. Будет редактировать с исправлением)

import java.util.Scanner;
public class TestStringManip {
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter a string: ");
        String input = in.nextLine();

        StringManipulation newString = new StringManipulation(input);

        String menu = "\n Please select an option to perform"
                + "\n1 (1) Get all uppercase letters."
                + "\n2 (2) Get every second letter."
                + "\n3 (3) Replace vowels with _ "
                + "\n4 (4) Get a count of all vowels."
                + "\n5 (5) Get position of all vowels.";
        System.out.println(menu);

        int option = getIntInput(in);

        do{
            if (option == 1)
            {
                newString.getUpperCase(input);
            }

            else if (option == 2)
            {
                newString.getEverySecond(input);
            }

            else if (option == 0){
                System.out.println("Goodbye!");
                System.exit(0);
            }

            else
            {
                option = getIntInput(in);
            }

          }while(option != 0);
    }

  //this function will keep prompting until the user inputs a valid option
  int getIntInput(Scanner in){
     while(!in.hasNextInt()){
        System.out.println("Please enter a valid option (# between 1 and 5)");
     }

     return in.nextInt();
  }


}
1

код:

  public class TestStringManip {


public static void main(String[] args) {
    String menu = "\n Please select an option to perform"
            + "\n1 (1) for option one enter 1."
            + "\n2 (2) for option two enter 2."
            + "\n0 (0) Exit Program";
    Scanner in = new Scanner(System.in);
    int option = ReadAndMenu(menu,in);

    int i = 0;
    do {
        if (option == 1) {
            System.out.println("option one");
            option = ReadAndMenu(menu,in);
        } else if (option == 2) {
            System.out.println("option two");
            option = ReadAndMenu(menu,in);
        } else if (option == 0){
            System.out.println("exit");
            i= 1; 
        } else {
            System.out.println("Please enter a number between 1 and 2");
            option = ReadAndMenu(menu,in);

        }
    } while (i == 0);

}

 private static int ReadAndMenu(String menu, Scanner in){
        System.out.println(menu);
        System.out.print("Enter your option: ");
        return in.nextInt();
    }

}

вывод:

Please select an option to perform
1 (1) for option one enter 1.
2 (2) for option two enter 2.
0 (0) Exit Program
Enter your option: 1
option one

 Please select an option to perform
1 (1) for option one enter 1.
2 (2) for option two enter 2.
0 (0) Exit Program
Enter your option: 2
option two

 Please select an option to perform
1 (1) for option one enter 1.
2 (2) for option two enter 2.
0 (0) Exit Program
Enter your option: 5
Please enter a number between 1 and 2

 Please select an option to perform
1 (1) for option one enter 1.
2 (2) for option two enter 2.
0 (0) Exit Program
Enter your option: 0
  • 0
    Так что я попробовал это, и сначала это, похоже, сработало, работает для первых двух вариантов, но последние не работают. по какой-то причине. Я обновил свой код. выше. Я также добавил опцию для выхода.
  • 0
    Вы должны определить другое, если для поддержки других номеров вы это сделали? Я просто дал вам это в виде синего шрифта, чтобы вы могли адаптировать его для ваших нужд. :)
Показать ещё 8 комментариев
1

Попробуйте оператор switch. Замените оператор if этим блоком кода.

do{
    switch(option){
        case 0:
             //Exit loop
             break;
        case 1:
             newString.getUpperCase(input);
             break;
        case 2:
             newString.getEverySecond(input);
             break;
        case 3:
             // Method number 3;
        . . .

        default:
            System.out.println("Please enter a number between 1 and 5");
            break;
    }
} while(option !=0)

EDIT Если вы хотите узнать больше о операторах switch, ознакомьтесь с этим руководством по java

Перередактируйте: И да, вам нужно будет проверить ввод int, а не строку, как сказал Рики

  • 0
    Это не отвечает на его вопрос, хотя его вопрос довольно неясен на данный момент. Он спросил о цикле.
  • 0
    Удален мой downvote, хороший редактор.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню