2013-07-26 4 views
3

Я очень новичок в программировании JAVA и раньше программировал на Python. Я пытаюсь понять, почему я получаю дубликат строки «Количество бутылок пива на стене», когда я выполняю свой код.Попытка узнать JAVA, и я хочу написать 99 бутылок пивной песни

package BeerBottle; 

    public class BeerBot { 
    public static void main (String [] args){ 
     int beerNum = 99; 
     String word = "bottles"; 

     while (beerNum > 0) { 

     if (beerNum == 1) { 
     word = "bottle"; 
     } else { 
     word = "bottles"; 
     } 
    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 > 0) { 
     System.out.println(beerNum + " " + word + " " + "of beer on the wall"); // I think it might be this line but I need it 
    } else { 
     System.out.println("No more bottles of beer on the wall"); 
    } 
    } 
    } 

}

В результате я получаю это:

2 bottles of beer on the wall 
    2 bottles of beer on the wall (duplicate) 
    2 bottles of beer 
    Take one down 
    pass it around 
    1 bottles of beer on the wall 
    1 bottle of beer on the wall (duplicate) 
    1 bottle of beer 
    Take one down 
    pass it around 
    No more bottles of beer on the wall 

Спасибо за вашу помощь

ответ

5

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

2 bottles of beer on the wall // Last line of a loop 

2 bottles of beer on the wall // First line of the next loop 
2 bottles of beer 
Take one down 
pass it around 
1 bottles of beer on the wall // Last line of a loop 

1 bottle of beer on the wall // First line of next loop 
1 bottle of beer 
Take one down 
pass it around 
No more bottles of beer on the wall 
+0

Конечно! почему я этого не увидел ... спасибо вам, – Snarre

+0

Вам нужно будет переместить блок 'if', который решит« бутылку »или« бутылки »сразу после того, как вы вычтете один из« beerNum », чтобы избежать« 1 » бутылки пива на стене' (множественные «бутылки» на 1). – rgettman

+0

Yupp получил! thnx – Snarre

2

Вы уверены, что вы на самом деле получаете непреднамеренное дубликат строки и не спутать последнюю строку одной строфы с первым из следующего? Попробуйте добавить лишнюю пустую строку в конце каждой строфы, чтобы четко увидеть разницу.

Это может быть сделано с помощью дополнительного System.out.println ("") или добавления «\ n» в конец предыдущего.

Кроме того, вы захотите переоценить, какое пивное слово вы используете, как только вы уменьшите количество пива.

+0

вы правы .... им надоело :) – Snarre

0

Я бы использовал петлю for вместо while. Я мог бы выйти из цикла 2 последних итераций, которые должны иметь дело с материалом «бутылка/бутылки».

Мой цикл будет выглядеть так:

for (int num_beers=99; i>2; i--) { 
    String output = num_bers + " bottles of beer"; 

    System.out.println(output + " on the wall"); 
    System.out.println(output); 
    System.out.println("Take one down\npass it around"); 
    System.out.println(output.replace(num_beers, num_beers-1) + " on the wall"); 
} 

С этого цикла, последняя строка распечатана будет «2 бутылки пива на стене» (первый раз).

Только для практики будет неплохо сделать тот же пример, но с использованием рекурсивного метода

Смежные вопросы