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

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

06.04.2013, 13:47. Показов 33627. Ответов 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
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru