НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ "КПІ"
ФАКУЛЬТЕТ ПРИКЛАДНОЇ МАТЕМАТИКИ
Кафедра спеціалізованих комп’ютерних систем
КУРСОВА РОБОТА
з дисципліни "Технологія програмування"
Виконав: Семенякін Володимир
Розробити програму для розрахунку норм вектору, отриманому по наступній формулі:
, Де A, B, C - матриці й X, Y - вектори.Теоретичні відомості
Для обрахунку заданої формули необхідно:
a) Написати процедуру[1] множення матриці на матрицю.
b) Написати процедуру сумування матриць.
c) Написати процедуру віднімання векторів.
d) Написати функцію множення матриці на вектор
e) Написати функцію для обчислення евклідової норми вектора.
f) Написати функцію обчислення норми вектора
g) Написати функцію обчислення норми вектора
h) Створити зручний інтерфейс для користувача.
Множення матриць:
Звідки легко бачити, що при множені матриці розмірами N M на матрицю розмірами М К буде отримана матриця розміром N К.
Сумування матриць:
Легко бачити, що задана дія ніяк не впливає на розмірність результуючої матриці. Матриці, що сумуються, мають бути однакових розмінностей.
Множення матриці на вектор:
Аналогічно множенню матриці на матрицю. Другим операндом у такій ситуації виступає матриця розміром М 1. В результаті виникає матриця розміром N 1, або ж просто вектор з N координатами.
Віднімання векторів:
Обчислення евклідової норми[2]:
Відбувається за наступною формулою:
Частіше всього евклідова норма використовується для обчислення довжини вектора.
Норми
й не потребують пояснення. Їх зміст у їх вигляді.Обґрунтування доцільності використання модулів
Модулі дозволяють використання функцій, процедур й типів для роботи з матрицями і векторами у інших програмах. Отже модульне програмування додає універсальності.
Функції й процедури доцільні, коли виникає багаторазове повторення одних й тих же алгоритмів. Ця курсова робота - як раз той випадок.
Код головної програми:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ComCtrls, matrix, Menus;
type
TmatrEditor = class (TForm)
Label1: TLabel;
Button2: TButton;
operList: TListView;
l2: TLabel;
objInf: TGroupBox;
matrViev: TStringGrid;
vectViev: TStringGrid;
itemNomb: TEdit;
infLab: TLabel;
Button3: TButton;
GroupBox2: TGroupBox;
Label2: TLabel;
vectorRB: TRadioButton;
matrixRB: TRadioButton;
l4: TLabel;
GroupBox3: TGroupBox;
Button1: TButton;
Button4: TButton;
TEST: TButton;
MainMenu1: TMainMenu;
File1: TMenuItem;
Save1: TMenuItem;
Open1: TMenuItem;
Exit1: TMenuItem;
opViev: TEdit;
GroupBox1: TGroupBox;
plusA: TRadioButton;
minusA: TRadioButton;
multA: TRadioButton;
Button5: TButton;
Button7: TButton;
Button6: TButton;
OpenD: TOpenDialog;
saveD: TSaveDialog;
Label3: TLabel;
procedure Button2Click (Sender: TObject);
procedure FormCreate (Sender: TObject);
procedure matrVievClick (Sender: TObject);
procedure TESTClick (Sender: TObject);
procedure Button1Click (Sender: TObject);
procedure operListClick (Sender: TObject);
procedure vectVievClick (Sender: TObject);
procedure vectorRBClick (Sender: TObject);
procedure matrixRBClick (Sender: TObject);
procedure Button4Click (Sender: TObject);
procedure itemNombKeyUp (Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure operListDblClick (Sender: TObject);
procedure Button5Click (Sender: TObject);
procedure Button6Click (Sender: TObject);
procedure Button7Click (Sender: TObject);
procedure Save1Click (Sender: TObject);
procedure Open1Click (Sender: TObject);
procedure itemNombChange (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const maxAct=15;
type matrRec = record
strName: string [20];
case typeOf: (vect,matr) of
matr: (mt: matrix_);
vect: (vt: vector);
end;
matrRecLink = ^matrRec;
var
matrEditor: TmatrEditor;
nowCharCode: byte;
nowMatr: matrix_;
nowVect: vector;
mainList: TList;
nowEl: matrRecLink;
i,j: size;
nowItem: integer;
fl: boolean;
actionArr: array [1. maxAct] of 0.5;
indexArr: array [1. maxAct+1] of 0.60;
sizeOfAction,act: 0.2;
opers: array [1.2] of matrRecLink;
filePath: string [255];
f: file of matrRec;
newItem: TListItem;
implementation
uses Unit3;
{$R *. dfm}
procedure TmatrEditor. Button2Click (Sender: TObject);
begin
newItem: =operList. Items. Add;
newItem. Caption: =char (nowCharCode);
newItem. SubItems. Add ('Vector');
// ------------------------
new (nowEl);
nowEl^. typeOf: =vect;
ziroVect (nowEl^. vt);
nowEl^. strName: =char (nowCharCode);
mainList. Add (nowEl);
// ------------------------
nowCharCode: =nowCharCode+1;
// ------------------------
operList. Enabled: =true;
end;
procedure TmatrEditor. FormCreate (Sender: TObject);
var newItem: TListItem;
begin
mainList: =TList. Create;
nowCharCode: =65;
fl: =true;
sizeOfAction: =0;
end;
procedure TmatrEditor. matrVievClick (Sender: TObject);
begin
itemNomb. Text: =matrViev. Cells [matrViev. Col,matrViev. Row];
infLab. caption: =matrRecLink (mainList [nowItem]) ^. strName+' ['+IntToStr (matrViev. Col+1) +'] ['+IntToStr (matrViev. Row+1) +'] ';
end;
procedure TmatrEditor. TESTClick (Sender: TObject);
begin
transp (nowMatr);
for i: =1 to nmax do
for j: =1 to nmax do
begin
matrViev. Cells [i-1,j-1]: =FloatToStr (nowMatr [i] [j]);
end;
end;
procedure TmatrEditor. Button1Click (Sender: TObject);
var nowRand: real;
begin
if matrRecLink (mainList [nowItem]) ^. typeOf = Matr then
for i: =1 to nmax do
for j: =1 to nmax do
begin
nowRand: = (1-2*random (2)) *random (100) /10;
matrViev. Cells [i-1,j-1]: =FloatToStr (nowRand);
matrRecLink (mainList [nowItem]) ^. mt [i] [j]: =nowRand;
end;
// ---------------------
if matrRecLink (mainList [nowItem]) ^. typeOf = Vect then
for i: =1 to nmax do
begin
nowRand: = (1-2*random (2)) *random (100) /10;
vectViev. Cells [i-1,0]: =FloatToStr (nowRand);
matrRecLink (mainList [nowItem]) ^. vt [i]: =nowRand;
end;
end;
procedure TmatrEditor. operListClick (Sender: TObject);
begin
if nowItem<>-1 then
begin
objInf. Enabled: =true;
nowItem: =operList. ItemIndex;
if matrRecLink (mainList [nowItem]) ^. typeOf=vect then
begin
l4. caption: ='vect';
for i: =1 to nmax do
for j: =1 to nmax do
matrViev. Cells [i-1,j-1]: ='';
for i: =1 to nmax do vectViev. Cells [i-1,0]: =FloatToStr (matrRecLink (mainList [nowItem]) ^. vt [i]);
vectViev. Color: =clWindow;
vectViev. Ctl3D: =true;
vectViev. Enabled: =true;
matrViev. Color: =clScrollBar;
matrViev. Ctl3D: =false;
matrViev. Enabled: =false;
// -----------------------
vectorRB. Checked: =true;
itemNomb. Text: =vectViev. Cells [0,0];
end;
// ==================================================
if matrRecLink (mainList [nowItem]) ^. typeOf=matr then
begin
l4. caption: ='matr';
for i: =1 to nmax do vectViev. Cells [i-1,0]: ='';
for i: =1 to nmax do
for j: =1 to nmax do
matrViev. Cells [i-1,j-1]: =FloatToStr (matrRecLink (mainList [nowItem]) ^. mt [i] [j]);
vectViev. Color: =clScrollBar;
vectViev. Ctl3D: =false;
vectViev. Enabled: =false;
matrViev. Color: =clWindow;
matrViev. Ctl3D: =true;
matrViev. Enabled: =true;
// -----------------------
matrixRB. Checked: =true;
itemNomb. Text: =matrViev. Cells [0,0];
end;
end;
end;
procedure TmatrEditor. vectVievClick (Sender: TObject);
begin
itemNomb. Text: =vectViev. Cells [vectViev. Col,0];
infLab. caption: =matrRecLink (mainList [nowItem]) ^. strName+' ['+IntToStr (vectViev. Col+1) +'] ';
end;
procedure TmatrEditor. vectorRBClick (Sender: TObject);
begin
if matrRecLink (mainList [nowItem]) ^. typeOf = matr then
if MessageDlg ('All matrix information will be lost. Change to vector? ', mtWarning, [mbYes, mbNo], 0) = mrYes then
begin
new (nowEl);
nowEl^. typeOf: =vect;
ziroVect (nowEl^. vt);
nowEl^. strName: =matrRecLink (mainList [nowItem]) ^. strName;
for i: =1 to nmax do
for j: =1 to nmax do
matrViev. Cells [i-1,j-1]: ='';
for i: =1 to nmax do vectViev. Cells [i-1,0]: =FloatToStr (nowEl^. vt [i]);
dispose (mainList [nowItem]);
mainList [nowItem]: =nowEl;
// -----------------------------
vectViev. Color: =clWindow;
vectViev. Ctl3D: =true;
vectViev. Enabled: =true;
matrViev. Color: =clScrollBar;
matrViev. Ctl3D: =false;
matrViev. Enabled: =false;
// ------------------------------
operList. Items [nowItem]. SubItems [0]: ='Vector';
end;
end;
procedure TmatrEditor. matrixRBClick (Sender: TObject);
begin
if matrRecLink (mainList [nowItem]) ^. typeOf = vect then
if MessageDlg ('All vector information will be lost. Change to matrix? ', mtWarning, [mbYes, mbNo], 0) = mrYes then
begin
new (nowEl);
nowEl^. typeOf: =matr;
ziroMatr (nowEl^. mt);
nowEl^. strName: =matrRecLink (mainList [nowItem]) ^. strName;
for i: =1 to nmax do vectViev. Cells [i-1,0]: ='';
for i: =1 to nmax do
for j: =1 to nmax do
matrViev. Cells [i-1,j-1]: =FloatToStr (nowEl^. mt [i] [j]);
dispose (mainList [nowItem]);
mainList [nowItem]: =nowEl;
// --------------------------------
vectViev. Color: =clScrollBar;
vectViev. Ctl3D: =false;
vectViev. Enabled: =false;
matrViev. Color: =clWindow;
matrViev. Ctl3D: =true;
matrViev. Enabled: =true;
// ------------------------------
operList. Items [nowItem]. SubItems [0]: ='Matrix';
end;
end;
procedure TmatrEditor. Button4Click (Sender: TObject);
begin
if matrRecLink (mainList [nowItem]) ^. typeOf = Vect then
begin
ziroVect (matrRecLink (mainList [nowItem]) ^. vt);
for i: =1 to nmax do
vectViev. Cells [i-1,0]: ='0';
end;
// ---------------------
if matrRecLink (mainList [nowItem]) ^. typeOf = Matr then
begin
ziroMatr (matrRecLink (mainList [nowItem]) ^. mt);
for i: =1 to nmax do
for j: =1 to nmax do
matrViev. Cells [i-1,j-1]: ='0';
end;
end;
procedure TmatrEditor. itemNombKeyUp (Sender: TObject; var Key: Word;
Shift: TShiftState);
var saveVal: real;
begin
if (matrRecLink (mainList [nowItem]) ^. typeOf=vect) and not (Key=46) then
begin
try
// saveVal: =matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col];
matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col]: =StrToFloat (itemNomb. text);
saveVal: =matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col];
vectViev. Cells [vectViev. Col,0]: =itemNomb. text;
except
on EConvertError do
begin
matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col]: =saveVal;
text: =FloatToStr (saveVal);
showMessage ('Put only number! ');
end;
end;
end;
{if matrRecLink (mainList [nowItem]) ^. typeOf=matr then
begin
saveVal: =matrRecLink (mainList [nowItem]) ^. mt [matrViev. Col] [matrViev. Row];
matrRecLink (mainList [nowItem]) ^. mt [matrViev. Col] [matrViev. Row]: =StrToFloatDef (text,saveVal);
text: =FloatToStr (matrRecLink (mainList [nowItem]) ^. mt [matrViev. Col] [matrViev. Row]);
matrViev. Cells [vectViev. Col,vectViev. Row]: =text;
end; }
end;
procedure TmatrEditor. operListDblClick (Sender: TObject);
begin
if (nowItem<>-1) and (sizeOfAction<2) then
begin
if length (opViev. Text) >0 then
begin
if multA. Checked then begin
opViev. Text: =opViev. text+'x'; act: =0; end;
if minusA. Checked then begin
opViev. Text: =opViev. text+'-'; act: =1; end;
if plusA. Checked then begin
opViev. Text: =opViev. text+'+'; act: =2; end;
end;
new (opers [sizeOfAction+1]);
opers [sizeOfAction+1] ^. typeOf: =matr;
for i: =1 to nmax do
for j: =1 to nmax do
opers [sizeOfAction+1] ^. mt [i] [j]: =matrRecLink (mainList [nowItem]) ^. mt [i] [j];
sizeOfAction: =sizeOfAction+1;
opViev. Text: =opViev. text+matrRecLink (mainList [nowItem]) ^. strName;
end;
end;
procedure TmatrEditor. Button5Click (Sender: TObject);
var newItem: TListItem;
begin
// -----------------------------------------