# «number». Помните, что «write» это (в настоящий момент) число
# сотен, которые нужно вывести. Прибавив «hundreds» к «numString»,
# мы добавляем после неё строку ' hundred'. Так, например, если
# мы сначала вызвали englishNumber с 1999 (т.е. «number» = 1999),
# затем в этой точке «write» будет равен 19, а «left» равен 99.
# Наиболее лениво в этом месте было бы заставить englishNumber
# вывести нам 'nineteen', а затем мы выведем ' hundred',
# и потом оставшаяся часть englishNumber выведет 'ninety–nine'.
if left > О
# Так, мы не выводим 'two hundredfifty-one'… numString = numString + ' ' end end
write = left/Ю # Сколько десятков осталось вывести?
left = left – write*10 # Вычтем эти десятки.
numString
end
puts
englishNumber(
0)
puts
englishNumber(
9)
puts
englishNumber(
10)
puts
englishNumber(
11)
puts
englishNumber(
17)
puts
englishNumber(
32)
puts
englishNumber(
88)
puts
englishNumber(
99)
puts
englishNumber(100)
puts
englishNumber(101)
puts
englishNumber(234)
puts
englishNumber(3211)
puts
englishNumber(999999)
puts
englishNumber(1000000000000)
zero
nine
ten
eleven
seventeen
thirty-two
eighty-eight
ninety-nine
one hundred
one hundred one
two hundred thirty-four
thirty-two hundred eleven
ninety-nine hundred ninety-nine hundred ninety-nine one hundred hundred hundred hundred hundred hundred
Ааааа…. Это гораздо, гораздо лучше. Программа довольно компактная, вот почему я добавил в неё так много комментариев. Она даже работает с большими числами… хотя не совсем так хорошо, как можно было надеяться. Например, я полагаю, для последнего числа было бы гораздо лучше вернуть значение 'one trillion', или даже 'one million million' (хотя все три значения правильные). В сущности, вы можете сделать это прямо сейчас…
Попробуйте ещё кое-что
• Доработайте englishNumber. Во-первых, добавьте тысячи. Так она должна возвращать ' one thousand ' вместо ' ten hundred ', а также ' ten thousand ' вместо 'one hundred hundred'.
• Ещё доработайте englishNumber. Теперь добавьте миллионы, чтобы вам возвращалось ' one million ' вместо ' one thousand thousand '. Затем попробуйте добавить миллиарды и триллионы. Насколько далеко вы сможете зайти?
• А как насчёт weddingNumber? Она должна работать почти также, как englishNumber, но только она должна вставлять повсюду слово «and», возвращая что-то наподобие ' nineteen hundred and seventy and two ', или как там это должно выглядеть в приглашениях на свадьбу? Я бы привёл вам больше примеров, но я сам не совсем это понимаю. Вам возможно, понадобится обратиться за помощью к устроителю свадеб.
• «Девяносто девять бутылок пива…” Используя englishNumber и вашу старую программу, напечатайте стихи этой песни, на этот раз правильно. Накажите ваш компьютер: пусть она начнётся с 9999. (Однако не задавайте слишком большое число, так как выводить всё это на экран займёт у компьютера достаточно много времени. Сто тысяч бутылок пива занимает приличное время; а если вы зададите миллион, вы накажете и себя тоже!
Мои поздравления! К этому моменту, вы стали настоящим программистом! Вы изучили всё, что нужно, чтобы составлять огромные программы с чистого листа. Если у вас есть идеи, какие бы программы вы сами хотели бы написать, попробуйте воплотить их!
Конечно, составлять всё с чистого листа может оказаться довольно медленным процессом. Зачем же тратить время на написание кода, который кто-то уже написал? Вы бы хотели, чтоб ваша программа оправляла электронную почту? Вы бы хотели сохранять и загружать файлы на свой компьютер? А как насчёт генерирования web- страниц для учебника, где примеры кода в самом деле выполняются каждый раз, когда загружается страница? ;) В Ruby есть много различных видов объектов, которые мы можем использовать и которые помогут нам писать программы лучше и быстрее.
9. Классы