Общая часть
Во всех задачах будем считать, что матрица описана следующим образом:
const SzM = 10; SzN = 10; type Matrix = array [1..SzM,1..SzN] of integer;
Кроме того, во всех задачах будем использовать следующие процедуры для заполнения и вывода:
procedure FillMatrixByRandom(var a: Matrix; m,n: integer); // Заполнение случайными begin for var i:=1 to M do for var j:=1 to N do a[i,j] := Random(10); end; procedure PrintMatrix(const a: Matrix; m,n: integer); // Вывод матрицы begin for var i:=1 to M do begin for var j:=1 to N do write(a[i,j]:4); writeln; end; end;
Данные участки кода следует писать в начале каждой программы, приводимой в этом пункте.
Заполнение матрицы случайными числами и вывод
var a: Matrix; begin var m := 4; var n := 5; FillMatrixByRandom(a,m,n); writeln('Элементы матрицы: '); PrintMatrix(a,m,n); end.
Перемена местами двух строк
var a: Matrix; begin var m := 5; var n := 9; FillMatrixByRandom(a,m,n); writeln('Исходная матрица: '); PrintMatrix(a,m,n); var k1 := 2; // поменять местами строки с номерами k1 и k2 var k2 := 4; for var j:=1 to n do Swap(a[k1,j],a[k2,j]); writeln('Преобразованная матрица: '); PrintMatrix(a,m,n); end.
Поиск минимумов в строках
var a: Matrix; mins: array [1..SzN] of integer; begin var m := 5; var n := 9; FillMatrixByRandom(a,m,n); writeln('Исходная матрица: '); PrintMatrix(a,m,n); for var i:=1 to m do begin var min := a[i,1]; for var j:=2 to n do if a[i,j]<min then min := a[i,j]; mins[i] := min; end; writeln('Минимумы в строках: '); for var i:=1 to m do write(mins[i]:4); end.
Поиск максимумов в столбцах
var a: Matrix; maxs: array [1..SzN] of integer; begin var m := 5; var n := 9; FillMatrixByRandom(a,m,n); writeln('Исходная матрица: '); PrintMatrix(a,m,n); for var j:=1 to n do begin var max := a[1,j]; for var i:=2 to m do if a[i,j]>max then max := a[i,j]; maxs[j] := max; end; writeln('Максимумы в столбцах: '); for var j:=1 to n do write(maxs[j]:4); end.
Поиск сумм в строках
var a: Matrix; sums: array [1..SzM] of integer; begin var m := 4; var n := 5; FillMatrixByRandom(a,m,n); writeln('Исходная матрица: '); PrintMatrix(a,m,n); for var i:=1 to m do begin var sum := 0; for var j:=1 to n do sum += a[i,j]; sums[i] := sum; end; writeln('Суммы в строках: '); for var i:=1 to m do write(sums[i]:4); end.
Поиск произведений в столбцах
var a: Matrix; products: array [1..SzN] of integer; begin var m := 3; var n := 4; FillMatrixByRandom(a,m,n); writeln('Исходная матрица: '); PrintMatrix(a,m,n); for var j:=1 to n do begin var p := 1; for var i:=1 to m do p *= a[i,j]; products[j] := p; end; writeln('Произведения в столбцах: '); for var j:=1 to n do writeln(products[j]:4); end.
Наличие нуля в матрице
var a: Matrix; HasZero: boolean; label 1; begin var m := 3; var n := 4; FillMatrixByRandom(a,m,n); writeln('Исходная матрица: '); PrintMatrix(a,m,n); HasZero := False; for var i:=1 to m do for var j:=1 to n do if a[i,j]=0 then begin HasZero := True; goto 1; end; 1: if HasZero then writeln('В матрице есть нули') else writeln('В матрице нулей нет') end.
Сумма чисел на главной диагонали
var a: Matrix; sum: integer; begin var m := 5; var n := m; FillMatrixByRandom(a,m,n); writeln('Исходная матрица: '); PrintMatrix(a,m,n); sum := 0; for var i:=1 to m do sum += a[i,i]; writeln('Сумма элементов главной диагонали: ',sum); end.
Сумма чисел на побочной диагонали
var a: Matrix; sum: integer; begin var m := 5; var n := m; FillMatrixByRandom(a,m,n); writeln('Исходная матрица: '); PrintMatrix(a,m,n); sum := 0; for var i:=1 to m do sum += a[i,m-i+1]; writeln('Сумма элементов побочной диагонали: ',sum); end.
Заполнение нулями ниже главной диагонали
var a: Matrix; sum: integer; begin var m := 5; var n := m; FillMatrixByRandom(a,m,n); writeln('Исходная матрица: '); PrintMatrix(a,m,n); for var i:=2 to m do for var j:=m-i+2 to m do a[i,j] := 0; writeln('Преобразованная матрица: '); PrintMatrix(a,m,n); end.
Заполнение нулями выше побочной диагонали
var a: Matrix; sum: integer; begin var m := 5; var n := m; FillMatrixByRandom(a,m,n); writeln('Исходная матрица: '); PrintMatrix(a,m,n); for var i:=1 to m-1 do for var j:=i+1 to m do a[i,j] := 0; writeln('Преобразованная матрица: '); PrintMatrix(a,m,n); end.
Ссылки
- Программы для начинающих
- Сайт PascalABC.NET: Программы и алгоритмы для начинающих
На занятии будет рассмотрен двумерный массив в Pascal и примеры работы с ним. Кроме того, предстоит знакомство с понятиями побочная диагональ матрицы в Паскаль и главная диагональ
Содержание:
- Двумерный массив в Pascal
- Описание, ввод и вывод элементов двумерного массива
- Главная и побочная диагональ при работе с двумерными матрицами в Pascal
Матрица или двумерный массив – это прямоугольная таблица чисел (или других элементов одного типа). Каждый элемент матрицы имеет два индекса (номер строки и номер столбца).
Исходные данные для решения многих задач можно представить в табличной форме:
Таблица результатов производственной деятельности нескольких филиалов фирмы может быть представлена так:
zavod1: array [1..4] of integer; zavod2: array [1..4] of integer; zavod3: array [1..4] of integer;
Или в виде двумерного массива так:
Объявление двумерного массива:
var A: array[1..3,1..4] of integer; begin {...}
begin var a := new integer[3,4]; {...} end.
Описание, ввод и вывод элементов двумерного массива
Варианты описания двумерного массива (традиционный pascal)
- Описание массива в разделе переменных:
- Описание массива через раздел type:
const N = 3; M = 4; var A: array[1..N,1..M] of integer;
const M=10; N=5; type matrix=array [1..M, 1..N] of integer; var A: matrix;
Ввод двумерного массива m x n с клавиатуры:
for i:=1 to N do for j:=1 to M do begin write('A[',i,',',j,']='); read ( A[i,j] ); end;
for var i:=0 to a.RowCount-1 do for var j:=0 to a.ColCount-1 do a[i,j]:=readinteger;
Заполнение случайными числами:
var a := MatrRandomInteger(3,4,0,10); // целые числа в диапазоне от 0 до 10 var a1 := MatrRandomReal(3,4,1,9) // веществ. числа в диапазоне от 1 до 9
«Красивый» вывод элементов двумерного массива m x n:
Следующий фрагмент программы выводит на экран значения элементов массива по строкам:
1 2 3 4 5 |
for i:=1 to N do begin for j:=1 to M do write ( A[i,j]:5 ); writeln; end; |
1 2 3 4 5 6 |
begin var a := MatrRandomInteger(3,4,0,10); var a1 := MatrRandomReal(3,4,1,9); a.Println; a1.Println(6,1) // 6 позиций всего на вывод, 1 знак после десят. запятой end. |
Результат:
8 2 1 3 5 8 0 8 6 3 9 3 3.3 4.7 3.7 5.4 2.9 1.7 2.3 4.0 8.3 3.7 8.4 1.4
Рассмотрим следующую задачу: Получены значения температуры воздуха за 4 дня с трех метеостанций, расположенных в разных регионах страны:
Номер станции | 1-й день | 2-й день | 3-й день | 4-й день |
---|---|---|---|---|
1 | -8 | -14 | -19 | -18 |
2 | 25 | 28 | 26 | 20 |
3 | 11 | 18 | 20 | 25 |
Т.е. запись показаний в двумерном массиве выглядела бы так:
t[1,1]:=-8; | t[1,2]:=-14; | t[1,3]:=-19; | t[1,4]:=-18; |
t[2,1]:=25; | t[2,2]:=28; | t[2,3]:=26; | t[2,4]:=20; |
t[3,1]:=11; | t[3,2]:=18; | t[3,3]:=20; | t[3,4]:=25; |
Или в pascalabc.NET:
var t := Matr(3,4,-8,-14,-19,-18,25,28,26,20,11,18,20,25); t.Println;
Объявление двумерного массива:
var t: array [1..3, 1..4] of integer;
Задание array 1: Необходимо:
- Распечатать температуру на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день.
- Распечатать показания термометров всех метеостанций за 2-й день.
- Определить среднюю температуру на 3-й метеостанции.
- Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла.
Дополните код:
Показать решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
var t: array [1..3, 1..4] of integer; s,i,j:integer; begin t[1,1]:=-8; t[1,2]:=-14; t[1,3]:=-19; t[1,4]:=-18; t[2,1]:=25; t[2,2]:=28; t[2,3]:=26; t[2,4]:=20; t[3,1]:=11; t[3,2]:=18; t[3,3]:=20; t[3,4]:=25; {1. Распечатать показания термометров на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день} writeln('1-е задание: ',t[2,4] , ' и ',t[...,...]); {2. Показания термометров всех метеостанций за 2-й день} for i:=1 to ... do writeln ('2-е задание: ',t[...,...]); {3. Определим среднее значение температуры на 3-й метеостанции:} i:=3; s:=0; for j:=1 to 4 do s:=...; {сумматор} writeln('3-е задание: ', s/4); {распечатаем всю таблицу} for i:=1 to 3 do for j:=1 to 4 do writeln(t[i,j]); {4. Распечатаем станции и дни с температурой 24-26 гр} writeln('4-е задание: '); for i:=1 to 3 do for ... ... do if (...) and (...) then writeln('станция ', i, ' день ', j) end. |
Самостоятельно подумайте, как находится сумма элементов массива pascal.
Задание array 2. Найти сумму элементов массива (прямоугольной таблицы) размером [m x n]
Задание array 4.
Найти сумму всех элементов массива (переменная sum
) 5 x 4, а также сумму элементов, составляющих столбцы таблицы (двумерного массива). Для хранения сумм столбцов чисел использовать одномерный массив (s
). Дополните код.
Показать решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
const m = 5; n = 4; var a: array[1..m,1..n] of byte; s: array[1..n] of byte; i,j, sum: byte; begin randomize; for i := 1 to m do begin for j := 1 to n do begin ... {инициализация элементов массива случайными числами} ... {вывод элементов массива} end; writeln end; writeln ('------------'); {для оформления} {обнуление значений массива суммы s[]:} ... {поиск сумм элементов по столбцам:} for i := 1 to n do begin for j := 1 to m do begin s[i]:=...; end; write(...) ; end; {поиск общей суммы:} sum:=0; ... {вычисление суммы элементов массива значений сумм по столбцам:} for ... ... write (' | sum = ', sum); readln end. |
Задание array 4_1.
Найти сумму элементов двумерного массива [m x n] по строкам:
2 8 1 9 : sum = 20 3 1 7 2 : sum = 13 4 5 6 2 : sum = 17
Методы матриц для работы со строками и столбцами:
begin var a := MatrRandomInteger(3,4); a.Println; a.Row(0).Sum.Println(); a.Row(1).Average.Println; a.Row(2).Product.Println; a.Col(0).Min.Println; a.Col(1).Max.Println; end.
Результат:
86 62 80 33 51 4 36 65 78 30 5 16 261 39 187200 51 62
Главная и побочная диагональ при работе с двумерными матрицами в Pascal
Главная диагональ квадратной матрицы n x n (т.е. той, у которой количество строк равно количеству столбцов) проходит с верхнего левого угла матрицы (элемент 1,1) до правого нижнего угла матрицы (элемент n,n).
Побочная диагональ квадратной матрицы n x n проходит с нижнего левого угла матрицы (элемент n,1) до правого верхнего угла матрицы (элемент 1,n).
Формулу поиска элементов диагоналей проще всего искать, нарисовав элементы матрицы:
Если индексы начинаются с единицы (традиционный Паскаль):
1,1 | 1,2 | 1,3 | 1,4 |
2,1 | 2,2 | 2,3 | 2,4 |
3,1 | 3,2 | 3,3 | 3,4 |
4,1 | 4,2 | 4,3 | 4,4 |
Если индексы начинаются с нуля (pascalAbc.NET):
0,0 | 0,1 | 0,2 | 0,3 |
1,0 | 1,1 | 1,2 | 1,3 |
2,0 | 2,1 | 2,2 | 2,3 |
3,0 | 3,1 | 3,2 | 3,3 |
Учитывая, что первая цифра в программе будет соответствовать счетчику i
, а вторая — счетчику j
, то из таблицы можно вывести формулы:
Главная диагональ матрицы в Паскаль имеет формулу:
i=j
Побочная диагональ матрицы в Паскале традиционном имеет формулу:
n=i+j-1
(или j=n-i+1
)
где n
— размерность квадратной матрицы
Побочная диагональ матрицы в pascalAbc.Net имеет формулу:
n=i+j+1
где n
— размерность квадратной матрицы
Пример: Вывести на экран сначала главную диагональ квадратной матрицы из N строк и N столбцов, а затем ее побочную диагональ.
Решение:
Пример: Заменить элементы главной и побочной диагонали квадратной матрицы нулями
Показать решение:
Паскаль:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
var i,j,n:integer; a: array[1..100,1..100]of integer; begin randomize; writeln ('введите размерность матрицы:'); readln(n); for i:=1 to n do begin for j:=1 to n do begin a[i,j]:=random(10); write(a[i,j]:3); end; writeln; end; writeln; for i:=1 to n do begin for j:=1 to n do begin if (i=j) or (n=i+j-1) then a[i,j]:=0; write(a[i,j]:3) end; writeln; end; end. |
PascalAbc.Net
1 2 3 4 5 6 7 8 9 10 11 12 |
begin var n := readinteger('введите размерность матрицы:'); var a := matrRandomInteger(n, n, -10, 10); a.Println(6); for var i := 0 to n - 1 do begin a[i, i] := 0; a[i, n - i - 1] := 0; end; writeln(); a.Println(6); end. |
Задание array 5:
Найти отдельно сумму элементов главной и побочной диагонали квадратной матрицы
1 7 3 7 2 1 8 3 5 7 6 4 8 2 3 1 ------- sum1 = 9 sum2 = 30
Пример:
Дана матрица 5х5. Найти сумму элементов, стоящих на двух соседних диагоналях с главной и параллельных ей.
Для решения задачи воспользуйтесь таблицей
Показать решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
var A:array[1..5,1..5] of integer; i,j:integer; sum,sum1,sum2:integer; begin randomize; for i:=1 to 5 do for j:=1 to 5 do A[i,j]:=random(10); write ('Исходный массив A: '); for i:=1 to 5 do begin writeln; for j:=1 to 5 do write (A[i,j]:2,' '); end; sum1:=0; for i:=1 to 5 do for j:=1 to 5 do if (i-j=1) then sum1:=sum1+A[i,j]; sum2:=0; for i:=1 to 5 do for j:=1 to 5 do if (j-i=1) then sum2:=sum2+A[i,j]; sum:=sum1+sum2; writeln; writeln('Сумма = ',sum); end. |
Задание array 6: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
Задание array 7: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
Задание array 8: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
Задание array 9: Составить программу, позволяющую с помощью датчика случайных чисел сформировать матрицу размерностью N. Определить:
Рассмотрим еще один пример работы с двумерным массивом.
Пример: В двумерном массиве размером N
х M
определить среднее значение элементов. Найти индекс элемента массива, наиболее близкого к среднему значению.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
var index1,index2,i,j,N,M:integer; s,min,f:real; a:array[1..300,1..300] of real; begin N:=10; M:=5; for i:=1 to N do begin for j:=1 to M do begin a[i,j]:=random(20); s:=s+a[i,j]; write(a[i,j]:3); end; writeln; end; f:=s/(N*M); writeln('srednee znachenie ',f); min:=abs(a[1,1]-f); for i:=1 to N do begin for j:=1 to M do begin if abs(a[i,j]-f)<min then begin min:=abs(a[i,j]-f); index1:=i; index2:=j; end; end; end; writeln('naibolee blizkiy ',index1,' ',index2); end. |
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:
Просмотров 8.4к. Обновлено 23 ноября 2020
Двумерный массив в Паскале представляет собой таблицу, состоящую из нескольких одномерных массивов. Двумерные массивы Pascal называют матрицей. Положение элементов в матрице обозначается двумя индексами.
Рассмотрим матрицу 3*3, то есть она будет состоять из 3 строк и 3 столбцов:
Каждый элемент обладает 2-мя индексами. Первый — номер строки, в котором располагается элемент, а второй – номер столбца. Следовательно, индекс элемента определяется местом пересечением столбца и строки . Например, a13 – это элемент, стоящий в первой строке и в третьем столбце массива.
Содержание
- Описание двумерного массива Паскаля.
- Основные действия с двумерными массивами Паскаля
- Ввод двумерного массива Паскаля.
- Вывод двумерного массива Паскаля на экран.
- Представление двумерного массива Паскаля в памяти
- Какой размер памяти выделяется для массива?
- Решим задачу с двумерным массивом Паскаля.
Описание двумерного массива Паскаля.
Имеется ряд методов объявления двумерного массива.
Рассмотри способ, в котором указывается тип элемента и переменные.
Type Vector = array [1..9] of <тип элементов>; Matrix= array [1..4] of vector; Var mas: matrix;
В данном варианте матрица mas состоит из 4 строк, в каждой из которых 9 столбцов. При этом мы можем обратиться к любой i -й строке через mas [ i ], а к j -му элементу внутри i строки – m [ i , j ].
Во втором и третьем способе матрицу можно задать в одну строку.
Type Matrix= array [1..4] of array [1..9] of < тип элементов >; или еще проще: type matrix = array [1..4, 1..9] of <тип элементов>;
Как и в предыдущем варианте, матрица имеет 4 строки и 9 столбцов, обращение к какому-либо элементу массива имеет вид: mas [ i , j ]. Значит, что элемент, расположен в i -й строке и j -м столбце. Важно не перепутать строки со столбцами, иначе произойдет ошибка в ответе.
Основные действия с двумерными массивами Паскаля
Все основные действия над матрицами выполняются поэлементно, причем типы данных элементов должны быть одинаковыми. То есть, если матрица состоит из чисел, то действия можно выполнять только с числами. Однако для реализации операции присваивания массивам достаточно быть одного размера. Например, дан массив
type matrix= array [1..4, 1..9] of integer; var a , b : matrix ;
в ходе выполнения такой программы матрице а можно присвоить значения матрицы b ( a := b ).
Ввод двумерного массива Паскаля.
Для поочередного ввода элементов в матрицу необходимо перебрать элементы с 1-го столбца 1-ой строки до последнего столбца последней строки. Для этого используется два оператора цикла for, причем один вложен в другой.
Проанализируем образец ввода двумерного массива Паскаля с клавиатуры:
type matrix= array [1..4, 1..9] of integer; var a, : matrix; i, j: integer; { индексы массива } begin for i :=1 to 4 do {цикл перебора всех строк} for j :=1 to 9 do {цикл перебора элементов строки по столбцам} readln ( a [ i , j ]); {ввод с клавиатуры элемента, стоящего в i -й строке и j -м столбце}
Способ заполнения двумерного массива Паскаля зависит от поставленной задачи. Например, функцию random (N) позволяет заполнять матрицу случайными величинами a[i,j]:=random(25)-10. Некоторые задачи требуют содержание выражений в матрице. Не забывайте, что в любом случае должен быть определен каждый элемент в каждых строках и столбцах.
Вывод двумерного массива Паскаля на экран.
При выводе элементы должны печатать по порядку индексов, то есть в строках элементы стоят друг за другом, а в столбах один под другим. Для этого необходимо написать следующие элементы кода:
for i :=1 to 4 do {цикл перебора всех строк} begin for j :=1 to 9 do {цикл перебора всех элементов строки по столбцам} write ( a [ i , j ]:3); {печать элементов, стоящих в i -й строке матрицы в одной экранной строке, при этом для вывода каждого элемента отводится 3 позиции} writeln ; end ;
Примечание! Использовать операторы readln ( a [ i , j ]), writeln именно в таком виде, в противном случае компилятор не сможет считать и напечатать элемент. Ввод в программу операторов в таком виде readln (a), writeln (a) не допустим, так как а – это переменная типа массив.
Представление двумерного массива Паскаля в памяти
В памяти ЭВМ элементы двумерного массива располагаются последовательно и занимают несколько байт. Например, элементы массива типа integer, будут занимать по 2 байта. А весь массив займет S^2 байта, где S – количество элементов в массиве.
В матрице для каждого элемента типа integer потребуется 2 байта памяти. Рассмотрим пример.
Matrix = array [1..4, 1..3] of integer ;
В данном случае необходимо 24 байт памяти.
Модель размещения массива M типа matrix в памяти.
Для любого элемента предоставляется две ячейки памяти, размещение осуществляется от первой строки до нижней, в порядке изменения индекса.
Между переменной и адресом ячейки устанавливается соответствие, однако, при объявлении матрицы программе известно только адрес начала массива, к остальным элементам адрес вычисляется по формуле:
Addres + SizeElemt * sum *( I -1)+ SizeElem *( J -1),
где Addres – местоположение первого элемента, выделенного для массива; I , J – индексы элемента в двумерном массиве; SizeElemt – размер элемента массива (например, 2 байта для элементов типа integer ); sum – количество элементов в строке.
SizeElemt * sum *( I -1)+ SizeElemt *( J -1) — смещение относительно начала массива.
Какой размер памяти выделяется для массива?
Чтобы программа работала нормально, компьютер выделят память сегментами по 64 Кбайт. Один из сегментов отводится для данных, которые обрабатываются программой. Для каждой переменной отводится свой сегмент. Например, если переменная состоит из массива, то он не сможет занимать места больше, чем 65536 байт. Естественно, кроме массива в сегменте могут находится и другие переменные, поэтому объем памяти вычисляется по формуле 65536- S , где S – размер памяти, ранее отведенные под другие переменные.
Рассмотрим пример, в котором:
Type myArray= array [1..50000] of integer;
С точки зрения синтаксиса запись верная, но компилятор выдаст ошибку об объявлении слишком длинного массива.
Можно без труда подсчитать количество элементов, которые допустимы по формуле: 65536/2 –1=32767. Однако, других переменных не должно быть. Матрицы обладают еще меньшими пределами индексов.
Решим задачу с двумерным массивом Паскаля.
Задача: Вычислить произведение ненулевых элементов матрицы.
Решение:
- Для начала нужно установить переменные: матрицу, состоящую из целочисленных элементов; P – произведение элементов, не равное 0; I , J – индексы массива; N , M – количество строк и столбцов в матрице.
- Входные данные N , M пусть вводятся с клавиатуры, а матрица зададим с помощью функции random ().
- Выходными параметром получим P (произведение).
- Выведем матрицу на экран, для проверки работы программы.
А теперь поговорим о процедурах.
Примечание! Тип массива должен быть определен заранее. Например:
Type Matrix=array [1..10, 1..10] of integer; .............................. procedure primer (a: matrix); ..............................
Для того чтобы вводимая матрица была передана в программу как результат следует воспользоваться процедурой vvod , В таком случае матрица будет передаваться по ссылке. В таком случае процедура выглядит следующее:
Procedure vvod ( var m : matrix );
Print – процедуры вывода на экран матрицы, которая передается по значению.
Procedure print ( m : matrix );
Для реализации вложенных циклов внутри процедуры нужно ввести счетчики – k и h . Алгоритм вывода матрицы на экран был описан выше, используем это описанием.
Итак, опишем ход выполнения программы.
- Ввод значений N и M ;
- Обращаемся к процедурам vvod ( a ) и print ( a ) для ввода и вывода матрицы соответственно, где а – матрица;
- Переменной, которая отвечает за произведение P, присвоим значение 1;
- Поочередно перебираем элементы матрицы с индексом 11 до элемента с индексом Каждый элемент матрицы должен удовлетворять условию: если a ij ? 0, то произведение P умножаем на элемент a ij ( P = P * a ij );
- Выводим на экран результат произведения ненулевых элементов матрицы – P
Program proizvedenie; Type Matrix=array [1..10, 1..10] of integer; Var a: matrix; n, m, i, j: byte; P: integer; Procedure vvod (var m: matrix); Var k , h : byte ; Begin For i :=1 to n do For j :=1 to m do M[i,j]:= random(10); End; Procedure print (m: matrix); Var k, h: byte; Begin For i:=1 to n do begin For j:=1 to m do Write (M[i, j]: 4); Writeln; end ; End ; Begin {начало основной программы} Writeln ('Введите размерность матрицы:'); Readln(N, M); Vvod(a); Print(a); P:=1; For i:=1 to N do For j:=1 to M do If a[i, j]<>0 then p:=p*a[i, j]; Writeln ( p ); End .
Тем, кто знакомым с математическими матрицами, будет не трудно освоить и двумерные массивы в Pascal. Матрица – это математический объект, представляющий собой прямоугольную таблицу. Таблица состоит из элементов, которые находятся на пересечении строк и столбцов, определяющих их, то есть i-ая строка и j-ый столбец задают адрес k-ому элементу матрицы (kij
). Двумерные массивы абсолютно аналогичны математическим матрицам.
В отличие от одномерных массивов, двумерные характеризуются в программе парой индексов, один из которых соответствует номеру строки, другой – столбца:
Mas[m, n], где Mas – имя массива, n – номер строки, а m – номер столбца.
Описать матрицу в программе можно несколькими способами:
1) В разделе описания переменных:
Var Mas: Array[1..n, 1..m] of <тип элементов>;
2) При помощи одномерного массива, элементами которого являются одномерные массивы.
Пример:
Const n = 5; m = 10; Type Arr1 = Array[1..m] of <тип элементов >; Arr2 = Array[1..n] of arr1; Var Mas: arr2;
Переменная Mas
– матрица, состоящая из пяти строк, в каждую из которых включено по десять элементов.
3) Предыдущий способ можно упростить так:
Const n = 5; m = 10; Турe arr=Array[1..n] Of Аrrау[1..m] of <тип элементов>; Var Mas: arr;
4) И снова сократив запись, получим:
Const n = 5; m = 10; Type arr = Array[1..n,1..m] of <тип элементов>; Var Mas: arr;
Для обработки содержимого матрицы, удобно пользоваться вложенными циклами:
For i:= 1 To n Do For j:= 1 To m Do
Например, для заполнения массива случайнми числами:
for i:=1 to n do for j:=1 to n do x[i,j]:=random(100);
Для вывода двумерного массива вещественных чисел размером n строк, m столбцов:
for i:=1 to n do begin for j:=1 to m do write(x[i,j]:5:2); writeln; end;
В следующей программе массив сначала заполняется числами с клавиатуры, а затем выводиться на экран.
program input_and_output_array; uses crt; const n=3; m=3; var i, j: integer; mas: array[1..n, 1..m] of integer; begin {ввод массива} for i:=1 to n do for j:=1 to m do begin write(' Элемент ', i,' строки, ',j,' столбца = '); readln(mas[i, j]); end; writeln(' Получившаяся матрица: '); {вывод массива} for i:=1 to n do begin for j:=1 to m do begin write(mas[i, j]:5); end; writeln end; end.
Количество элементов в массиве (его размерность) можно узнать, умножив количество строк на количество столбцов.
Сумма всех элементов квадратной матрицы:
sum:=0; for i:=1 to n do for j:=1 to n do sum:=sum+x[i,j]; writeln('Сумма=',sum);
Сумма элементов главной диагонали квадратной матрицы (элементы главной диагонали имеют одинаковые индексы -x[1,1], x[2,2] и т.д.):
sum:=0; for i:=1 to n do sum:=sum+x[i,i]; writeln('Сумма=',sum);
Сумма элементов побочной диагонали (диагонали противоположной главной). Индексы элементов побочной диагонали в сумме равны n+1, т.е. i+j=n+1
или j=n+1-i
:
sum:=0; for i:=1 to n do sum:=sum+x[i,n+1-i]; writeln('Сумма=',sum);
Сумма элементов ниже главной диагонали квадратной матрицы (строго ниже):
sum:=0; for i:=1 to n do for j:=1 to n do if i>j then sum:=sum+x[i,j]; writeln('Сумма=',sum);
Можно не просматривать весь массив, а брать только нужные элементы:
sum:=0; for i:=2 to n do for j:=1 to i-1 do sum:=sum+x[i,j]; writeln('Сумма=',sum);
Сумма элементов выше и на главной диагонали квадратной матрицы:
sum:=0; for i:=1 to n do for j:=1 to n do if i<=j then sum:=sum+x[i,j]; writeln('Сумма=',sum);
Здесь также можно не просматривать весь массив, а брать только нужные элементы:
sum:=0; for i:=1 to n do for j:=i to n do sum:=sum+x[i,j]; writeln('Сумма=',sum);
Сумма элементов ниже побочной диагонали квадратной матрицы (строго ниже) :
sum:=0; for i:=1 to n do for j:=1 to n do if i+j>n+1 then sum:=sum+x[i,j]; writeln('Сумма=',sum);
Можно не просматривать весь массив, а брать только нужные элементы:
sum:=0; for i:=2 to n do for j:=n+2-i to n do sum:=sum+x[i,j]; writeln('Сумма=',sum);
Если надо посчитать сумму элемсентов ниже побочной диагонали и на ней, то в предыдущем примере, при просмотре всего массива в предыдущем примере надо заменить знак отношения > на >=, а при просмотре толко нужных элементов применить такой код:
sum:=0; for i:=1 to n do for j:=n+1-i to n do sum:=sum+x[i,j]; writeln('Сумма=',sum);
При подсчете суммы элементов выше и на главной диагонали, выше и на побочной диагонали возможно применине такого кода:
sum:=0; for i:=1 to n do for j:=1 to n do if (i<=j) and (i+j<=n+1) then sum:=sum+x[i,j]; writeln('Сумма=',sum);
Подсчет сумм элементов по строкам:
for i:=1 to n do begin sum:=0; for j:=1 to n do sum:=sum+x[i,j]; writeln('Сумма ',i,'-й строки',sum); end;
Подсчет сумм элементов по столбцам:
for j:=1 to n do begin sum:=0; for i:=1 to n do sum:=sum+x[i,j]; writeln('Сумма ',j,'-го столбца ',sum); end;
Безусловно суммы по строкам и столбцам можно записывать в одномерный массив. Например, для сумм по столбцам:
for i:=1 to n do sum[j]:=0; for i:=1 to n do for j:=1 to n do zum[j]:=sum[j]+x[i,j]; {вывод сумм по столбцам} for i:=1 to n do write(sum[i]:4); writeln;
Суммы элементов по диагоналям, параллельным главной диагонали.
Очевидно, что таких сумм будет 2n-1. Кроме того, разности индексов эдементов, стоящих на одной диагонали будут равны друг другу. Имеется в виду разность «номер строки минус номер столбца». Эти разности будут меняться от -n+1 для самой верхней диагонали s1, содержащей всего лишь один элемент, до n-1 для диагонали s2N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив:
Var sum:array[-n+1..n-1] of integer;
Число элементов в этом массиве будет 2n-1. Код для подсчета этих сумм:
for i:=-n+1 to n-1 do sum[i]:=0; for i:=1 to n do for j:=1 to n do sum[i-j]:=sum[i-j]+x[i,j]; for i:=-n+1 to n-1 do write(sum[i]);
Суммы элементов по диагоналям, параллельным побочной диагонали.
for i:=2 to 2*n do sum[i]:=0; for i:=1 to n do for j:=1 to n do sum[i+j]:=sum[i+j]+x[i,j]; for i:=2 to 2*n do write(sum[i]);
Суммы элементов по периметрам двумерного массива.
Cледует различать четный или нечетный порядок матрицы n. Число сумм будет равно k=n div 2
при четном n и k=n div 2 +1
при нечетном значении n.
Счет суммы начинается по строке i от столбца j равного i и заканчивается столбцом n-i+1
, т.е. начинается с элемена находящегося на главной диагонали и заканчивается элементом на побочной диагонали.
Одновременно учитываются элементы из параллельной строки, индекс которой равен n-i+1
.
Затем считаем элементы по двум паралельным столбцам i и n-i+1
(не учитывая элементы, стоящие в строках). Если n -нечетное число, то выводим значение центрального элемента массива x[k+1,k+1]
.
k:=n div 2; for i:=1 to k do begin sum:=0; {строки} for j:=i to n-i+1 do sum:=sum+x[i,j]+x[n-i+1,j]; {столбцы} for j:=i+1 to n-i do sum:=sum+x[j,i]+x[j,n-i+1]; writeln(sum); {вывод суммы} end; if n mod 2=1 then writeln(x[k+1,k+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[2][4]. — элемент матрицы 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, обращение к элементу матрицы можно осуществить 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.2. Составить программу
транспонирования2Транспонированная матрица — матрица, полученная из исходной матрицы заменой строк на столбцы. матрицы.
Блок-схема транспонирования матрицы приведена на рис. 6.6. При транспонировании матрицы получается матрица B.
Рис.
6.6.
Блок-схема транспонирования матрицы A
Рассмотрим частный случай транспонирования матрицы фиксированного размера A(4,3).
На форме разместим метки Label1 и Label2 со свойствами Caption — Заданная матрица и Транспонированная матрица , два компонента типа TStringGrid, изменив их свойства так, как показано в табл. 6.1, и кнопку Транспонирование матрицы.
Окно формы приложения представлено на рис. 6.7.
Ниже приведён текст подпрограммы с комментариями, которая будет выполняться, если пользователь щёлкнет по кнопке Транспонирование матрицы.
Свойство | 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Свойству формы Caption присвоено значение Транспонирование матрицы.. Матрицы 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.
Свойства элементов матрицы