Пример 25-11. Эмуляция массива с двумя измерениями
Пример 25-11. Эмуляция массива с двумя измерениями
#!/bin/bash
# Эмуляция двумерного массива.
# Второе измерение представлено как последовательность строк.
Rows=5
Columns=5
declare -a alpha # char alpha [Rows] [Columns];
# Необязательное объявление массива.
load_alpha ()
{
local rc=0
local index
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y
do
local row=`expr $rc / $Columns`
local column=`expr $rc % $Rows`
let "index = $row * $Rows + $column"
alpha[$index]=$i # alpha[$row][$column]
let "rc += 1"
done
# Более простой вариант
# declare -a alpha=( A B C D E F G H I J K L M N O P Q R S T U V W X Y )
# но при таком объявлении второе измерение массива завуалировано.
}
print_alpha ()
{
local row=0
local index
echo
while [ "$row" -lt "$Rows" ] # Вывод содержимого массива построчно
do
local column=0
while [ "$column" -lt "$Columns" ]
do
let "index = $row * $Rows + $column"
echo -n "${alpha[index]} " # alpha[$row][$column]
let "column += 1"
done
let "row += 1"
echo
done
# Более простой эквивалент:
# echo ${alpha[*]} | xargs -n $Columns
echo
}
filter () # Отфильтровывание отрицательных индексов.
{
echo -n " "
if [[ "$1" -ge 0 && "$1" -lt "$Rows" && "$2" -ge 0 && "$2" -lt "$Columns" ]]
then
let "index = $1 * $Rows + $2"
echo -n " ${alpha[index]}" # alpha[$row][$column]
fi
}
rotate () # Поворот массива на 45 градусов
{
local row
local column
for (( row = Rows; row > -Rows; row-- )) # В обратном порядке.
do
for (( column = 0; column < Columns; column++ ))
do
if [ "$row" -ge 0 ]
then
let "t1 = $column - $row"
let "t2 = $column"
else
let "t1 = $column"
let "t2 = $column + $row"
fi
filter $t1 $t2 # Отфильтровать отрицательный индекс.
done
echo; echo
done
# Поворот массива выполнен на основе примеров (стр. 143-146)
# из книги "Advanced C Programming on the IBM PC", автор Herbert Mayer
# (см. библиографию).
}
#-----------------------------------------------------#
load_alpha # Инициализация массива.
print_alpha # Вывод на экран.
rotate # Повернуть на 45 градусов против часовой стрелки.
#-----------------------------------------------------#
# Упражнения:
# -----------
# 1) Сделайте инициализацию и вывод массива на экран
# + более простым и элегантным способом.
#
# 2) Объясните принцип работы функции rotate().
exit 0
По существу, двумерный массив эквивалентен одномерному, с тем лишь различием, что для индексации отдельных элементов используются два индекса -- "строка" и "столбец".
Более сложный пример эмуляции двумерного массива вы найдете в Пример A-11.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Эмуляция дискуссий в блогосфере
Эмуляция дискуссий в блогосфере Организация PR-кампаний в блогосфере постепенно входит в стандартные наборы услуг российских агентств. Существуют три принципиально разные схемы ее использования в PR-целях. Применение каждой из них может (при условии профессиональной
С двумя источниками напряжения
С двумя источниками напряжения На рис. 1.6 показана схема с двумя источниками напряжения. Хотя схема не слишком сложна, для нахождения токов и напряжений в ней требуется немало усилий. Мы предполагаем, что вы не будете применять метод контурных токов или узловых
Эмуляция классов
Эмуляция классов Часто случается, что разработчики классов желают развернуть новые версии уже существующих классов, чтобы исправить дефекты или расширить функциональные возможности. Полезно придать этим новым реализациям новые идентификаторы класса CLSID , чтобы
Глава 2 Эмуляция CD/DVD-приводов
Глава 2 Эмуляция CD/DVD-приводов • Программа Alcohol 120 %.• Настройка программы.• Поиск образов и Диспетчер CD/DVD.• Запись CD/DVD из образов.• Эмуляция и запись.• Копирование дисков в программе Alcohol 120 %.• Стирание информации с CD/DVD.Виртуальный привод компакт-дисков – это
Эмуляция и запись
Эмуляция и запись Эмуляция применяется, если вы не уверены в правильности выбранных настроек: файл-образ сначала записывается не на компакт-диск, а на винчестер. Так можно поэкспериментировать с установкой различных параметров в настройках Тип данных. Жестких
Эмуляция карточки памяти
Эмуляция карточки памяти Все модели карманных компьютеров и смартфонов имеют возможность увеличения объема памяти при помощи различных карточек памяти. Дополнительный объем дискового пространства используют для хранения фильмов, фотографий и других документов.
Пример 10-2. Цикл for с двумя параметрами в каждом из элементов списка
Пример 10-2. Цикл for с двумя параметрами в каждом из элементов списка #!/bin/bash# Список планет.# Имя кажой планеты ассоциировано с расстоянием от планеты до Солнца (млн. миль).for planet in "Меркурий 36" "Венера 67" "Земля 93" "Марс 142" "Юпитер 483"do set -- $planet # Разбиение переменной "planet" на
Пример 25-9. Эмуляция структуры "СТЕК" ("первый вошел -- последний вышел")
Пример 25-9. Эмуляция структуры "СТЕК" ("первый вошел -- последний вышел") #!/bin/bash# stack.sh: Эмуляция структуры "СТЕК" ("первый вошел -- последний вышел")# Подобно стеку процессора, этот "стек" сохраняет и возвращает данные по принципу#+ "первый вошел -- последний вышел".BP=100 #
Пример A-8. days-between: Подсчет числа дней между двумя датами
Пример A-8. days-between: Подсчет числа дней между двумя датами #!/bin/bash# days-between.sh: Подсчет числа дней между двумя датами.# Порядок использования: ./days-between.sh [M]M/[D]D/YYYY [M]M/[D]D/YYYYARGS=2 # Ожидается два аргумента из командной строки.E_PARAM_ERR=65 # Ошибка в числе ожидаемых
Система для шифрования с двумя ключами.
Система для шифрования с двумя ключами. Все желающие (PGP распространяется свободно) переписывают из любых источников саму систему (PGP) и ее исходные тексты (если есть необходимость, исходные тексты также распространяются свободно). Все функции системы выполняются с
У18.1 Эмуляция перечислимых типов однократными функциями
У18.1 Эмуляция перечислимых типов однократными функциями Покажите, что при отсутствии unique-типов перечислимый тип языка Pascaltype ERROR = (Normal, Open_error, Read_error)может быть представлен классом с однократной функцией для каждого значения