Автор работы: Пользователь скрыл имя, 19 Мая 2015 в 21:37, курсовая работа
Данный курсовой проект посвящен программному моделированию реакции одномассовой системы на прямоугольный импульс. В результате импульса, в том числе и прямоугольного, система начинает колебаться. Различного рода колебания – одно из самых распространенных физических явлений. Ничто в окружающей нас среде не остается в стороне от колебаний, будь то математический маятник или лист дерева на ветру. На основе колебаний работает огромное количество приборов и механизмов, широко используемых человеком.
matr[idx(1,1)]:=rod+1; //коэф при первой степени х (для 1 рода=1, для второго рода=2)
//заполнение матрицы в циклах
for i:=2 to n do
for j:=(i mod 2) to n do
if ((i+j) mod 2)=1 then continue
else begin //рассчет коэффициента в i-строке и j-столбце
matr[idx(i,j)]:= - matr[idx(i-2,j)];
if j>0 then matr[idx(i,j)]:=matr[idx(i,j)]
end;
ShowPolynomial;
end;
//====================== Вывод многочлена
в окно ==============================
function TCPoly.st(gr:integer):string;
var res:string;
begin
if gr<>1 then
res:='^'+IntToStr(gr);
Result:=res;
end;
//----------------------------
function TCPoly.xst(gr:integer):string;
var res:string;
begin
if not(gr=1) then res:=#183; //точка, знак умножения
if gr>0 then res:=res+'x'+st(gr);
Result:=res;
end;
//----------------------------
function TCPoly.koef(gr:integer):
var res:string;
begin
if gr=0 then begin res := FloatToStr(matr[idx(n,gr)]); matr_for_table[idx(n,gr)] := matr[idx(n,gr)] end
else //gr>0
begin
if matr[idx(n,gr)]=-1 then res:='-'
else if not(matr[idx(n,gr)]=1) then
begin
matr_for_table[idx(n,gr)] := matr[idx(n,gr)];
res:=FloatToStr(matr[idx(n,gr)
end
else {=1} res:=xst(gr);
end;
Result:=res;
end;
//----------------------------
procedure TCPoly.ShowPolynomial;//вывод результата в виде строки многочлена
var s:string;
gr:integer; //степень члена многочлена (или номер столбца)
begin
for gr:=n downto 0 do
begin
if matr[idx(n,gr)]=0 then continue;
if (gr=n) or (matr[idx(n,gr)]<0) then
s:=s + ' '//коэф без знака "+"
else if matr[idx(n,gr)]>0 then
s:=s + ' +';//остальные положительные члены знака "+"
s:=s +koef(gr); //функция которая допишет остаток данного слагаемого многочлена
end;
v_str:=s;
end;
procedure TCPoly.Get_Table(SG : TStringGrid);
var row, _count: integer;
begin
SG.ColCount := 2;
SG.RowCount := count+1;
sg.FixedRows := 1;
SG.FixedCols := 0;
SG.Cells[1, 0] := 'коэфф.';
SG.Cells[0, 0] := 'x^';
_count := n;
for row := count - 1 downto 0 do
begin
SG.Cells[1, row+1] := FloatToStr(matr_for_table[row]
SG.Cells[0, row+1] := IntToStr(_count);
_count := _count - 2;
end;
end;
function TCPoly.stepX(X: Extended; stepen: integer): Extended;
var st: integer;
_x: Extended;
begin
_x:=X;
for st := 2 to stepen do
X:=X*_x;
Result:= X;
end;
procedure TCPoly.Get_Chart(Ch: TChart);
var
x,y: Extended;
_count, i: integer;
begin
x := -1;
_count := n;
y := 0;
CH.Series[0].Clear;
while x<=1 do
begin
for i := count - 1 downto 0 do
begin
y:=y+stepX(x,_count)*matr_for_
_count := _count - 2;
end;
CH.Series[0].AddXY(x,y);
x:=x+0.001;
y := 0;
_count := n;
end;
Ch.SaveToBitmapFile(
end;
procedure TCPoly.Import_To_Excel(rod, por:integer);
var row, _count: integer;
excel: variant;
begin
try
// создаем обьект EXCEL
excel := CreateOleObject('Excel.
// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;
// создаем новый документ
excel.WorkBooks.Add;
//присваиваем диапазону значения
excel.WorkBooks[1].WorkSheets[
excel.WorkBooks[1].WorkSheets[
excel.WorkBooks[1].WorkSheets[
excel.WorkBooks[1].WorkSheets[
_count := n;
for row := count - 1 downto 0 do
begin
excel.WorkBooks[1].WorkSheets[
excel.WorkBooks[1].WorkSheets[
_count := _count - 2;
end;
excel.WorkBooks[1].WorkSheets[
//где
//100 - отступ слева
//60 - отступ сверху
//600 - ширина
//400 - высота
// Делаем его видимым
excel.Visible := true;
//освобождаем интерфейсы
excel := Unassigned;
Except
showmessage('Внимание! Произошла ошибка при создании MS Excel приложения');
//закрываем Excel
excel.Application.quit;
//освобождаем интерфейсы
excel := Unassigned;
end;
end;
procedure TCPoly.Import_To_Word(rod, por:integer);
var
word, wdRng: variant; // Переменная в которой создаётся объект Word
begin
try
//Отчет в Word
word := CreateOleObject('Word.
// Чтоб не задавал вопрос о сохранении документа
word.DisplayAlerts := false;
//Новый док
word.Documents.Add;
word.ActiveDocument.
wdRng:=word.ActiveDocument.
wdRng.ParagraphFormat.
wdRng.InsertBefore('Полином
wdRng:=word.ActiveDocument.
wdRng.InsertAfter(IntToStr(
wdRng.InsertAfter(v_str);
word.Selection.InlineShapes.
word.Visible := true;
//освобождаем интерфейсы
word := Unassigned;
Except
showmessage('Внимание! Произошла ошибка при создании MS Word приложения');
//закрываем Word
word.Application.quit;
//освобождаем интерфейсы
word := Unassigned;
end;
end;
end.
Файл описания динамической библиотеки DllForm.pas
unit DllForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfrmDllForm = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmDllForm: TfrmDllForm;
implementation
{$R *.dfm}
function ShowDllFormModal: integer; stdcall;
begin
frmDllForm:= TfrmDllForm.Create(nil);
Result:= frmDllForm.ShowModal;
end;
procedure TfrmDllForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Exports
ShowDllFormModal;
procedure TfrmDllForm.Button1Click(
begin
frmDllForm.Close;
end;
end.
Файл формы отправки письма PUnit2.pas
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdMessageClient, IdSMTP, IdMessage,
IdExplicitTLSClientServerBase, IdSMTPBase;
type
TForm2 = class(TForm)
GroupBox1: TGroupBox;
Memo1: TMemo;
Button1: TButton;
IdSMTP1: TIdSMTP;
IdMessage1: TIdMessage;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
begin
Form2.Top := Screen.Height div 2 - Form2.Height div 2; //центрирование под экран
Form2.Left := Screen.Width div 2 - Form2.Width div 2;
Memo1.Lines.Text := '';
IdSMTP1.Port := 25;
IdSMTP1.Host := 'smtp.mail.ru';
//IdSMTP1.AuthenticationType:=
IdSMTP1.Username:='g1_ang31';
IdSMTP1.Password:='eV3mxam7Z';
end;
procedure TForm2.Button1Click(Sender: TObject);
var
Msg: TIdMessage;
begin
Msg := TIdMessage.Create(nil);
Msg.Subject:='Poly user';
Msg.Recipients.EMailAddresses:
Msg.From.Address := 'g1_ang31@mail.ru';
Msg.Body.Text := Memo1.Lines.Text;
//IdSMTP1.Connect(5000);
if IdSMTP1.Connected
then
begin
IdSMTP1.Send(Msg);
ShowMessage('Сообщение отправлено! Благодарю');
end;
IdSMTP1.Disconnect;
Msg.Free;
Form2.Close;
end;
end.
Файл проекта COM-сервера – Project1.dpr
library Project1;
uses
ComServ,
Project1_TLB in 'Project1_TLB.pas',
Unit1 in 'Unit1.pas' {MyClass: CoClass},
Unit2 in 'Unit2.pas';
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer,
DllInstall;
{$R *.TLB}
{$R *.RES}
begin
end.
Модуль описания COM – класса – Unit1.pas
unit Unit1;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, ActiveX, Classes, ComObj, Project1_TLB, StdVcl,
VCLTee.TeeProcs, VCLTee.Chart, VCLTee.Series, VCLTee.TeEngine, Math, Grids, SysUtils, Types, Graphics, IniFiles,
Messages, Dialogs, StdCtrls, Variants, Controls, Forms,
ExtCtrls, Buttons, Menus, Excel_TLB, Word_TLB;
type
TMyClass = class(TTypedComObject, IMyClass)
protected
n: integer;
rod: integer;
v_str: string;
matr: array of Extended;
matr_for_table: array of Extended;
count: integer;
public
procedure PolyCheb(_n, _rod: integer); stdcall;
function idx(i,j:integer):integer; stdcall;
procedure ClearMatr; stdcall;
function st(gr:integer):string; stdcall;
function xst(gr:integer):string; stdcall;
function koef(gr:integer):string; stdcall;
function get_str(): string; stdcall;
function get_count(): integer; stdcall;
procedure ShowPolynomial; stdcall;
function get_el_array(i_row:integer): Extended; stdcall;
procedure whithout_zero(); stdcall;
procedure Get_Table(SG : TStringGrid); stdcall;
procedure Get_Chart(Ch : TChart); stdcall;
function stepX(X: Extended; stepen: integer): Extended; stdcall;
procedure Import_To_Excel(rod, por:integer); stdcall;
procedure Import_To_Word(rod, por:integer); stdcall;
end;
const
Class_MyClass: TGUID = '{FBE41A88-03B9-4EEB-B457-
implementation
uses ComServ;
procedure TMyClass.whithout_zero();
var
buf: array of Extended;
el: integer;
_count: integer;
i: integer;
begin
_count := 0;
for i := 0 to (n+1)*(n+1)-1 do
if matr_for_table[i] = 0
then
inc(_count);
_count:=(n+1)*(n+1)-_count;
SetLength(buf, _count);
el:=0;
for i := 0 to (n+1)*(n+1)-1 do
if matr_for_table[i] <> 0
then
begin
buf[el] := matr_for_table[i];
inc(el);
end;
matr_for_table := nil;
SetLength(matr_for_table, _count);
for i := 0 to _count-1 do
matr_for_table[i] := buf[i];
count := _count;
end;
function TMyClass.get_count(): integer;
begin
Result:=count;
end;
function TMyClass.get_el_array(i_row:
begin
Result:=matr_for_table[i_row];
end;
function TMyClass.get_str(): string;
begin
Result:=v_str;
end;
function TMyClass.idx(i,j:integer):
begin
Result:=i*(n+1)+j;
end;
procedure TMyClass.ClearMatr;
var i:integer;
begin
//установка размера и очистка матрицы
SetLength(matr,(n+1)*(n+1));
for i:=0 to (n+1)*(n+1)-1 do matr[i]:=0;
SetLength(matr_for_table,(n+1)
for i:=0 to (n+1)*(n+1)-1 do matr_for_table[i]:=0;
end;
//----------------------------
procedure TMyClass.PolyCheb(_n, _rod: integer); //Чебышева
var i,j:integer; //счетчики для циклов (i номер строки, j номер столбца)
begin
n:=_n; rod := _rod;
ClearMatr; // создание чистой матрицы нужного размера
matr[idx(0,0)]:=1; //коэф при нулевой степени х
matr[idx(1,1)]:=rod+1; //коэф при первой степени х (для 1 рода=1, для второго рода=2)
//заполнение матрицы в циклах
for i:=2 to n do
for j:=(i mod 2) to n do
if ((i+j) mod 2)=1 then continue
else begin //рассчет коэффициента в i-строке и j-столбце
matr[idx(i,j)]:= - matr[idx(i-2,j)];
if j>0 then matr[idx(i,j)]:=matr[idx(i,j)]
end;
ShowPolynomial;
end;
//====================== Вывод многочлена в окно ==============================
function TMyClass.st(gr:integer):
var res:string;
begin
if gr<>1 then
res:='^'+IntToStr(gr);
Result:=res;
end;
//----------------------------
function TMyClass.xst(gr:integer):
var res:string;
begin
if not(gr=1) then res:=#183; //точка, знак умножения
if gr>0 then res:=res+'x'+st(gr);
Result:=res;
end;
//----------------------------
function TMyClass.koef(gr:integer):
var res:string;
begin
if gr=0 then begin res := FloatToStr(matr[idx(n,gr)]); matr_for_table[idx(n,gr)] := matr[idx(n,gr)] end
else //gr>0
begin
if matr[idx(n,gr)]=-1 then res:='-'
else if not(matr[idx(n,gr)]=1) then
begin
matr_for_table[idx(n,gr)] := matr[idx(n,gr)];
res:=FloatToStr(matr[idx(n,gr)
end
else {=1} res:=xst(gr);
end;
Result:=res;
end;
//----------------------------
procedure TMyClass.ShowPolynomial;//выво
var s:string;
gr:integer; //степень члена многочлена (или номер столбца)
begin
for gr:=n downto 0 do
begin
if matr[idx(n,gr)]=0 then continue;
if (gr=n) or (matr[idx(n,gr)]<0) then
s:=s + ' '//коэф без знака "+"
else if matr[idx(n,gr)]>0 then
s:=s + ' +';//остальные положительные члены знака "+"
s:=s +koef(gr); //функция которая допишет остаток данного слагаемого многочлена
end;
v_str:=s;
end;
procedure TMyClass.Get_Table(SG : TStringGrid);
var row, _count: integer;
begin
SG.ColCount := 2;
SG.RowCount := count+1;
sg.FixedRows := 1;
SG.FixedCols := 0;
SG.Cells[1, 0] := 'коэфф.';
SG.Cells[0, 0] := 'x^';
_count := n;
for row := count - 1 downto 0 do
begin
SG.Cells[1, row+1] := FloatToStr(matr_for_table[row]
SG.Cells[0, row+1] := IntToStr(_count);
_count := _count - 2;
end;
end;
function TMyClass.stepX(X: Extended; stepen: integer): Extended;
var st: integer;
_x: Extended;
begin
_x:=X;
for st := 2 to stepen do
X:=X*_x;
Result:= X;
end;
procedure TMyClass.Get_Chart(Ch: TChart);
var
x,y: Extended;
_count, i: integer;
begin
x := -1;
_count := n;
y := 0;
CH.Series[0].Clear;
while x<=1 do
begin
for i := count - 1 downto 0 do
begin
y:=y+stepX(x,_count)*matr_for_
_count := _count - 2;
end;
CH.Series[0].AddXY(x,y);
x:=x+0.001;
y := 0;
_count := n;
end;
Ch.SaveToBitmapFile(
end;
procedure TMyClass.Import_To_Excel(rod, por:integer);
var row, _count: integer;
excel: variant;
begin
try
// создаем обьект EXCEL
excel := CreateOleObject('Excel.
// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;
// создаем новый документ
excel.WorkBooks.Add;
//присваиваем диапазону
excel.WorkBooks[1].WorkSheets[
excel.WorkBooks[1].WorkSheets[