unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Math, ExtCtrls, TeeProcs, TeEngine, Chart, Series; type TRepository = class; TController = class; TFormBase = class(TForm) Label0: TLabel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; hEdit: TEdit; roEdit: TEdit; rEdit: TEdit; wEdit: TEdit; KprEdit: TEdit; DbEdit: TEdit; OmegaEdit: TEdit; drawPlotButton: TButton; saveResultsButtons: TButton; SaveDialog1: TSaveDialog; Chart: TChart; Button1: TButton; Series1: TFastLineSeries; procedure calculate(Sender: TObject); procedure saveDataIntoFile(Sender: TObject); procedure drawPlot(Sender: TObject); private _controller : TController; public procedure connectController(var aController : TController); function getH : Real; function getRo : Real; function getR : Real; function getW : Real; function getKpr : Real; function getDb : Real; function getOmega : Real; end; TController = class private _form : TFormBase; _repository : TRepository; public procedure connectForm(var aForm : TFormBase); procedure connectRepository(var aRepository : TRepository); function cBeta (t : Real) : Real; procedure calculate; procedure saveDataIntoFile(var FileName : String); end; TRepository = class private _controller : TController; _results : array [1..1000] of array [0..1] of Real; public procedure saveData(var FileName : String); procedure connectController(var aController : TController); end; procedure connection (var aForm : TFormBase; var aController : TController; var aRepository : TRepository); implementation {$R *.dfm} procedure TController.connectForm(var aForm : TFormBase); begin self._form := aForm; end; procedure TController.connectRepository(var aRepository : TRepository); begin self._repository := aRepository; end; procedure TRepository.connectController(var aController : TController); begin self._controller := aController; end; procedure connection (var aForm : TFormBase; var aController : TController; var aRepository : TRepository); begin aForm.connectController(aController); aController.connectForm(aForm); aCOntroller.connectRepository(aRepository); aRepository.connectController(aController); end; function TController.cBeta(t : Real) : Real; var Kpr,Db,ro,r,h,M,I,eps,w0,w,HH,wr,Omega,C1,beta : Real; begin Db := self._form.getDb; Kpr := self._form.getKpr; ro := self._form.getRo; r := self._form.getR; h := self._form.getH; M := ro*3.14*r*r*h; I := M*r*r/2; eps := Db/(2*sqrt(Kpr*I)); w0 := sqrt(Kpr/I); w := w0*sqrt(1-eps*eps); wr := self._form.getW; HH := I*wr; Omega := self._form.getOmega; C1 := -1*(HH/Kpr)*Omega; result := (C1*power(2.73,-1*eps*w0*t) * sin(w*t + 3.14/2) + (HH/Kpr)*Omega)/1000; end; procedure TRepository.saveData(var FileName: string); var F : TextFile; i : integer; begin AssignFile (F, FileName); Rewrite (F); Writeln (F,'Значения угла Б (t,с --- beta,рад):') ; for i := 1 to 1000 do begin Writeln (F,FloatToStr(self._results[i][0]) + ' --- ' + FloatToStr(self._results[i][1]) ); end; CloseFile (F); end; procedure TController.calculate; var i : Integer; t : Real; begin for I := 0 to 1000 - 1 do begin t := i * 0.01; self._repository._results[i][0] := t; self._repository._results[i][1] := self.cBeta(t); end; end; procedure TController.saveDataIntoFile(var FileName: string); begin self._repository.saveData(FileName); end; procedure TFormBase.calculate(Sender: TObject); begin self._controller.calculate; end; procedure TFormBase.connectController(var aController : TController); begin self._controller := aController; end; function TFormBase.getH : Real; begin result := StrToFloat(self.hEdit.Text); end; function TFormBase.getRo : Real; begin result := StrToFloat(self.roEdit.Text); end; function TFormBase.getR : Real; begin result := StrToFloat(self.rEdit.Text); end; function TFormBase.getW : Real; begin result := StrToFloat(self.wEdit.Text) * 3.14; end; procedure TFormBase.saveDataIntoFile(Sender: TObject); var FileName : string; begin if (SaveDialog1.Execute) then begin FileName := SaveDialog1.FileName; self._controller.saveDataIntoFile(FileName); end; end; function TFormBase.getKpr: Real; begin result := StrToFloat(self.KprEdit.Text) / (100*100); end; procedure TFormBase.drawPlot(Sender: TObject); var i : integer; time : Real; value : Real; begin self.Series1.Clear; for i := 1 to 1000 do begin time := self._controller._repository._results[i][0] /100; value := self._controller._repository._results[i][1]; self.Series1.AddXY(time,value); end; end; function TFormBase.getDb : Real; begin result := StrToFloat(self.DbEdit.Text) / (100*100); end; function TFormBase.getOmega : Real; begin result := StrToFloat(self.OmegaEdit.Text) * 3.14; end; end.