Компания ALT Linux
Опубликован: 10.04.2015 | Доступ: свободный | Студентов: 762 / 0 | Длительность: 14:03:00
Специальности: Программист, Преподаватель
Лекция 6:

Обработка матриц в Паскале

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
ЗАДАЧА 6.6. Преобразовать исходную матрицу так, чтобы последний элемент каждого столбца был заменён разностью минимального и максимального элемента в этом же столбце.

Для решения данной задачи необходимо найти в каждом столбце максимальный и минимальный элементы, после чего в последний элемент столбца записать их разность. Блок-схема алгоритма решения приведена на рис. 6.20.

Ниже приведён текст консольного приложения с комментариями.

program pr_6_6;
	var a : array [ 1.. 25, 1.. 25 ] of real;
	i, j, n,m: integer;
	max, min : real;
	begin
{Ввод размеров матрицы.}
	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
{Максимальным и минимальным объявляем первый элемент текущего (j-го)}
{столбца матрицы.}
	max:=a [ 1, j ];
	min:=a [ 1, j ];
{Последовательно перебираем все элементы в текущем (j-м) столбце}
{матрицы.}
	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 [ n, j ] : =max _min;
	end;
{Вывод преобразованной матрицы.}
	writeln ( ’Преобразованная матрица ’ );
	for i :=1 to n do
		begin
			for j :=1 to m do
				write ( a [ i, j ] : 7 : 3, ’   ’ );
		writeln;
	end;
end.
Блок-схема алгоритма решения задачи 6.6

Рис. 6.20. Блок-схема алгоритма решения задачи 6.6

Теперь давайте создадим визуальное приложение, реализующее рассмотренный алгоритм. За основу возьмём форму (см. рис. 6.9) и проект транспонирования матрицы A(N,M), разработанные для задачи 6.2. Окно формы несколько изменим (рис. 6.9). Кнопку Транспонирование переименуем в Преобразование матрицы, а свойством Caption метки label5 установим Преобразованная матрица A. Кроме того, изменим свойство Caption формы (см. рис. 6.21). Окно изменённой формы представлено на рис. 6.21.

Обработчики кнопок Ввод, Очистить, Выход из программы изменятся мало. Рассмотрим алгоритм работы обработчика кнопки Преобразование матрицы. В этом обработчике будет производиться считывание матрицы из компонента StringGrid1, преобразование матрицы A по алгоритму, представленному на рис. 6.20, вывод преобразованной матрицы в компонент StringGrid2.

Окно формы решения задачи 6.6

увеличить изображение
Рис. 6.21. Окно формы решения задачи 6.6

Текст модуля визуального приложения решения задачи 6.6 с комментариями приведён ниже.

unit Unit1;
{$mode objfpc}{$H+}
interface
uses
	Classes, SysUtils, LResources, Forms, Controls, Graphics,
	Dialogs, StdCtrls, Grids;
//Описание формы
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;
	procedure Button1Click ( Sender : TObject );
	procedure Button2Click ( Sender : TObject );
	procedure Button3Click ( Sender : TObject );
	procedure Button4Click ( Sender : TObject );
private
	{private declarations}
public
	{public declarations}
	end;
var
	A: array [ 1.. 2 5, 1.. 2 5 ] of real;
	N,M: integer;
	Form1 : TForm1;
implementation
{ TForm1 }
//Обработчик кнопки "Выход из программы".
procedure TForm1. Button4Click ( Sender : TObject );
begin
	Close;
end;
//Обработчик первой кнопки — кнопки ввода размерности матрицы.
procedure TForm1. Button1Click ( Sender : TObject );
var i : byte; kod_n, kod_m, kod : integer;
begin
//Ввод размерности матрицы.
//Символьная информация преобразовывается в числовую и
//записывается в переменные 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
//то
	begin
//визуализируется первая матрица,
	StringGrid1. Visible := true;
//соответствующая ей надпись,
	Label4. Visible := true;
//кнопки "Очистить"
	Button2. Visible := true;
//и "Транспонирование"
	Button3. Visible := true;
	with StringGrid1 do
		begin
			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 :=M+1;
		StringGrid2. RowCount:=N+1;
	end
	else
	begin
//При некорректном вводе выдается соответствующее сообщение.
		MessageDlg ( ’Размеры матрицы введены неверно! ’,
		MtInformation, [ mbOk ], 0 );
//Устанавливаются стартовые параметры в поля ввода.
		Edit1. Text := ’ 4 ’;
		Edit2. Text := ’ 3 ’;
	end;
end;
//Обработчик кнопки "Преобразование матрицы".
procedure TForm1. Button2Click ( Sender : TObject );
var i, j : integer;
	max, min : real;
begin
	StringGrid2. Visible := true;
	label5. Visible := true;
	for i :=1 to N do //Цикл по номерам строк.
		for j :=1 to M do //Цикл по номерам столбцов.
//Считывание элементов матрицы A из компонента StringGrid1,
			A[ i, j ] : = StrToFloat ( 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 //столбцы второй матрицы.
					Cells [ i, 0 ] : = IntToStr ( i );
			end;
//Решение задачи 6.6.
	for j :=1 to m do
	begin
{Максимальным и минимальным объявляем первый элемент текущего (j-го)}
{столбца матрицы.}
	max:=a [ 1, j ];
	min:=a [ 1, j ];
{Последовательно перебираем все элементы в текущем (j-м) столбце}
{матрицы.}
		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 [ n, j ] : =max _min;
	end;
//Элементы преобразованной матрицы A выводятся в ячейки
//таблицы на форме.
	for i :=1 to N do //Цикл по номерам строк.
		for j :=1 to M do //Цикл по номерам столбцов.
//Запись элемента преобразованной матрицы A в ячейку StringGrid2.
		StringGrid2.Cells [ j, i ] : = FloatToStr (A[ i, j ] );
//Делаем первую кнопку невидимой.
	Button1. Visible := False;
end;
//Обработчик кнопки "Очистить"
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;
initialization
	{$I unit1.lrs}
end.

На рис. 6.22 представлено окно с результатами решения задачи.

ЗАДАЧА 6.7. Поменять местами n-й и r-й столбцы матрицы A(K, M ).

Задача сводится к обмену n-го и r-го элемента во всех строках матрицы.

Блок-схема приведена на рис. 6.23.

Ниже приведён листинг консольного приложения с комментариями.

type matrica=array [ 1.. 15, 1.. 15 ] of real;
var
a : matrica;
i, j, k,m, n, r : byte; b : real;
begin
//Ввод размеров матрицы.
write ( ’ k= ’ ); readln ( k );
write ( ’m= ’ ); readln (m);
//Ввод матрицы A.
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 );
{Ввод считается верным, если n и r не больше m и не равны друг другу.}
until ( n<=m) and ( r<=m) and ( n<>r );
{Элементы столбца с номером r заменить элементами столбца с номером n.}
for i :=1 to k do
begin
b:=a [ i, n ];
a [ i, n ] : = a [ i, r ];
a [ i, r ] : = b
end;
writeln ( ’Преобразованная матрица A ’ );
for i :=1 to k do
begin
for j :=1 to m do
write ( a [ i, j ] : 7 : 3, ’   ’ );
writeln;
end;
end.
Результаты решения задачи 6.6

увеличить изображение
Рис. 6.22. Результаты решения задачи 6.6
Блок-схема алгоритма решения задачи 6.7

Рис. 6.23. Блок-схема алгоритма решения задачи 6.7

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

Результаты решения задачи 6.7

Рис. 6.24. Результаты решения задачи 6.7
< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Юрий Шутиков
Юрий Шутиков

По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. 
 

Евгений Силуков
Евгений Силуков

Еще в декабре выполнил тест №1, а его все так и не проверили.