несколько условий else / if утверждение как-то не так? - PullRequest
0 голосов
/ 10 января 2019

Я делаю вызов хакернету, где n - это int-вход. Условия:

  • Если n нечетно, выведите Weird
  • Если n четное и в диапазоне от 2 до 5 включительно, выведите Not Weird
  • Если n чётно и находится в диапазоне от 6 до 20, выведите Weird
  • Если n чётно и больше 20, выведите Not Weird.

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

public static void main(String[] args)
{
    int N = scanner.nextInt();
    scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

    if (N % 2 != 0 || N % 2 == 0 && N >= 6 && N <= 20)
    {
        System.out.print("weird");
    }
    else
    {
        System.out.print("not weird");
    }
}

Ответы [ 7 ]

0 голосов
/ 10 января 2019

Мне кажется, что в условии if (N% 2! = 0 || N% 2 == 0 && N> = 6 && N <= 20) вы проверяете нечетные и четные значения одновременно, используя && и || оператор. Можете ли вы изменить условие следующим образом (N% 2! = 0 || (N% 2 == 0 && N> = 6 && N <= 20)) и проверить? Если N нечетно, странно будет напечатано или если N четно и оно попадает под 6 и 20 включительно, будет напечатано странно. </p>

0 голосов
/ 10 января 2019

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

Похоже, что единственная "Not Weird" распечатка - 2, 4 и четные числа > 20

Так что пример может быть что-то вроде:

if (n % 2 == 0) {
    if ((n >= 2 && n <= 5) || (n > 20)) {
        return "Not Weird";
    }
}
return "Weird";
0 голосов
/ 10 января 2019

Для технической части: начните с чтения о приоритет java операторов , а затем облегчает чтение вашего кода.

Помещение множества условий в один if не полезно. Вы видите это сами: вы думаете, что код правильный, но, вероятно, это не так. А теперь вы обращаетесь к другим людям, чтобы объяснить вам ваш слишком сложный код. И, конечно, все остальные ответы делают все это для вас ... но кроме этого:

«Настоящий» ответ здесь: научитесь проверять ваш код.

Вместо основного, который каким-то образом запрашивает число, а затем принимает решения, напишите метод boolean isWeird(), который принимает число и возвращает true / false в соответствии с вашими требованиями.

А затем просто протестируйте этот метод со всеми разумными случаями. А затем проверьте, соответствует ли этот результат ожидаемому.

Используя JUnit, вы могли бы написать что-то вроде

 assertThat(isWeird(1), true);
 assertThat(isWeird(21), true);
 assertThat(isWeird(22), true);
 ...

В идеале вы пишете такие тесты до того, как реализуете этот метод. И затем вы выполняете все условия, и любая неудачная проверка говорит вам, что вы что-то не так сделали.

0 голосов
/ 10 января 2019

Отметьте следующее

public static void main(String[] args)
    {
        int N = scanner.nextInt();
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

        if(N%2!=0) {
            System.out.print("weird");  
        }else if(N>=2 && N<=5) {
            System.out.print("not weird");
        }else if(N>=6 && N<=20) {
            System.out.print("weird");
        }else if(N>20) {
            System.out.print("not weird");
        }

    }
0 голосов
/ 10 января 2019

Прочитайте это условие:

if (N % 2 != 0 || N % 2 == 0 && N >= 6 && N <= 20)

в

if (N % 2 != 0 || (N % 2 == 0 && N >= 6 && N <= 20))

Затем посмотрите, как приоритет оператора меняет поведение и дает желаемые результаты.

0 голосов
/ 10 января 2019

Вы можете попробовать это

 private static final Scanner scanner = new Scanner(System.in);

        public static void main(String[] args) {
            int n = scanner.nextInt();
            scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
            if (n % 2 == 1 || (n >= 6 && n <= 20)) {
                System.out.println("Weird");
            } else {
                System.out.println("Not Weird");
            }
            scanner.close();
        }
0 голосов
/ 10 января 2019

Проблема заключается в логике в вашем else состоянии, которое также ловит значения N, которые меньше 2. Попробуйте эту версию:

if (N % 2 != 0)
{
    System.out.print("weird");
}
else if (N >= 2 && N <= 5 || N > 20)
{
    System.out.print("not weird");
}
else if (N >= 6 && N <= 20)
{
    System.out.print("weird");
}
else
{
    // NOTE: if the code still fails, remove this else condition
    System.out.print("unexpected value of N");
}

Примечание. Чтобы код прошел задачу Hackernet, вам, возможно, придется полностью удалить условие else. Я добавил его для полноты, но Hackernet может проверить N=1, чтобы увидеть, ничего не напечатано.

...