Lecture 7.2 for distance courses "Fundamentals of Informatics"
1. Двовимірні масиви
С++ дозволяє створювати багатовимірні масиви. Вимірність масиву
визначається кількістю індексів. Елементи одновимірного масиву
(вектора) мають один індекс, двовимірного масиву (матриці, таблиці) –
два індекси: перший з них – номер рядка, другий – номер стовпчика.
Кількість індексів у масивах є необмежена. При розміщуванні елементів
масиву в пам’яті комп’ютера першою чергою змінюється крайній правий
індекс, потім решта – справа наліво.
Найпростішим видом багатовимірного масиву є двовимірний масив.
Двовимірний масив – це масив одновимірних масивів. Двовимірний
масив оголошується наступним чином:
<тип> <ім’я> [ <розмір1>] [ <розмір2>] ;
Кількість елементів масиву дорівнює добуткові кількості елементів за
кожним індексом. У прикладі
int B[3][4];
оголошено двовимірний масив з 3-х рядків та 4-х стовпчиків (12-ти
елементів) цілого типу:
В[0][0], В[0][1], В[0][2], В[0][3],
В[1][0], В[1][1], В[1][2], В[1][3],
В[2][0], В[2][1], В[2][2], В[2][3];
2. Під масив надається пам’ять, потрібна для розташування усіх його
елементів. Елементи масиву один за одним, з першого до останнього,
запам’ятовуються у послідовно зростаючих адресах пам’яті так само, як і
елементи одновимірного масиву. Двовимірні масиви зберігаються у вигляді
матриці, де перший індекс відповідає за рядок, а другий – за стовпчик. Це
означає, що правий індекс змінюється швидше лівого, якщо рухатися по
масиву в порядку розташування елементів в пам'яті. На рис. показано
графічне представлення двовимірного масиву в пам'яті. Лівий індекс можна
розглядати як покажчик на рядок.
3. При оголошенні масиву можна ініціалізовувати початкові значення
його елементів, причому необов’язково усіх, наприклад:
int w[3][3]={ { 2, 3, 4 },{ 3, 4, 8 },{ 1, 0, 9 } };
double C[4][2]={1.1, 2, 3, 3.4, 0.5, 6.8, 9.7, 0.9};
Двовимірні масиви можна оголошувати й зі створюванням типу
користувача:
typedef <тип_даних> <і’мя_типу>[<розмір1>][<розмір2>];
<і’мя_типу> <і’мя_масиву> ;
Наприклад, створимо тип з ім’ям matr як масив додатних цілих чисел з
10-ти рядків і 7-ми стовпчиків та оголосимо два масиви – M1 і M2 –
створеного типу:
typedef int matr[10][7];
matr M1, M2;
Для оголошення масивів можна також використовувати типізовані
констант-масиви, які дозволяють водночас оголосити масив і задати його
значення в розділі оголошень констант, наприклад:
const int arr[2][2] = {{9, 3},{ –7, 123};
4. Введення-виведення значень елементів двовимірного масиву можна
лише поелементно, для чого слід організовувати цикли, в яких послідовно
змінюватимуться значення індексів елементів.
Приклад виведення двовимірного масиву у вигляді таблиці:
const int n=5,m=3;
int i,j;
double A[n][m];
for (i = 0; i < n; i++) {
for (j=0; j < m; j++) {
A[i][j]=(i+j)*0.1;
printf(“%3.1lf ",A[i][j]);
}
printf("n");
}
С++ дозволяє створювати масиви з розмірностями більше двох.
Багатовимірний масив оголошується наступним чином:
<тип> <ім’я> [ <розмір1>] [ <розмір2>] … [ <розмірN>];
Масиви, що мають більше трьох розмірностей, використовуються
надзвичайно рідко, оскільки потрібен великий обсяг пам'яті для їх
зберігання.
6. #include <iostream> Met_massiv2_N
#include <math.h>
int main()
{ const int n=10,kd=3;
double w[n], Ne[n][kd],dw;
double wmin=47;
double Nen[kd]={177,442,993},wn[kd]={220,272,293};
double a[kd]={0.49,-0.06,0.15},b[kd]={1.7,2.88,2.82},c[kd]={1.19,1.82,1.97};
int i,j;
dw=(wn[2]-wmin)/(n-1);
for (i = 0; i < n; i++) {
w[i]=wmin+i*dw;
for (j = 0; j < kd; j++)
Ne[i][j]=Nen[j]*(a[j]*w[i]/wn[j]+b[j]*pow(w[i]/wn[j],2)-c[j]*pow(w[i]/wn[j],3));
}
printf("w(rad/s) Ne IAMZ-238(kVt) Ne 3TD-4(kVt) Ne 6TD-3(kVt)n");
for (i = 0; i < n; i++) {
printf(" %5.1lf t",w[i]);
for (j = 0; j < kd; j++){
if (w[i]<=wn[j])
printf("%5.1lf tt",Ne[i][j]);
else printf("----- tt");
}
printf("n");
}
return 0;
}
7. Практичне завдання 7.1
Написати програму, яка буде реалізовувати наступний алгоритм:
1. Знайти максимальний та мінімальний елементи двовимірного масиву.
2. Рядок, що містить максимальний елемент, поміняти місцями з рядком, що містить
мінімальний елемент. Вивести отриманий масив.
3. Розташувати елементи кожного рядка в порядку зменшення.
Приклад інтерфейсу програми:
12. #include <iostream>
massiv_z_7_1
#include <time.h>
#include <stdlib.h>
int main()
{
const int n=10,m=5;
int i,j,imin,imax,k;
double A[n][m];
double min,max,tmp;
srand(time(NULL));
for (i = 0; i < n; i++) {
for (j=0; j < m; j++) {
A[i][j]=rand()%100+1;
printf("%3.0lf ",A[i][j]);
}
printf("n");
}
13. //Пошук максимального і мінімального елементів масиву
min=max=A[0][0];
imin=imax=0;
for (i = 0; i < n; i++)
for (j=0; j < m; j++)
{
if (min>A[i][j])
{ min=A[i][j];
imin=i;
}
if (max<A[i][j])
{ max=A[i][j];
imax=i;
}
}
printf("ntmin=%3.0lf max=%3.0lf imin=%d imax=%dnn",min,max,imin+1,imax+1);
// Перестановка рядків
for (j=0; j < m; j++)
{tmp=A[imax][j];
A[imax][j]=A[imin][j];
A[imin][j]=tmp;
}
for (i = 0; i < n; i++) {
for (j=0; j < m; j++) {
printf("%3.0lf ",A[i][j]);
}
printf("n");
}
printf("n");
14. //Сортування рядків масиву за зменшенням
for (i = 0; i < n; i++)
for (j = 0; j < m-1; j++)
for (k=j+1; k < m; k++)
if (A[i][j]<A[i][k]) {
tmp=A[i][j];
A[i][j]=A[i][k];
A[i][k]=tmp;
}
for (i = 0; i < n; i++) {
for (j=0; j < m; j++) {
printf("%3.0lf ",A[i][j]);
}
printf("n");
}
return 0;
}
15. Практичне завдання 7.3
Постановка задачі
Надано: масив оцінок Oc[kstud][koc] студентів, де kstud – кількість студентів, koc – кількість
оцінок відповідного i-го студента, масив вагових коефіцієнтів кожної j-ої дисципліни Kr[koc], масив
додаткових балів кожного i-го студента D[kstud].
1. Створити програму формування масиву RB[kstud], в якому кожен елемент – рейтинговий бал i-го
студента.
2. Розташувати елементи масиву RB[kstud] в порядку зменшення.