Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
439.97 Кб
Скачать

3.1.4. Двумерный массив

Для создания двумерного массива необходимо указать в квадратных скобках два значения – количество строк и столбцов в массиве.

тип_массива имя_массива[кол-во строк][кол-во столбцов];

Рисунок иллюстрирует индексы элементов двумерного массива. Массив содержит три строки и два столбца.

[0][0]

[0][1]

[1][0]

[1][1]

[2][0]

[2][1]

На самом деле, в памяти двумерные массивы хранятся по строкам, как показано на рисунке:

[0][0]

[0][1]

[1][0]

[1][1]

[2][0]

[2][1]

 

double matrix[3][2]; // двумерный массив 2х3

double sum=0.;

for(int i=0; i<3; i++) // номер строки

{

for(int j=0; j<2; j++) // номер столбца

{

sum+=matrix[i][j];

}

}

3.1.5. Динамическое размещение двумерного массива (пример 3.2)

Двумерный массив можно разместить динамически, только если представить его как одномерный. В этом случае вместо доступа по индексам [ i][ j], придется вычислять индекс одномерного массива, которому будет соответствовать необходимый элемент двумерного массива.

Например, если двумерный массив 3х2 разместить как одномерный, элементу [1][0] двумерного массива будет соответствовать индекс [2] одномерного массива.

0

1

2

3

4

5

[0][0]

[0][1]

[1][0]

[1][1]

[2][0]

[2][1]

 

/////////////////////////////////////////////////////////////////////////////

// Прикладное программирование

// Пример 3.2. Пример работы с динамическим двумерным массивом

//

// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru

// СПб НИУ ИТМО

/////////////////////////////////////////////////////////////////////////////

// подключение библиотеки ввода-вывода

#include <iostream>

// подключение стандартного пространства имен для использования библиотек

using namespace std;

/////////////////////////////////////////////////////////////////////////////

void main()

{

// динамическое размещение массива 3х2

double *matrix=new double[3*2];

// инициализация массива

for(int j=0; j<2; j++) // номер столбца

{

for(int i=0; i<3; i++) // номер строки

{

matrix[i*2+j]=j*10+i;

}

}

// вывод элементов массива на экран

for(int j=0; j<2; j++) // номер столбца

{

for(int i=0; i<3; i++) // номер строки

{

cout<<matrix[i*2+j]<<" ";

}

cout<<endl;

}

delete [] matrix; //освободить память

}

/////////////////////////////////////////////////////////////////////////////

3.2 Контейнеры

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

При организации контейнера требуется решить следующие принципиальные вопросы.

  1. Каким образом осуществляется хранение элементов контейнера? Т.е. каким образом элементы должны быть расположены в памяти: последовательно, непрерывным блоком, или они могут быть разбросаны по всей памяти.

  2. Каким образом осуществляется доступ к элементам контейнера? По индексу или достаточно последовательного перебора.

вектор

  1. хранение элементов всегда осуществляется единым блоком

  2. все элементы проиндексированы и доступ легко осуществляется по индексу

стек

  1. хранение элементов осуществляется в едином блоке памяти

  2. доступ возможен к элементу находящемуся на вершине стека

очередь

  1. хранение элементов осуществляется в едином блоке памяти

  2. доступ возможен к первому элементу внесенному в очередь

список

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

  2. возможен только перебор

дерево

  1. хранение последовательное

  2. возможен обхода дерева от корня. Доступ к элементам зная родителя, который содержит ссылки на дочерние элементы

ассоциативный массив

  1. хранение последовательное

  2. доступ организуется с помощью обхода дерева по ключу

Стандартная библиотека С++ предоставляет все возможные контейнеры, кроме деревьев. Это связано с тем, что при решении разных задач к деревьям предъявляются разнообразные требования и выработать обобщенный шаблон этой структуры данных достаточно сложно.