дХОКНЛМШЕ ПЮАНРШ, ЙСПЯНБШЕ ОПНЕЙРШ МЮ ГЮЙЮГ, ЙНМРПНКЭМШЕ ПЮАНРШ МЮ ГЮЙЮГ

 

мЮВЕПРЮРЕКЭМЮЪ ЦЕНЛЕРПХЪ оПЮЙРХЙСЛ ОН ПЕЬЕМХЧ ГЮДЮВ цЕНЛЕРПХВЕЯЙНЕ ВЕПВЕМХЕ хМФЕМЕПМЮЪ ЦПЮТХЙЮ еяйд йПЮРМШЕ ХМРЕЦПЮКШ лЮРЕЛЮРХВЕЯЙХИ ЮМЮКХГ лЮРПХЖШ оПЕДЕКШ оПНХГБНДМШЕ бЕЙРНПМЮЪ ЮКЦЕАПЮ хМРЕЦПЮКЭМНЕ ХЯВХЯКЕМХЕ ртйо ъДЕПМЮЪ ТХГХЙЮ щКЕЙРПНЯРЮРХЙЮ лЮЦМЕРХГЛ нОРХЙЮ хМТНПЛЮЖХНММШЕ РЕУМНКНЦХХ

Предыдущий разделУровень вышеСледующий раздел

Операторы ветвления

Условный оператор, называемый также оператором выбора, позволяет в зависимости от истинности или ложности некоторого условия выполнять ту или иную последовательность команд.

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

Следует запомнить, что только false и nil трактуются как ложные в логическом контексте. Все остальное, что вычисляется, является истинным. Для того чтобы лучше понять смысл данного высказывания, выполните следующую программу:

 if 23 puts "23 есть ИСТИНА" 
end if "qq" puts "И любая строка есть ИСТИНА" end 

Ruby поддерживает все стандартные логические операторы, а также дополнительный оператор defined?. Для конъюнкции двух логических выражений используются and и &&. Их результат будет истинен только если инстинны оба операнда. Эти функции вычисляют второй операнд лишь тогда, когда первый истинен, а отличаются они только своим приоритетом (приоритет оператора and меньше &&).

В свою очередь результатом выполнения операторов or и || (дизъюнкции) будет истина, если хотя бы один из операндов истинен. Они вычисляют второй оператор только в том случае, если первый окажется ложным. Как и в случае с оператором and, оператор or имеет меньший приоритет по сравнению с || (отметим, что оператор and имеет приоритет, равный приоритету оператора or, в то время как приоритет && выше, чем у ||).

Операторы not и ! возвращают значение, противоположное своему аргументу (если аргумент истинен, то результат ложен, и наоборот). Между собой отличаются только приоритетом.

Оператор defined? возвращает nil, если его аргумент не определен, и его описание в противном случае. Ниже приведены примеры применения этого оператора.

 puts defined? 
1 puts defined? dummy puts defined? printf puts defined? (c, d = 1, 2) puts defined? 
42.abs 

В логических выражениях допускаются также следующие операции сравнения: ==<, <=, >=, >!=.

Синтаксис условного оператора if в языке Ruby аналогичен его синтаксису в большинстве других языков программирования.

 # Определение метода оценки величины выражения 
def howBigPrint(i) if i < 10 puts "Число #{i} меньше 10" elsif i < 20 puts "Число 
#{i} между 10 и 20" elsif i < 30 puts "Число #{i} между 20 и 30" else puts "Число 
#{i} больше или равно 30" end end # Использование метода ... howBigPrint(7); howBigPrint(15) 
howBigPrint(23); howBigPrint(105) 
Общая форма оператора if такова:
 if <логическое_выражение> [then] тело_оператора elsif <логическое_выражение> 
[then] тело_оператора ... else тело_оператора end 
Здесь <логическое_выражение> может быть любым фрагментом кода на языке Ruby, результатом вычисления которого является логическая величина (с учетом сказанного выше). Слово then отделяет тело оператора от условия. Запись его в квадратных скобках означает, что оно может быть опущено, если тело начинается с новой строки. Значение, возвращаемое оператором if, есть результат последнего вычисленного выражения. Изменим наш пример, чтобы продемонстрировать сказанное:
 # Метод оценки величины выражения # 
теперь возвращает строку def howBig(i) if i < 10 then "Аргумент меньше 10" elsif 
i < 20 then "Аргумент между 10 и 20" elsif i < 30 then "Аргумент между 20 и 30" 
else "Аргумент больше или равно 30" end end # Использование метода ... puts howBig(7); 
puts howBig(15) puts howBig(23); puts howBig(105) 

Для выполнения одного варианта из двух возможных используется следующая форма оператора if:

 if <логическое_выражение> [then] тело_оператора else тело_оператора 
end 
В следующем фрагменте сравнивается значение переменной i с числом 100.
 if i < 100 puts "Мало" else puts "Значительно больше" end 

Оператор if может использоваться в правой части оператора присваивания, например,

 str = if i < 100 then "Мало" else "Побольше" end puts str 

Для аналогичных целей используется и тернарный оператор

 логическое_выражение ? выражение1 
: выражение2 
Если логическое_выражение истинно, то выполняется выражение1, иначе - выражение2. Посмотрите на примеры использования этого оператора:
 i = 23 i < 100 ? puts("Мало") : puts("Значительно больше") 
i = 1234 s = i < 100 ? "Мало" : "Значительно больше" puts s 
Как видите, этот оператор особенно удобен, если требуется переменной присвоить одно из двух значений.


Пример
Напишите программу, определяющую четность введенного числа.

 print "Введите целое число: " a = gets.to_i str = a%2 == 0 ? "четно" 
: "нечетно" puts "Число #{a} " + str 

Если требуется выполнить последовательность операторов только в том случае, когда выполнено некоторое условие, то используется форма

 if <логическое_выражение> [then] тело_оператора end 
Для этих же целей можно использовать и модифицированный оператор if:
 выражение if <логическое_выражение> 
Ниже приводятся две версии фрагмента программы, использующей оператор if:
 if radiation > 3000 
puts "Радиационная опасность!" end # то же самое puts "Радиационная опасность!" 
if radiation > 3000 


Пример
Напишите программу, определяющую, является ли введенная фраза палиндромом (перевертышем).

 puts "Введите фразу:" 
a = gets.chop!.delete(' ') # удалили все пробелы a = a.tr('A-Z,А-Я', 'a-z,а-я') 
# замена букв на прописные str = "палиндром" str = "не " + str if a != a.reverse 
# проверка puts "Введенная фраза - " + str + "." 

При выборе из большего числа альтернатив удобнее использовать оператор case. Ниже приведен его общий вид (части, заключенные в квадратные скобки, могут быть опущены).

 
case <выражение> when <тест1> [then] ... when <тест2> [then] 
... when <тестN> [then] ... [else ... ] end 
В операторе case<выражение> последовательно сравнивается с выражениями <тест> до тех пор пока, оно не совпадет с одним из них (сравнение производится при помощи операции ==), после чего выполняется соответствующий фрагмент кода. Оператор case возвращает значение последнего вычисленного выражения, или nil, если такого не было.
 s = case i when 0 .. 9 "однозначное" when 10 .. 99 "двузначное" when 100 
.. 999 "трехзначное" else "огромное" end puts "Введено #{s} число." 
Здесь мы снова воспользовались оператором .. (двоеточие), который возвращает список целых чисел, заключенных между левым и правым операндами (включая их самих).

(Загрузить файл с примерами)


Задания

  1. Напишите программу, печатающую максимальное и минимальное из трех введенных чисел.
  2. Напишите программу, печатающую название месяца по порядковому номеру.

Предыдущий разделУровень вышеСледующий раздел