#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'
Наконец, есть несколько существенных проблем, связанных со стилем.
- Объявление
static
поля обычно является ошибкой. - Ошибочно использовать поле, когда вы должны использовать локальную переменную. Состояние, относящееся только к одному выполнению метода, должно быть 1, представленное с использованием локальной переменной.
- Это серьезная стилистическая ошибка, когда переменная начинается с заглавной буквы.
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. @укладчик Я не понимаю, в чем проблема, все, что я сделал изначально, это добавил дополнительную информацию к данному ответу, которую ОП может найти или не найти полезной.