6.2 Алгоритмы и программы работы с матрицами
Рассмотри несколько примеров решения задач обработки матриц.
ЗАДАЧА 6.3. Найти сумму элементов матрицы, лежащих выше главной диагонали (см. рис. 6.13).
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Рассмотрим два алгоритма решения данной
задачи. Первый алгоритм (см. рис. 6.14) по-
строен следующим образом: вначале перемен-
ная S для накапливания суммы обнуляется
( S:=0 ). Затем с помощью двух циклов (первый
по строкам, второй по столбцам) перебираются
все элементы матрицы, но накапливание суммы
происходит только в том случае, если этот эле-
мент находится выше главной диагонали (если
выполняется свойство i<j ).
Текст консольного приложения
Рисунок 6.14: Блок-схема
задачи 6.3 (алгоритм 1)
for i:=1 to n do for j:=1 to m do
for i:=1 to n do for j:=1 to m do
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
writeln(‘матрица А’); for i:=1 to n do begin
особенно общая ширина поля!> write(a[i,j]:8:3,’ ‘);
writeln(‘сумма элементов матрицы’, s:8:3); end.
Результаты работы программы представлены на рис. 6.15.
Рисунок 6.15: Результаты работы программы решения задачи 6.3
Второй алгоритм решения этой задачи представлен на рис. 6.16. В нем проверка условия i<j не выполняется, но, тем не менее, в
нем так же суммируются элементы матрицы, находящиеся выше главной диагонали. Для пояснения функционирования алгоритма обратимся к рисунку 6.13.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Рисунок 6.16: Блок-схема задачи 6.3 (алгоритм 2)
В первой строке заданной матрицы необходимо сложить все элементы, начиная со второго. Во второй – все, начиная с третьего, в i –й строке процесс суммирова-
ния начнется с ( i+1 )–го элемента
и так далее. Таким образом, первый цикл работает от 1 до N , а
второй от i+1 до M .
Предлагаем читателю самостоятельно составить программу, соответствующую описанному алгоритму.
ЗАДАЧА 6.4. Вычислить количество положительных элементов квадратной матрицы A, расположенных по ее периметру и на диагоналях.
В квадратной матрице число строк равно числу столбцов. Прежде чем приступить к решению задачи, рассмотрим рисунок 6.17, на котором изображена схема диагоналей квадратных матриц различной размерности.
Из рисунка видно, что нет необходимости рассматривать все элементы матрицы. Достаточно рассмотреть элементы, расположенные в первой и последней строках, в первом и последнем столбцах, а также на диагоналях квадратной матрицы. Все эти элементы отмечены на рис. 6.17, причем черным цветом выделены элементы, которые принадлежат строкам, столбцам и диагоналям. Например, элемент принадлежит первой строке, первому столбцу и главной диагонали матрицы, элемент находится в последней строке, последнем столбце и принадлежит главной диагонали. Кроме того, если N – чис-
ло нечетное (на рисунке 6.17 эта матрица расположена слева), то существует элемент с индексом ( N div 2 +1 , N div 2 +1 ), который
находится на пересечении главной и побочной диагоналей. При четном значении N (матрица справа на рис. 6.17) диагонали не пересе-
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Рисунок 6.17: Рисунок к условию задачи 6.4
Рассмотрим алгоритм решения задачи. Для обращения к элементам главной диагонали вспомним, что номера строк этих элементов всегда равны номерам столбцов. Поэтому, если параметр i изменяется циклически от 1 до N , то A i , i — элементы расположенные на глав-
ной диагонали. Воспользовавшись свойством, характерным для эле-
ментов побочной диагонали, получим: i+j-1=N → j=N-i+1,
следовательно, для строк i=1,2,…,N элемент A i , N − i 1 — элемент побочной диагонали. Элементы, находящиеся по периметру матрицы,
записываются следующим образом:
ные в первой строке ( i=1,2,…,N ),
ные в последней строке ( i=1,2,…,N ) и соответственно
менты, расположенные в первом столбце ( i=1,2,…,N ),
последнем столбце ( i=1,2,…,N ).
Алгоритм обработки построим следующим образом, сначала обработаем элементы, расположенные на диагоналях квадратной матрицы. Для этого необходимо в каждой строке ( i=1,2,…,N ) проверять
знак элементов A i , i и A i , N − i 1 .
Так как при проверке диагональных элементов матрицы угловые элементы были учтены, то при обработке элементов, расположенных по периметру матрицы, угловые элементы учитывать не нужно.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Поэтому надо перебрать элементы со второго до предпоследнего в
первой и последней строках, в первом и последнем столбцах. for i:=2 to N-1 do
Затем надо проверить, не был ли элемент, находящийся на пересечении диагоналей, подсчитан дважды. Это могло произойти только в том случае, если N – нечетно и элемент, расположенный на пересече-
нии диагоналей 70 , положителен.
if (N mod 2 <>0) and (a[n div 2+1,n div 2+1]>0) then k:=k-1;
Ниже приведен полный текст консольного приложения решения задачи 6.4 с комментариями. На рис. 6.18 представлены результаты
работы программы решения задачи 6.4. var
a:array [1..10,1..10] of integer; i,j,N,k:integer;
begin write(‘N=’); readln(N);
//Ввод исходной матрицы. writeln(‘Введите матрицу A’); for i:=1 to N do
for j:=1 to N do read(a[i,j]);
//Вывод исходной матрицы. writeln(‘Была введена матрица A:’);
70 На пересечении диагоналей находится элемент с индексами ( N div 2 +1 , N div 2 +1 )
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Рисунок 6.18: Результаты решения задачи 6.4 for i:=1 to N do
for j:=1 to N do write(a[i,j],’ ‘);
//Обработка элементов, расположенных //на диагоналях матрицы.
for i:=1 to N do begin
if (a[i,i]>0) then k:=k+1; if a[i,N-i+1]>0 then k:=k+1;
//Обработка элементов, расположенных //по периметру матрицы.
for i:=2 to N-1 do begin
if (a[1,i]>0) then k:=k+1; if (a[N,i]>0) then k:=k+1; if (a[i,1]>0) then k:=k+1;
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
if (n mod 2<>0) and (a[N div 2+1,N div 2+1]>0) then
k:=k-1; writeln(‘k=’,k); end.
ЗАДАЧА 6.5. Проверить, является ли заданная квадратная матрица единичной.
Единичной называют матрицу, у которой элементы главной диагонали – единицы, а все остальные – нули. Например,
Решать задачу будем так. Предположим, что матрица единичная, ( pr:=true ) и попытаемся доказать обратное. В двойном цикле по
строкам ( i:=1,2. N ) и по столбцам ( j:=1,2. N ) переби-
раем все элементы матрицы. Если диагональный элемент ( i = j ) не равен единице или элемент, расположенный вне диагонали ( i ≠ j ), не равен нулю 71 , то в логическую переменную pr записываем значе-
ние false и прекращаем проверку (аварийно покидаем цикл). После цикла проверяем значение pr , если переменная pr попрежнему равна
true , то матрица единична, иначе она такой не является. var a:array[1..10,1..10] of real; i,j,n:integer;
writeln(‘Введите размер матрицы’); readln(n);
writeln(‘Введите матрицу’); for i:=1 to n do
71 Воспользовавшись логическими операциями and и or, это сложное условие можно записать так if ((i=j) and (a[i,j]<>1)) or ((i<>j) and (a[i,j]<>0)) then
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 308
for j:=1 to n do read(a[i,j]);
истина. Если значение этой переменной при выходе из цикла не изменится, это будет означать, что матрица единичная.> pr:=true;
for i:=1 to n do for j:=1 to n do
writeln(‘Матрица не является единичной’);
ЗАДАЧА 6.6. Преобразовать исходную матрицу так, чтобы последний элемент каждого столбца был заменен разностью минимального и максимального элемента в этом же столбце.
Для решения данной задачи необходимо в каждом столбце найти максимальный и минимальный элементы, после чего в последний элемент столбца записать их разность. Блок-схема алгоритма решения приведена на рис. 6.19.
Ниже приведен текст консольного приложения с комментариями.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Рисунок 6.19: Блок-схема алгоритма решения задачи 6.6
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 310
var a:array[1..25,1..25] of real; i,j,n,m:integer;
<Ввод размеров матрицы.>writeln(‘Введите размеры матрицы’); readln(n,m);
<Ввод исходной матрицы.>writeln(‘Введите матрицу’); for i:=1 to n do
for j:=1 to m do read(a[i,j]);
for j:=1 to m do begin
for i:=2 to n do begin
if a[i,j]>max then max:=a[i,j];
if a[i,j]<min then min:=a[i,j]; end;
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
for i:=1 to n do begin
for j:=1 to m do write(a[i,j]:7:3,’ ‘);
Теперь давайте создадим визуальное приложение, реализующее рассмотренный алгоритм. За основу возьмем форму (рис. 6.9) и проект транспонирования матрицы A(N,M) , разработанные для зада-
чи 6.2. Окно формы несколько изменим. Кнопку Транспонирование переименуем в Преобразование матрицы , а свойство Caption метки label5 установим Преобразованная матрица A . Кроме того изменим свойство Caption формы. Окно измененной формы представлено на рис. 6.20.
Рисунок 6.20: Окно формы решения задачи 6.6
Обработчики кнопок Ввод , Очистить , Выход из программы
изменятся мало. Рассмотрим алгоритм работы обработчика кнопки Преобразование матрицы . В этом обработчике будет считывание
матрицы из компонента StringGrid1 , преобразование матрицы A
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
по алгоритму, представленному на рис. 6.19, вывод преобразованной матрицы в компонент StringGrid2 .
Текст модуля визуального приложения решения задачи 6.6 с комментариями приведен ниже.
Controls, Graphics, Dialogs, StdCtrls,Grids; //Описание формы
TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Edit1: TEdit;
Label5: TLabel; StringGrid1: TStringGrid; StringGrid2: TStringGrid;
procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private
A:array[1..25,1..25] of real;
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
N,M:integer; Form1: TForm1; implementation
//Обработчик кнопки «Выход из программы». procedure TForm1.Button4Click(Sender: TObject); begin
//Обработчик первой кнопки — кнопки //ввода размерности матрицы.
procedure TForm1.Button1Click(Sender: TObject); var i:byte;kod_n,kod_m,kod:integer;
//Ввод размерности матрицы.
//Символьная информация преобразовывается
//в числовую и записывается в переменные N и M. Val(Edit1.Text,N,kod_m); Val(Edit2.Text,M,kod_n);
//Если преобразование прошло успешно //и введенные размеры удовлетворяют //писанию матриц A и B,
if (kod_n=0) and (kod_m=0) and (N>0) and (N<26) and (M>0) and (M< 26) then
//визуализируется первая матрица, StringGrid1.Visible:=true;
//соответствующая ей надпись, Label4.Visible:=true;
//кнопки Очистить Button2.Visible:=true;
//и преобразование матрицы. Button3.Visible:=true; with StringGrid1 do begin
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
//и нумеруются строки и
for i:=1 to RowCount-1 do
//столбцы первой таблицы.
for i:=1 to ColCount-1 do
//При некорректном вводе выдается
//Устанавливаются стартовые параметры
//Обработчик кнопки «Преобразование матрицы».
procedure TForm1.Button2Click(Sender: TObject);
//Цикл по номерам строк.
//Цикл по номерам столбцов.
//Считывание элементов матрицы A
//из компонента StringGrid1.
with StringGrid2 do
for i:=1 to RowCount-1 do //Нумеруются
//столбцы 2-й матрицы.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
for i:=1 to ColCount-1 do Cells[i,0]:=IntToStr(i);
//Решение задачи 6.6. for j:=1 to m do begin
for i:=2 to n do begin
if a[i,j]>max then max:=a[i,j];
if a[i,j]<min then min:=a[i,j]; end;
//Элементы преобразованной матрицы A выводятся
//таблицы на форме.
//Цикл по номерам строк.
//Цикл по номерам столбцов.
//Запись элемента преобразованной матрицы A в ячейку StringGrid2.
StringGrid2.Cells[j,i]:=FloatToStr(A[i,j]); //Делаем первую кнопку невидимой. Button1.Visible:=False;
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
//Обработчик кнопки «Очистить».
procedure TForm1.Button3Click(Sender: TObject); var i,j:integer;
//Очистка компонента 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′;
end; initialization <$I unit1.lrs>end.
На рис. 6.21 представлено окно с результатами решения задачи.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Рисунок 6.21: Результаты решения задачи 6.6
ЗАДАЧА 6.7. Поменять местами n-й и r-й столбцы матрицы A(K,M).
Задача сводится к обмену n-го и r-го элементов во всех строках матрицы. Блоксхема приведена на рис. 6.22.
Ниже приведен листинг консольного приложения с комментариями.
Результаты работы программы приведе-
ны на рис. 6.23. type matrica=
array [1..15,1..15] of real; var
a:matrica; b:real; i,j,k,m,n,r:byte;
//Ввод размеров матрицы. write (‘k=’);readln(k); write (‘m=’);readln(m); //Ввод матрицы A.
Рисунок 6.22: Блок-схема алгоритма
решения задачи 6.7
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 318
writeln(‘Матрица A’); for i:=1 to k do
for j:=1 to m do read(a[i,j]); //Ввод номеров столбцов матрицы, //подлежащих обмену.
repeat write(‘n=’);readln(n); write(‘r=’);readln(r);
Рисунок 6.23: Результаты решения задачи 6.7
for i:=1 to k do begin
writeln(‘Преобразованная матрица A’); for i:=1 to k do
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
ЗАДАЧА 6.8. Преобразовать матрицу A(m,n) так, чтобы строки с нечетными индексами были упорядочены по убыванию, c четными – по возрастанию.
Каждая строка матрицы является одномерным массивом. Поэтому для упорядочивания строки или столбца можно использовать обычные алгоритмы сортировки массивов. При решении задачи необходимо последовательно просматривать все строки матрицы, если номер строки нечетен, то сортируем строку методом пузырька по убыванию, иначе — по возрастанию.
Блок-схема этого алгоритма представлена на рис. 6.24. Ниже представлено консольное приложение решения этой задачи с комментариями.
На рис. 6.25 приведены результаты работы программы. var
a:array [1..15,1..15] of real; j,i,k,m,n:byte;
//Ввод размеров матрицы. writeln(‘введите m и n’); readln(m,n);
//Ввод матрицы. writeln(‘Матрица А’); for i:=1 to m do
for j:=1 to n do read(a[i,j]);
//Преобразование матрицы. for i:=1 to m do
if (i mod 2)=0 then
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Рисунок 6.24: Блок-схема алгоритма решения задачи 6.8
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
for k:=1 to n-1 do for j:=1 to n-k do
if a[i,j] > a[i,j+1] then begin
то упорядочить ее элементы по убыванию.>
Рисунок 6.25: Результаты решения задачи 6.8
for k:=1 to n-1 do for j:=1 to n-k do
if a[i,j] < a[i,j+1] then begin
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 322
//Вывод преобразованной матрицы. writeln(‘преобразованная матрица A’); for i:=1 to m do
write (a[i,j]:7:3,’ ‘); writeln
ЗАДАЧА 6.9. Задана матрица целых положительных чисел A(n,m). Сформировать вектор P(n), в который записать сумму простых чисел каждой строки матрицы в четверичной системе счисления, если в строке нет простых чисел, в соответствующий элемент массива записать число 0.
Для решения этой задачи нам понадобятся функции: проверки, является ли число простым, и перевода целого числа в четверичную систему счисления. Функция проверки, является ли число простым, подробно рассматривалась в пятой главе при решении задачи 5.7.
Поэтому здесь просто приведем ее текст.
function prostoe(N:integer):boolean; var i:integer; pr:boolean;
if N<1 then pr:=false else
for i:=2 to N div 2 do if (N mod i = 0) then begin
Кроме того в пятой главе мы рассматривали алгоритм (рис. 5.45) и функцию перевода
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
вещественного числа в p -чную систему счисления (задача 5.10). Нужная нам функция перевода целого числа в четверичную систему счисления является частным случаем рассмотренной ранее функции perevod . Ниже приведен текст функции perevod4 , которая пере-
водит целое положительное число в четверичную систему счисления.
function perevod4(N:word):word; var
s1,i ,q, ost: word; begin
while (N<>0) do begin
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
В каждой строке надо найти сумму простых чисел, а затем полученное число перевести в четверичную систему счисления. Поэтому необходимо для каждой строки ( i:=1,2. n ) выполнить следую-
щее: обнулить сумму S ( S:=0 ), организовать цикл по элементам строки ( j:=1,2. m ), внутри которого проверять, является ли текущий элемент A i , j простым и, если является, добавлять его к сумме S . После выхода из цикла по j необходимо проверить, были ли в строке с номером i простые числа ( S>0 ), и, если были, перевести S в
четверичную систему счисления и сформировать соответствующий элемент массива P ( P[i]:=perevod4(S) ).
Блок-схема алгоритма приведена на рис. 6.26.
Рисунок 6.26: Блок-схема алгоритма решения задачи 6.9
Полный текст консольного приложения: function prostoe(N:integer):boolean;
var i:integer; pr:boolean; begin
if N<1 then pr:=false
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 325
else begin pr:=true;
for i:=2 to N div 2 do if (N mod i = 0) then begin
pr:=false; break; end;
function perevod4(N:word):word; var s1,q, ost: word;
Пока число не станет равным 0.> while (N<>0) do
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
var S,i,j,n,m: word; a:array[1..25,1..25] of word; p:array[1..25] of word;
//Ввод размеров матрицы. writeln(‘Введите размеры матрицы’); readln(n,m);
writeln(‘Введите матрицу A’); <Ввод матрицы.>for i:=1 to n do
для формирования суммы простых чисел каждой строки.>
for i:=1 to n do begin
if prostoe(A[i,j]) then s:=s+A[i,j];
if s>0 then p[i]:=perevod4(s)
//Вывод сформированного массива P. writeln(‘Массив P’);
for i:=1 to n do write(P[i],’ ‘); writeln; end.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Результаты работы программы представлены на рис. 6.27.
Рисунок 6.27: Результаты работы программы решения задачи 6.9
ЗАДАЧА 6.10. Написать программу умножения двух матриц A(N,M) и B(M,L).
Напомним некоторые сведения из курса математики.
Умножать можно только матрицы, у которых количество столбцов в первой матрице совпадает с количеством строк во второй матрице.
Матрица-произведение имеет столько строк, сколько было в первой матрице и столько столбцов, сколько было во второй. Таким образом, при умножении матрицы A(N,M) на матрицу B(M,L ) получа-
ется матрица C(N,L) . Каждый элемент матрицы C i , j является скалярным произведением i -й строки матрицы A и j -го столбца матрицы B . В общем виде формула для нахождения элемента C i , j матрицы имеет вид:
C i , j = ∑ A ik B kj , где i = 1,N и j = 1,L . (6.1)
Рассмотрим более подробно формирование матрицы C(3,2) как произведение матриц A(3,3) и B(3,2) .
a 11 b 11 a 12 b 21 a 13 b 31
= a 21 b 11 a 22 b 21 a 23 b 31
a 31 b 11 a 32 b 21 a 33 b 31
a 11 b 12 a 12 b 22 a 13 b 32 a 21 b 12 a 22 b 22 a 23 b 32 . a 31 b 12 a 32 b 22 a 33 b 32
Следует помнить, что A B ≠ B A .
Блок-схема, реализующая расчет каждого элемента матрицы C по
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
формуле (6.1), приведена на рис. 6.28. Далее приведен текст программы умножения двух матриц с комментариями. Результат работы представлен на рис. 6.29.
Рисунок 6.28: Блок-схема
Рисунок 6.29: Результаты работы
программы умножения матриц
умножения двух матриц
//Умножение двух матриц.
type matrica=array [1..15,1..15] of real; var a,b,c:matrica; i,j,M,N,L,k:byte; begin
//Ввод размеров матриц.
writeln(‘введите n,m и l’); readln(N, M, L); writeln(‘Матрица A’);//Ввод матрицы A.
for j:=1 to M do read(a[i,j]); writeln(‘Матрица B’);//Ввод матрицы B. for i:=1 to M do
for j:=1 to L do read(b[i,j]);
for i:=1 to N do //Формирование матрицы C. for j:=1 to L do
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
for k:=1 to M do c[i,j]:=c[i,j]+a[i,k]*b[k,j];
writeln(‘матрица C=A*B’);//Вывод матрицы C=AB. for i:=1 to N do
for j:=1 to L do write(c[i,j]:7:3,’ ‘);
ЗАДАЧА 6.11 В матрице натуральных чисел A(N,M) найти строки, где находится максимальное из простых чисел. Элементы в них упорядочить по возрастанию. Если в матрице нет простых чисел, то оставить ее без изменений.
Перед решением задачи отметим некоторые ее особенности 72 . В матрице может не быть простых чисел, максимальных значений может быть несколько, и при этом некоторые из них будут находиться в одной строке.
При решении задачи нам понадобятся следующие подпрограммы: 1. Функция Prostoe , которая проверяет, является ли число P
типа word простым. Она возвращает значение true , если число P –
простое и false – в противном случае. Заголовок функции имеет вид
Function Prostoe (P:word):Boolean;
2. Процедура Udal , которая из массива чисел X удаляет значения,
встречающиеся более одного раза. У процедуры два параметра: массив X и его размер N , оба – параметры переменные. Заголовок проце-
Procedure Udal(var X:massiv; var N:word);
Перед описанием процедуры следует описать тип данных massiv (например, massiv = array [1..200] of word ). Блок-схема
процедуры Udal представлена на рис. 6.30.
72 Авторы рекомендуют читателям внимательно изучить этот пример, в нем сконцентрированы практически все основные моменты, рассмотренные нами до сих пор.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Рисунок 6.30: Блок-схема процедуры Udal
Удаление повторяющихся элементов происходит следующим образом. Просматриваются все элементы, начиная с первого, i -й эле-
мент сравнивается со всеми последующими . Если x i = x j , то встретился повторяющийся элемент, и мы удаляем из массива элемент с но-
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
мером j . Алгоритм удаления был подробно рассмотрен в пятой главе. 3. Функция Nalichie возвращает true , если число a присутствует в массиве b , и false – в противном случае. Заголовок проце-
Function Nalichie(a:word; b:massiv; N:word);
Блок-схема функции представлена на рис. 6.31. 4. Процедура Vozr упорядочения масси-
ва х по возрастанию.
Алгоритмы упорядочения рассматривались в пятой главе. Здесь авторами использовался алгоритм сортировки методом пузырька.
У процедуры Vozr два параметра: массив х (параметр-переменная) и его размер N
(параметр-значение). Заголовок процедуры
Procedure Vozr(var x:massiv; N:word);
Рассмотрим более подробно алгоритм решения задачи 6.11, который приведен на рис. 6.32-6.33. После ввода матрицы (блоки 1-4) предполагаем, что простых чисел нет.
В логическую переменную Pr записываем false , как только встретится простое число, в переменную Pr запишем true.
Количество максимальных значений среди простых чисел равно 0 ( k:=0) (блок 5).
Рисунок 6.31: Блок-схема функции
Для проверки, является ли простым числом каждый элемент матрицы, обращаемся к функции Prostoe . Если число простое (блок 8),
проверяем, первое ли это простое число в матрице (блок 9).
Если это первое простое число, то переписываем его в переменную max, в переменную k записываем число 1 (количество максиму-
мов равно 1 ), номер строки, в которой находится максимум, записы-
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
ваем в массив mas под номером k 73 . В связи с тем что в матрице есть простые числа, в переменную Pr записываем true (блок 10).
Если это не первое простое число, сравниваем A ij с переменной max . Если A ij max (блок 11), то в переменную max запишем A ij , в переменную k запишем 1 (есть один максимум), в mas[k] записываем i – номер строки, где находится максимальный элемент (блок
12). Если A ij = max (блок 13), то встретилось число, равное переменной max. В этом случае значение k увеличиваем на 1 и в mas[k] записываем номер строки, где находится элемент, равный max .
В результате двойного цикла обработки всех элементов матрицы (блоки 6-14) в переменной max будет храниться максимальное из про-
стых чисел, в переменной k – количество максимумов, в массиве mas из k элементов будут храниться номера строк, где находятся максимальные значения среди простых чисел матрицы. В переменной Pr хранится true , если в матрице есть простые числа, false – в про-
Если в матрице нет простых чисел (блок 15), выводим соответствующее сообщение (блок 16), в противном случае – с помощью процедуры Udal (блок 17) удаляем из массива mas элементы, встре-
чающиеся более одного раза 74 . Затем просматриваем все строки матрицы (цикл начинается блоком 18), если номер этой строки присутствует в массиве mas (блок 19), то переписываем текущую строку
матрицы в массив b (блоки 20-21) и обращаемся к процедуре упорядочивания массива по возрастанию Vozr (блок 22).
Упорядоченный массив b переписываем в i -ю строку матрицы А (блоки 23-24). На последнем этапе выводим на экран матрицу А после
преобразования (блоки 25-27).
Ниже приведен листинг всей программы с подробными комментариями.
73 В массиве mas будут храниться номера строк, где находится максимум.
74 Если некоторые максимальные элементы находятся в одной строке, то в массиве mas есть повторяющиеся элементы.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
(начало) 11.6 задачи решение схема-Блок 32:.6 Рисунок
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Рисунок 6.33: Блок-схема решения задачи 6.11 (продолжение)
type massiv=array[1..200] of word;
var pr:boolean;i:word; begin
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 335
if N>0 then begin
for i:=2 to n div 2 do
if N mod i =0 then begin
procedure udal(var x:massiv; var n:word); var i,j,m:word;
while(i<=n) do begin
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
if x[i]=x[j] then begin
for m:=j to N-1 do x[m]:=x[m+1];
var pr:boolean; i:word; begin
if b[i]=a then begin
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
pr. > nalichie:=pr end;
procedure vozr(var x:massiv; n:word);
var i, j, b :word; begin
for i:=1 to N-1 do for j:=1 to N-i do
if x[j]>x[j+1] then begin
//Начинается основная программа var
N, M, i, j, k, max :word; A:array[1..20,1..20] of word; pr, L: boolean;
mas, b:massiv; begin
writeln(‘ Matrica A’); for i:=1 to N do
for j:=1 to M do read(A[i,j]);
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
Как задать квадратную матрицу в лазарусе
if (N mod 2 <>0) and (a[n div 2+1,n div 2+1]>0) then k:=k-1;
a:array [1..10,1..10] of integer; i,j,N,k:integer;
for j:=1 to N do read(a[i,j]);
for i:=1 to N do begin
if (a[i,i]>0) then k:=k+1; if a[i,N-i+1]>0 then k:=k+1;
for i:=2 to N-1 do begin
if (a[1,i]>0) then k:=k+1; if (a[N,i]>0) then k:=k+1; if (a[i,1]>0) then k:=k+1;
if (n mod 2<>0) and (a[N div 2+1,N div 2+1]>0) then
for j:=1 to n do read(a[i,j]);
for i:=1 to n do for j:=1 to n do
var a:array[1..25,1..25] of real; i,j,n,m:integer;
for j:=1 to m do read(a[i,j]);
for j:=1 to m do begin
for i:=2 to n do begin
if a[i,j]>max then max:=a[i,j];
if a[i,j]<min then min:=a[i,j]; end;
for i:=1 to n do begin
TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Edit1: TEdit;
Label5: TLabel; StringGrid1: TStringGrid; StringGrid2: TStringGrid;
procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private
A:array[1..25,1..25] of real;
N,M:integer; Form1: TForm1; implementation
procedure TForm1.Button1Click(Sender: TObject); var i:byte;kod_n,kod_m,kod:integer;
if (kod_n=0) and (kod_m=0) and (N>0) and (N<26) and (M>0) and (M< 26) then
for i:=1 to RowCount-1 do
for i:=1 to ColCount-1 do
procedure TForm1.Button2Click(Sender: TObject);
with StringGrid2 do
for i:=1 to ColCount-1 do Cells[i,0]:=IntToStr(i);
for i:=2 to n do begin
if a[i,j]>max then max:=a[i,j];
if a[i,j]<min then min:=a[i,j]; end;
procedure TForm1.Button3Click(Sender: TObject); var i,j:integer;
for i:=1 to RowCount-1 do for j:=1 to ColCount-1 do
for i:=1 to RowCount-1 do for j:=1 to ColCount-1 do
//StringGrid1, StringGrid2,labe4, label5. StringGrid1.Visible:=False; StringGrid2.Visible:=False; label4.Visible:=False; label5.Visible:=False;
end; initialization end.
array [1..15,1..15] of real; var
a:matrica; b:real; i,j,k,m,n,r:byte;
for i:=1 to k do begin
a:array [1..15,1..15] of real; j,i,k,m,n:byte;
for j:=1 to n do read(a[i,j]);
if (i mod 2)=0 then
for k:=1 to n-1 do for j:=1 to n-k do
if a[i,j] > a[i,j+1] then begin
for k:=1 to n-1 do for j:=1 to n-k do
if a[i,j] < a[i,j+1] then begin
function prostoe(N:integer):boolean; var i:integer; pr:boolean;
if N<1 then pr:=false else
for i:=2 to N div 2 do if (N mod i = 0) then begin
function perevod4(N:word):word; var
s1,i ,q, ost: word; begin
while (N<>0) do begin
var i:integer; pr:boolean; begin
if N<1 then pr:=false
else begin pr:=true;
for i:=2 to N div 2 do if (N mod i = 0) then begin
pr:=false; break; end;
function perevod4(N:word):word; var s1,q, ost: word;
var S,i,j,n,m: word; a:array[1..25,1..25] of word; p:array[1..25] of word;
for i:=1 to n do begin
if prostoe(A[i,j]) then s:=s+A[i,j];
if s>0 then p[i]:=perevod4(s)
for i:=1 to n do write(P[i],’ ‘); writeln; end.
C i , j = ∑ A ik B kj , где i = 1,N и j = 1,L . (6.1)
a 11 b 11 a 12 b 21 a 13 b 31
= a 21 b 11 a 22 b 21 a 23 b 31
a 31 b 11 a 32 b 21 a 33 b 31
a 11 b 12 a 12 b 22 a 13 b 32 a 21 b 12 a 22 b 22 a 23 b 32 . a 31 b 12 a 32 b 22 a 33 b 32
type matrica=array [1..15,1..15] of real; var a,b,c:matrica; i,j,M,N,L,k:byte; begin
for j:=1 to L do read(b[i,j]);
for k:=1 to M do c[i,j]:=c[i,j]+a[i,k]*b[k,j];
Function Prostoe (P:word):Boolean;
Procedure Udal(var X:massiv; var N:word);
Function Nalichie(a:word; b:massiv; N:word);
Procedure Vozr(var x:massiv; N:word);
(начало) 11.6 задачи решение схема-Блок 32:.6 Рисунок
type massiv=array[1..200] of word;
var pr:boolean;i:word; begin
if N>0 then begin
for i:=2 to n div 2 do
if N mod i =0 then begin
procedure udal(var x:massiv; var n:word); var i,j,m:word;
while(i<=n) do begin
if x[i]=x[j] then begin
for m:=j to N-1 do x[m]:=x[m+1];
var pr:boolean; i:word; begin
if b[i]=a then begin
pr. > nalichie:=pr end;
procedure vozr(var x:massiv; n:word);
var i, j, b :word; begin
for i:=1 to N-1 do for j:=1 to N-i do
if x[j]>x[j+1] then begin
N, M, i, j, k, max :word; A:array[1..20,1..20] of word; pr, L: boolean;
mas, b:massiv; begin
writeln(‘ Matrica A’); for i:=1 to N do
for j:=1 to M do read(A[i,j]);
Практическая работа «Работа с матрицей в Lazarus»

int m,n, k,s,min, mas[100][100];
__fastcall TForm1::TForm1(TComponent* Owner)
void __fastcall TForm1::FormCreate(TObject *Sender)
void __fastcall TForm1::CSpinEdit1Change(TObject *Sender)
void __fastcall TForm1::CSpinEdit2Change(TObject *Sender)
void __fastcall TForm1::Button1Click(TObject *Sender)

Профессиональные компетенции педагога в рамках Федерального закона «Об образовании в Российской Федерации» №273-ФЗ от 29.12.2012


- Сейчас обучается 286 человек из 67 регионов

- подготовка к ЕГЭ/ОГЭ и ВПР
- по всем предметам 1-11 классов
- ЗП до 91 000 руб.
- Гибкий график
- Удаленная работа
- Информатика
- 10 класс
- Другие методич. материалы
- 09.02.2019
- 1133
- 4
- Информатика
- 9 класс
- Другие методич. материалы
- 09.02.2019
- 823
- 49
- Информатика
- 5 класс
- Рабочие программы
- 09.02.2019
- 159
- 0
- Информатика
- Рабочие программы
- 09.02.2019
- 928
- 55
- Информатика
- Конспекты
- 09.02.2019
- 2269
- 9
- Информатика
- Конспекты
- 09.02.2019
- 1678
- 23
- Информатика
- Презентации
- 09.02.2019
- 497
- 2
- Информатика
- Конспекты
- 09.02.2019
- 1385
- 3
- Курс повышения квалификации «Информационные технологии в деятельности учителя физики»
- Курс повышения квалификации «Внедрение системы компьютерной математики в процесс обучения математике в старших классах в рамках реализации ФГОС»
- Курс повышения квалификации «Организация работы по формированию медиаграмотности и повышению уровня информационных компетенций всех участников образовательного процесса»
- Курс профессиональной переподготовки «Информационные технологии в профессиональной деятельности: теория и методика преподавания в образовательной организации»
- Курс повышения квалификации «Использование компьютерных технологий в процессе обучения в условиях реализации ФГОС»
- Курс повышения квалификации «Специфика преподавания информатики в начальных классах с учетом ФГОС НОО»
- Курс повышения квалификации «Применение MS Word, Excel в финансовых расчетах»
- Курс повышения квалификации «Введение в программирование на языке С (СИ)»
- Курс профессиональной переподготовки «Математика и информатика: теория и методика преподавания в образовательной организации»
- Курс повышения квалификации «Современные тенденции цифровизации образования»
- Курс повышения квалификации «Специфика преподавания дисциплины «Информационные технологии» в условиях реализации ФГОС СПО по ТОП-50»
- Курс повышения квалификации «Применение интерактивных образовательных платформ на примере платформы Moodle»
- 09.02.2019 1326
- DOCX 108 кбайт
- Оцените материал:
- На сайте: 7 лет и 4 месяца
- Подписчики: 0
- Всего просмотров: 13620
- Всего материалов: 8
40%
85 минут
82 минуты
131 минута
Из файла ввести таблицу чисел (матрицу) и вычислить
Так обычно начинается общая часть типичной задачи для делфи паскаля или лазаруса. В этом посте решение задачи в которой необходимо из файла ввести таблицу чисел (матрицу) и найти строку с максимальной суммой чисел и саму сумму. Для решения таких задач первая проблема это матрицу из текстового формата перевести в числовой и запихать в двумерный массив. В условиях задачи ка правило предполагается что числа в текстовом файле введены через пробел и строки разделены вводом (Enter). Для преобразования текстового символа в числовой есть стандартная функция a:=Strtoint(b); где a имеет тип integer b имеет тип string. Также при чтении и преобразовании строки стоит учитывать что элемент в матрице может состоять как из одной цифры так и из нескольких. ниже приложена ссылка на архив в котором решена эта задача на Лазарусе, но для Делфи принцип тот же, в архиве исполняемый файл, файл проекта и файл с простейшей матрицей, программный код снабжен комментариям и если вы хоть немного разбираетесь в программировании разобраться в этой задаче не составит вам труда , а также решить множество аналогичных задач. Задача Лазарус решение.
Name already in use
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Программа реализации основных мат. действий над матрицами в визуальной среде Лазарус.
- Матрицы А и Б можно изменять в размере
- 3 вида действий над матрицами
- Все предупреждения об ошибках выводятся
The program of implementation of the main mat. actions on matrices in the Lazarus visual environment.
- Matrices A and B can be changed in size
- 3 types of matrix actions
- All error warnings are displayed
About
Программа реализации основных мат. действий над матрицами в визуальной среде Лазарус.