В коде есть несколько основных проблем, основанных на желаемых результатах, которые вы описали. Самая вопиющая проблема, которую я вижу, заключается в том, что вы намереваетесь, чтобы игра по существу «начиналась с нуля» в начале каждого раунда, но вы никогда не сбрасываете переменные numEven и numOdd. Это источник ваших результатов печати, которые кажутся случайными. Например, если вы запустили игру и ввели число:
34567
Игра обработает число и скажет, что это благоприятное число, потому что оно нечетное, имеет нечетное количество нечетных цифр (3) и имеет четное количество четных цифр (2). Однако при повторном запуске игры он выполнит тот же код без возврата переменных в 0, что означает, что при вводе:
34567
Игра обработала бы это число как неправильное, потому что накопленное значение нечетных цифр будет 6 вместо 3 (поскольку 3 в первый раз + 3 во второй раз дает 6), а 6 - четное. Итак, что мы хотим сделать:
...
int n;
do
{
int numEven = 0;
int numOdd = 0;
System.out.print("Enter a number: ");
n = scan.nextInt();
...
Помещая объявления numEven и numOdd внутри блока do, они являются локальными переменными, которые существуют только на время действия блока do. Мы также могли бы сделать что-нибудь простое:
...
else
{
System.out.println("Wallace didn't like your number.");
}
numEven = 0;
numOdd = 0;
}
while (n > 0);
...
Простой сброс значений поможет нам отслеживать фактические предполагаемые значения numOdd и numEven более последовательно.
Что касается закрытия программы при вводе однозначного числа, я не уверен. Это не имеет смысла, потому что, поскольку это цикл do-while, он должен выполняться как минимум по крайней мере один раз и выдавать одно из операторов печати. Я загружаю этот код в свою среду IDE прямо сейчас, чтобы опробовать его. Я обновлю свой ответ, если что-нибудь найду.
-EDIT-: Прочитав ваш вопрос еще раз, кажется, что вы можете не предлагать, чтобы программа закрывалась до фактического выполнения какой-либо из своих функций, а просто закрываете ее вообще. Причина закрытия программы заключается в том, что вы выполняете арифметическую функцию с целочисленным делением, где вы, вероятно, хотите использовать другой тип числа. Позволь мне объяснить:
При обычном человеческом счете у нас есть естественный набор чисел, не имеющих десятичных знаков. Обычно они начинаются так:
1, 2, 3, 4, 5 ...
Затем у нас есть отдельный набор чисел для математики, где мы работаем с большей точностью:
0.5, 1.4232, 3.142 ...
Когда мы говорим о числах обычным человеческим языком, мы предполагаем, что деление 1 на 2 дает 0,5. Однако компьютеры не знают об этом косвенно. Чтобы компьютер пришел к выводу «0,5» в результате деления 1 на 2, вам необходимо явно указать ему, что он должен использовать определенный тип числа для получения этого вывода.
«Нормальные» числа, на которые я ссылался ранее, в программировании наиболее слабо связаны с целым числом. По сути, это число без десятичной точки. Это означает, что всякий раз, когда вы делите два целых числа вместе, вы всегда получаете в качестве результата другое целое число. Таким образом, если бы вы разделили 1 на 2, компьютер не интерпретировал бы результат как 0,5, потому что это число имеет десятичную дробь. Вместо этого он округлит его до ближайшего целого числа, которое в данном случае равно 0.
Итак, для более конкретного примера, относящегося к актуальному вопросу, допустим, мы вводим число 5 в нашу программу. Он выполняет все вычисления для шансов и эвенов, но в конечном итоге доходит до этой строки:
n /= 10
Здесь все становится напуганным. Мы делим два целых числа, но их результат не получается как идеальное целое число. В этом случае результат 5/10 снова будет 0,5. Но для компьютера, поскольку мы делим два целых числа, результат 0,5 просто не подходит, поэтому после округления до ближайшего целого числа мы получаем 0. На этом этапе произошла одна фатальная ошибка:
(while n > 0);
Когда мы выполняем эту проверку, мы получаем false и цикл while завершается. Почему? Поскольку после выполнения n / = 10, n становится 0. И 0 не больше 0.
Как мы можем это исправить? Лучше всего, вероятно, просто использовать число с плавающей запятой для выполнения вычислений. В Java это довольно просто. Все, что нам действительно нужно сделать, это:
n /= 10.0
Когда Java видит, что мы делим на 10,0, которое не является целым числом, она автоматически преобразует «n» в число с плавающей запятой, чтобы разделить на 10,0. В этом случае, если n равно 5, наш результат при делении 5 на 10,0 будет 0,5. Затем, когда мы запустим:
(while n > 0);
Это становится правдой! И петля не обрывается.
Я собираюсь внести все эти изменения в свою среду IDE, чтобы убедиться, что все работает так, как задумано для меня. Я бы посоветовал вам тоже попробовать, чтобы посмотреть, решит ли он ваши проблемы.
Надеюсь это поможет.
person
Michael Fourre
schedule
07.11.2015
the program ends when 1 digit number entered
, то почему условиеn>0
? Это должно бытьn>10
правильно? - person Rehman   schedule 07.11.2015n /= 10;
- person Sekula1991   schedule 07.11.2015