Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 7 Многомер массивы.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
223 Кб
Скачать
☆

2.2 Ступенчатые массивы

В ступенчатых массивах количество элементов в разных строках может различаться. В памяти ступенчатый массив хранится иначе, чем прямоугольный: в виде нескольких внутренних массивов, каждый из которых имеет свой размер. Кроме того, выделяется отдельная область памяти для хранения ссылок на каждый из внутренних массивов. Организацию ступенчатого массива иллюстрирует рис. 3.

Рисунок 3 - Ступенчатый массив

Описание ступенчатого массива:

тип[ ] [ ] имя;

Под каждый из массивов, составляющих ступенчатый массив, память требуется выделять явным образом, например:

int[ ] [ ] а = new int [3][ ]; / / выделение памяти под ссылки на три строки

а[0]= new int [5]; / / выделение памяти под 0-ю строку (5 элементов)

а[1] =new int [3]; / / выделение памяти под 1-ю строку (3 элемента)

а[2] = new int [4]; / / выделение памяти под 2-ю строку (4 элемента)

Здесь а[0], а[1] и а[2] — это отдельные массивы, к которым можно обращаться по имени ниже (листинг 3) приведен пример работы со ступенчатым массивом с использованием выделения памяти под каждую строку.

Другой способ выделения памяти:

int[ ] [ ] а = { new int[5], new int[3], new int[4] };

K элементу ступенчатого массива обращаются, указывая каждую размерность в своих квадратных скобках, например:

a[1][2] a[i][j] a[j][i]

В остальном использование ступенчатых массивов не отличается от использования прямоугольных.

Пример 2. Поиск максимального элемента в двумерном массиве.

Решение поставленной задачи осуществляется с помощью цикла по параметру i, изменяющегося шагом +1 от 0 до m-1 с вложенным циклом по параметру j, изменяющемуся шагом +1 от 0 до n-1.

Перед входом в цикл переменной max присваивается значение у[0,0] элемента массива. С каждым изменением параметра j происходит переход к новому элементу той же строки массива и сравнение его значения со значением переменной max.

Если значение элемента массива больше, то max присваивается значение элемента массива с текущим порядковым номером. Когда при данном значении параметра i завершается цикл по параметру j, происходит изменение параметра i и переход к новой строке двумерного массива.

Листинг 2- Программа к примеру 2

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

const int m = 3, n = 4;

int[,] y = new int[m, n] {

{ 2, 2, 8, 9 },

{ 4, 5, 6, 2 },

{ 7, 0, 1, 1 }

};

Console.WriteLine("Исходный массив:");

for (int i = 0; i < m; ++i)

{

for (int j = 0; j < n; ++j)

Console.Write(" " + y[i, j]);

Console.WriteLine();

}

int max=y[0,0];

for (int i = 0; i < m; ++i)

{

for (int j = 0; j < n; ++j)

if (y[i, j] > max) max = y[i, j];

}

Console.WriteLine("Наибольший элемент в матрице "+ max);

Console.Read();

}

}

}

Рисунок 3 - Схема алгоритма к примеру 2

Результаты работы программы:

В листинге 3 продемонстрировано применение элементов класса Аrrау при работе со ступенчатым массивом.

Листинг 3 - Использование методов класса Аrrау для обработки ступенчатого массива

using System;

namespace ConsoleApplication3

{

class Program

{

static void Main(string[] args)

{

int[][] a = new int[3][];

a[0] = new int[5] { 4, 5, 8, 3, 6 };

a[1] = new int[3] { 7, 9, 1 };

a[2] = new int[4] { 6, 5, 3, 1 };

Console.WriteLine("Исходный массив:");

for (int i = 0; i < a.Length; ++i)

{

for (int j = 1; j < a[i].Length; ++j)

Console.Write(" " + a[i][j]);

Console.WriteLine();

}

Console.WriteLine(Array.IndexOf(a[0], 8));

}

}

}

Необходимо обратить внимание на то, как внутри цикла по строкам определяется длина каждого одномерного массива (длина каждой строки массива).

Результаты работы программы: