Практическая информатика

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


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

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.7.

(html, txt)

Задания

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




Оператор case возвращает значение последнего вычисленного выражения, или nil, если такого не было.

s = case i when 0 .. 9 "однозначное" when 10 .. 99 "двузначное" when 100 .. 999 "трехзначное" else "огромное" end puts "Введено #{s} число."

Здесь мы снова воспользовались оператором .. (двоеточие), который возвращает список целых чисел, заключенных между левым и правым операндами (включая их самих).

#!/usr/bin/env ruby if 23 puts "23 есть ИСТИНА" end

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

# Определение метода оценки величины выражения 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) puts

# Метод оценки величины выражения # теперь возвращает строку 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)

puts i = 23 i < 100 ? puts("Мало") : puts("Значительно больше") i = 1234 s = i < 100 ? "Мало" : "Значительно больше" puts s

puts "Перевертыш"

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

print "Введите неотрицательное целое число: " i= gets.to_i s = case i when 0 .. 9 "однозначное" when 10 .. 99 "двузначное" when 100 .. 999 "трехзначное" else "огромное" end puts "Введено #{s} число."

Пример 1.7.

Задания

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



Содержание раздела