Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Задача с простым циклом


Автор: Zann 4.12.2009, 21:26
Всем привет.
Только недавно стал изучать языки программирования, а именно Ruby.
Осваиваю по книге Криса Пайна. Так вот, есть там задача:
Цитата

Напишите программу "Глухая бабуля". Что бы вы ни говорили бабуле (чтобы вы ни
вводили с консоли), она должна отвечать: АСЬ?! ГОВОРИ ГРОМЧЕ, ВНУЧЕК!, если
только вы не кричите ей (вводите слова заглавными буквами). Если вы кричите, она
вас слышит (или по крайней мере думает, что слышит) и вопит в ответ:
НЕТ, НИ РАЗУ С 1938 ГОДА! Чтобы сделать вашу программу действительно
правдоподобной, пусть бабуля кричит каждый раз другой год; например, любой
случайный год между 1930 и 1950. (Эта часть необязательная, и вам будет гораздо
легче, если вы прочтёте раздел о генераторе случайных чисел в Ruby в конце главы
о методах.) Вы не можете остановить разговор с бабулей, пока не прокричите ПОКА.

Бьюсь второй день, но программа не работает, как надо.
Код

puts 'Hello, grandson! WHAT DO YOU SAID?!'
years = 1938
years = years.to_s
reply = gets.chomp
while reply != 'BYE'
 if reply == reply.upcase
   puts 'NOT, EVEN ONCE SINCE ' + years + '!'
 else
   puts 'WHAT? I dont hear!'
   reply = gets
 end
end
puts 'Good Bye!'

С генерацией года не очень понятно в книге. rand не генерирует (1930-1950), либо я не умею, тк в книге про это нет.
Думал сделать иначе: 
Код

years = rand(31)
puts 'NOT, EVEN ONCE SINCE 19' + years + '!'
 
Но опять же, rand сгенерирует 1, а не 01 и год уже будет выглядет неправильно. Решил  пока присвоить точное значение.

С циклом тоже не все понятно. Если условие выполняется - он зависает. По логике, его надо закрыть, но если поставить end до else,
программа не работает... Запутался в общем. Не судите строго, пишу эти детсадовские программы пятый день. 

Автор: source777 4.12.2009, 21:37
1) years = 1930 + rand(20)
2) 10 и 11 строчки надо поменять местами

Автор: Pitlord 4.12.2009, 21:37
Цитата(Zann @  4.12.2009,  21:26 Найти цитируемый пост)
Но опять же, rand сгенерирует 1, а не 01 и год уже будет выглядет неправильно. Решил  пока присвоить точное значение.

Просто к сгенерированному прибавь 1900

Цитата(Zann @  4.12.2009,  21:26 Найти цитируемый пост)
С циклом тоже не все понятно. Если условие выполняется - он зависает.

Строка
Код

reply = gets

должна быть за пределами if ... else... :

Код

if reply == reply.upcase
   puts 'NOT, EVEN ONCE SINCE ' + years + '!'
 else
   puts 'WHAT? I dont hear!'
 end
 reply = gets


Добавлено через 21 секунду
Опоздал чуток

Автор: Zann 4.12.2009, 22:13
Огромное спасибо. 
Как я понял, while может содержать метод gets, а if-else не может?

Автор: Pitlord 4.12.2009, 22:16
Цитата(Zann @  4.12.2009,  22:13 Найти цитируемый пост)
Как я понял, while может содержать метод gets, а if-else не может? 

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

Автор: Zann 4.12.2009, 22:31
Понял, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)