Java, четное количество четных цифр, нечетное количество нечетных цифр

По сути, эта программа представляет собой игру, в которой пользователь должен вводить числа, чтобы увидеть, какие числа подходят: числа с четным числом четных цифр и нечетным числом нечетных цифр.

Итак, прежде всего, программа завершается, когда я ввожу однозначное число, что не является преднамеренным. Я предполагаю, что это как-то связано с while (n > 0). Также, вероятно, существует проблема с if (_2 _......), потому что результаты печати кажутся почти случайными: число хорошее, а то же число иногда не хорошее.

Честно говоря, я заблудился. Большое спасибо за любую помощь.

ОБНОВЛЕНИЕ: этот код работает так, как я хочу, я просто хотел поблагодарить всех, кто помог! Это мой первый семестр информатики, так что я еще новичок в этом ... извините за мои ошибки, которые, вероятно, были довольно глупыми :)

package quackygame;
import java.util.Scanner;
public class QuackyGame 
{
    public static void main(String[] args) 
   {
       System.out.println("Welcome to the Number Game!"
                + " Try to figure out the pattern "
                + "in the numbers that Wallace likes!");

        Scanner scan = new Scanner (System.in);
        int n;
        int numEven = 0;
        int numOdd = 0;
        boolean isEven;

        do
        {
           System.out.print("Enter a number > 0: ");
           n = scan.nextInt();
           while (n > 0)
           {
               if (n % 2 == 0)
                 {
                   //n is even
                   isEven = true;
                   numEven++;
                 }
                else
                 {
                   //n is odd
                   isEven = false;
                   numOdd++;
                 }
               n /= 10;
           }
           //if numEven is even and numOdd is odd
           if (numEven % 2 == 0 && numOdd % 2 == 1)
               System.out.println("Wallace liked your number!");
           else
           {
               System.out.println("Wallace didn't like your number.");
           }
           numEven = 0;
           numOdd = 0;

        }

        while (n >= 0); 
    }

}

person mjamev10    schedule 07.11.2015    source источник
comment
если ваше требование the program ends when 1 digit number entered, то почему условие n>0? Это должно быть n>10 правильно?   -  person Rehman    schedule 07.11.2015
comment
Проверить n /= 10;   -  person Sekula1991    schedule 07.11.2015
comment
Если вы хотите убедиться, что люди знают, что на ваш вопрос ответили, либо примите один из текущих ответов, либо дайте свой собственный ответ и примите его. Это добавит зеленую галочку, чтобы люди увидели, что вы удовлетворены решением своей проблемы. Вы можете принять ответ, нажав на галочку рядом с ответом.   -  person Michael Fourre    schedule 08.11.2015


Ответы (2)


В коде есть несколько основных проблем, основанных на желаемых результатах, которые вы описали. Самая вопиющая проблема, которую я вижу, заключается в том, что вы намереваетесь, чтобы игра по существу «начиналась с нуля» в начале каждого раунда, но вы никогда не сбрасываете переменные 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
comment
Я действительно намеревался использовать n / = 10, а не n / = 10.0, поскольку я выполняю эту операцию, чтобы избавиться от последней цифры числа, чтобы проверить, четная или нечетная следующая. Он делится на 10, оставляя число с последней цифрой как десятичное, а десятичное число просто обрезается с помощью int. Итак, у меня numEven и numOdd сброшены до нуля после оператора else, как вы предложили, и теперь моя программа говорит, что четные числа - это плохо, а нечетные числа - хорошо ... опять же, это не то, на что я надеялся. Я предполагаю, что это как-то связано с моим if (numEven% 2 == 0 && numOdd% 2 == 1) - person mjamev10; 08.11.2015
comment
@ mjamev10, если вы хотите убедиться, что выполняете правильную условную проверку, используйте круглые скобки: (((numEven% 2) == 0) && ((numOdd% 2) == 1)) Мой пример немного избыточен, но вы вникнуть в суть. Что касается операции / = 10, просто добавьте отдельное условие, которое выполняет только n / = 10.0, когда n уже равно ‹10, например: if (n‹ 10) n /=10.0 иначе if (n ›= 10) n / = 10. - person Michael Fourre; 08.11.2015
comment
Что ж, теперь код работает, как и планировалось; оператор if на самом деле был в порядке, как и было, и n / = 10 также работает так, как я хочу. Спасибо за помощь! Это мой первый семестр изучения информатики, так что я еще новичок в этом :) - person mjamev10; 08.11.2015
comment
@ mjamev10 Замечательно, приятно слышать. Я могу отредактировать свой ответ с добавленными изменениями. - person Michael Fourre; 08.11.2015

Вы увеличиваете число numEven или numOdd каждый раз, когда вводите число, а затем вы используете if (numEven % 2 == 0 && numOdd % 2 == 1), это случайно, потому что если вы впервые поместите число 33 => numOdd = 1; => true => «Уоллес любит», но в следующий раз вы поставите 33 во второй раз => numOdd = 2; => false => «Уоллес не любит».

Edit * Может быть, вы хотели что-то подобное?

public static void main(String[] args) 
{
       System.out.println("Welcome to the Number Game!"
                + " Try to figure out the pattern "
                + "in the numbers that Wallace likes!");

        Scanner scan = new Scanner (System.in);
        int n;
        boolean isEven;

        do
        {
           System.out.print("Enter a number: ");
           n = scan.nextInt();

           //if 0, you leave the loop
           if(n==0) {
               System.out.println("You pressed 0, have a nice day");
               break;
           }
           if (n % 2 == 0)
           {
               //it is even
               isEven = true;
           }

           else
           {
               //it is not even
               isEven = false;
           }


           //if even then he likes it, otherwise he does not
           if (isEven)
               System.out.println("Wallace liked your number!");
           else
           {
               System.out.println("Wallace didn't like your number.");
           }

        }
        //put any contition here, lets say if you press 0 , you leave the loop
        while (n != 0); 
    }
person Sekula1991    schedule 07.11.2015