Выбрать главу

end

write = left

# Сколько единиц осталось вывести?

left = 0

# Вычтем эти единицы.

if write > 0

if write

= = 1

numString

= numString + 'one'

elsif write

= = 2

numString

= numString + 'two'

elsif write

= = 3

numString

= numString + 'three'

elsif write

= = 4

numString

= numString + 'four'

elsif write ==

5

numString = numString + 'five'

elsif write ==

6

numString = numString + 'six'

elsif write ==

7

numString = numString + 'seven'

elsif write ==

8

numString = numString + 'eight'

elsif write ==

9

numString = numString + 'nine'

end

end

if

numString == '

'

# Только в одном случае «numString» может быть пустой -

# если «number

” равно 0.

return 'zero'

end

#

Если мы дошли

досюда, то у нас имеется число где-то

#

между 0 и 100,

поэтому нам нужно вернуть «numString».

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)

zero

nine

ten

eleven

seventeen

thirty-two

eighty-eight

ninety-nine

one hundred

И всё-таки, определённо имеется несколько моментов в этой программе, которые мне не нравятся. Во-первых, в ней слишком много повторений. Во-вторых, она не обрабатывает числа больше 100. В-третьих, в ней слишком много особых случаев, слишком много возвратов по return. Давайте используем несколько массивов и попробуем её немного подчистить:

def englishNumber number

if number < 0 # Без отрицательных чисел.

return 'Пожалуйста, введите неотрицательное число.'

end

if number == 0

return 'zero'

end

# Больше нет особых случаев! Больше нет возвратов по return!

numString = '' # Эту строку мы будем возвращать.

# единицы

onesPlace =['one', 'two', 'three', 'four', '

five',

'six', 'seven', 'eight', 'nine']

# десятки

tensPlace =['ten', 'twenty', 'thirty', 'forty',

'fifty',

'sixty', 'seventy', 'eighty', 'ninety']

teenagers =['eleven', 'twelve', 'thirteen', 'fourteen',

'fifteen',

# «left» – сколько от числа нам ещё осталось вывести.

# «write» – часть числа, которую мы выводим сейчас.

# write и left… поняли? :) left = number

write = left/ЮО # Сколько сотен осталось вывести?

left = left – write*100 # Вычтем эти сотни.

if write > О

# Вот здесь действительно хитрый фокус: hundreds = englishNumber write

numString = numString + hundreds + ' hundred'

# Это называется «рекурсия». Так что же я только что сделал?

# Я велел этому методу вызвать себя, но с параметром «write» вместо

# «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' (хотя все три значения правильные). В сущности, вы можете сделать это прямо сейчас…