Пример 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.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Эмуляция классов

Из книги Сущность технологии СОМ. Библиотека программиста автора Бокс Дональд

Эмуляция классов Часто случается, что разработчики классов желают развернуть новые версии уже существующих классов, чтобы исправить дефекты или расширить функциональные возможности. Полезно придать этим новым реализациям новые идентификаторы класса CLSID , чтобы


Глава 2 Эмуляция CD/DVD-приводов

Из книги Запись CD и DVD: профессиональный подход автора Бахур Виктор

Глава 2 Эмуляция CD/DVD-приводов • Программа Alcohol 120 %.• Настройка программы.• Поиск образов и Диспетчер CD/DVD.• Запись CD/DVD из образов.• Эмуляция и запись.• Копирование дисков в программе Alcohol 120 %.• Стирание информации с CD/DVD.Виртуальный привод компакт-дисков – это


Эмуляция и запись

Из книги Продвижение бизнеса в Интернет. Все о PR и рекламе в сети автора Гуров Филипп

Эмуляция и запись Эмуляция применяется, если вы не уверены в правильности выбранных настроек: файл-образ сначала записывается не на компакт-диск, а на винчестер. Так можно поэкспериментировать с установкой различных параметров в настройках Тип данных. Жестких


Эмуляция дискуссий в блогосфере

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Эмуляция дискуссий в блогосфере Организация PR-кампаний в блогосфере постепенно входит в стандартные наборы услуг российских агентств. Существуют три принципиально разные схемы ее использования в PR-целях. Применение каждой из них может (при условии профессиональной


У18.1 Эмуляция перечислимых типов однократными функциями

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

У18.1 Эмуляция перечислимых типов однократными функциями Покажите, что при отсутствии unique-типов перечислимый тип языка Pascaltype ERROR = (Normal, Open_error, Read_error)может быть представлен классом с однократной функцией для каждого значения


С двумя источниками напряжения

Из книги Программирование КПК и смартфонов на .NET Compact Framework автора Климов Александр П.

С двумя источниками напряжения На рис. 1.6 показана схема с двумя источниками напряжения. Хотя схема не слишком сложна, для нахождения токов и напряжений в ней требуется немало усилий. Мы предполагаем, что вы не будете применять метод контурных токов или узловых


Эмуляция карточки памяти

Из книги PGP: Кодирование и шифрование информации с открытым ключом. автора Левин Максим

Эмуляция карточки памяти Все модели карманных компьютеров и смартфонов имеют возможность увеличения объема памяти при помощи различных карточек памяти. Дополнительный объем дискового пространства используют для хранения фильмов, фотографий и других документов.


Система для шифрования с двумя ключами.

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Система для шифрования с двумя ключами. Все желающие (PGP распространяется свободно) переписывают из любых источников саму систему (PGP) и ее исходные тексты (если есть необходимость, исходные тексты также распространяются свободно). Все функции системы выполняются с


Пример 10-2. Цикл for с двумя параметрами в каждом из элементов списка

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Пример 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 # Ошибка в числе ожидаемых