Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_2_изд_испр.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.27 Mб
Скачать

10.5. Подмассивы (сечения) (c)

В языке С можно рассматривать многомерный массив как одномерный, элементами которого являются массивы на 1 меньшей размерности.

Пример.

float sales[3][4][5];

Такой объект можно трактовать как массив с плавающей точкой, состоящий из 3 элементов, каждый из которых является двумерным массивом размером 4*5.

Допустимы следующие обращения к содержимому этого массива:

sales – массив целиком,

sales[ i ] – к i-му подмассиву 4*5,

sales[ i ][ j ] – к элементу с индексами i и j: массив из 5 элементов,

sales[ i ][ j ][ k ] – скалярная величина: собственно элемент массива sales.

Использование сечений иногда весьма удобно, особенно при обращении к процедуре.

Пример. Найти индексы максимальных элементов каждой строки матрицы.

#define M 10

#define N 10

void main(void){

float a[M][N]; int s[M], ind(float [ ], int);

..............

for(i=0; i<M; i++){

s[ i ]=ind(a[ i ], N);// Аргументом функции ind является i-я строка

}

..............

}//End main

int ind(float x[ ], int n){// Параметр есть одномерный массив длиной в строку

int i, k; float y;

y=x[0];

k=0;

for(i=1; i<n; i++){

if(y<x[ i ]){

y=x[ i ]; k=i;

}

}

return k;

} //End ind

10.6. Динамические массивы (b)

Достаточно часто возникает необходимость работы с массивами, размеры которых либо неизвестны в момент запуска программы, либо могут меняться в процессе ее выполнения. Примером может служить программа умножения матриц произвольных размеров. В этих случаях в программах на языке Basic используются динамические массивы.

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

Пример.

dim DinArray( ) as single

Задание размерности и границ индексов такого массива производится во время выполнения программы инструкцией вида:

redim [preserve] <имя_массива>(<выражение>[, <выражение>]...)

Инструкция redim в отличие от инструкции dim является выполняемой. Первое ее использование задает размерность (число измерений), которая не может быть переопределена в последующих инструкциях redim. Эти последующие инструкции могут изменить только границы индексов. Также инструкция redim не может изменить объявленный тип элементов динамического массива.

Пример.

................................

redim DinArray(1 to 10, 4)

................................

redim DinArray(5,5)

При выполнении инструкции redim все значения элементов, которые были заданы ранее, теряются. При этом числовые значения заменяется нулями, строки – пустыми строками (""). Однако, имеется возможность сохранить "старые" значения элементов массива. Это особенно полезно, когда после переопределения размер массива увеличивается. Для этого в инструкции redim необходимо употребить ключевое слово preserve (сохранить). При использовании опции preserve можно изменять только верхнюю границу последнего измерения.

Пример.

redim preserve DinArray(5, 10)

При переопределении динамических массивов весьма удобно употреблять 2 встроенные функции языка Basic:

Lbound(<имя_массива>[, <№ измерения>]) – нижняя граница,

UBound(<имя_массива>[, <№ измерения>]) – верхняя граница.

Пример. Увеличить на 1 границы массива DinArray.

redim DinArray(Ubound(DinArray)+1, Ubound(DinArray, 2)+1)