Книга: Искусство программирования на языке сценариев командной оболочки
Пример 8-1. Наибольший общий делитель
Пример 8-1. Наибольший общий делитель
#!/bin/bash
# gcd.sh: поиск наибольшего общего делителя
# по алгоритму Эвклида
# Под "наибольшим общим делителем" (нод) двух целых чисел
#+ понимается наибольшее целое число, которое делит оба делимых без остатка.
# Алгоритм Эвклида выполняет последовательное деление.
# В каждом цикле,
#+ делимое <--- делитель
#+ делитель <--- остаток
#+ до тех пор, пока остаток не станет равным нулю (остаток = 0).
#+ The gcd = dividend, on the final pass.
#
# Замечательное описание алгоритма Эвклида можно найти
# на сайте Jim Loy, http://www.jimloy.com/number/euclids.htm.
# ------------------------------------------------------
# Проверка входных параметров
ARGS=2
E_BADARGS=65
if [ $# -ne "$ARGS" ]
then
echo "Порядок использования: `basename $0` первое-число второе-число"
exit $E_BADARGS
fi
# ------------------------------------------------------
gcd ()
{
# Начальное присваивание.
dividend=$1 # В сущности, не имеет значения
divisor=$2 #+ какой из них больше.
# Почему?
remainder=1 # Если переменные неинициализировать,
#+ то работа сценария будет прервана по ошибке
#+ в первом же цикле.
until [ "$remainder" -eq 0 ]
do
let "remainder = $dividend % $divisor"
dividend=$divisor # Повторить цикл с новыми исходными данными
divisor=$remainder
done # алгоритм Эвклида
} # последнее $dividend и есть нод.
gcd $1 $2
echo; echo "НОД чисел $1 и $2 = $dividend"; echo
# Упражнение :
# --------
# Вставьте дополнительную проверку входных аргументов,
#+ и предусмотрите завершение работы сценария с сообщением об ошибке, если
#+ входные аргументы не являются целыми числами.
exit 0
+=
"плюс-равно" (увеличивает значение переменной на заданное число)
let "var += 5" значение переменной var будет увеличено на 5.
-=
"минус-равно" (уменьшение значения переменной на заданное число)
*=
"умножить-равно" (умножить значение переменной на заданное число, результат записать в переменную)
let "var *= 4" значение переменной var будет увеличено в 4 раза.
/=
"слэш-равно" (уменьшение значения переменной в заданное число раз)
%=
"процент-равно" (найти остаток от деления значения переменной на заданное число, результат записать в переменную)
Арифметические операторы очень часто используются совместно с командами expr и let.
- 16.1.3. Пример составления программы
- Пример установочного скрипта
- Пример из практики
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Примеры получения статистики
- Пример применения метода «пять почему»
- Пример 12-8. Частота встречаемости отдельных слов
- 1.2.5. Пример программы
- Пример 17-10. Блочный комментарий
- Примеры
- 2. Пример создания базового отношения в записи на псевдокоде
- Пример 9-8. Содержимое $* и $@, когда переменная $IFS -- пуста