Лабораторна робота № 7
Оброблення двовимірного масиву
1. Порядок виконання роботи
1.1. Скласти алгоритмічною мовою Фортран програму оброблення двовимірного масиву.
1.2. Відлагодити на комп’ютері складену програму.
1.3. Ввести числові дані та отримати результат.
1.4. Скласти звіт про роботу й захистити його.
2. Вказівки до виконання роботи
2.1. Приклади задач оброблення двовимірних масивів
При розв’язуванні різноманітних математичних та інженерних задач (матрична алгебра, оброблення експериментальних даних, виконання багатьох варіантів розрахунків тощо) виникає потреба у використанні двовимірних масивів. Розглянемо декілька характерних прикладів задач оброблення двовимірних масивів.
Приклад 1. Для заданої матриці А, яка містить N рядків і М стовпців, необхідно обчислити суму значень елементів її кожного рядка. Результат оформити у вигляді одновимірного масиву S.
Обчислення суми значень елементів кожного рядка матриці виконується за формулою

де і – біжучий номер рядка, j – біжучий номер стовпця. Для обчислення суми елементів і-го рядка необхідно, зафіксувавши його номер і, змінювати номер j стовпця матриці від 1 до M та обчислити суму значень елементів даного рядка.
Один із можливих варіантів програми:

С
С
С
С
С


С






С






C
C






C






C






C






C



DO 3 I = 1, N

С
“Очищення“ комірки пам’яті, де буде вестися підрахунок суми елементів і-го рядка



S(I) = 0.

C
Початок циклу за параметром j



DO 2 J = 1, M

С
C
Обчислення суми елементів і-го рядка.
Закінчення циклу за змінною j


2
S(I) = S(I)+A(I, J)

C
С
Друкування номера і-го рядка та суми його елементів
на екран монітора



4
WRITE (*, 4) I, S(I)
FORMAT (2X, ‘S(’, I2, ‘) = ’, E10.4)

C
Закінчення циклу за змінною i


3
CONTINUE

C
Закінчення роботи програми



STOP
END


У цій програмі задано розмір двовимірного масиву A(30, 20) і розмір одновимірного масиву S(30), тому максимальне значення N кількості рядків не може перевищувати 30, а максимальне значення М кількості стовпців не може перевищувати 20. При необхідності розміри масивів можна змінити.
Перед запуском програми на виконання необхідно створити файл вхідної інформації DANI.DAT і занести до нього вхідні дані у довільному форматі таким чином: у першому рядку файла задати кількість рядків матриці А, у другому рядку – кількість її стовпців, у третьому рядку файла задати перший рядок матриці А, у четвертому – її другий рядок і т.д. Наприклад, матриця, яка містить 4 рядки і 3 стовпці, повинна бути задана у вигляді:
4
3
1.2
–3.25
9.07

–8.93
0.0
3.33

2.64
7.38
–1.37

5.76
2.80
0.05


У програмі організовано два цикли – внутрішній за параметром j, за допомогою якого змінюється номер стовпця, і зовнішній за параметром і, за допомогою якого змінюється номер рядка.
Очевидно, що перед початком обчислення суми елементів кожного рядка, комірки пам’яті, де буде проводитися підрахунок, необхідно “занулити”.
Результати обчислень надрукується на екрані монітора і будуть містити інформацію про номер рядка матриці та суму його елементів.
Приклад 2. Для матриці В, яка складається з N рядків і М стовпців, підрахувати кількість від’ємних елементів у кожному стовпці. Вхідна інформація задана у файлі DN.DAT у вигляді, аналогічному до наведеного. Результати оформити у вигляді одновимірного масиву і записати до файла REZ.DAT.
Один із можливих варіантів програми:
С
Оголошення розміру масивів



DIMENSION B(20, 15), К(15)

С
Відкривання файла вхідної інформації



OPEN (1, FILE = ‘DN.DAT’, STATUS = ‘OLD’)

C
Введення вхідних даних



1
READ (1, *) N
READ (1, *) М
DO 1 I=1, N
READ(1, *) (В(I, J), J=1, M)

C
Закривання файла вхідної інформації



CLOSE (1)

C
Відкривання файла вихідної інформації



OPEN (2, FILE = ‘REZ.DAT’, STATUS = ‘UNKNOWN’)

C
Початок циклу за параметром j



DO 4 J = 1, M

C
“Очищення“ комірки пам’яті, де буде вестися підрахунок кількості від’ємних елементів у стовпці



K(J)=0

C
Початок циклу за параметром i



DO 2 I = 1, N

C
C
Аналізування B(i, j).
Якщо B(i, j) < 0, то обчислення кількості від’ємних елементів у стовпці



IF (B(І, J) .LT. 0.0) K(J) = K(J) + 1

С
Закінчення циклу за змінною і


2
CONTINUE

C
Друкування номера j-го стовпця та кількості його від’ємних елементів у файл



3
WRITE (2, 3) J, K(J)
FORMAT (2X, ‘№ стовпця’, I3, 2X, ‘К-сть його від”ємних елементів’, I3)

С
Закінчення циклу за змінною j


4
CONTINUE

C
Закривання файла вихідної інформації



CLOSE (2)

C
Закінчення роботи програми



STOP
END


Тут, як і у попередній програмі, для обчислення кількості від’ємних елементів у кожному стовпці організовано два цикли. У зовнішньому циклі організовано вибір стовпця, а у внутрішньому – логічний умовний оператор передбачає для від’ємних елементів вибраного стовпця перехід на обчислення їх кількості.
Результати обчислень надрукується у файлі вихідної інформації, де буде вказано номер стовпця матриці та кількість його від’ємних елементів.
Приклад 3. Для матриці C скласти фрагмент програми визначення максимального за модулем елемента та його порядкового номера рядка і стовпця.
Один із можливих варіантів фрагменту програми:
С
Припускаємо, що елемент масиву С(1, 1) є максимальним за модулем



Amax = ABS(C(1, 1))

C
Його порядковий номер рядка 1



NR = 1

C
Його порядковий номер стовпця 1



NS = 1

C
Початок циклу за параметром і



DO 1 I = 1, N

C
Початок циклу за параметром j



DO 1 J = 1, M

C
Перевіряння умови |C(i, j)| > Amax



IF (ABS(С(І, J)) .GT. Amax) THEN


C
Так, |C(i, j)| > Amax.
Присвоєння змінній Amax знайденого максимального за модулем значення елемента масиву
та змінним NR і NS відповідно його порядкового номера рядка і стовпця



Amax = ABS(C(I, J))
NR = I
NS = J

C
Закінчення виконання блочного умовного оператора.

С
Закінчення циклів за параметрами і та j


1
END IF


Тут для визначення максимального за модулем елемента припускаємо, що елемент масиву С(1, 1) є максимальним і його значення за модулем присвоюємо змінній Amax. Очевидно, що у цьому випадку номер рядка та номер стовпця елемента С(1, 1) рівні 1. Далі кожен модуль елемента масиву С(i, j) порівнюємо з Amax, тобто перевіряємо умову |C(i, j)| > Amax. У випадку, коли умова справджується, то аналізоване значення С(i, j) є найбільшим за модулем і його присвоюємо змінній Amax та фіксуємо порядковий номер i рядка й порядковий номер j стовпця масиву.
Якщо матриця містить декілька однакових найбільших за модулем елементів, то наведеним фрагментом програми буде знайдений останній з них (тут слід мати на увазі, що знаходження цього елемента здійснюється по рядках). Рекомендуємо читачеві внести корективи у цей фрагмент програми з метою знаходження першого найбільшого за модулем елемента матриці.
2.2. Завдання
За номером варіанту з таблиці 7 вибираємо назву матриці, її розміри та розташування у таблиці 8.
Наприклад, для варіанту № 30, вибираємо матрицю PASS, яка містить N = 5 рядків і M = 4 стовпці. Її елемент PASS(1, 1) розташований на перетині І = 2 рядка та J = 4 стовпця таблиці 8. Тому ця матриця буде такою:
6,3
–2,1
8,5
0,0

1,7
6,8
–0,5
0,0

7,2
–5,5
–2,3
6,2

4,3
8,6
9,4
4,7

0,1
–5,8
3,2
4,8


Вибрану матрицю слід записати до файла DaniL7.dat у довільному форматі.
Для заданої файлі DaniL7.dat матриці при В = –1 необхідно:
1. Знайти максимальне значення елементу матриці.
2. Знайти максимальні значення модулів елементів матриці у кожному рядку.
3. Знайти мінімальні значення елементів матриці у кожному стовпці.
4. Знайти номер рядка і стовпця елементу матриці з мінімальним значенням.
5. Знайти номери рядків матриці з максимальним значення елементу у її кожному стовпці.
6. Знайти номери стовпців матриці з мінімальним значення елементу у її кожному рядку.
7. Обчислити кількість елементів матриці, які більші від В.
8. Обчислити кількість елементів кожного рядка матриці, які не більші від В.
9. Обчислити кількість елементів кожного стовпця матриці, які менші від В.
10. Обчислити суму елементів матриці.
11. Обчислити суму елементів матриці, більших від В.
12. Обчислити суму елементів матриці, для яких добуток i·j номерів їхніх рядка і стовпця є парним.
13. Обчислити добуток елементів матриці, відмінних від нуля і для яких добуток i·j номерів їхніх рядка і стовпця є непарним.
14. Обчислити суму елементів матриці, записаних у її непарних рядках.
15. Обчислити добуток елементів матриці, відмінних від нуля і записаних у її парних стовпцях.
16. Обчислити суму елементів матриці, записаних на перетині її парних рядків та непарних стовпців.
17. Обчислити кількість додатних елементів матриці, записаних на перетині її непарних рядків та парних стовпців.
18. Знайти різницю між кількістю додатних та від’ємних елементів матриці.
19. Обчислити суму додатних та добуток від’ємних елементів матриці.
20. Обчислити добуток елементів матриці, відмінних від нуля.
21. Обчислити добуток елементів матриці, відмінних від нуля і більших від В.
22. Порахувати кількість додатних елементів матриці.
23. Порахувати кількість від’ємних та нульових елементів матриці.
24. Порахувати кількість елементів матриці, модуль яких більший від одиниці.
25. Знайти номери рядка та стовпця елементів матриці, які дорівнюють заданому В.
26. Знайти кількість елементів матриці, які дорівнюють нулю, і їх номери рядка та стовпця.
27. Знайти номери рядка та стовпця додатних елементів матриці.
28. Знайти номери рядка та стовпця від’ємних елементів матриці, більших від В.
29. Знайти номери рядка та стовпця першого і останнього додатних елементів матриці.
30. Знайти номери рядка та стовпця другого і передостаннього від’ємних елементів матриці.
Завдання підвищеної складності.
Для матриці, заданої у файлі DaniL7.dat, необхідно:
1*. Розташувати елементи кожного рядка масиву у порядку зростання їхніх значень.
2*. Розташувати елементи кожного стовпця масиву у порядку спадання їхніх значень.
3*. Розташувати елементи кожного стовпця масиву у порядку зростання значень їхніх модулів.
4*. Розташувати елементи кожного рядка масиву у порядку спадання значень їхніх модулів.
5*. Вивести порядкові номери елементів кожного рядка масиву у порядку зростання їхніх значень.
6*. Вивести порядкові номери елементів кожного стовпця масиву у порядку спадання їхніх значень.
7*. Вивести порядкові номери кожного стовпця елементів масиву у порядку зростання значень їхніх модулів.
8*. Вивести порядкові номери кожного рядка елементів масиву у порядку спадання значень їхніх модулів.
Таблиця 7
Назва, розміри матриці та її розташування у таблиці 8
№ варіанту

Назва матриці

N

M

I

J

1
C7
4
5
1
3

2
B
3
5
4
6

3
ABC
5
5
1
2

4
G5
4
3
2
8

5
D
6
6
1
3

6
FF
6
5
1
6

7
P
5
6
2
4

8
G
5
4
1
5

9
H5R
4
5
3
3

10
B1
5
5
2
6

11
BM
6
3
1
5

12
SA
5
4
2
3

13
ROTOR
4
6
3
1

14
U
5
6
1
4

15
Y
6
5
1
2

16
W
5
5
2
4

17
QE
3
6
4
3

18
TA
4
4
3
4

19
B
6
4
1
6

20
V
5
6
2
3

21
Z
4
5
2
1

22
XY
5
5
1
5

23
H
5
4
2
6

24
AF
6
3
1
4

25
X
5
4
1
3

26
CCC
4
6
2
1

27
SER
4
5
3
3

28
TOP
6
4
1
7

29
AQ17
5
5
2
5

30
PASS
5
4
2
4


Таблиця 8
Вибір матриці
Стовпець
Рядок

1

2

3

4

5

6

7

8

9

10

1
8,3
–1,0
2,4
4,5
2,3
–5,1
1,3
–8,1
0,0
2,8

2
–6,0
5,7
0,8
6,3
–2,1
8,5
0,0
1,6
1,1
–7,3

3
9,7
–4,3
3,5
1,7
6,8
–0,5
0,0
2,7
3,2
–0,4

4
–2,8
2,3
0,7
7,2
–5,5
–2,3
6,2
5,9
–9,5
3,6

5
4,1
–6,7
0,0
4,3
8,6
9,4
4,7
–3,8
3,3
–0,8

6
7,1
5,9
–1,0
0,1
–5,8
3,2
4,8
–9,4
2,8
–8,7