Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/160: Рейтинг темы: голосов - 160, средняя оценка - 4.94
2 / 2 / 1
Регистрация: 14.09.2012
Сообщений: 83

Head First Java (непонятный пример)

06.04.2013, 13:47. Показов 33555. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В книге указан такой пример

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class BeerSong{
    public static void main(String[] args){
        int beerNum = 99;
        String word = "бутылок (бутылки)";
        
        while(beerNum > 0){
            if (beerNum == 1){
                word = "бутылка";
            }
            System.out.println(beerNum + " " + word + " пива на стене");
            System.out.println(beerNum + " " + word + " пива");
            System.out.println("Возьми одну.");
            System.out.println("Пусти по кругу");
            beerNum = beerNum - 1;
            if(beerNum > 0){
                System.out.println(beerNum + " " + word + " пива на стене");
            }else{
                System.out.println("Нет бутылок пива на стене");
            }//конец else
        }//конец while
    }     //конец метода main
}//конец класса
и указано нужно найти ошибку. Ошибку я исправил, но я не понимаю, что это за ошибка. Не заходило в цикл while
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class BeerSong{
    public static void main(String[] args){
        int beerNum = 99;
        String word = "бутылок (бутылки)";
        
        while(true){
            if(beerNum == 0) break;
            if (beerNum == 1){
                word = "бутылка";
            }
            System.out.println(beerNum + " " + word + " пива на стене");
            System.out.println(beerNum + " " + word + " пива");
            System.out.println("Возьми одну.");
            System.out.println("Пусти по кругу");
            beerNum = beerNum - 1;
            if(beerNum > 0){
                System.out.println(beerNum + " " + word + " пива на стене");
            }else{
                System.out.println("Нет бутылок пива на стене");
            }//конец else
        }//конец while
    }     //конец метода main
}//конец класса
объясните пж в чем прикол?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2013, 13:47
Ответы с готовыми решениями:

Задача из Head first java
Если не сложно объясните логику программы! package HeadFirst.Java.lesson120; public class Mix4 { int counter = 0; ...

Непонятный пример из книги
Не могу никак разобраться в одном маленьком примере из книги, речь идёт про условную операцию. Распишите плз, как действует при i=0 i=1 i= 2

Ошибка Java Head Space
Доброе время суток. Подскажите пожалуйста, приложение выдает ошибку Java Head Space, в детализации написано "outofmemoryerror: java...

35
 Аватар для Vortal
104 / 104 / 27
Регистрация: 11.08.2011
Сообщений: 301
06.04.2013, 16:11
В коде нет ошибок, может быть он не правильно написан с этический точки зрения, с while все в порядке и в первом варианте.
Вывод:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
99 бутылок пива на стене
99 бутылок пива
Возьми одну.
Пусти по кругу
98 бутылок пива на стене
98 бутылок пива на стене
98 бутылок пива
Возьми одну.
Пусти по кругу
97 бутылок пива на стене
97 бутылок пива на стене
97 бутылок пива
Возьми одну.
Пусти по кругу
Тут, как по мне, лишний вывод строки.
0
2 / 2 / 1
Регистрация: 14.09.2012
Сообщений: 83
06.04.2013, 17:13  [ТС]
Цитата Сообщение от Vortal Посмотреть сообщение
В коде нет ошибок, может быть он не правильно написан с этический точки зрения, с while все в порядке и в первом варианте.
Вывод:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
99 бутылок пива на стене
99 бутылок пива
Возьми одну.
Пусти по кругу
98 бутылок пива на стене
98 бутылок пива на стене
98 бутылок пива
Возьми одну.
Пусти по кругу
97 бутылок пива на стене
97 бутылок пива на стене
97 бутылок пива
Возьми одну.
Пусти по кругу
Тут, как по мне, лишний вывод строки.
В том то и прикол, что в первом варианте она пропускает while. Ну короче ничего не выводит. и в книжке задание исправьте это. Я сделал 2й вариант. Все сработало. Странно, что у вас 1й вариант сработал...
0
 Аватар для exiqa
487 / 333 / 71
Регистрация: 24.12.2011
Сообщений: 591
06.04.2013, 18:03
с 1-м вариантом все нормально. Даже в книге написано, что код скомпилируется и запустится (я не поленился глянуть ) Я если честно, не совсем понимаю, на какую ошибку намекают авторы. Возможно на то, что вывод с одной бутылкой будет
1 бутылок (бутылки) пива на стене
1 бутылка пива на стене
1 бутылка пива
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
06.04.2013, 19:23
они намекают что исправить нужно так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class BeerSong {
    public static void main(String[] args) {
        int beerNum = 99;
        String word = "бутылок";
 
        while (beerNum > 0) {
            switch (beerNum % 10) {
            case 1:
                word = "бутылка";
                break;
            case 2:
            case 3:
            case 4:
                word = "бутылки";
                break;
            default:
                word = "бутылок";
                break;
            }
            System.out.println(beerNum + " " + word + " пива на стене");
            System.out.println("Возьми одну.");
            System.out.println("Пусти по кругу");
            beerNum--;
            System.out.println();
            if (beerNum == 0)
                System.out.println("Нет бутылок пива на стене");
 
        }
    }
}
Кстати 4 из 99 бутылки в такой реализации выводятся неправильно тоже угадайте какие

не торопитесь заглядывать под спойлер сначала попробуйте решить
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class BeerSong {
    public static void main(String[] args) {
        int beerNum = 99;
        String word = "бутылок";
 
        while (beerNum > 0) {
            switch (beerNum > 14 ? beerNum % 10 : beerNum) {
            case 1:
                word = "бутылка";
                break;
            case 2:
            case 3:
            case 4:
                word = "бутылки";
                break;
            default:
                word = "бутылок";
                break;
            }
            System.out.println(beerNum + " " + word + " пива на стене");
            System.out.println("Возьми одну.");
            System.out.println("Пусти по кругу");
            beerNum--;
            System.out.println();
            if (beerNum == 0)
                System.out.println("Нет бутылок пива на стене");
 
        }
    }
}
0
0 / 0 / 0
Регистрация: 31.07.2015
Сообщений: 1
31.07.2015, 10:26
я конечно только начинаю вникать в Java, но у меня получилось вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class BeerSong {
   public static void main (String[] args) {
      int beerNum = 99;
      String word = "бутылок";
      while (beerNum > 0) {
       if (beerNum > 0) {
          System.out.print (beerNum + " " + word + " пива на стене." + " ");
          System.out.print (beerNum + " " + word + " пива." + " ");
          System.out.print ("Возьми одну." + " ");
          System.out.println ("Пусти по кругу.");
          beerNum = beerNum - 1;
       } 
       if (beerNum == 0) {
          System.out.println("Нет бутылок пива на стене");
       }
     
       if (beerNum == 1) {
          word = "бутылка";
       } 
       
       if (beerNum == 2) {
          word = "бутылки";
       }
       if (beerNum == 3) {
          word = "бутылки";
       }
       if (beerNum == 4) {
          word = "бутылки";
       } 
       
    }
  }
}
0
0 / 0 / 0
Регистрация: 08.08.2015
Сообщений: 1
08.08.2015, 19:28
Согласен по поводу типа ошибки с exiqa !
Я просто исправил

Java
1
2
3
4
            if (beerNum > 0) {
            System.out.println (beerNum + " " + word + " пива на стене");
        } else {
            System.out.println("Нет бутылок пива на стене");
на
Java
1
2
3
4
            if (beerNum > 1) {
            System.out.println (beerNum + " " + word + " пива на стене");
        } else {
            System.out.println("Нет бутылок пива на стене");
и все получилось !
Но до конца не уверен что именно это имели ввиду авторы задачи )))
0
1 / 1 / 0
Регистрация: 10.05.2015
Сообщений: 15
11.08.2015, 15:32
А может быть стоило реализовать все с помощью цикла do-while?Так он выполнит код раз,перед проверкой условия.
0
1 / 1 / 0
Регистрация: 18.08.2015
Сообщений: 1
18.08.2015, 12:55
Согласен по поводу типа ошибки с exiqa.

Но решение Kivnikcan не работает, а выдаёт белиберду в конце.

Исправил исходную программу простым перемещением условия изменения окончания слова сразу за вычитание бутылки. Всё работает.

ЗЫ: mutagen конечно прав но на том этапе книги такой синтаксис обучающемуся ещё не известен + книга явно не адаптирована под русский и смысл задачи в bottle(s) .
1
0 / 0 / 0
Регистрация: 03.03.2017
Сообщений: 1
03.03.2017, 06:23
Там же написано что всего 1 ошибка. В итоге мой код таков:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Butilki {
 
    public static void main (String[] args) {
        int beerNum = 1;
        String word = "бутылок (бутылки)";
        
        while (beerNum < 99) {
            if (beerNum == 1) {
                word = "бутылка";
            }
            
            
            System.out.println(beerNum + " " + word + " пива.");
            System.out.println("Возьми одну.");
            System.out.println("Пусти по кругу.");
            beerNum = beerNum + 1;
            if (beerNum > 0) {
                System.out.println(beerNum + " " + word + " пива на стене");
                
            } else {
                System.out.println("Нет бутылок пива на стене");
            }
        }
    }
}
Я в принципе ничего не добавлял, только поменял значения и удалил - System.out.println(beerNum + " " + word + " пива на стене"); (Изначально их было 2 штуки)
0
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 15
03.01.2018, 19:05
В песенке поётся так:
"<количество> бутылок пива на стене
<количество> бутылок пива!
Возьми одну, пусти по кругу
<количество минус 1> бутылок пива на стене!"


То есть, в первый раз это строчка должна быть, дальше она будет повторятся из цикла "if (beerNum > 0)", следовательно, нужно, чтобы строчка была лишь 1 раз, для этого есть подсказка(если кто не заметил, строчка имеет отступ).

Java
1
2
3
if (beerNum == 99) {
   System.out.println(beerNum + " " + word + " пива на стене");
}
и после этого, текст песенки будет в норме.


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class BeerSong {
  public static void main (String[] args) {
    int beerNum = 99;
    String word = "бутылок (бутылки)";
    
    while (beerNum > 0) {
      
      if (beerNum == 1) {
        word = "бутылка";
      }
      
      if (beerNum == 99) {
       System.out.println(beerNum + " " + word + " пива на стене");
      }
      
      System.out.println(beerNum + " " + word + " пива.");
      System.out.println("Возьми одну.");
      System.out.println("Пусти по кругу.");
       
      beerNum = beerNum - 1;
 
      if (beerNum > 0 ) {
        System.out.println((beerNum) + " " + word + " пива на стене");
      } else {
        System.out.println("Нет бутылок пива на стене");
      }
    }
  }
}
0
1 / 1 / 0
Регистрация: 29.08.2018
Сообщений: 2
29.08.2018, 01:44
Ошибок две, а не одна. Вот пример где все работает:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Beer{
 
    public static void main(String[] args) {
        int beerNum = 99;
        String word = "бутылок (бутылки)";
        while (beerNum > 0) {
            System.out.println(beerNum + " " + word + " пива");
            System.out.println("Возьми одну");
            System.out.println("Пусти по кругу");
            beerNum--;
            if (beerNum == 1) {
                word = "бутылка";
            }
            if (beerNum > 0) {
                System.out.println(beerNum + " " + word + " пива на стене");
            }else {
                System.out.println("Нет бутылок пива на стене");
            }
        }
    }
}
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,687
Записей в блоге: 29
29.08.2018, 08:18
Sielarok, знаешь значение слова некропост?
0
1 / 1 / 0
Регистрация: 29.08.2018
Сообщений: 2
29.08.2018, 11:09
Welemir1, к сожалению на тот момент я не обратил внимание на дату. И если мое действие вас хоть как-то задело
то извиняюсь.
0
0 / 0 / 0
Регистрация: 04.05.2019
Сообщений: 1
04.05.2019, 15:30
А зачем нам нужны последний строки с if и else ,если у нас уже проверятся условие beerNum>0?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class beerSong {
    public static void main(String [] args) {
     int beerNum =99;
     String word="бутылок(бутылки)";
     while (beerNum>0) {
         if (beerNum == 1) {
             word="бутылка";
         }
         System.out.println(beerNum+" "+word+" пива на стене");
         System.out.println(beerNum+" "+word+" пива");
         System.out.println("Возьми одну");
         System.out.println("Пусти по кругу");
         beerNum=beerNum -1;
         }
     System.out.println("Нет бутылок пива на стене");
 }
}
0
0 / 0 / 0
Регистрация: 16.06.2019
Сообщений: 1
16.06.2019, 11:17
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class BeerSong{
    public static void main(String[] args){
        int beerNum = 99;
        String word = "бутылок (бутылки)";
        
        while(beerNum > 0){
            if (beerNum == 1){
                word = "бутылка";
            }
            //System.out.println(beerNum + " " + word + " пива на стене");
            System.out.println(beerNum + " " + word + " пива");
            System.out.println("Возьми одну.");
            System.out.println("Пусти по кругу");
            beerNum = beerNum - 1;
            if(beerNum > 0){
                System.out.println(beerNum + " " + word + " пива на стене");
            }else{
                System.out.println("Нет бутылок пива на стене");
            }//конец else
        }//конец while
    }     //конец метода main
}//конец класса
Вот верный вариант, просто нужно было закомментировать 10 строку.

Знаю,что некропост, но вдруг кому поможет
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 1
15.07.2019, 11:31
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class BeerSong{
    public static void main(String[] args){
        int beerNum = 99;
        String word = "бутылок (бутылки)";
         System.out.println(beerNum + " " + word + " пива на стене");
        
        while(beerNum > 0){
            if (beerNum == 1){
                word = "бутылка";
            }
           
            System.out.println(beerNum + " " + word + " пива");
            System.out.println("Возьми одну.");
            System.out.println("Пусти по кругу");
            beerNum = beerNum - 1;
            if(beerNum > 0){
                System.out.println(beerNum + " " + word + " пива на стене");
            }else{
                System.out.println("Нет бутылок пива на стене");
            }//конец else
        }//конец while
    }     //конец метода main
}//конец класса
Beetlejuice1337, разрешите с вами не согласится, на мой взгляд надо сделать так, просто вынести 10 строку из цикла, её напишет один раз перед ним, тогда будет :
99 бутылок пива на стене
99 бутылок
возьми одну
пусти по кругу
98 бутылок пива на стене
98 бутылок
и т.д.
0
0 / 0 / 0
Регистрация: 09.03.2020
Сообщений: 1
09.03.2020, 10:33
Считаю вариант Gleb1524 самым правильным из всех предложенных, сам сделал немного по другому:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class BeerSong {
    public static void main (String[] args) {
        int beerNum = 99;
        String word = "bottles";
        
        while (beerNum > 0) {
            
            if (beerNum == 1) {
                word = "bottle";   // В единственном числе, 1 бутылка
            }
            
            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("No bottles of beer on the wall");
        }
    }
}
}
0
1 / 1 / 0
Регистрация: 04.05.2020
Сообщений: 12
04.05.2020, 20:19
Шел 2020 год, а люди все продолжали решать задачу Сьерра / Бейтс.

Я не хочу продолжать некропост, но у меня новый вопрос.

Сама задача, я скажу, довольно американиста. Сначала мне пришлось увидеть как звучит песня в оригинале, чтобы понять какие строки должны быть в принципе и исключить все другие идеи об ошибках, кроме как - окончание в слове "бутылка" для случая одной бутылки.

Сама ошибка, как уже сказали, заключалась в окончании для последней итерации. Когда остается одна бутылка

Согласен с решением и объяснением от Squater (18/05/15)потому что именно такое решение я и искал, имея дико ограниченные знания и зная, что это первое задание в книжке.
Но не понимаю, (ВО ПЕРВЫХ) что происходит с кодом при перестановки строки с условием if (beerNum ==1)word = "bytilka"; если поставить его после строки beerNum = beerNum - 1;

А точнее - Почему при такой перестановке, условие word = "bytilka"; начинает влиять и на ту часть кода, которая находится под if (beerNum > 0)

(ВО ВТОРЫХ) почему строка System.out.println(beerNum + " " + word + " piva."); находящаяся под while (beerNum > 0) { учитывается лишь один раз при первом прохождении кода?
А соседняя строка System.out.println("Vozmi odny."); учитывается каждый раз? (99 раз)

Также срока System.out.println(beerNum + " " + word + " piva na stene"); записанная после условия if (beerNum > 0) тоже прописывается в результате работы кода 98 раз.

Скрин пояснение приложен
Миниатюры
Head First Java (непонятный пример)  
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
04.05.2020, 23:55
Leroy354, открой отладчик и посмотри где и что происходит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2020, 23:55
Помогаю со студенческими работами здесь

Непонятный пример из книги Дейтел
#include &lt;stdio.h&gt; main() { int a, b, sum; /* объявление */ printf(&quot;Enter first integer\n&quot;); /*подсказка*/ ...

Непонятный пример экземпляра класса
Что значит? Выходит на 36 строке. Сам код public class delegate { private interface Graphics { void draw(); }

Наверно, в книге Head First Java ошибка
Здравствуйте. Читаю данную книгу в русском издании. В одном месте мне кажется ошибка. Там упражнение, я его решил и моё решение не...

Непонятный пример из книги Дейтел Как программировать на C++
Вот сделал скриншот. Хотя я точно так пишу, но выскакивает ошибка при компиляции. А почему? error: expected ',' or ';' before '{' token|

Head First Java , чем отличается первое издание от второго?
мб глупый вопрос , но быстро его загуглить не получилось. второе изданием как продолжение первой книги или просто по другому написанное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru