Смекни!
smekni.com

Метод Золотого сечения на Delphi (стр. 2 из 3)

Решение задачи с помощью программы Метод Симпсона.exe:

Данная программа работает корректно, т.к. ответы совпадают.


3.5 Инструкция пользователя

Данная программа состоит из 1 откомпилированного exe файла – Метод Симпсона.exe и rar-архива содержащего все компоненты программы написанных на языке программирования – Delphi 7.0.

1. Запуск программы осуществляется путем открытия файла Метод Симпсона .exe.

2.

Ввод значений производится следующим образом:

Ввод функции f(x) – в данное окно производится ввод формулы предназначенной для вычисления значения интеграла. Для просмотра используемых арифметических действий при вводе необходимо нажать левой кнопкой мышки на
, после чего на экран выводится следующее окно (см. рис. 3).

Ввод отрезка [a,b] производится путем ввода

- точка а (начальная точка),
- точка b (конечная точка отрезка).

Шаг h или dx – ввод в

.

3. После ввода всех значений интеграла необходимо нажать кнопку

(см. рис.4).

где – таблица значений XibF(xi);


- приближенное значение интеграла.

-

4. Для вывод справочной информации о пользовании программой необходимо нажать кнопку

, после чего на экран выводится следующее окно (см. рис.7)

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