50398 (Вычисление определителя матрицы прямым методом), страница 2
Описание файла
Документ из архива "Вычисление определителя матрицы прямым методом", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "50398"
Текст 2 страницы из документа "50398"
2. АЛГОРИТМ РАБОТЫ ПРОГРАММЫ
2.1 Структура алгоритма и данных
Задача вычисления определителя матрицы разбивается на несколько подзадач:
-
Заполнение массива начальными данными;
-
Изменение порядка матрицы по желанию пользователя и заполнение нового массива;
-
Ввод и фильтрация вводимых пользователем данных в массив;
-
Вычисление детерминанта;
4.1) Ввод исходных данных в массив
4.2) Выбор главного элемента;
4.3) Замена строк местами;
4.4) Заполнение нового массива;
4.5) Приведение матрицы к верхнему треугольному виду;
4.6) Вычисление определителя матрицы.
Согласно вышеприведенной структуре, программа будет состоять из четырех подпрограмм:
-
Подпрограмма создания формы и ввода начальных данных в массив.
В данной подпрограмме задается начальное число столбцов и строк матрицы (ее порядок), вводятся заголовки матрицы, строк и столбцов в соответствии с заданным размером.
-
Подпрограмма изменения порядка матрицы;
В данной подпрограмме формируется новая матрица, исходя из данных, введенных пользователем, вводятся новые заголовки матрицы, строк и столбцов в соответствии с заданным размером.
-
Подпрограмма фильтрации вводимых пользователем данных, при нажатии на кнопки клавиатуры;
Данная подпрограмма разрешает пользователю вводить в матрицу только цифры, разделитель дробной и целой части и знак «-». Ввод других символов запрещается. Также в этой подпрограмме производится замена неверного разделителя на верный.
-
Подпрограмма вычисления определителя.
В данной подпрограмме происходит заполнение массива данных, поочередно для каждого столбца производится выбор главного элемента (наибольшего по модулю), затем строки меняются местами и производится приведение матрицы к верхней треугольной форме, т.е. когда ниже главной диагонали содержатся только нулевые элементы. Согласно вышеприведенным формулам производится вычисление значения детерминанта и полученный результат выводится на экран.
2.2 Схема алгоритма
На рисунке 1 представлен алгоритм работы программы при возникновении события OnCreate. Процедура TForm1.FormCreate(Sender: TObject).
Рис. 1. Алгоритм работы программы при возникновении события OnCreate
На рисунке 2 представлен алгоритм работы программы при нажатии на кнопку «Изменить размерность массива». Процедура TForm1.Button2Click(Sender: TObject).
Рис. 2. Алгоритм работы программы при нажатии на кнопку «Изменить размерность массива»
На рисунке 3 представлен алгоритм работы программы при вводе данных с клавиатуры (событие OnKeyPress). Процедура TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char).
Рис. 3. Алгоритм работы программы при при вводе данных с клавиатуры (событие OnKeyPress). Процедура TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char)
На рисунке 4 представлен алгоритм работы программы при нажатии на кнопку «Расчет». Процедура TForm1.Button1Click(Sender: TObject).
алгоритм программа pascal матрица определитель
Рис. 4. Алгоритм работы программы при нажатии на кнопку «Расчет»
3. ТЕКСТ ПРОГРАММЫ
3.1 Описание переменных и структур данных
При выполнении программы используются следующие переменные: N – максимальное число строк (столбцов) массива; r, c, max, j, z, p, s, zam – номера строк и столбцов и количество производимых замен строк – все они являются переменными типа integer (целое), переменные detA, k, buf – детерминант, коэффициент и буфер, используемый при замене строк – переменные типа extended (действительное число), а также переменная А – массив, тип массива – двумерный (Massiv = array[1..Nmax,1..Nmax] of extended).
При запуске программы возникает событие «создание формы» (OnCreate), процедура TForm1.FormCreate(Sender: TObject). При этом задается количество строк и столбцов двумерного массива (по умолчанию 4 и 4) StringGrid1.RowCount := N+1; StringGrid1.ColCount := N+1; но ячейки первой строки и первого столбца не редактируемые, они используются для вывода надписей над строками и столбцами, для чего используются функции StringGrid1.Cells [0,r] := ' r = ' + IntToStr(r) и StringGrid1.Cells [c,0] := ' c = ' + IntToStr(c). Вывод данных поочередно в каждую из этих ячеек производится посредством стандартной инструкции for … to … do begin … end.
Нажатие на кнопку влечет за собой возникновение события OnClick процедура TForm1.Button2Click(Sender: TObject). Данные о количестве строк и столбцов массива считываются из поля Edit1. Так как численное значение переменной N имеет целочисленный тип для преобразования строковой записи числа, находящегося в переменной Edit1.Text в целое, используется стандартная функция N:=StrToInt(Edit1.Text).
П
20
ри вводе пользователем данных в поле StringGrid1 происходит событие OnKeyPress, процедура TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char). Посредством стандартной инструкции case Key of, которая позволяет реализовать множественный выбор, происходит фильтрация вводимых пользователем данных. Разрешается ввод только цифр, разделителя (DecimalSeparator), знака «минус» и нажатие клавиши Backspace. Посредством инструкции if Key <> DecimalSeparator then производится выбор одиного из двух возможных вариантов развития программы: разделитель заменяется на правильный, если он введен неверно (Key := DecimalSeparator), либо разделитель оставляется без изменений. Ввод остальных символов запрещается (else key := Chr(0)).При нажатии на кнопку возникает событие (OnClick), процедура TForm1.Button1Click(Sender: TObject). Задаются начальные значения переменных max:= 1, detA := 1, zam:=0. Производится заполнение массива (A[c,r]:=StrToFloat(StringGrid1.Cells[c,r])), свойство StringGrid1.Cells[c,r] определяет содержимое ячейки с табличными координатами (c,r), строковые значения переменных, находящихся в ячейках (c,r) преобразуются в вещественный тип посредством стандартной инструкции StrToFloat. Стандартная инструкция for … to … do begin … end позволяет выполнять несколько раз действия, заключенные в этой инструкции. Функция abs(A[c,j]) возвращает модуль аргумента.
Инструкция if (stringgrid1.cells [c,r] > stringgrid1.cells [c-1,r]) and (stringgrid1.cells [c,r] < stringgrid1.cells [c+1,r]) then begin k := k+1; end; используется для выбора одного из вариантов развития программы, т.е. в случае выполнения данного условия число «особых» элементов увеличивается на 1 (k := k+1), если нет, то цикл повторяется до предпоследнего элемента матрицы. Реализует этот выбор стандартная инструкция for … to … do begin … end. Так как переменная detA действительное число, то для ее преобразования в строковый вид используется инструкция FloatToStrF(detA,fffixed,6,3). Функция zam mod 2 – проверка на четность количества замен строк, если число нечетное, то определитель умножается на -1.
Выход из программы осуществляется нажатием кнопки .
3.2 Текст программы на языке Pascal
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, Menus, Buttons;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label3: TLabel;
Button2: TButton;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
const
Nmax=10;
Type
Massiv1 = array[1..Nmax,1..Nmax] of extended;
var
Form1: TForm1;
A : Massiv1;
N, r, c: integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
N := 4;
Edit1.Text := FloatToStr(N);
StringGrid1.RowCount := N+1;
StringGrid1.ColCount := N+1;
Label3.Caption := ' для вычисления определителя матрицы нажмите расчет';
StringGrid1.Cells [0,0] := 'Матрица А';
for r := 1 to N do begin
StringGrid1.Cells [0,r] := ' строка ' + IntToStr(r);
end;
for c := 1 to N do begin
StringGrid1.Cells [c,0] := ' столбец ' + IntToStr(c);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
N:=StrToInt(Edit1.Text);
StringGrid1.RowCount:=N+1;
StringGrid1.ColCount:=N+1;
for r := 1 to N do begin
StringGrid1.Cells [0,r] := ' строка ' + IntToStr(r);
end;
for c := 1 to N do begin
StringGrid1.Cells [c,0] := ' столбец ' + IntToStr(c);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
detA, k, buf: extended;
max, j, z, p, s, zam:integer;
begin
max:= 1;
detA := 1;
zam:=0;
for c := 1 to N do
for r := 1 to N do
A[c,r]:=StrToFloat(StringGrid1.Cells[c,r]);
for c := 1 to N-1 do begin
for z := c to N-1 do begin
max:=z;
for j := z+1 to N do begin
if abs(A[c,j]) > abs(A[c,max]) then
max:=j;
end;
for p := 1 to N do begin
buf:=A[p,z]; A[p,z]:=a[p,max]; A[p,max]:=buf;
end;
end;
for r := c+1 to N do begin
k := A[c,r]/A[c,c];
for s := 1 to N do begin
A[s,r]:= A[s,r]-A[s,c]*k;
end;
end;
if c<>max then begin
zam := zam+1;
end;
end;
for c := 1 to N do
detA := detA*A[c,c];
if zam mod 2 <> 0 then
detA := (-1)*detA;
label3.Caption := 'Детерминант матрицы равен: ' + FloatToStrF(detA,fffixed,6,3);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
MessageDlg(Программа вычисляет детерминант (определитель) матрицы методом Гаусса с выбором главного элемента. Внимание!!! Матрица должна быть квадратной!',mtInformation,[mbOK],0);
end;
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9', '-' : ;
'.',',':
begin
if Key <> DecimalSeparator then
Key := DecimalSeparator;
end;
else