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

 

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

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

Библиотеки

Язык 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 
Обратите внимание на использование форматного вывода в данной программе.

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


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