<
  • Главная
Статьи

НОУ ІНТУЇТ | лекція | Обробка матриць в Паскалі

  1. 6.1 Введення-виведення матриць

Матриця - це двовимірний масив, кожен елемент якого має два індекси: номер рядка та номер стовпчика.

Оголосити двовимірний масив (матрицю) можна так:

ім'я: array [індекс1_нач .. індекс1_кон, індекс2_нач .. індекс2_кон]

of тип;

де

  • тип визначає тип елементів масиву,
  • ім'я - ім'я матриці,
  • індекс1_нач..індекс1_кон - діапазон зміни номерів рядків,
  • індекс2_нач..індекс2_кон - діапазон зміни номерів стовпців матриці.

наприклад,

var h: array [0 .. 1 1, 1 .. 10] of integer;

Описана матриця цілих чисел h, що складається з дванадцяти рядків і десяти стовпців (рядки нумеруються від 0 до 11, стовпчики від 1 до 10).

Існує ще один спосіб описати матриці, для цього треба створити новий тип даних:

type

новий_тіп = array [індекс1_нач .. індекс1_кон] of тип;

var

ім'я: array [індекс2_нач .. індекс2_кон] of новий_тіп;

або

type

новий_тіп = array [спісок_діапазонов] of тип;

var

ім'я: новий_тіп;


Мал.6.1.

Построчная обробка матриці
Мал. 6.2. Алгоритм обробки матриці по стовпцях

наприклад:

type massiv = array [1 .. 30] of integer; matrica = array [0 .. 15, 0 .. 13] of real; var a, b: array [1 .. 10] of massiv; c: matrica;

В даному випадку в матрицях a і b є 10 рядків і 30 стовпців, а з - матриця, в якій є 16 рядків і 14 стовпців.

Для звернення до елемента матриці необхідно вказати її ім'я і в квадратних дужках через кому номер рядка і номер стовпця:

ім'я [номер_рядка, номер_стовпчика]

або

ім'я [номер_рядка] [номер_стовпчика]

Наприклад, h [2,4] 1 - елемент матриці h, що знаходиться в рядку під номером два і стовпці під номером чотири.

Для обробки всіх елементів матриці необхідно використовувати два циклу. Якщо матриця обробляється через підрядник, то в зовнішньому циклі послідовно перебираються рядки від першої до останньої, потім у внутрішньому - все (перший, другий, третій і т. Д.) Елементи поточної рядки. При обробці елементів матриці по стовпцях зовнішній цикл буде перебирати стовпці, внутрішній - рядки. на Мал. 6.1 представлена ​​блок-схема алгоритму обробки матриці по рядках, на Мал. 6.2 - по стовпцях. Тут i - номер рядка, j - номер стовпця, N - кількість рядків, M - кількість стовпців матриці A.


Мал.6.3.

Блок-схема введення елементів матриці
Мал. 6.4. Порядковий висновок матриці

Розглянемо основні операції, що виконуються над матрицями при вирішенні завдань.

6.1 Введення-виведення матриць

Матриці, як і масиви, потрібно вводити (виводити) поелементно. Спочатку слід ввести розміри матриці, а потім вже в подвійному циклі вводити елементи. Блок-схема введення елементів матриці зображена на Мал. 6.3 .

Висновок можна здійснювати по рядках або по стовпцях, але краще, якщо елементи розташовуються по рядках, наприклад,

2 3 13 35

5 26 76 37

52 61 79 17

Алгоритм порядкового виведення елементів матриці наведено на Мал. 6.4 .

Про опис матриць на мові Паскаль було розказано в розділі 5.2 глави 5, звернення до елементу Про опис матриць на мові Паскаль було розказано в розділі 5 матриці можна здійснити c допомогою конструкції або .

Розглянемо реалізацію введення-виведення матриць в консольних додатках.

Для організації порядкового введення матриці в подвійному циклі по рядках і стовпцях можна використовувати оператор read.

for i: = 1 to N do for j: = 1 to m do read (A [i, j]);

В цьому випадку елементи кожного рядка матриці можна розділяти символами пробілу або табуляції, і тільки в кінці рядка натискати Enter.

ЗАВДАННЯ 6.1. Написати консольне застосування введення матриці дійсних чисел і виведення її на екран монітора.

Нижче наведено приклад консольного застосування введення-виведення матриці.

var a: array [1 .. 2 0, 1 .. 2 0] of real; i, j, n, m: integer; begin {Введення розмірів матриці} writeln ( 'Введіть кількість рядків і стовпців матриці A'); readln (N, M); {Введення елементів матриці.} Writeln ( 'Введіте_матріцу'); for i: = 1 to N do for j: = 1 to m do read (A [i, j]); {Висновок елементів матриці.} Writeln ( 'матриця А'); for i: = 1 to n do begin for j: = 1 to m do write (a [i, j]: 8: 3, ''); {Друкується рядок.} Writeln {Перехід на новий рядок.} End;

на Мал. 6.5 представлені результати роботи програми.


Мал.6.5.

Результати роботи програми вирішення задачі 6.1

Введення матриці також можна організувати за допомогою наступного циклу.

for i: = 1 to N do for j: = 1 to m do begin write ( 'A (', i, ',', j, ') ='); readln (A [i, j]) end;

Автори пропонують читачеві самостійно розібратися, в чому буде відмінність введення матриці в цьому випадку.

Для введення-виведення матриць можна використовувати компонент типу TStringGrid, з яким ми познайомилися в розділі 5.

Як приклад розглянемо наступну задачу.

Блок-схема транспонування матриці приведена на Мал. 6.6 . При транспонировании матриці Блок-схема транспонування матриці приведена на   Мал виходить матриця B .


Мал.6.6.

Блок-схема транспонування матриці A

Розглянемо окремий випадок транспонування матриці фіксованого розміру A (4,3).

На формі розмістимо мітки Label1 і Label2 з властивостями Caption - Задана матриця На формі розмістимо мітки Label1 і Label2 з властивостями Caption - Задана матриця   і Транспонована матриця   , Два компонента типу TStringGrid, змінивши їх властивості так, як показано в   табл і Транспонована матриця , Два компонента типу TStringGrid, змінивши їх властивості так, як показано в табл. 6.1 , І кнопку Транспонування матриці.

Вікно форми додатка представлено на Мал. 6.7 .

Нижче наведено текст підпрограми з коментарями, яка буде виконуватися, якщо користувач клацне по кнопці Транспонування матриці.

Таблиця 6.1. Властивості компонентів StringGrid1, StringGrid2. Властивість StringGrid1 StringGrid2 Опис властивості Top 30 30 Відстань від верхньої межі таблиці до верхнього краю форми Left 15 240 Відстань від лівої межі таблиці до лівого краю форми Height 130 130 Висота таблиці Width 200 200 Ширина таблиці ColCount 4 5 Кількість стовпців RowCount 5 4 Кількість рядків DefaultColWidth 30 30 Ширина стовпчика DefaultRowHeight 20 20 Висота рядка Options.goEditing true false Можливість редагування таблиці
Мал. 6.7. Форма додатка транспонування матриці procedure TForm1. Button1Click (Sender: TObject); const n = 4; m = 3; // Розмірність матриці A (n, m). var i, j: byte; // Індекси матриці: // i - рядки, j - стовпці. A: array [1 .. n, 1..m] of integer; // Початкова матриця. B: array [1 .. m, 1 .. n] of integer; // Транспонована матриця. begin // Вихідні дані зчитуються з елементів таблиці на формі, // і їх значення записуються в двовимірний масив А. for i: = 1 to n do // Цикл за номерами рядків. for j: = 1 to m do // Цикл за номерами стовпців. // Зчитування елементів матриці A з компонента StringGrid1. A [i, j]: = StrToInt (StringGrid1.Cells [j, i]); // Формування транспонованою матриці B, см. Блок-схему на // рис. 6.6. for i: = 1 to n do // Цикл за номерами рядків. for j: = 1 to m do // Цикл за номерами стовпців. B [j, i]: = A [i, j]; // Елементи матриці B виводяться в осередку таблиці на формі. for i: = 1 to n do // Цикл за номерами рядків. for j: = 1 to m do // Цикл за номерами стовпців. // Звернення до елементів матриці відбувається за стовпцями. StringGrid2.Cells [i, j]: = IntToStr (B [j, i]); end;

Результати роботи програми представлені на Мал. 6.8 .


Мал.6.8.

Результати роботи програми транспонування матриці A (3,4)

Для демонстрації введення-виведення матриць за допомогою компонента типу TStringGrid ми розглянули роботу з матрицями фіксованого розміру A (4,3) і B (3,4). Тепер розглянемо загальний випадок рішення задачі транспонування матриці A (N, M).

Розташуємо на формі наступні компоненти:

  • мітку label1 з написом "Введіть розмірність матриці";
  • мітку label2 з написом "N =";
  • мітку label3 з написом "M =";
  • мітку label4 з написом "Вихідна матриця А";
  • мітку label5 з написом "Перетворена матриця В";
  • поле введення Edit1 для введення числа N;
  • поле введення Edit2 для введення числа M;
  • компонент StringGrid1 для введення вихідної матриці A;
  • компонент StringGrid2 для зберігання транспонованою матриці B;
  • кнопку Button1 з написом "Введення" для введення розмірів матриці А;
  • кнопку Button2 з написом "Очистити" для очистки вмісту матриць;
  • кнопку Button3 з написом "Транспонування" для вирішення завдання транспонування матриці А;
  • кнопку Button4 з написом "Вихід з програми" для завершення роботи програми.

Можна розмістити компоненти на формі так, як показано на Мал. 6.9 .

Встановимо властивість видимості (Visible) в False у компонентів мітки label4, label5, StringGrid1, StringGrid2, кнопки Button2 і Button3. Після цього при запуску програми буде видно тільки компоненти, що відповідають за введення розмірів матриці, і кнопка Вихід з програми ( см. рис. 6.10 ) 3. Матриці A і B, їх розміри N, M оголосимо глобально.

type {TForm1} {Опис форми} TForm1 = class (TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; StringGrid1: TStringGrid; StringGrid2: TStringGrid; private {private declarations} public {public declarations} end; var {Матриці A, B} A, B: array [1 .. 25, 1 .. 25] of integer; {І їх розміри} N, M: integer; Form1: TForm1;

Оброблювач кнопки Вихід з програми стандартний і представлений нижче.

procedure TForm1. Button4Click (Sender: TObject); begin Close; end;

Тепер напишемо обробник кнопки Введення, який повинен вводити і перевіряти коректність введення розмірів матриці, встановлювати властивості компонентів StringGrid1 і StringGrid2 (кількість рядків і стовпців), робити видимим компонент StringGrid1, кнопку Транспонування, невидимими компоненти, що відповідають за введення розмірів матриці (мітки label1, label2 , label3, поля введення Edit1 і Edit2, кнопку введення).

procedure TForm1. Button1Click (Sender: TObject); var i: byte; kod_n, kod_m, kod: integer; begin // Введення розмірності матриці. // Символьна інформація перетворюється в числову і // записується в Val (Edit1. Text, N, kod_m); // змінну M Val (Edit2. Text, M, kod_n); // і змінну N. // Якщо перетворення пройшло успішно і введені розміри // задовольняють опису // матриць A і B, if (kod_n = 0) and (kod_m = 0) and (N> 0) and (N <26) and (M> 0) and (M <26) then // то begin // візуалізується перша матриця, StringGrid1. Visible: = true; Label4. Visible: = true; // відповідна їй напис, Button2. Visible: = true; // кнопки "Очистити" Button3. Visible: = true; // і "Транспонування". with StringGrid1 do begin // Визначаємо число рядків (RowCount) і стовпців (ColCount) в // компоненті StringGrid1. ColCount: = M + 1; RowCount: = N + 1; // і нумеруем рядки і стовпці матриці. for i: = 1 to RowCount-1 do Cells [0, i]: = IntToStr (i); for i: = 1 to ColCount -1 do Cells [i, 0]: = IntToStr (i); end; StringGrid2. ColCount: = N + 1; StringGrid2. RowCount: = M + 1; end else begin // При некоректному введенні видається відповідне повідомлення. MessageDlg ( 'Розміри матриці введені не вірно!', MtInformation, [mbOk], 0); // Встановлюються стартові параметри в поля введення. Edit1. Text: = '4'; Edit2. Text: = '3'; end; end;

Тепер напишемо обробник кнопки Транспонування. При натисканні на цю кнопку стає видимим компонент StrigGrid2, призначений для зберігання транспонованою матриці B, відповідна йому напис (label5), формується матриця B. Матриця B виводиться в компонент StringGrid2. Кнопка Введення стає невидимою. Текст обробника наведено нижче.

procedure TForm1. Button2Click (Sender: TObject); var i, j: integer; begin // Візуалізується друга матриця, // відповідна їй напис. StringGrid2. Visible: = true; label5. Visible: = true; for i: = 1 to N do // Цикл за номерами рядків. for j: = 1 to M do // Цикл за номерами стовпців. // Зчитування елементів матриці A з компонента StringGrid1. A [i, j]: = StrToInt (StringGrid1.Cells [j, i]); with StringGrid2 do begin for i: = 1 to RowCount-1 do // Нумеруються рядки Cells [0, i]: = IntToStr (i); for i: = 1 to ColCount -1 do // і стовпці компонента StringGrid2, в Cells [i, 0]: = IntToStr (i); // якому відображається матриця B. end; // Формування транспонованою матриці B. for i: = 1 to N do // Цикл за номерами рядків. for j: = 1 to M do // Цикл за номерами стовпців. B [j, i]: = A [i, j]; // Елементи матриці B виводяться в осередку таблиці на формі. for i: = 1 to n do // Цикл за номерами рядків. for j: = 1 to m do // Цикл за номерами стовпців. // Звернення до елементів матриці відбувається за стовпцями. StringGrid2.Cells [i, j]: = IntToStr (B [j, i]); Buuton1.Visible: = False; end;

Залишилося написати обробник події при натисканні на кнопку Очистити. При натисканні на цю кнопку повинно відбуватися наступне:

  • очищення вмісту компонентів StringGrid1, StringGrid2;
  • компоненти StringGrid1, StringGrid2 і відповідні їм мітки labe4 і label5, а також кнопки Транспонувати і Очистити стають невидимими;
  • стає видимою кнопка Введення;
  • в поля введення записуються початкові значення розмірів матриці (N = 4, M = 3).

Текст обробника кнопки Очистити з коментарями наведено нижче:

procedure TForm1. Button3Click (Sender: TObject); var i, j: integer; begin // Очищення компонента StringGrid1. with StringGrid1 do for i: = 1 to RowCount-1 do for j: = 1 to ColCount -1 do Cells [j, i]: = ''; // Очищення компонента StringGrid2. with StringGrid2 do for i: = 1 to RowCount-1 do for j: = 1 to ColCount -1 do Cells [j, i]: = ''; // Робимо невидимими компоненти StringGrid1, StringGrid2, // labe4, label5. StringGrid1. Visible: = False; StringGrid2. Visible: = False; label4. Visible: = False; label5. Visible: = False; // Робимо невидимими кнопки "Транспонувати" і "Очистити". Button2. Visible: = False; Button3. Visible: = False; // Робимо видимої кнопку "Введення". Button1. Visible: = True; // Запис початкових значень розмірів матриці // (N = 4, M = 3). Edit1. Text: = '4'; Edit2. Text: = '3'; end;

Ми отримали працюючу програму для транспонування матриці. на Мал. 6.11 представлені результати транспонування матриці A (2,4).

Зверніть увагу на використання оператора приєднання

with імя_компонента do оператор;

який спрощує доступ до властивостей компонента. Усередині оператора With ім'я компонента для звернення до його властивостей можна не використовувати.

Наприклад, для очищення елементів матриці A замість операторів

for i: = 1 to StringGrid1. RowCount-1 do for j: = 1 to StringGrid1. ColCount -1 do StringGrid1.Cells [j, i]: = '';

був використаний оператор

with StringGrid1 do for i: = 1 to RowCount-1 do for j: = 1 to ColCount -1 do Cells [j, i]: = '';

Розглянемо кілька задач обробки матриць. Для їх вирішення нагадаємо читачеві деякі властивості матриць ( Мал. 6.12 ):


Мал.6.12.

Властивості елементів матриці



Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью