выполните цикл while с запросом пользователя «Да/нет»

#java #loops #while-loop

Вопрос:

У меня возникли проблемы с моим кодом. Код состоит в том, чтобы найти факториал числа, затем спросить, хотите ли вы снова запустить программу, ее предполагается запустить снова, а затем выйти. Однако, когда я вхожу Y , чтобы перезапустить программу, она прерывается и не перезапускается, а когда я вхожу N , чтобы выйти, она не выходит из программы.

 private static Object Cont;

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    // Greetings
    System.out.println("Welcome to my factorial program! ");
    System.out.println("Please choose from the following: ");

    //Menu
    System.out.println("1. Run Program");
    System.out.println("2. Exit Program");

    int choice = scanner.nextInt();

    switch (choice) {
        case 1:
            System.out.println("This program will determine the factorial value of positive integers.");
            do {
                System.out.println("The starting number is 1.");
                System.out.println("Please enter an ending integer value:");
                int n = scanner.nextInt();
                for (int i = 1; i <= n; i  ) {
                    System.out.println(i   "! = "   fact(i));//call to function
                }
                System.out.println("Run factorial program again? (Y for Yes, N for No): ");
                String Cont = scanner.next();
                if (Cont.equals("N")) {
                    break;
                }
            } while (Cont.equals("Y"));// do while loop
            break;
        //Menu Exit
        case 2:
            System.out.println("Thank you for using the program.");
            System.out.println("Goodbye");
        default:
            System.exit(1); // remebered from last week to set this to one
            System.out.println("Goodbye");
            break;
    }
}//Factorial Math

static long fact(int x) {
    long f = 1;
    for (int i = 1; i <= x; i  ) {
        f = f * i;
    }
    return f;
} //End Main Method
 

Что я упускаю или делаю не так?

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

1. Основная причина вашей проблемы заключается в том, что у вас есть две разные Cont переменные. Код в цикле присваивается одному. Но while условие проверяет другое.

Ответ №1:

У вас здесь есть пара проблем.

Первая проблема заключается в том, что вы объявили две разные Cont переменные. Первый — это static поле. Вторая — это локальная переменная, объявленная в теле цикла.

Я не знаю, почему вы объявили статическое поле, но я предполагаю, что вы сделали это, потому } while (Cont.equals("Y")); что оно не компилировалось без него. (Это связано с тем, что Cont переменная, объявленная в цикле, не находится в области действия за пределами тела цикла.) К сожалению, это было неправильное решение. Потому что теперь у вас есть код, который присваивается одной переменной и проверяет другую. Естественно, это не работает.

На мой взгляд, правильное решение состоит в том, чтобы избавиться от static поля и объявления в теле цикла. Чем добавлять объявление для Cont перед началом цикла. (У него не должно быть инициализации). Наконец, в цикле вам просто нужно прочитать (с помощью сканера) и назначить строку Cont , чтобы вы могли протестировать в состоянии цикла.


Вторая проблема заключается в том, что у вас там избыточный тест. Если вы собираетесь проверить, нужно ли вам продолжать использовать } while (Cont.equals("Y")); , вам также не нужно проверять, есть ли Cont "N" и break .

Соответственно, equals("Y") это не то же самое, что нет equals("N") . (Подумайте "Hello" … или "n" . Они не являются ни "Y" тем, ни "N" другим .) Поэтому , если вы действительно хотите остановить цикл при вводе пользователем N , условие завершения цикла должно быть:

     } while (!Cont.equals("N"));  // keep looping while not 'N'
 

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

  1. Объявление static поля обычно является ошибкой.
  2. Ошибочно использовать поле, когда вы должны использовать локальную переменную. Состояние, относящееся только к одному выполнению метода, должно быть 1, представленное с использованием локальной переменной.
  3. Это серьезная стилистическая ошибка, когда переменная начинается с заглавной буквы. Cont должно быть cont .

    Если вы когда — нибудь работали в профессиональной команде разработчиков Java, которая уделяет внимание стилю, вам будет трудно игнорировать соглашения об идентификаторах Java. И (ИМО) ваш учитель должен закрепить знаки стиля за эту ошибку.

1 — Причины: 1) Это затрудняет чтение метода, потому что объявление переменной находится дальше от его использования. 2) Обычно это делает код невозвратным. 3) Это открывает вам возможность нежелательной связи между методами; например, если два метода случайно используют одну и ту же «локальную переменную, объявленную как поле». 4) Во многих случаях он использует больше памяти.

Ответ №2:

Вам нужно дополнительно break и объявить Продолжение перед do циклом:

 //private static Object Cont; This is is not declared on the right location, we'll declare it later
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    // Greetings
    System.out.println("Welcome to my factorial program! ");
    System.out.println("Please choose from the following: ");

    //Menu    
    System.out.println("1. Run Program");
    System.out.println("2. Exit Program");

    int choice = scanner.nextInt();

    switch (choice) {
        case 1:
            System.out.println("This program will determine the factorial value of positive integers.");
            String Cont = null; // Cont must be declared here
            do {
                System.out.println("The starting number is 1.");
                System.out.println("Please enter an ending integer value:");
                int n = scanner.nextInt();
                for (int i = 1; i <= n; i  ) {
                    System.out.println(i   "! = "   fact(i));//call to function
                }
                System.out.println("Run factorial program again? (Y for Yes, N for No): ");
                Cont = scanner.next();
                if (Cont.equals("N")) {
                    break;
                }
            } while (Cont.equals("Y"));// do while loop
            break;
        //Menu Exit
        case 2:
            System.out.println("Thank you for using the program.");
            System.out.println("Goodbye");
            break; // requires this additional break
        default:
            System.exit(1); // remembered from last week to set this to one
            System.out.println("Goodbye");
            break;
    }
}//Factorial Math

static long fact(int x) {
    long f = 1;
    for (int i = 1; i <= x; i  ) {
        f = f * i;
    }
    return f;
} //End Main Method
 

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

1. Во-первых, нет необходимости в еще одном перерыве; существующий уже бессмыслен. Если if (Cont.equals("N") ... бы это было опущено, поток программы был бы точно таким же. Следовательно, переменную можно просто удалить и scanner.next() встроить.

2. встроенное-плохая практика

3. OP не запрашивает переменные верхнего регистра и бесполезные операторы if. Как вы можете заметить, OP-новый пользователь. Вежливость очень важна. Пожалуйста, сосредоточьтесь на помощи, а не на подшучивании.

4. Эти обсуждения-именно то, почему он перестал помогать молодым программистам.

5. @укладчик Я не понимаю, в чем проблема, все, что я сделал изначально, это добавил дополнительную информацию к данному ответу, которую ОП может найти или не найти полезной.