Створення|створіння| і обробка масивів

Мета|ціль|. Отриматитримати практичні навички|навички| створення|створіння| і обробки масивів даних за допомогою мови С++.

Короткі теоретичні відомості

Масив – це тип даних, використовуваний для представлення великої кількості даних одного типу. Доступ до елементів масиву організовується за допомогою індексів. Типове оголошення масиву розподіляє пам'ять, що починається з базової адреси. У С++ ім'я масиву – покажчик на базову адресу (фактично константа).

За способом розподілу пам'яті під дані масиви розділяють на статичні і динамічні.

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

Мова|язик| С++ допускає масиви будь-якого типу, включаючи масиви масивів (багатовимірні|багатомірні|).

Наприклад. Заданий двовимірний масив дійсних чисел. Визначити математичне очікування|чекання| і дисперсію.

#include <iostream. h>

#include <conio. h>

#define Row 5

#define Col 4

void main ()

{float mas[Row][Col],//оголошення масиву mas, який містить Row*Col //елементів типу float

float m_o = 0, m_o_2=0; int i, j;

for (i = 0; i < Row, i ++)

for (j = 0; j < Col, j ++)

{cin >> mas[i][j]; //внесення значень елементів

m_o + = mas[i][j]; //накопичення суми елементів масиву

m_o_2+=mas[i][j]*mas[i] [j];//накопичення суми квадратів елементів масиву

}

m_o = m_o / (Col*Row); //обчислення мат. сподівання/

сout << “\n Математичне сподівання = ” << m_o;

m_o_2 = m_o_2 / (Col*Row); //обчислення моменту другого порядку

cout << “\ n Дисперсія = “ << m_о_2 - m_о*m_0;

getch();

}

Динамічні масиви використовуються для гнучкішого розподілу оперативної пам'яті під елементи масиву і управління нею. При цьому в С++ використовуються оператори new і delete у вигляді|виді|:

ім’я_массиву = new тип_ елементу [кількість_элементів] ;

delete [] ім’я_массиву;

при цьому ідентифікатор ім’я_масиву повинен бути оголошений покажчиком на тип елементів масиву:

тип_елементу * ім’я_массива;

Якщо компілятору не вдається виділити з|із| купи(вільної пам'яті) необхідний об'єм|обсяг| пам'яті, що запрошується оператором new, то ідентифікатору ім’я_масиву привласнюється значення системного покажчика порожнечі|пустоти| NULL.

При динамічному розподілі пам'яті під багатовимірні|багатомірні| масиви спочатку за допомогою оператора new відбувається|походить| виділення зв'язної області під ланцюжок покажчиків на рядки масиву (тобто під адреси рядків). Довжина цього ланцюжка визначається кількістю рядків. Далі необхідно ініциалізувати кожен покажчик з|із| ланцюжка адресою, за якою знаходитиметься|перебуватиме| ланцюжок елементів відповідного рядка.

Наприклад. Створити динамічний двовимірний масив чисел, визначити позицію першого нуля в кожному рядку.

#include < iostream. h >

void main()

{ int row, col, i, j, pos;

cout << ¢¢ \n введіть кількість рядків та стовпчиків¢¢;

cin >> row>>col;

int ** mas;

mas = new int * [row]; // розподіл пам’яті під адреси рядків

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

{ mas [i] = new int [col]; /* розподіл пам’яті під елементи i - ого

рядка масиву */

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

cin >> mas [i] [j] ; // внесення значень елементів масиву

}

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

{ pos = -1;

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

if (mas [i][j] = = 0) break;

pos = j; /* якщо поточний елемент стовпчика дорівнює

нулю, занести його позицію в змінну pos*/

if (pos <col) cout << ¢¢ \ n в ¢¢ <<i<<¢¢ - ому рядку нуль знаходиться в ¢¢

<<pos<< ¢¢ стовпчику¢¢;

else cout << ¢¢ \n ¢¢ <<i<< ¢¢ рядок не мітить нуля¢¢;

}

for(i=0;i<col;i++) delete[] mas[i]; /*звільнення пам’яті, що була зайнята під елементи i-того рядка */

delete[] mas; //звільнення пам’яті, що була зайнята під покажчики на рядки

}