ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.09.2024

Просмотров: 16

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Об’єктно-орієнтована технологія програмування

Тема12: Багатовимірні масиви План:

  1. Основні визначення

  2. Форми ініціалізації масиву

  3. Матриці

  4. Введення-виведення матриць

  5. Перебір елементів матриці

За визначенням, багатовимірні масиви як такі в С++ не існують, масив завжди вважається одновимірним. Проте в С++ дозволено оголошувати одновимірні масиви масивів (тобто багатовимірні масиви). Вони задаються вказівкою розміру кожній розмірності в квадратних дужках.

Наприклад, опис двовимірного масиву з 6 рядків по 8 стовпців: int matr [6][8]; інтерпретується як одновимірний масив з ім'ям matr з 6 елементів типа int[8].

Тривимірний масив double prim [6][4][2]; інтерпретується як одновимірний масив з ім'ям prim, що включає 6 елементів, кожен з яких має типа double [4][2]. У свою чергу, кожен з цих елементів є одновимірний масив з чотирьох елементів типа double [2]. І, нарешті, кожен з цих елементів є масивом з двох елементів типа double.

Для доступу до елементу багатовимірного масиву вказуються всі його індекси, наприклад: matr[i][j], prim [i][j][k];.

Форми ініціалізації масиву:

При структурній ініціалізації багатовимірний масив представляється як масив масивів, при цьому кожен масив полягає в свої фігурні дужки. При безструктурній ініціалізації задається загальний список елементів в тому порядку, в якому елементи розташовуються в пам'яті.

Багатовимірні масиви можуть ініціалізуватися і без вказівки розміру найлівішій розмірності. Компілятор в цьому випадку визначає число елементів по числу членів в списку ініціалізації.

Приклади:

структурна ініціалізація:

int mass [][2] = { {1,1}, {0, 2}, {1, 0} };

int array [2][3] = {{1, 2, 3}, {2, 3, 4}};

int а [2][3] [4]= {{{1}, {2, 3}, {4, 5, 6}}, {{1, 2}, {2, 3, 4}, {4, 5, 6, 7}}};

//результат ініціалізації: 1000 2300 4560 1200 2340 4567

безструктурна ініціалізація:

int mass [3][2] = {1, 1, 0, 2, 1, 0};

int а [2][3] [4]= {1, 0, 0, 0, 2, 3, 0, 0, 4, 5, 6, 0, 1, 0, 0, 0, 2, 3, 0, 0, 4, 5, 6, 0};

int m[] [3] = { 00, 01, 02, 10, 11, 12, 20, 21, 22}

У пам'яті багатовимірний масив розташовується в послідовних комірках по рядкам (шарах). Елементи з меншими значеннями індексу зберігаються в нижчих адресах пам'яті. Багатовимірні масиви розташовуються таким чином, що найправіший


індекс зростає найпершим. Наприклад, якщо є масив int array [10][3], то в пам'яті за збільшенням адрес будуть розміщені елементи:

array [0][0], array [0][1], array [0][2], array [1][0], array [1][1], array [1][2] ...,

array [9][0], array [9][1], array [9][2].

Розглянемо тривимірний масив: int M [10][2][3].

M[0], M[9] – одновимірні масиви, елементи яких є двовимірні масиви (матриці) int [2][3], що займають (2 х 3 х sizeof (int)) байт; M[0][0], M[0][1] – одновимірні масиви, елементи яких є одновимірні масиви (вектора) int [3], що займають (3 х sizeof (int)) байт; M[0][1][1], M[0][1][0] – значення типа int, що займають sizeof (int) байт.

В разі опису масиву double M [10][2][3], елементи M[0][1][0], M[0][1][1] є значення типа double, що займають sizeof(double) байт.


Двовимірні масиви

Характерним об'єктом програмування є двовимірні масиви (матриці). Часто розглядаються матриці спеціального вигляду – одиничні, діагональні, трикутні, розріджені і ін. Представлення матриці кожного з видів в програмі може бути різним; наприклад, діагональні матриці можуть представлятися одновимірним масивом.

Матриці

Матриця є прямокутна таблиця чисел з n рядків і m стовпців. Якщо n = m, матриця називається квадратною, а число n – її порядком. Матрицю зазвичай представляють таким чином:

a11 a12 a13 . . . . . . . . a1m

а 21 а 22 а 23 . . . . . . . . а 2m

a 31 a 32 а 33 . . . . . . . . .a 3m

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

а n1 а n2 а n3 . . . . . . . . а nm

Рядок з індексом i, (1 ≤ i ≤ n) – це одновимірний масив елементів матриці а i1, а i2, а i3 ..., aim, в яких перший індекс i (номер рядка) фіксований, а другий індекс j (номер стовпця) міняється від 1 до m. Стовпець з індексом j (1 ≤ j ≤ m) – це одновимірний масив елементів матриці а1j, а2j ..., аij ..., аnj, в яких другий індекс j фіксований, а перший індекс i міняється від 1 до n.

Головною діагоналлю квадратної матриці порядку n називають безліч елементів a11, а22, ..., aii ..., аnn. Якщо елемент aij належить головній діагоналі, то справедлива рівність i = j.

Побічною діагоналлю квадратної матриці порядку n називають безліч елементів а 1n, а 2n ..., а in+1≤i, ..., аn1. Якщо елемент aij належить побічній діагоналі, то справедлива рівність i + j = n + 1.

У мові C матриці відповідає двовимірний масив. Далі поняття «матриця» і «двовимірний масив» використовуються як синоніми. Загальний формат оголошення двовимірного масиву має наступний вигляд:

<тип> <ім'я> [n][m]

Зауваження. У завданнях по програмуванню часто квадратну матрицю для наочності інтерпретують як квадрат:

Зауваження. У мові C++ перший індекс масиву завжди дорівнює нулю.

Зауваження. При програмуванні, перш ніж перетворити інформацію, спочатку треба визначити її місцезнаходження в пам'яті.

Індекси i і j елементу однозначно визначають місце цього елементу в пам'яті. Тому для нас зручніше матрицю представляти як таблицю індексів її елементів або як таблицю її координат в пам'яті комп'ютера.


Таблиця1.

Координати в пам'яті комп'ютера

0,0 0,1 0,2 0,3 0,4 0,5

1,0 1,1 1,2 1,3 1,4 1,5

2,0 2,1 2,2 2,3 2,4 2,5

3,0 3,1 3,2 3,3 3,4 3,5

4,0 4,1 4,2 4,3 4,4 4,5

5,0 5,1 5,2 5,3 5,4 5,5

Перебір елементів матриці продемонструємо на програмі введення елементів матриці з файлу в пам'ять комп'ютера. Природно, елементи матриці перебираються в циклі. В цьому випадку треба використовувати два цикли.

Перший цикл перебирає номери рядків матриці, другої, – елементи кожного рядка. Деталі організації такого перебору демонструє нижченаведена програма. Нагадаємо: аби ввести дані з файлу в пам'ять комп'ютера, цей файл треба раніше створити на зовнішньому носієві. Заносити матрицю у файл для наочності і контролю краще по рядках. Це означає, що кожен рядок матриці займатиме один рядок у файлі.

Запам'ятаємо деякі властивості квадратних матриць:

  • якщо номер рядка i елементу матриці A збігається з номером стовпця j, тобто i==j, це означає, що елемент A[i][i] лежить на головній діагоналі матриці;

  • якщо номер рядка i елементу матриці A перевищує номер стовпця j, тобто i>j, це означає, що елемент A[i][j] знаходиться нижчим за головну діагональ

  • якщо номер стовпця j елементу матриці A більше номера рядка i, тобто i<j, це означає, що елемент A[i][j] знаходиться вищим за головну діагональ;

якщо індекси елементу A[i][j] матриці А задовольняють рівності i==N-j-1, це означає, що елемент A[i][j] лежить на побічній діагоналі;

  • якщо індекси елементу A[i][j] матриці А задовольняють нерівності i<N-j-1, це означає, що елемент A[i][j] знаходиться вищим за побічну діагональ;

  • якщо індекси елементу A[i][j] матриці А задовольняють нерівності i>N-j-1, це означає, що елемент A[i][j] знаходиться нижчим за побічну діагональ.

Операції можливі лише над окремими елементами масивів.

Введення-виведення матриць

Матриці, як і одновимірні масиви, потрібно вводити (виводити) поелементно. Блок-схема введення елементів матриці A[n] [m] розташована нижче:

Введення значень двовимірного масиву здійснюється за допомогою «подвійного» циклу. Наприклад:

int а, i, j;

for (i=0; i< 2; i++)

for( j=0; j< 3; j++)

cin >> а[i][j]; //набираем елементи рядка через пропуск і натискуємо <enter> //або набираємо всі елементи матриці через пропуск і натискуємо<enter>


//або після кожного елементу нажимаем<enter>

Привласнення значень елементам символьного масиву char array [n][m]:

#include <stdlib.h>

int main ()

{

const int n=3;

const int m=4;

char а[n][m];

int i, j;

for (i=0; i< 4; i++)

for( j=0; j< 3; j++)

а[i][j]= char (97+rand() %26); //символы латинського алфавіту

for (i=0; i< 4; i++)

{for( j=0; j< 3; j++)

printf ("%2c",a[i][j]);

printf ("\n");

}

_getch();

return 0;

}

Заповнення двовимірного масиву випадковими цілими числами від 1 до 10 і виведення елементів масиву на экран:

#include <stdlib.h>

const int n = 10;

const int m = 5;

int main ()

{static int а[n][m]; //по умовчанню ініціалізація нулями елементів масиву

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

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

{а[i][j]= 1 +rand() % 10;

printf (" %7d %c", а, (j==m-1)?'\n':' ');

}

_getch();

return 0;

}

Виведення елементів двовимірного масиву здійснюється по рядках:

1. для цілочисельних значень (наприклад, що не перевершують 5 знаків):

const int n = 10;

const int m = 5;

int main ()

{static int а[n][m];

for (unsigned i=0; i< n; i++)

{ for(unsigned j=0; j< m; j++)

cout << setw (8) << а[i][j]; //+ позиція на знак +2 пропуску

cout <<endl;

}

_getch();

return 0;

}

або

const int n = 9;

const int m = 3;

int main () {

static int а[n][m];

for (unsigned i=0; i< n; i++)

for(unsigned j=0; j< m; j++) //\t табуляція

printf ("а[%d][%d]=%d \t%c", i, j, а, (j==m-1)? '\n': ' ');

_getch();

return 0;

}

або

const int n = 10;

const int m = 5;

int main () {

static int а[n][m];

for (unsigned i=0; i< n; i++)

for(unsigned j=0; j< m; j++)

printf ("%d \t%c", а, (j==m-1)? '\n': ' ');

_getch();

return 0;

}

або

const int n = 9;

const int m = 3;

int main () {

static int а[n][m];

for (unsigned i=0; i< n; i++)

{for (unsigned j=0; j< m; j++)

printf ("а[%d][%d]=%8d \t", i, j, а[i][j]);

printf ("\n");

}

_getch();

return 0;

}

Програма. Введення двовимірного масиву з файлу.

void main(void)

{ const n = 4, m = 4;

FILE *f1;

int i,j, а[n][m];

clrscr();

// Введення двовимірного масиву з файлу.

f1 = fopen("t2.dat", "r"); // t2.dat – ім'я файлу на диску з елементами матриці.

for (i = 0; i <= n-1; i++) // Перебір індексів рядків матриці.

{ for (j = 0; j <= m-1; j++) // Перебір елементів рядка матриці.

{ fscanf( f1 " %d", &a[i][j]); // Введення з файлу в пам'ять машини

// елементів i-й рядка матриці.

printf(" %d ", а[i][j]); // Виведення елементів матриці на екран

// монітора.

}

printf("\n"); // Переклад курсора екрану на інший рядок.

}

fclose(f1);

// Запис двовимірного масиву у файл.

f1 = fopen("t2_w.dat", "w");