- •1. Основні поняття Object Pascal
- •Label { Розділ опису міток } Const { Розділ опису констант }
- •Дійсні дані зображуються в експоненціальній формі
- •Введення і виведення даних. Для введення і виведення даних використовуються процедури
- •Лабораторна робота № 1 Лінійні програми з розгалуженнями
- •2. Оператори повторень
- •Оператор for з зарезервованим словом to виконується за алгоритмом:
- •Завершення виконання оператора for.
- •Лабораторна робота № 2 Циклічні програми. Обчислення з заданою точністю
- •3. Структуровані типи даних. Масиви
- •Лабораторна робота № 3 Алгоритми обробки масивів
- •4. Алгоритми обробки багатовимірних масивів
- •Лабораторна робота № 4 Алгоритми обробки багатовимірних масивів
- •5. Упорядкування і пошук даних
- •Лабораторна робота № 5 Упорядкування і пошук даних
- •6. Структуровані типи даних. Множини
- •Лабораторна робота № 6 Множини
- •7. Символьні рядки
- •Лабораторна робота № 7 Символьні рядки
- •8. Процедури і функції
- •Лабораторна робота № 8 Процедури і функції
- •9. Процедури і функції. Процедурні типи
- •Лабораторна робота № 9 Процедурні типи
- •Теоретичні відомості для виконання лабораторної роботи
- •1. Формула середніх прямокутників
- •2. Формула трапецій
- •3. Формула Сімпсона (формула парабол)
- •Розв’язування рівнянь. Розв’язування рівнянь виду
- •10. Рекурсивні процедури і функції Рекурсія – це такий спосіб організації обчислювального процесу, при якому підпрограма під час виконання звертається сама до себе.
- •Лабораторна робота № 10 Рекурсивні процедури і функції
- •11. Динамічні структури даних
- •Дані, які використовуються у програмі, поділяються на статичні й динамічні.
- •Вказівник може бути у трьох станах:
- •Вказівники
- •Лабораторна робота № 11 Динамічні структури даних
- •12. Файли
- •Лабораторна робота № 12 Текстові файли
- •Додаток Процедури і функції Object Pascal
- •Література
- •Практикум
- •58012, Чернівці, вул. Коцюбинського, 2
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.