йНМЯОЕЙР ОН МЮВЕПРЮРЕКЭМНИ ЦЕНЛЕРПХХ хМФЕМЕПМЮЪ ЦПЮТХЙЮ юПУХРЕЙРСПЮ щбл хМТНПЛЮРХЙЮ Х ХМТНПЛЮЖХНММШЕ РЕУМНКНЦХХ

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

Библиотеки

Язык Ruby поставляется с большой и полезной библиотекой модулей и классов. С понятием класса мы уже немного познакомились, а модули представляют собой некоторый способ группирования вместе методов, классов и констант, на котором мы сейчас не будем останавливаться. В этом разделе нас будет интересовать применение библиотечных модулей и классов.

Для того чтобы воспользоваться каким-либо методом одного из модулей, следует указать имя модуля (оно так же, как и имя класса начинается с заглавной функции), а затем через точку имя метода, например, Math.sqrt(2). Для обращения к константе следует отделить ее имя от имени модуля или класса двоеточием. В случае, когда приходится использовать методы одного модуля несколько раз, удобнее подключить нужный модуль при помощи оператора include, что позволит использовать вызов метода без указания имени модуля:

 puts Math.sqrt(2); puts Math::PI 
# или include Math puts sqrt(2); puts PI 

Начнем с описания модуля Math, который содержит методы для работы с математическими функциями и две константы, задающие числа пи - PI и е - E.

МетодНазначение метода
cos(x), sin(x)
и tan(x)
Возвращают косинус, синус и тангенс числа x, заданного в радианах
atan2(y, x)Возвращает арктангенс дроби y/x, где x и y заданы в радианах и заключены в диапазоне от -PI до PI
exp(x)Возвращает число е, возведенное в степень x
log(x)Возвращает натуральный логарифм числа x>0
log10(x)Возвращает логарифм числа x>0 по основанию 10
sqrt(x)Возвращает квадратный корень из неотрицательного числа x

Другим полезным модулем является Enumerable, позволяющий вызывать методы, связанные с перечислением, поиском и сортировкой информации. Продемонстрируем работу с ним на примерах. Для вывода будем использовать оператор p.

 
include Enumerable # получить квадраты целых чисел от 1 до 4 a1 = (1..4).collect 
{|i| i*i } # тоже самое a2 = (1..4).map {|i| i*i } p a1, a2 # выдать четыре раза 
строку "cat" b = (1..4).collect { "cat" } p b # найти первое вхождение числа, 
# которое делится и на 5 и на 7 # поиск среди чисел от 1 до 10 - таких нет c = 
(1..10).detect {|i| i % 5 == 0 and i % 7 == 0 } p c # поиск среди чисел от 1 до 
100 - первым найдено число 35 c1 = (1..100).detect {|i| i % 5 == 0 and i % 7 == 
0 } # то же самое c2 = (1..100).find {|i| i % 5 == 0 and i % 7 == 0 } p c1, c2 
# найти все вхождения чисел, которые делятся и на 5 и на 7 c = (1..100).find_all 
{|i| i % 5 == 0 and i % 7 == 0 } p c # найти все целые числа, кратные 3 и не превышающие 
10 d1 = (1..10).find_all {|i| i % 3 == 0 } # то же самое d2 = (1..10).select {|i| 
i % 3 == 0 } # и, наоборот, удалить все целые числа, кратные 3 d3 = (1..10).reject 
{|i| i % 3 == 0 } p d1, d2, d3 # преобразовать объект перечисляемого типа в массив 
l = 1..10; p l.to_a # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

Этот модуль содержит также методы max - нахождение максимального значения, min - минимального и метод sort, выполняющий сортировку. Их можно применять ко всем объектам, которые можно сравнивать между собой - числам, строкам и т. п.

 puts "Максимум чисел #{1..10} равен #{(1..10).max}" # сортировка по убыванию 
p ((1 .. 8).sort { |i,j| j<=>i}) # [8, 7, 6, 5, 4, 3, 2, 1] # минимальный элемент 
массива a1 = %w(albatross dog horse) p a1.min # albatross 
А вот так можно определить самую длинную строку в массиве:
 puts a1.max {|a,b| a.length <=> 
b.length } # albatross 

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


Пример
Сохраните приведенную ниже программу печати тригонометрических функций в файле trig.rb и выполните ее. При вводе данных можно использовать константу PI и математические операции, например, -3*PI/4.

 include Math print "Введите угол x в радианах: " y = gets.chop! 
print "x=", y x = eval y print "\nБезформатный вывод:\tcos(x)= #{cos(x)}\n" print 
"\nПечать с 4-мя знаками после", " запятой (как в таблицах Брадиса)\n" printf 
"cos(x)=%1.4f\n", cos(x) printf "\nx=%s: cos(x)= %1.4f\tsin(x)=%1.4f\t", y, cos(x), 
sin(x) if cos(x).abs < 0.0001 print "tg не сущ.\t" else printf "tg(x)=%1.4f\t", 
tan(x) end if sin(x).abs < 0.0001 print "ctg не сущ.\n\n" else printf "ctg(x)=%1.4f\n\n", 
cos(x)/sin(x) end 

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


Пример
Следующая программа печатает значения тригонометрических функций для углов от -180 градусов до 180 с шагом 15 градусов.

 include Enumerable, Math # составили список чисел от -PI до PI с шагом PI/12 
a = (-12 .. 12).map {|i| i.to_s + "*PI/12"} # печать заголовка print "Угол\t Синус\t 
Косинус\t Тангенс\t Котангенс\n" for i in a.reverse # для печати в убывающем порядке 
x = eval i printf "%4s\t%9.4f\t%9.4f\t", eval(i + "*(15*12/PI)").round, # радианы 
-> градусы sin(x), cos(x) if cos(x).abs < 0.0001 then print " не сущ.\t" else 
printf "%9.4f\t", tan(x) end if sin(x).abs < 0.0001 then print " не сущ.\n" else 
printf "%9.4f\n", cos(x)/sin(x) end end 
Обратите внимание на использование форматного вывода в данной программе.

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


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

мЮВЕПРЮРЕКЭМЮЪ ЦЕНЛЕРПХЪ Х ХМФЕМЕПМЮЪ ЦПЮТХЙЮ, ОЕПЯОЕЙРХБЮ