Поняття та алгоритми обробки двовимірних масивів
МІНІСТЕРСТВО
ОСВІТИ І НАУКИ УКРАЇНИ
БУКОВИНСЬКИЙ
ДЕРЖАВНИЙ ФІНАНСОВО-ЕКОНОМІЧНИЙ УНІВЕРСИТЕТ
Кафедра
комп’ютерних наук
Індивідуальне
навчально-дослідне завдання
на
тему
«Поняття
та алгоритми обробки двовимірних масивів»
Виконала:
студентка
групи КН-11
Кицун
Т.М.
Чернівці
- 2014
План
1. Визначення та ініціалізація
двовимірних масивів.
. Ознаки розміщення елементів
на головній та бічній діагоналі.
. Алгоритми обробки двовимірних
масивів.
. Двовимірні масиви в задачах
лінійної алгебри.
1. Визначення та ініціалізація
двовимірних масивів
Всі ми знаємо, що таке одновимірні
масиви. Вони нагадують полицю з книгами. Може бути більше книг на більш довшій
полиці або ж менше книг - на більш коротшій полиці. Таким чином, полиця - єдина
розмірність, що визначає її ємність, отже, вона є одновимірною. Але що, якщо
тепер потрібно використати масив для моделювання сонячних панелей, як показано
на рисунку 1? Сонячні панелі, на відміну від книжних полиць, поширюються у двох
розмірностях: по довжині і по ширині.
Як можна помітити на рис.1, шість
сонячних панелей розташовуються в двовимірному порядку: два ряди по три
стовпці. З одного боку, ви можете розглядати таке розташування, як масив з двох
елементів, кожен з яких сам є масивом з трьох панелей, іншими словами, як масив
масивів. У мові C ++ ви можете створювати двовимірні масиви, але ви не обмежені
тільки двома розмірностями. Залежно від необхідності і характеру програми, ви
можете також створити в пам'яті багатовимірні масиви.
Ініціалізація двовимірних масивів.
Мова C ++ дозволяє оголошувати
багатовимірні масиви, вказавши кількість елементів, яку необхідно зарезервувати
по кожній розмірності. Отже, двовимірний масив цілих чисел, що являє сонячні
панелі на рис.1, можна оголосити так:SolarPanell [2][3];
Зверніть увагу, що на рис.1 кожному
з шести панелей присвоєно також ідентифікатор в межах від 0 до 5. Якби довелося
ініціалізувати цілочисельний масив в тому ж порядку, то це виглядало б
так:SolarPanell [2][3] = {{0, 1, 2}, {3, 4, 5}};
Як бачите, синтаксис ініціалізації
подібний використовуваному при ініціалізації двох одновимірних масивів.
Зверніть увагу: це не два масиви, оскільки массив двовимірний, це два його
рядки. Якби цей масив складався з трьох рядків і трьох стовпців, його
оголошення і ініціалізація виглядали б наступним чином:Threemass [3][3] = {{4,
3, 7}, {1, 2, 5}, {9, 8, 6}};
Такі масиви називаються статичними
(static array), оскільки кількість елементів, що в них містяться, а також
розмір їх області в пам'яті залишаються незмінними під час компіляції.
ПРИМІТКА. Навіть при тому, що мова
C++ дозволяє використовувати модель багатовимірних масивів, в пам'яті масив
міститься як одновимірний. Компілятор розкладає багатовимірний масив в області
пам'яті, яка розширюється тільки в одному напрямку.
Масив визначається двома розмірами,
які укладені в квадратні дужки:massiv [i][j];
Можна вважати massiv двовимірним
масивом, схожим на шахову дошку. Іншими словами, можна сказати, що цей масив є
масивом масивів. Це масив елементів i, кожен з яких є массивом елементів j. На
рис.2 показано, як це виглядає.
двовимірний масив
алгоритм матриця
В цілому багатовимірний масив
оголошується у програмі в такий спосіб:
<тип> <ім’я масиву> [
<розмір1>] [ <розмір2>] … [ <розмірN>];
Для того, щоб елементи масиву ми
могли вводити з клавіатури, потрібно ввести такий код:<<"n,
m="; //запитуємо n(кількість рядків), m(кількість
стовпців);>>n>>m; //вводимо
n,m;(i=0;i<n;i++)(j=0;i<m;j++)>>a[i][j]; //вводимо елементи масиву;
Аналогічно можна використати
оператор rand() для ініціалізації елементів матриці за допомогою генератора
псевдовипадкових чисел.
Для виведення двовимірного масиву на
екран використовуються наступні оператори:
for(i=0;i<n;i++)
{(j=0;i<m;j++)<<a[i][j]<<”
“;<<endl;
}
Приклад.
Дано матрицю А розмірності NxN.
Заповнити її за допомогою генератора псевдовипадкових чисел в діапазоні [-5;
5]. Знайти суму додатних елементів.
#include <iostream>
#include <conio.h>
#include <clocale>namespace
std;main ()
{(LC_CTYPE,”rus”);A[20][20],
i,j,S=0,N;<<"Введіть N: "; //вводимо розмірність
матриці;>>N;(i=0;i<N;i++) /*заповнюємо матрицю за допомогою генератора
псевдовипадкових
чисел;*/(j=0;j<N;j++)[i][j]=rand()%-11-5;<<"Матриця A:
"<<endl;(i=0;i<N;i++) //виводимо матрицю на екран;
{(j=0;j<N;j++)
{<<A[i][j]<<"
";
}<<endl;
}(i=0;i<N;i++) //знаходимо
додатні елементи і їх суму;
{(j=0;j<N;j++)(A[i][j]>0)
{=S+A[i][j];
}
}<<"Сума додатних
елементів - "<<S;();0;
}
. Ознаки розміщення елементів на
головній та бічній діагоналі
Багато задач по двовимірним масивам
пов’язана із використанням елементів, що розміщена на головній чи бічній
діагоналях матриці або ж вище чи нижче них. На рисунку 3 зображено діагоналі і
рівності.
♦ Якщо елемент знаходиться на
головній діагоналі, тоді номер рядка має дорівнювати номеру стовпця (i=j).
♦ Якщо ж елемент знаходиться
на бічній діагоналі, тоді сума індексів має дорівнювати розмірності елементів,
від якої відняли 1, тобто має задовольняти рівність «i+j=N-1».
♦ Якщо елементи знаходяться нижче
головної діагоналі, то номер рядка елемента має бути більшим за номер
стовпця(i>j).
♦ Якщо елемент знаходиться
вище головної діагоналі, то номер рядка елемента має бути менший за номер
стовпця елемента (i<j).
♦ Якщо потрібні елементи
знаходяться над бічною діагоналлю, тоді індекси мають задовольняти таку
рівність «i + j +1 < N».
Якщо ж елементи знаходяться нижче
головної діагоналі, тоді задовольняється така рівність «i+j+1>N».
Приклад.
Дано матрицю розмірності NxN. Заповнити
матрицю, вивести елементи головної та бічної діагоналей. Знайти середнє
арифметичне суми їх елементів.
#include <iostream>
#include <conio.h>
#include <clocale>namespace
std;main ()
{(LC_CTYPE,"rus");i, j,
HD, BD,sum=0;n,ser;A[50][50];<<"n= ";>>n;<<"Введіть
елементи матриці A: "<<endl;(i=0;i<n;i++) // знаходимо елементи
головної діагоналі(j=0;j<n;j++)>>A[i][j];<<"Елементи
головної діагоналі: ";(i=0;i<n;i++)(j=0;j<n;j++)
{(i==j)
{<<A[i][j]<<"
";=sum+A[i][j];
}
{<<A[i][j]<<"
";=sum+A[i][j];
}<<endl;=sum/n;<<"Середнє
геометричне суми елементів діагоналей = "<<ser;();0;
}
. Алгоритми обробки двовимірних
масивів
Існує багато різноманітних задач з
використання двовимірних масивів. Що ж можна робити з двовимірними масивами.
Ось перелік декількох операцій:
♦ створення нового масиву за
заданим алгоритмом;
♦ пошук елементів масиву за
заданими параметрами;
♦ визначення, чи задовольняє
двовимірний масив або окремі його елементи певній властивості;
♦ виконання певних операцій
над компонентами двовимірного масиву (переставляння рядків і стовпців, множення
матриць, знаходження окремих елементів тощо).
. Двовимірні масиви в задачах
лінійної алгебри.
В лінійній алгебрі двовимірні масиви
зазвичай називають матрицями. Над матрицями як і над числами, можна виконувати
ряд дій, причому всі з них можливо запрограмувати. (Знаходження визначника,
множення матриць, піднесення до степеня, транспонування тощо). Наведемо один
приклад використання двовимірних масивів в лінійній алгебрі.
Приклад.
Дано дійсну матрицю А розмірності
nxn. Транспонувати матрицю та вивести її на екран. Помножити транспоновану
матрицю на введене з клавіатури число k та вивести готову матрицю на екран.
#include <iostream>
#include <conio.h>
#include <clocale>
#include <math.h>namespace
std;main ()
{(LC_CTYPE,"rus");i, j, k,
n;A[50][50];<<"n= ";>>n;<<"k=
";>>k;<<"Введіть елементи матриці A:
"<<endl;(i=0;i<n;i++) //вводимо початкову
матрицю;(j=0;j<n;j++)>>A[i][j];<<"Транспонована матриця:
"<<endl;(i=0;i<n;i++) //виводимо транспоновану матрицю;
{(j=0;j<n;j++)
{<<A[j][i]<<"
"; /*для цього достатньо вивести матрицю в зворотному порядку*/
}<<endl;
}(i=0;i<n;i++) //множимо матрицю
на число k;
{(j=0;j<n;j++)
{[i][j]=A[j][i]*k;
}
}<<"Помножимо
транспоновану матрицю на число k: "<<endl;(i=0;i<n;i++)
//виводимо готову матрицю на екран;
{(j=0;j<n;j++)
{<<A[i][j]<<"
";
}<<endl;
}();0;
}
Використана література
1. Лафоре Р. "Объектно-ориентированное
программирование в С++" <http://vk.com/wall-54530371_254> (2004)
. С. Рао "Освой самостоятельно C++
за 21 день" <https://vk.com/wall-54530371_6846> (2013)
. "Учимся программировать на С++
вместе с Джоном Смайли" <https://vk.com/wall-54530371_7695> (2014)
. А.І. Скицько, «Лінійна алгебра та
аналітична геометрія»(2003)