unit LInvoluta; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Button1: TButton; Button2: TButton; Edit1: TEdit; Label3: TLabel; Label4: TLabel; Edit2: TEdit; Label5: TLabel; Edit3: TEdit; Label6: TLabel; Label7: TLabel; procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation procedure PInvoluta; const DX=1E-19;{погрешность вычисления} var U:real;{Значение инволюты} M:real; I,N:integer; X1,X2,X,Xdeg:real; function Y(X:real):real; begin Y:=Sin(X)/Cos(X)-X-U; end; begin U:=StrToFloat(Form1.Edit1.Text); X:=0; M:=1; if Y(-M)*Y(M)>=0 then repeat M:=M+(Pi/2-M)/2; until Y(-M)*Y(M)<0; X1:=-M; X2:=M; N:=Round(Ln(2*M/DX)/Ln(2)); for I:=1 to N do begin if Y(X1)*Y(X)<=0 then X2:=X else X1:=X; X:=(X1+X2)/2; end; Xdeg:=X*180/Pi; Form1.Edit2.Text:=FloatToStrF(X,ffFixed,24,18); Form1.Edit3.Text:=FloatToStrF(Xdeg,ffFixed,24,18); end; {$R *.dfm} procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin case Key of #8, '0'..'9': ;//цифры и клавиша #13: begin PInvoluta; Edit1.Enabled := false; end; '.',',': begin if Key <> DecimalSeparator then Key:=DecimalSeparator;//заменим разделитель на допустимый if Pos(DecimalSeparator, Edit1.Text)<>0 then Key := Chr(0); //запрет на ввод второго разделителя end; '-': //минус можно вводить только первым символом, //т.е когда ячейка пустая if Length(Edit1.Text) <> 0 then Key := Chr(0); else Key:=Chr(0);//остальные символы запрещены end; end; procedure TForm1.Button1Click(Sender: TObject); begin PInvoluta; Edit1.Enabled := false; end; procedure TForm1.Button2Click(Sender: TObject); begin Edit1.Enabled := true; Edit1.Text := ''; Edit2.Text := ''; Edit3.Text := ''; Edit1.SetFocus; end; end.