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

    

Аргументы командной строки


Как и другие языки программирования, Ruby позволяет передавать данные в программу, использую аргументы командной строки. Все, что при старте программы указывается после ее имени, интерпретатор помещает в специальный массив ARGV, работа с элементами которого нечем не отличается от работы с другими массивами. Можно, например, проверить, с правильным ли количеством аргументов командной строки была вызвана программа. Далее приводится программа, прерывающий свое выполнение, если число аргументов меньше 2:

=begin Напишите программу подсчета суммы всех нечетных чисел, заключенных в интервале от K до L, где K и L - аргументы командной строки =end

if ARGV.length < 2 puts "Слишком мало входных данных" exit(1) end

s = 0 k = ARGV[0].to_i l = ARGV[1].to_i for i in k .. l s += i if i%2 != 0 end puts "Сумма нечетных чисел в интервале " + "от #{k} до #{l} равна #{s}"

Для экстренного прерывания процесса выполнения программы здесь использован встроенный метод exit.

Пример 1.10.

(html, txt)

Задача

Числами Фибоначчи называется последовательность целых чисел, задаваемая соотношениями: а0 = 0, a1 = 1, an = an-1+an-2. Напишите программу, получающую с качестве аргумента командной строки целое число n, и печатающую n-е число Фибоначчи.

Вариант 1 - рекурсивная функция

В следующей программе первый элемент массива ARGV преобразовывается в целое число и передается в качестве аргумента рекурсивной функции fib.

def fib(n) if n<2 n else fib(n-2)+fib(n-1) end end n = ARGV[0].to_i puts "#{n}-е число Фибоначчи равно #{fib(n)}"

Для вычисления с помощью этой программы, размещенной в файлe fib.rb, например, 30-го числа Фибоначчи достаточно выполнить команду

ruby fib.rb 30

Данная программа использует двойную рекурсию, поэтому процесс вычисления займет достаточно заметное время.

Пример 1.11.

(html, txt)

Вариант 2 - использование массива

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

n =ARGV[0].to_i f= [0, 1] fib = case n when 0 f[0] when 1 f[1] else for i in 2 .. n f[i] = f[i-1] + f[i-2] end f[n] end

puts "#{n}-е число Фибоначчи равно #{fib}"

Пример 1.12.

(html, txt)

Однако и у этой программы есть существенный недостаток - она хранит все промежуточные результаты, в то время как каждое предыдущее значение используется лишь дважды. Изменим программу так, чтобы она использовала только три переменных: вычисляемое значение и два предшествующих ему:

n =ARGV[0].to_i if n > 1 prev, beforePrev = 1, 0 for i in 2 .. n fib = prev + beforePrev prev, beforePrev = fib, prev end else fib = n end puts "#{n}-е число Фибоначчи равно #{fib}"

Пример 1.13.

(html, txt)

Включите в рассмотренные программы операторы, информирующие о продолжительности вычислений, и сравните их эффективность. Для этого найдите с помощью первой из рассмотренных программ 30, 31 и 32 числа Фибоначчи. Пользуясь второй и, тем более, третьей вы сможете вычислить достаточно большое число Фибоначчи, например, для вычисления 60000-го числа Фибоначчи, содержащего 12539 цифр на компьютере с процессором Celeron-500, программе, размещающей промежуточные результаты в массиве, потребовалось около 19 секунд, в то время как последняя программа вычислила его за 2 секунды.


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