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.