0
public class BeerSong {
    public static void main(String args[]) {
        int BeerNum = 99;
        String word = "bottles";

        while(BeerNum > 0) {

            System.out.println(BeerNum + " " + word + " of the beer on the wall");
            System.out.println("Catch one.");
            System.out.println("Take around.");
            BeerNum = BeerNum - 1;

            if(BeerNum == 1) {
                word = "bottle";
            }

            if(BeerNum > 0) {
                System.out.println(BeerNum + " " + word + " of the beer on the wall");
            } else {
                System.out.println("Nothing on the wall");
            }
        }
    }
}

Сам вопрос насчет:

if(BeerNum == 1)
word = "bottle";
}

Если его поставить сразу после while, то в конце будет так: 1 bottles of the beer on the wall. 1 bottle of the beer on the wall.

Почему для првой строки берется множественное значение, а для второй единственное? В тоже время, если поставить данный оператор if после BeerNum = BeerNum - 1; то оба значения будут в единственном числе. Объясните. почему такая разница? Разве есть различие, где ставить if в начале блока кода или после уменьшения? Спасибо!

  • 1
    различие, где ставить if в начале блока кода или после уменьшения? - тебе не кажется, что ты сам ответил на вопрос? – Алексей Шиманский Oct 14 '17 at 05:13
  • А вообще я рекомендую прочитать о циклах, чем отличаются например do от for от while и почитать вот это Java Debugging (Отладка) и самостоятельно пройти по коду, посмотрев что там происходит в обоих случаях – Алексей Шиманский Oct 14 '17 at 05:14
  • Просто если после while то для первого не действует, а для второго действует,, если после уменьшения, то децствует для всех выводимых строк – Дмитрий Oct 14 '17 at 05:15
  • Я только начал изучение, но пытаюсь разобраться во всех хитросплетениях, спасибо!) – Дмитрий Oct 14 '17 at 05:16
  • Оператор if здесь ни при чем, как и магия его использования или положение в пространстве. Элементарный последовательный алгоритм: если berrNum = 1 - выводить с bottle, если больше одного - с bottles, когда меньше одного - выводить, что кончилось. С каждой итерацией цикла beerNum уменьшается на 1. Если вы не можете осилить логику такого простого алгоритма (не понимая что происходит при уменьшении и на что влияет), то еще не поздно задуматься о другом месте приложения усилий. Никакой грубости, просто программировать не всем дано, потому и зарплаты такие. – pavlofff Oct 14 '17 at 06:09
  • Спасибо за мнение, но я так не считаю, учусь всего лишь 3-й день, рано ставить на себе крест. Вопрос в другом, скопируйте данный код себе, только if(BeerNum == 1) {word = "bottle"; } вырежьте и поставьте сразу после while, когда счетчик дойдет до 1, будет 2 строки, первая с bottles, а вторая уже с bottle. Вот и интересно, почему такая разница от места постановки if. – Дмитрий Oct 14 '17 at 09:20
  • Очевидно, что это происходит потому, что в оригинальном варианте изменение переменной word происходит после вычитания, а с вашими изменениями - перед вычитанием. Пройдите по программе пошаговой отладкой и сами все поймете. Видимо вас вводит в заблуждение то, что вывод каждой итерации происходит без разделителя, поставьте последним оператором цикла while оператор System.out.ptintln() и увидите, что выводится за одну итерацию (итерации будут разделены пустой строкой) - В оригинале уже в предпоследней итерации выводится bottle, при ваших изменениях - только в последней. – pavlofff Oct 14 '17 at 10:34

1 Answers1

0

Я вот так оптимизировал:

package com.example.learnjava;

public class LearnJava {
    public static void main (String[] args) {
        int beerNum = 99;
        String word = "bottles";
        while (beerNum > 0) {
            System.out.println(beerNum + " " + word + " of beer on the wall");
            System.out.println(beerNum + " " + word + " of beer.");
            System.out.println("Take one down.");
            System.out.println("Pass it around.");
            beerNum = beerNum - 1;
            if (beerNum <= 1) {
                word = "bottle"; // singular, as in ONE bottle.
            }
        } // end while loop
        System.out.println("No more bottles of beer on the wall");
    } // end main method
} // end class
0xdb
  • 51,614