Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
METOD_2.doc
Скачиваний:
11
Добавлен:
09.11.2019
Размер:
9.21 Mб
Скачать

4. Алгоритми обробки багатовимірних масивів

До традиційних обчислювальних алгоритмів обробки багатовимірних масивів належать: алгоритми пошуку максимальних і мінімальних елементів та індексів їх розміщення у масиві; обчислення сум і добутків елементів рядків і стовпчиків матриць; перестановки місцями рядків і стовпчиків матриць; вилучення рядків і стовпчиків матриць; обчислення суми, різниці та добутку матриць; транспонування матриць та інші. Розглянемо деякі з цих алгоритмів.

Приклад. Нехай задана матриця , . Розробити програму, яка перестановкою рядків і стовпчиків перетворює матрицю так, щоб мінімальний елемент матриці (вважається, що він єдиний) розмістився в правому нижньому куті.

Алгоритм розв’язання задачі складається з двох частин. Перша частина – це пошук номера рядка і номера стовпчика , на перетині яких розміщений мінімальний елемент матриці. Друга частина – це переміщення мінімального елемента матриці у правий нижній кут. Для цього потрібно поміняти місцями -ий і -ий рядки та -ий і -ий стовпчики матриці.

Для реалізації алгоритму командою File|New Application створимо новий проект. Присвоїмо формі заголовок Обчислення функції (властивість Caption). Командою File|Save All запишемо програмний модуль у файл з іменем ULAB4_1.pas, а проект – PLAB4_1.dpr.

Розробимо форму для введення початкових даних і виведення результату Рис.4.1.

Для введення розмірності матриці n розмістимо на формі компонент Edit. Для введення елементів матриці та виведення перетвореної матриці розмістимо на формі два компоненти StringGrid з такими властивостями:

  • Cels(ACol,ARow:integer):string – вмістиме комірки з координатами ACol, Arow;

  • Cols(Index:integer): Tstrings – вмістиме колонки Index;

  • Rows(Index:integer): Tstrings – вмістиме рядка Index;

  • Name: string – ім’я компонента;

  • Col: longint – номер поточного стовпця;

  • Row: longint – номер поточного рядка;

  • ColCount: longint – кількість стовпців;

  • RowCount: longint – кількість рядків;

  • FixedCol: longint – кількість стовпців фіксованої зони;

  • FixedRow: longint – кількість рядків фіксованої зони;

  • Options.goEditing: Boolean – дозвіл на редагування;

  • Options.goTabs: Boolean – переміщення курсора кл. Tab.

Рис.4.1 Форма Перетворення матриці

Встановимо компонентам StringGrid такі значення властивостей: FixedCols=0, FixedRows=0, Options.goEditing=true, Options.goTabs=true.

Крім цього, розмістимо на формі три керуючі кнопки (компонент Button) з написами Введення, Обчислення та Вихід.

Обробники кнопок Введення Обчислення містяться у програмному модулі ULAB4_1 і мають вигляд:

unit ULAB4_1;

interface

………………

implementation

{$R *.DFM}

var n:integer;

{Обробник кнопки Введення}

procedure TForm1.Button1Click(Sender: TObject);

begin

if edit1.Text=''then ShowMessage('Введіть n')

else begin n:=strtoint(Edit1.Text);

if (n<0)or(n>14)then ShowMessage('Недопустиме n')

else begin

StringGrid1.RowCount:=n;

StringGrid1.ColCount:=n;

StringGrid2.RowCount:=n;

StringGrid2.ColCount:=n;

end;

end;

end;

{Обробник кнопки Введення}

procedure TForm1.Button2Click(Sender: TObject);

Type Tmas=array[0..14] of integer;

Var a: array[0..14] of Tmas;

b:Tmas;

i, j, k, l, r: integer;

begin

{Введення початкових даних}

for i:=0 to n-1 do

for j:=0 to n-1 do

a[i,j]:=StrToInt(StringGrid1.Cells[j,i]);

{Пошук координат мінімального елемента матриці }

k:=0; l:=0;

for i:=0 to n-1 do

for j:=0 to n-1 do

if a[i,j]<a[k,l] then begin k:=i; l:=j;end;

{Перестановка місцями -го і -го рядків матриці}

b:=a[n-1]; a[n-1]:=a[k]; a[k]:=b;

{Перестановка місцями -го і -го стовпців матриці}

for i:=0 to n-1 do

begin r:=a[i,n-1]; a[i,n-1]:=a[i,l]; a[i,l]:=r; end;

{Виведення перетвореної матриці }

for i:=0 to n-1 do

for j:=0 to n-1 do

StringGrid2.Cells[j,i]:=IntToStr(a[i,j]);

end;

end.

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

Наведемо алгоритм обчислення добутку двох матриць. Добутком матриць і є матриця , елементи якої обчислюються за правилом

тобто елемент , який стоїть в -му рядку і -му стовпчику, дорівнює сумі добутків відповідних елементів -го рядка матриці і -го стовпчика матриці .

Для реалізації алгоритму командою File|New Application створимо новий проект. Присвоїмо формі заголовок Обчислення функції (властивість Caption). Командою File|Save All запишемо програмний модуль у файл з іменем ULAB4_2.pas, а проект – PLAB4_2.dpr.

Розробимо форму для введення початкових даних і виведення результату Рис.4.2.

Аналогічно, як у попередньому прикладі для введення розмірності матриць n розмістимо на формі компонент Edit. Для введення елементів матриць і та виведення їх добутку розмістимо на формі три компоненти StringGrid і встановимо їм такі ж значення властивостей.

Крім цього, розмістимо на формі три керуючі кнопки з написами Введення, Обчислення та Вихід.

Обробник кнопки Обчислення міститься у програмному модулі ULAB4_2.

Рис.4.2 Форма Добуток матриць

unit ULAB4_2;

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

procedure TForm1.Button2Click(Sender: TObject);

Type Tmas=array[0..14] of real;

Var a, b, c: array[0..14] of Tmas;

i, j, k: integer;

begin

{Введення початкових даних}

for i:=0 to n-1 do

for j:=0 to n-1 do

a[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);

for i:=0 to n-1 do

for j:=0 to n-1 do

b[i,j]:=StrToFloat(StringGrid2.Cells[j,i]);

{Обчислення добутку матриць a і b }

for i:=0 to n-1 do

for j:=0 to n-1 do

begin c[i,j]:=0;

for k:=0 to n-1 do

c[i,j]:= c[i,j]+a[i,k]*b[k,j];

end;

{Виведення добутку матриць}

for i:=0 to n-1 do

for j:=0 to n-1 do

StringGrid3.Cells[j,i]:=FloatToStr(c[i,j]);

end;

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]