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

он должен прокричать в ответ:

ЧТО ЗНАЧИТ: «Я ХОЧУ ПОВЫШЕНИЯ ЗАРПЛАТЫ.»?!? ВЫ УВОЛЕНЫ!!

• А вот здесь для вас есть кое-что, чтоб ещё поиграть с center, ljust и rjust: напишите программу, которая будет отображать «Содержание» так, чтобы это выглядело следующим образом:

Содержание

Глава 1: Числа page 1

Глава 2 :

Буквы

page 72

Глава 3:

Переменные

page 118

Высшая математика

(Этот раздел – совершенно необязательный. Он предполагает некоторый уровень математических знаний. Если вам не интересно, вы можете без малейших затруднений перейти прямо к Управлению выполнением. Однако, быстрый взгляд на раздел о случайных числах может весьма пригодиться.)

Числовых методов не настолько много, как строковых методов (хотя я всё равно не держу их все в своей голове). Здесь мы рассмотрим оставшиеся арифметические методы, генератор случайных чисел и объект Math с его тригонометрическими и трансцендентальными методами.

Снова арифметика

Ещё два арифметических метода – это ** (возведение в степень) и % (деление по модулю). Так что, если вы хотите сказать на Ruby «пять в квадрате», вы просто запишите это как 5**2. Вы также можете использовать в качестве степени числа с плавающей точкой, так что если вам нужен квадратный корень из пяти, вы можете написать 5**0.5. Метод % (деление по модулю) выдаёт остаток от деления на число. Так, например, если я разделю 7 на 3, то получу 2 и 1 в остатке. Давайте посмотрим, как это работает в программе:

puts 5**2 puts 5**0.5 puts 7/3 puts 7%3

puts 365%7

Из последней строки мы узнали, что любой (не високосный) год состоит из некоторого количества недель плюс один день. Так что, если ваш день рождения был во вторник в этом году, на следующий год он будет в среду. Вы также можете применять в методе деления по модулю числа с плавающей точкой. В основном, он выполняет вычисления наиболее возможным осмысленным способом… но я предоставляю вам самим поиграть с этим.

Остаётся упомянуть ещё один метод прежде, чем мы проверим работу генератора

случайных чисел: abs. Он просто берёт абсолютное значение указанного числа:

puts((5–2).abs) puts((2–5).abs)

3

3

Случайные числа

Ruby поставляется с довольно хорошим генератором случайных чисел. Метод, возвращающий случайно выбранное число, называется rand. Если вы вызовете rand как есть (без аргументов), вы получите дробное число, большее или равное 0.0 и меньшее 1.0. Если вы дадите методу rand целое (например, 5), он вернёт вам целое число, большее или равное 0 и меньшее, чем 5 (то есть одно из пяти возможных чисел, от 0 до 4).

Давайте посмотрим rand в действии. (Если вы перезагрузите эту страницу [на оригинальном англоязычном сервере – Прим. перев.], то эти числа будут каждый раз другими. Вы ведь знали, что я на самом деле выполнял все эти программы, не так ли?)

puts rand puts rand puts rand puts(rand(100)) puts(rand (100)) puts(rand(100)) puts(rand(1)) puts(rand(1)) puts(rand (1))

puts(rand(99999999999999999999999999999999999999999999999999999999999))

puts('Синоптик сказал, что с вероятностью в '+rand(101).to_s+'% пойдёт дождь,')

puts('но никогда не стоит доверять синоптикам.')

0.053950924931684

0.975039266747952

0.436084118016833

38

0

0

0

5435049192 7962189206794015651522429182285732200948685516886

Синоптик сказал, что с вероятностью в 22% пойдёт дождь, но никогда не стоит доверять синоптикам.

Обратите внимание, что я использовал rand(101), чтобы получить числа от 0 до 100, и что rand (1) всегда возвращает 0. Непонимание того, каков диапазон возможных возвращаемых значений, является, по-моему, самой частой ошибкой, которую делают при работе с rand; даже профессиональные программисты и даже в завершённых программных продуктах, которые вы покупаете в магазине. У меня даже однажды был CD–проигрыватель, который в режиме «Случайное воспроизведение» проигрывал все песни, кроме последней… (Я гадал, что бы могло произойти, если я бы вставил в него CD с одной-единственной песней?)

Иногда вы можете захотеть, чтобы rand возвращал те же самые случайные числа в той же последовательности при двух разных запусках вашей программы. (Например, я однажды использовал случайно сгенерированные числа для создания случайно сгенерированного мира в компьютерной игре. Если я обнаружил мир, который мне по- настоящему понравился, возможно, мне захочется снова сыграть с ним или отправить его другу.) Чтобы проделать это, вам нужно задать seed [зерно случайной последовательности – Прим. перев.], что можно сделать методом srand. Вот так:

srand 1776 puts(rand (100)) puts(rand(100)) puts(rand(100)) puts(rand (100)) puts(rand(100)) puts '' srand 1776 puts(rand(100)) puts(rand(100)) puts(rand (100)) puts(rand(100)) puts(rand(100))

Одно и то же будет выдаваться каждый раз, когда вы «посеете» то же самое число в качестве зерна. Если вы снова хотите получать различные числа (также, как происходит, если вы не применяли до этого srand), то просто вызовите srand 0. Этим вызовом в генератор «засевается» действительно причудливое число с использованием (кроме всего прочего) текущее время в вашем компьютере, с точностью до миллисекунды.

Объект Math

Наконец, давайте рассмотрим объект Math. Наверное, нам следует сразу окунуться в примеры:

puts(Math::PI)

puts(Math::E)

puts(Math.cos(Math:

:PI/3))

puts(Math.tan(Math:

:PI/4))

puts(Math.log(Math:

:E**2))

puts((1 + Math.sqrt(5))/2)

Первое, что вы, возможно, заметили, это символы :: в обозначениях констант. Объяснение оператора пределов видимости (а это именно он) на самом деле выходит за, хм… пределы этого учебника. Я не хотел каламбурить. Честное слово. Достаточно сказать, что вы можете просто использовать Math::Pi в ожидаемом вами значении.

Как видите, в Math есть всё, что вы предполагаете иметь в приличном научном калькуляторе. И как и прежде, дробные числа действительно близко представляют правильные результаты. [Точность вычислений десятичных чисел ограничена их двоичным представлением в компьютере. – Прим. перев.]

А теперь перейдём к выполнению!

6. Управление выполнением

Ааааа, управление выполнением… Вот где всё соединяется воедино. И хотя эта глава короче и легче, чем глава о методах, она откроет вам целый мир программных возможностей. После этой главы мы сможем писать по-настоящему интерактивные программы; до этого мы создавали программы, которые выводили разные вещи в зависимости от вашего ввода с клавиатуры, но после этой главы они также будут действительно делать разные вещи. Но прежде, чем мы сможем сделать это, нам нужно иметь возможность сравнивать объекты в наших программах. Нам нужны…

Методы сравнения

Давайте быстро пробежимся по этому разделу, чтобы можно было перейти к следующему разделу, «Ветвления», где будут происходить самые классные вещи. Так, чтобы узнать, что один объект больше или меньше другого, мы применяем методы > и <, вот так:

puts 1 > 2 puts 1 < 2

false

true