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