По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Обработка матриц в Паскале
Для решения данной задачи необходимо найти в каждом столбце максимальный и минимальный элементы, после чего в последний элемент столбца записать их разность. Блок-схема алгоритма решения приведена на рис. 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.9) и проект транспонирования матрицы A(N,M), разработанные для задачи 6.2. Окно формы несколько изменим (рис. 6.9). Кнопку Транспонирование переименуем в Преобразование матрицы, а свойством Caption метки label5 установим Преобразованная матрица A. Кроме того, изменим свойство Caption формы (см. рис. 6.21). Окно изменённой формы представлено на рис. 6.21.
Обработчики кнопок Ввод, Очистить, Выход из программы изменятся мало. Рассмотрим алгоритм работы обработчика кнопки Преобразование матрицы. В этом обработчике будет производиться считывание матрицы из компонента StringGrid1, преобразование матрицы A по алгоритму, представленному на рис. 6.20, вывод преобразованной матрицы в компонент StringGrid2.
Текст модуля визуального приложения решения задачи 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.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.24.