logo
Метод Золотого сечения на Delphi

4. Заключение

Данная программа была написана на языке Delphi 7.0. При разработке программы были учтены все требования к программе и выполнены в полной мере.

При разработке данной программы Я закрепил знания по программированию в среде Delphi 7.0, также получил некоторые новые знания при разработке этой программы.

Приложение

Листинг программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, ExtCtrls;

type

TForm1 = class(TForm)

Edit_F: TEdit;

Button_Itogo: TButton;

Edit_A: TEdit;

Label1: TLabel;

Label4: TLabel;

Edit_B: TEdit;

SS: TStringGrid;

Edit_Int: TEdit;

Label3: TLabel;

Image1: TImage;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label5: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

Label12: TLabel;

Label13: TLabel;

Button1: TButton;

procedure Button_ItogoClick(Sender: TObject);

procedure Label5Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

uses Unit_help,Unit_h;

{$R *.dfm}

procedure Formula( Var Vivod:string; Var Gl_massiv: Array of string);

Var

Sk_massiv: Array [0..100] of string;

Tmp_st,st:integer; // Переменная степени

i_sk:integer; //Номер ячейки c начала массива скобки

j_sk:integer;// Переменная по перемещению по массиву скобки

z:integer; //Номер ячейки от конца гл. массива

i:integer; //Номер ячейки c начала гл. массива

j:integer; // Переменная по перемещению по гл. массиву

// Булевые типы (ложь) или (Истина) для гл. масиива и скобки

Y, Ysk:Boolean;

ch:Real; // Число

Itog:Real; //Переменная значений вычислений

begin // Начало

{---- Вычисление значений в скобках -----}

For z:=1 to 100 do //Чтение то конца гл. массива

Begin

// Если левая скобка найдена

if Gl_massiv [100-z] = ( then

Begin

i:= 100-z; j:= 0; Y:= False;

Repeat

Begin

if Gl_massiv[i+1] <> ) then //Найдена след.закрывающая скобка

Begin

Sk_massiv[j]:= Gl_massiv[i+1];

// Скрываем чило использованное для вычисления

Gl_massiv[i+1]:= #;

j:=j+1;

i:=i+1;

end

else Begin Gl_massiv[i+1]:= #; Y:= True; end;

end;

Until Y=True;

Y:= False;

{--------- Вычисление в скобках ---------------}

For i_sk:=0 to 100 do

Begin

Ysk:= False;

{-------------- Косинус---------------}

if Sk_massiv [i_sk]= cos then

Begin j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk+j_sk] <> # then

begin

itog:= cos(Strtofloat(Sk_massiv[i_sk+j_sk]));

Sk_massiv[i_sk]:= Floattostr(itog);

Sk_massiv[i_sk+j_sk]:= #; Ysk:= True;

end else j_sk:= j_sk+1;

until Ysk=True;

Ysk:= False;

end;

{-------------- Синус ---------------}

if Sk_massiv[i_sk]= sin then

Begin j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk+j_sk] <> # then

begin

itog:= sin(Strtofloat(Sk_massiv[i_sk+j_sk]));

Sk_massiv[i_sk]:= Floattostr(itog);

Sk_massiv[i_sk+j_sk]:= #; Ysk:= True;

end else j_sk:= j_sk+1;

until Ysk=True;

Ysk:= False;

end;

end;

{-------------- ^ квадрат ---------------}

For i_sk:=0 to 100 do

Begin

Ysk:= False;

if Sk_massiv[i_sk]= ^ then

Begin j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk-j_sk] <> # then begin

itog:= Strtofloat(Sk_massiv[i_sk-j_sk]);

Sk_massiv[i_sk-j_sk]:= #; Ysk:= True;

end else j_sk:= j_sk+1;

until Ysk=True;

Tmp_st:= StrToInt(Sk_massiv[i_sk+1]);

ch:=itog;

For st:=2 to Tmp_st do

begin

itog:= itog*ch;

end;

Sk_massiv[i_sk]:= Floattostr(itog);

end;

end;

{-------------- Умножение / Деление ---------------}

For i_sk:=0 to 100 do

Begin

Ysk:= False;

{-------------- Умножение---------------}

if Sk_massiv[i_sk]= * then

Begin j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk-j_sk] <> # then begin

itog:= Strtofloat(Sk_massiv[i_sk-j_sk]);

Sk_massiv[i_sk-j_sk]:= #; Ysk:= True;

end else j_sk:= j_sk+1;

until Ysk=True;

j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk+j_sk] <> # then begin

itog:= itog* Strtofloat(Sk_massiv[i_sk+j_sk]);

Sk_massiv[i_sk]:= Floattostr(itog);

Sk_massiv[i_sk+j_sk]:= #; Ysk:= True;

end else j_sk:= j_sk+1;

until Ysk=True;

end; Ysk:= False;

{--------------------- Деление ----------------}

if Sk_massiv[i_sk]= / then

Begin j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk-j_sk] <> # then begin

itog:= Strtofloat(Sk_massiv[i_sk-j_sk]);

Sk_massiv[i_sk-j_sk]:= #; Ysk:= True;

end else j_sk:= j_sk+1;

until Ysk=True;

j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk+j_sk] <> # then begin

itog:= itog/Strtofloat(Sk_massiv[i_sk+j_sk]);

Sk_massiv[i_sk]:= Floattostr(itog);

Sk_massiv[i_sk+j_sk]:= #; Ysk:= True;

end else j_sk:= j_sk+1;

until Ysk=True;

end; Ysk:= False;

end;

{-------------- cложение/вычитание -----------------}

For i_sk:= 0 to 100 do

Begin

Ysk:= False;

{-------------- сложение---------------}

if Sk_massiv[i_sk]= + then

Begin j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk-j_sk] <> # then begin

itog:= Strtofloat(Sk_massiv[i_sk-j_sk]);

Sk_massiv[i_sk-j_sk]:= #; Ysk:= True;

end else j_sk:= j_sk+1;

until Ysk=True;

j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk+j_sk] <> # then begin

itog:= itog+ Strtofloat(Sk_massiv[i_sk+j_sk]);

Sk_massiv[i_sk]:= Floattostr(itog);

Sk_massiv[i_sk+j_sk]:= #; Ysk:= True;

end else j_sk:= j_sk+1;

until Ysk=True;

end; Ysk:= False;

{------------------- Вычитание ----------------}

if Sk_massiv[i_sk]= - then

Begin j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk-j_sk] <> # then begin

itog:= Strtofloat(Sk_massiv[i_sk-j_sk]);

Sk_massiv[i_sk-j_sk]:= #; Ysk:= True;

end else j_sk:= j_sk+1;

until Ysk=True;

j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk+j_sk] <> # then begin

itog:= itog-Strtofloat(Sk_massiv[i_sk+j_sk]);

Sk_massiv[i_sk]:= Floattostr(itog);

Sk_massiv[i_sk+j_sk]:= #; Ysk:= True;

end else j_sk:= j_sk+1;

until Ysk=True;

end; Ysk:= False;

end;

For i_sk:=0 to 100 do

Begin

Ysk:= False;

{-------------- Натуральный логарифм --------------}

if Sk_massiv[i_sk]= ln then

Begin j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk+j_sk] <> # then

begin

ch:= Strtofloat(Sk_massiv[i_sk+j_sk]);

If ch > 0 then

Begin

itog:= ln(Strtofloat(Sk_massiv[i_sk+j_sk]));

Sk_massiv[i_sk]:= Floattostr(itog);

Sk_massiv[i_sk+j_sk]:= #; Ysk:= True;

end else Begin

Showmessage(Натуральный логарифм меньше нуля);

Sk_massiv[i_sk]:=0;

Ysk:= True;

end;

end else j_sk:= j_sk+1;

until Ysk=True;

Ysk:= False;

end;

{-------------- Корень кв.--------------}

if Sk_massiv[i_sk]= sqrt then

Begin j_sk:=1; Ysk:= False;

repeat

if Sk_massiv[i_sk+j_sk] <> # then

begin

ch:= Strtofloat(Sk_massiv[i_sk+j_sk]);

If ch > 0 then

Begin

itog:= sqrt(Strtofloat(Sk_massiv[i_sk+j_sk]));

Sk_massiv[i_sk]:= Floattostr(itog);

Sk_massiv[i_sk+j_sk]:= #; Ysk:= True;

end else Begin

Showmessage(Значение квадратного корня меньше нуля);

Sk_massiv[i_sk]:=0;

Ysk:= True;

end;

end else j_sk:= j_sk+1;

until Ysk=True;

Ysk:= False;

end;

end; Ysk:= False;

j_sk:=0;

Repeat

Begin

if Sk_massiv[0+j_sk] <> # then Begin

// Запись в гл. массив значение скобки

Gl_massiv[100-z]:= Sk_massiv[0+j_sk];

Ysk:= true; end

else j_sk:=j_sk+1;

end;

Until Ysk = true;

end;

end;

{----- Вычиление значения в скобках закончено -----}

//showmessage(Gl_massiv[0]);

Vivod:= Gl_massiv[0];

end; // Конец процедуры

{--------------------------------------------------------}

procedure TForm1.Button_ItogoClick(Sender: TObject);

Var

a,b,h:real; //Отрезок а, b и шаг h

Fx,Fa,Fb:Real; //Результат и суммы значений F(xi)

My_vivod:string;//Значение F(xi)

mas,z,j:integer; //Номер ячейки массива

i:integer; //Номер символа в строке формул

s,st,ch:string; //Символ

// Булевый тип (ложь) или (Истина) для выхода из цикла подсчета цифр

Bool:Boolean;

//Массив символов формулы

My_massiv:Array [0..100] of string;

begin

//Присвоение к переменным значений отрезка а,b и шага h

a:= StrToFloat(Edit_A.Text);

b:= StrToFloat(Edit_B.Text);

h:=StrToFloat(Edit_Int.Text);

z:=0;

// Вычисление значений Xi на отрезке a,b с шагом h

Repeat

Begin //Начало цикла

//Вывод в массив значения Xi

SS.Cells[0,z]:= FloatToStr(a);

z:=z+1; //Переход на ячейку ниже

a:=a+h; //Шаг

end;

Until a > b; //Продолжение цикла до конца отрезка а,b

mas:=0;

//Вывод всех значений F(xi) в массив

Repeat

begin

i:=1; j:=1;

Repeat

//Вычисление F(xi) и вывод в массив

Begin

s:= Copy(Edit_F.text,i,1); //Копировать i-й символ в строке формул

//Проверка на значение натурального логарифма

if s=l then Begin

s:=ln; i:= i+1; end;

//Проверка на значение косинуса

if s=c then Begin

s:=cos; i:= i+2; end;

//Проверка на значение синуса или корня

if s=s then Begin

i:= i+1; st:= Copy(Edit_F.text,i,1);

if st=i then begin

s:=sin; i:=i+1; end

else begin s:=sqrt; i:=i+2; end; end;

//Проверка на значение цифры

if (s=0) or (s=1) or (s=2)or (s=3)or (s=4)

or (s=5)or (s=6)or (s=7)or (s=8)or (s=9) then

Begin

ch:=s; Bool:=False;

Repeat

Begin

i:=i+1; // Перемещение к след. символу

s:= Copy(Edit_F.text,i,1); //Копировать i-й символ в строке формул

//Проверка на значение цифры

if (s=0) or (s=1) or (s=2)or (s=3)or (s=4)

or (s=5)or (s=6)or (s=7)or (s=8)or (s=9)or (s=,) then

Begin //Если Да

//Обьединение нескольких цифр подрят

ch:= ch+s;

end

else Bool:=True; //Если нет Bool - Истина

end;

Until Bool=True; //Выход, если Bool - Истина

My_massiv[j]:= ch; j:=j+1 //Запись значений цифр в массив

//Если значение не цифра - запись в массив текущего символа

end else Begin My_massiv[j]:=s; j:=j+1; i:=i+1; end;

end;

//Продолжение цикла до конца количества символов в строке формул

Until i > Length(Edit_F.Text);

// Взять формулу в массиве в скобки

My_massiv[0]:=(;

My_massiv[Length(Edit_F.Text)+1]:=);

// Присвоение значению х - значения xi в массиве

For i:= 0 to 100 do begin

if My_massiv[i]= x then

My_massiv[i]:= SS.Cells[0,mas];

end;

Formula(My_vivod,My_massiv[0]);

SS.Cells[1,mas]:= My_vivod; //Вывод F(xi) в массив

mas:=mas+1; //Перемешение в массиве на строку ниже

end;

//Продолжение цикла до последнего значения xi

Until mas>z-1;

Fa:=0; i:=0; //Обнуление переменных

//Суммирование значений F(x2,x4..xn-1)

Repeat

Begin

Fa:=Fa+StrtoFloat(SS.Cells[1,i]);

i:=i+2;

end;

Until i>=z;

i:=0;

//Суммирование значений F(x1,x3..xn)

Repeat

Begin

Fb:=Fb+StrtoFloat(SS.Cells[1,i+1]);

i:=i+2;

end;

Until i>=z-1;

//Вычисление значения F(x)

Fx:=(h/3)*(StrToFloat(SS.Cells[1,0])+(4*Fb)+(2*Fa));

//Вывод результата

Label3.Caption:= FloatToStr(h)+/3 * (+SS.Cells[1,0]+

* 4*(+FloattoStr(Fb)+)+ 2*(+FloattoStr(Fa)+) = ;

Label13.Caption:=FloatToStr(Fx);

end;

procedure TForm1.Label5Click(Sender: TObject);

begin

Form2.showmodal;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Form_help.ShowModal;

end;

end.