Смекни!
smekni.com

Розрахунок норм вектору (стр. 1 из 2)

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ "КПІ"

ФАКУЛЬТЕТ ПРИКЛАДНОЇ МАТЕМАТИКИ

Кафедра спеціалізованих комп’ютерних систем

КУРСОВА РОБОТА

з дисципліни "Технологія програмування"

Виконав: Семенякін Володимир

Постановка завдання

Розробити програму для розрахунку норм вектору, отриманому по наступній формулі:

, Де 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

// -----------------------------------------