99 бутылок пива

Для всех любителей и профессионалов этого нелегкого дела.

Модераторы: Почётные модераторы, Модераторы "Программирование"

99 бутылок пива

Сообщение black_c » 29 июн 2016, 16:59

Начал изучать java, дошел до всем известного задания про 99 бутылок пива.

Вот мой код

Изображение

Вот командная строка

Изображение

Вопрос на миллион долларов: почему отсчет начинается с 59? Кодировку Notepad++ менял (ANSU-UTF8). При чем первые две строки, которые не должны там быть, пропадают, когда я начинаю отсчет с меньшего числа. Я так понимаю консоль считает только до 59, как исправить?

Не быть мне программистом...
Аватара пользователя
black_c
 
Сообщения: 299
Зарегистрирован: 21 авг 2011, 18:35

Re: 99 бутылок пива

Сообщение [Psycho]-Fox » 29 июн 2016, 19:21

Я бы так написал (Если я правильно понял задание, которого гугл так и не выдал мне...).
Код, правда, на C#, но главное - логика.
Код: Выделить всё
using System;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int beerCount = 99;
            string bottle;

            while (beerCount > 0)
            {
                switch (beerCount % 10) // Остаток от деления на 10, тоесть последний символ числа
                {
                    case 1: bottle = "бутылка"; break;
                    case 2:
                    case 3:
                    case 4: bottle = "бутылки"; break;  // Один код для чисел 2, 3 и 4
                    default: bottle = "бутылок"; break; // Для всего остального
                }

                Console.WriteLine("{0} {1} пива на стене...", beerCount, bottle);
                Console.WriteLine("{0} {1} пива!", beerCount, bottle);
                Console.WriteLine("Возьми одну - пусти по кругу!");
                beerCount--; // "--" означает, что число будет уменьшено на 1. Увеличить - "++" соответственно.
                Console.WriteLine("{0} {1} пива на стене...", beerCount, bottle);
                Console.WriteLine();    // Разделитель куплетов
                Thread.Sleep(100);      // Чтобы печаталось с небольшой задержкой а не 300+ строк в одно мгновение
            }
            Console.WriteLine("Пива больше не осталось и похоже мы нажрались...");
            Console.ReadKey();  // Ткни любую кнопку для закрытия окна.
        }
    }
}
Последний раз редактировалось [Psycho]-Fox 13 июл 2016, 17:47, всего редактировалось 3 раз(а).
Skype: Fox_experience
Аватара пользователя
[Psycho]-Fox
Почётный пользователь
 
Сообщения: 2704
Зарегистрирован: 18 май 2010, 11:54

Re: 99 бутылок пива

Сообщение black_c » 29 июн 2016, 19:24

Красивый компактный код, скорей бы так научиться делать, но вопрос был совершенно в другом, что у меня с командной строкой Windows?
Аватара пользователя
black_c
 
Сообщения: 299
Зарегистрирован: 21 авг 2011, 18:35

Re: 99 бутылок пива

Сообщение DreamerX » 29 июн 2016, 19:26

есть же пошаговый мониторинг значений и выполнения строк. наблюдай, увидишь где криво идёт
Поставки электроники для бизнеса и развлечений. МагМаркет http://magmarket.net
Аватара пользователя
DreamerX
 
Сообщения: 3445
Зарегистрирован: 01 ноя 2007, 16:45
Откуда: МагМаркет

Re: 99 бутылок пива

Сообщение [Psycho]-Fox » 29 июн 2016, 19:47

Поправил код в предыдущем сообщении.
Получилось такое:
beerCount.jpg
Skype: Fox_experience
Аватара пользователя
[Psycho]-Fox
Почётный пользователь
 
Сообщения: 2704
Зарегистрирован: 18 май 2010, 11:54

Re: 99 бутылок пива

Сообщение [Psycho]-Fox » 29 июн 2016, 19:52

Собственно, цикл switch равносилен такой конструкции:
Код: Выделить всё
if (wordEnd == 1)
    bottle = "бутылка";
else if (wordEnd > 2 && wordEnd < 4)
    bottle = "бутылки";
else
    bottle = "бутылок";

... Строго говоря примерно в это и превращяется switch, когда преобразовывается в машинный код, если мне память не изменяет...
Skype: Fox_experience
Аватара пользователя
[Psycho]-Fox
Почётный пользователь
 
Сообщения: 2704
Зарегистрирован: 18 май 2010, 11:54

Re: 99 бутылок пива

Сообщение black_c » 29 июн 2016, 20:01

Ребят, еще раз: проблема в том, что консоль показывает отсчет с 59, а отсчет должен идти с 99, причем первые две строчки "Возьми одну." и "Пусти по кругу." в ней появляются, когда значение переменной больше или равно этой самой заветной цифры 59, стоит уменьшить значение и они исчезают. Там полторы строчки кода, тем более скопипастено с учебника, то есть проблема не в нем (согласитесь?), а видимо в битой кодировке командной строки или я даже не знаю.

Изображение
Аватара пользователя
black_c
 
Сообщения: 299
Зарегистрирован: 21 авг 2011, 18:35

Re: 99 бутылок пива

Сообщение black_c » 29 июн 2016, 20:04

DreamerX писал(а):есть же пошаговый мониторинг значений и выполнения строк. наблюдай, увидишь где криво идёт

Где именно? Если речь про IDE, я пока только с NotePad++ да с командной строкой балуюсь, ошибок никаких не выдает. Кстати в IDE Eclipse все нормально отображается, начиная с 99...
Аватара пользователя
black_c
 
Сообщения: 299
Зарегистрирован: 21 авг 2011, 18:35

Re: 99 бутылок пива

Сообщение [Psycho]-Fox » 29 июн 2016, 20:07

Дык это не ошибка, а ограничение буфера консоли (Отображает только последние 64 строки или около того).
Ну а так как в коде нет никакой задержки - то все строки отображаются менее чем за секунду, оттого и кажется, что глюк (Я для этого добавил строку Thread.Sleep(100); - Тоесть задержка в 0.1 секунды между выводом четверостиший)
Skype: Fox_experience
Аватара пользователя
[Psycho]-Fox
Почётный пользователь
 
Сообщения: 2704
Зарегистрирован: 18 май 2010, 11:54

Re: 99 бутылок пива

Сообщение black_c » 29 июн 2016, 20:44

Раздул буфер до неимоверных размеров, результат тот же...

Изображение
Аватара пользователя
black_c
 
Сообщения: 299
Зарегистрирован: 21 авг 2011, 18:35

Re: 99 бутылок пива

Сообщение [Psycho]-Fox » 29 июн 2016, 20:53

Это винда - ей плевать.
В любом случае - это не косяк вашей проги, а ограничение системной консоли, не способной отображать более 50 (+/-) строк текста.
Сделай вывод в файл - там будет всё. 100%.
Skype: Fox_experience
Аватара пользователя
[Psycho]-Fox
Почётный пользователь
 
Сообщения: 2704
Зарегистрирован: 18 май 2010, 11:54

Re: 99 бутылок пива

Сообщение ddo » 30 июн 2016, 08:05

Автор, можно пошагово выполнить приложение в отладчике, или поставить в цикле Thread.sleep(1000) и наблюдать за замедленным выводом.
Для неформального общения - @ddomgn
Аватара пользователя
ddo
 
Сообщения: 3190
Зарегистрирован: 17 сен 2007, 11:33

Re: 99 бутылок пива

Сообщение black_c » 30 июн 2016, 11:52

Да, с Thread.sleep(1000) начал с 99-ой. Но по окончании вывода опять остались только последние 59 бутылок... т.е. консоль обрубает "лишние строки". И опять две первые строчки вылезли ("Возьми одну." "Пусти по кругу.")

Изображение

Изображение
Аватара пользователя
black_c
 
Сообщения: 299
Зарегистрирован: 21 авг 2011, 18:35

Использование ссылок

Сообщение black_c » 06 июл 2016, 17:47

Дошел до задания с использованием ссылочных переменных.

Вот код

Изображение

Вот консоль

Изображение

Откуда появился null, у меня же нет пустой ссылки, все ведут на свои объекты, ткните носом. И почему строка с null вышла раньше этой - "Имя последней собаки - " ?
Аватара пользователя
black_c
 
Сообщения: 299
Зарегистрирован: 21 авг 2011, 18:35

Re: 99 бутылок пива

Сообщение Naevus » 06 июл 2016, 21:05

в 7 строке у тебя что происходит?
Личный раздел- Список недругов- pater_leo - Выбрать отмеченных- Отправить- Да
Аватара пользователя
Naevus
Модератор
 
Сообщения: 10681
Зарегистрирован: 24 сен 2007, 21:52
Откуда: Магнитогорск

Re: 99 бутылок пива

Сообщение black_c » 06 июл 2016, 21:45

Ок, вижу, спасибо.
Аватара пользователя
black_c
 
Сообщения: 299
Зарегистрирован: 21 авг 2011, 18:35

Re: 99 бутылок пива

Сообщение [Psycho]-Fox » 07 июл 2016, 17:37

Заметка: Если обращаешся к чемуто внутри класса желательно писать "this.something" (this - ссылка на текущий класс).
А можно вообще писать имя переменной/функции, копилятор будет искать её в текущем классе, а уже потом среди всех переменных в пределах текущего пространства имён (namespace).

И конструкция "class dog { ... var some = new dog(); ... }" - Немного некорректна (Содание объекта внутри этого же самого объекта, при том что класс, по сути, ещё не описан / не весь код класса). Да, компилятор умный, и проглотит такое не подавившись, но вот в интерпритируемых языках (JavaScript, PHP, Python и тп.) такое уже не прокатит, т.к. код выполняется по ходу чтения из файла.
Или в коде ошибка и пропущена закрывающая скобка?
Код: Выделить всё
class dog {
  string Name;
}

public static void main (String[] args) {
...

Кстати, можно делать интереснее:
Код: Выделить всё
class Dog {
  public string Name;
  Dog (string name) {
    this.Name = name;
  }
}

void main ... {

Dog myDogs[] = new Dog[3]; // Вообще тут можно динамический список использовать ( List(); ), но, видимо, до него ещё не дошли.
myDogs[0] = new Dog("Собака 1");
myDogs[1] = new Dog("Собака 2");
myDogs[2] = new Dog("Собака 3");

// Или более продвинутый вариант:
Dog myDogs[] = new Dog[] {
      new Dog("Собака 1"),
      new Dog("Собака 2"),
      new Dog("Собака 3")
};
// Java умная, сама определит размер массива.
}

В общем - годные уроки есть ещё на http://www.javable.com/tutorials/fesunov/
Skype: Fox_experience
Аватара пользователя
[Psycho]-Fox
Почётный пользователь
 
Сообщения: 2704
Зарегистрирован: 18 май 2010, 11:54

Re: 99 бутылок пива

Сообщение black_c » 12 июл 2016, 15:39

Есть задание: вывести на консоль указанное число случайных чисел.
Ничего лучше не придумал, как создать массив из n элементов, которые вводит пользователь, т.е.

Изображение

Получаем

Изображение

У нас значение этих рандомных чисел ограничено длиной массива, а как сделать так, чтобы выводилось ЛЮБОЕ число (в пределах значений, соответствующих int)?
Аватара пользователя
black_c
 
Сообщения: 299
Зарегистрирован: 21 авг 2011, 18:35

Re: 99 бутылок пива

Сообщение Naevus » 12 июл 2016, 16:40

Рандом вообще то возвращает значение от 0 до 1. В 17 сроке ты умножаешь это значение на n, что переводит генерируемые значения в интервал от 0 до n. И потом приводишь к целому.
Слабо понимаю, что означает "ЛЮБОЕ число (в пределах значений, соответствующих int)", но если тебе надо изменить пределы - умножай не на n, а на необходимый предел (видимо - на предел int? Сколько он в этом языке - не знаю).

ps Массив в данном случае вообще не нужен - можно же сразу в консоль кидать результат рандома. или это требование ТЗ?
Личный раздел- Список недругов- pater_leo - Выбрать отмеченных- Отправить- Да
Аватара пользователя
Naevus
Модератор
 
Сообщения: 10681
Зарегистрирован: 24 сен 2007, 21:52
Откуда: Магнитогорск

Re: 99 бутылок пива

Сообщение black_c » 12 июл 2016, 16:50

Naevus писал(а):ps Массив в данном случае вообще не нужен - можно же сразу в консоль кидать результат рандома. или это требование ТЗ?


А как мне вывести количество вводимых пользователем переменных, не применяя массив?
Аватара пользователя
black_c
 
Сообщения: 299
Зарегистрирован: 21 авг 2011, 18:35

След.

Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron