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

Эти подсказки помогут вам писать программы с ветвлением, но они также помогут освоить другой основной тип управления выполнением:

Циклы

Довольно часто вам может захотеться, чтобы ваш компьютер выполнял одно и то же снова и снова – в конце концов, предполагается, что именно этим компьютеры занимаются лучше всего.

Когда вы говорите вашему компьютеру повторять что-либо, вам также нужно сказать ему, когда остановиться. Компьютеру никогда не может наскучить, поэтому если вы не скажете ему остановиться, он и не остановится. Мы можем быть уверены, что подобное не случится, если скажем компьютеру повторять отдельные части программы пока (while) определённое условие является истинным. Это работает очень похоже на то, как работает if:

command = ' ' while command != 'пока' puts command command = gets.chomp end

puts 'Приходите ещё!'

Ау?

Ау?

Привет!

Привет!

Рад

познакомиться.

Рад

познакомиться.

О..,

как приятно!

пока

Приходите ещё !

Вот это и есть цикл. (Вы, наверное, заметили пустую строку в в начале вывода; она – от первого puts, перед первым gets. Как бы вы изменили программу, чтобы избавиться от этой пустой строки? Проверьте её! Она работает в точности, как программа выше, не считая первой пробельной строки?)

Циклы позволяют вам делать самые разные интересные вещи, какие только можно себе вообразить. Они, однако, могут также вызвать и неприятности, если вы сделаете ошибку. Что если ваш компьютер попадётся в ловушку бесконечного цикла? Если вы думаете, что именно так, возможно, и случилось, то просто, удерживая клавишу Ctrl, нажмите на клавишу с. [Это прервёт выполнение вашей программы. – Прим. перев.]

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

Чуть-чуть логики

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

puts 'Привет, как Вас зовут?' name = gets.chomp puts 'Привет, ' + name + '.' if name == 'Chris'

puts 'Какое милое имя!' else

if name == 'Katy'

puts 'Какое милое имя!' end end

Привет, как Вас зовут?

Katy

Привет, Katy. Какое милое имя!

Ну да, она работает… но это не очень-то красивая программа. Почему не очень? Ну, потому, что лучшее правило, которое я когда-либо узнал в программировании, – это правило DRY (Don't Repeat Yourself), то есть «Не повторяйся!» Возможно. я бы мог написать небольшую книгу только о том, почему это такое хорошее правило. В нашем случае, мы повторили строку puts 'Какое милое имя! '. Почему это так важно? Ладно, а что если я сделал опечатку, когда переписывал её? Что если я хотел изменить с 'милое' на 'прекрасное' в обеих строках? Я же ленивый, помните? По сути, если я хочу, чтобы программа делала одно и то же, когда она получает 'Chris ' или ' Katy ', тогда она должна действительно делать одно и то же:

puts 'Привет, как Вас зовут?' name = gets.chomp

puts 'Привет, ' + name + '.' if (name == 'Chris' or name == 'Katy')

puts 'Какое милое имя!' end

Привет, как Вас зовут?

Katy

Привет, Katy.

Какое милое имя!

Гораздо лучше. Чтобы заставить это заработать, я применил or. Другие логические операции это and и not. [«ИЛИ», «И» и «НЕ» – Прим. перев.] И когда работаешь с ними, лучшим решением будет всегда использовать скобки. Давайте посмотрм, как они работают:

iAmChris = true

iAmPurple = false

iLikeFood = true

iEatRocks = false

puts

(iAmChris

and

iLikeFood)

puts

(iLikeFood

and

iEatRocks)

puts

(iAmPurple

and

iLikeFood)

puts

(iAmPurple

and

iEatRocks)

puts

puts

(iAmChris

or

iLikeFood)

puts

(iLikeFood

or

iEatRocks)

puts

(iAmPurple

or

iLikeFood)

puts (iAmPurple or iEatRocks) puts

puts (not iAmPurple)

puts (not iAmChris )

true

false

false

false

true

true

true

false

true

false

Единственная из них, которая может обмануть вас, – это операция or. В английском языке мы часто используем «or» в значении «один или другой, но не оба». Например, ваша мама могла бы сказать: «На десерт ты можешь съесть торт или пирожное». Она не предполагала, что вы можете съесть и то и другое! Компьютер, напротив, использует or в значении «один или другой или оба». (Другой способ выразить это: «по крайней мере, один из них – истинный».) Вот почему с компьютерами гораздо веселее, чем с мамами.

Попробуйте ещё кое-что

• «99 бутылок пива на стене…» Напишите программу, которая печатает стихи этой излюбленной классической походной песни: «99 бутылок пива на стене».

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

Подсказка: Не забывайте о chomp/ ' пока ' с символом Enter это не то же самое, что ' пока ' без него/

Подсказка 2: Попробуйте обдумать, какие части вашей программы должны происходить снова и снова. Все они должны находиться внутри цикла while.

• Улучшите вашу программу «Глухая бабуля»: Что если бабуля не хочет, чтобы вы уходили? Когда вы кричите пока, она может притвориться, что не слышит вас. Измените вашу предыдущую программу так, чтобы вам нужно было прокричать пока три раза в одной строке. Удостоверьтесь в правильности вашей программы: если вы прокричите пока три раза, но не в одной строке, вы должны дальше разговаривать с бабулей.