Скачиваний:
5
Добавлен:
01.05.2014
Размер:
15.7 Кб
Скачать
uses Crt, Inform, Trf2;


var

Size : Integer;

function getF(var M:sMas;var I:Integer;var Code:Byte):Boolean;
var
Get:Boolean;
begin
get := false;
If (ord(M[I]) = 251) then
begin
Code := 12;
get := true;
I := I + 1;
end;
If (M[I] = 's') and (M[I+1] = 'i') and (M[I+2] = 'n') then
begin
Code := 6;
get:=true;
I:=I+3
end;
If (M[I] = 'c') and (M[I+1] = 'o') and (M[I+2] = 's') then
begin
Code := 7;
get:=true;
I:=I+3
end;
If (M[I] = 'a') and (M[I+1] = 's') and (M[I+2] = 'i') then
begin
Code := 8;
get:=true;
I:=I+3
end;
If (M[I] = 'a') and (M[I+1] = 't') and (M[I+2] = 'g') then
begin
Code := 9;
get:=true;
I:=I+3
end;
If (M[I] = 'l') and (M[I+1] = 'o') and (M[I+2] = 'g') then
begin
Code := 10;
get:=true;
I:=I+3
end;
If (M[I] = 'e') and (M[I+1] = 'x') and (M[I+2] = 'p') then
begin
Code := 11;
get:=true;
I:=I+3
end;
GetF := Get
end;

function GetConst(var M:sMas;var I:Integer; var S : String; MaxNum:Integer):Boolean;
var
Del,Exit,Get:Boolean;
H: Text;
begin
assign(H,'H1.txt');
rewrite(H);
Get := False;
Del := false;
If (M[I] >= 'a') and (M[I] <= 'z') then
begin
Get := true;
I := I + 1;
S := M[I - 1]
end
else
begin
Exit := false;
while not(Exit) do
begin
If I <= MaxNum then

If (M[I] >= '0') and (M[I] <= '9') then
begin
Get := true;
write(H,M[I]);
I := I + 1;
end
else If M[I] = '.' then
If Del then
Exit := true
else
begin
Get := true;
write(H,'.');
I := I + 1;
Del := true
end
else
Exit := true
else
Exit := true
end;
reset(H);
If Get then
read(H,S)
end;

close(H);
GetConst := Get
end;

function NumConst(var S : String) : Boolean;
var
I : Integer;
Flag,Ans,Exit : Boolean;
begin
I := 1;
Flag := false;
Ans := true;
Exit := false;
while not(Exit) and (I <= length(S)) do
begin
If ((S[I] < '0') or (S[I] > '9')) then
If (S[I] = '.') and not(Flag) then
begin
Flag := true;
I := I + 1
end
else
begin
Ans := false;
Exit := true
end
else
I := I + 1
end;
NumConst := Ans
end;

procedure Mode(var F:Text);
var
M : sMas;
C : Char;
I,J : Integer;
begin
reset(F);
I := 0 ;
while not(Eof(F)) do
begin
Read(F,C);
If not((ord(C) = 32) or (ord(C) = 13)) then
If (C >= 'A') and (C <= 'Z') then
begin
I := I + 1;
M[I] := chr(ord(C)-ord('A')+ord('a'))
end
else
begin
I := I + 1;
M[I] := C
end
end;
rewrite(F);
For J := 1 to I do
write(F,M[J])
end;

Function DataAn(var F:Text;var OpM:uMas;var CoM:cMas):Boolean;
var
M : sMas;
C : Char;
I,J,MaxNum,BrNum,K,P : Integer;
Exit,Answer,State:Boolean;
S : String;
begin
Mode(F);
reset(F);
I := 1;
while not(Eof(F)) do
begin
Read(F,C);
M[I] := C;
I := I + 1
end;
close(F);
MaxNum := I - 1;
BrNum := 0;
Exit := false;
I := 1;
J := I;
Answer := false;
State := false;
while (I <= MaxNum) and not(Exit) do
begin
C := M[I];
write(C);
K := I;
If C = '(' then
If State then
begin
writeln;
writeln('It is not a good place for "("');
readkey;
Exit := true;
answer := false
end
else
begin
BrNum := BrNum + 1;
I := I + 1
end
else
If C = ')' then
If (State and (BrNum > 0)) then
begin
BrNum := BrNum - 1;
I := I + 1
end
else
begin
writeln;
writeln('It is not a good place for ")"');
readkey;
Exit := true;
answer := false
end
else If C = '-' then
If State then
begin
OpM[J].Op.Num := false;
Opm[J].Op.Code := 3;
Opm[J].Prior := BrNum * 4 + 1;
State := false;
I := I + 1;
J := J + 1
end
else
begin
OpM[J].Op.Num := true;
CoM[J] := '-1';
OpM[J].Prior := 255;
OpM[J + 1].Op.Num := false;
Opm[J + 1].Op.Code := 4;
Opm[J + 1].Prior := BrNum * 4 + 2;
J := J + 2;
I := I + 1
end
else
If (C = '+') or (C = '*') or (C = '/') or (C = '^') then
If State then
begin
OpM[J].Op.Num := false;
If C = '+' then
begin
Opm[J].Op.Code := 2;
Opm[J].Prior := BrNum * 4 + 1;
J := J + 1;
I := I + 1;
State := false
end;
If (C = '*') then
begin
Opm[J].Op.Code := 4;
Opm[J].Prior := BrNum * 4 + 2;
J := J + 1;
I := I + 1;
State := false
end;
If (C = '/') then
begin
Opm[J].Op.Code := 5;
Opm[J].Prior := BrNum * 4 + 2;
J := J + 1;
I := I + 1;
State := false
end;
If (C = '^') then
begin
Opm[J].Op.Code := 16;
Opm[J].Prior := BrNum * 4 + 3;
J := J + 1;
I := I + 1;
K := I;
If (GetConst(M,I,S,MaxNum)) and (NumConst(S))then
begin
For P := K to I - 1 do
write(M[P]);
OpM[J].Op.Num := true;
CoM[J] := S;
OpM[J].Prior := 255;
J := J + 1;
State := true
end
else
begin
writeln;
writeln('There should be a constant greater then zero...');
readkey;
Exit := true;
answer := false
end
end
end
else
begin
writeln;
writeln('It is not a good place for ',C);
readkey;
Exit := true;
answer := false
end
else
If GetF(M,I,OpM[J].op.Code) and (I - 1 <= MaxNum) then
If not(State) then
begin
For P := K + 1 to I do
write(M[P]);
If M[I] = '(' then
begin
OpM[J].Op.Num := false;
OpM[J].Prior := BrNum * 4 + 4;
BrNum := BrNum + 1;
J := J + 1;
I := I + 1
end
else
begin
writeln;
writeln;
writeln('There should be "("');
readkey;
Exit := true
end
end
else
begin
For P := K + 1 to I - 1 do
write(M[P]);
writeln;
writeln('Not a good place for this');
readkey;
Exit := true
end
else
If GetConst(M,I,S,MaxNum) and (I - 1 <= MaxNum) then
If not(State) then
begin
For P := K + 1 to I - 1 do
write(M[P]);
OpM[J].Op.Num := true;
CoM[J] := S;
OpM[J].Prior := 255;
J := J + 1;
State := true
end
else
begin
For P := K + 1 to I - 1 do
write(M[P]);
writeln;
writeln('Not a good place for this');
readkey;
Exit := true
end
else
begin
writeln;
writeln('Not a good place for this');
readkey;
Exit := true
end

end;
If BrNum <> 0 then
begin
writeln;
writeln;
writeln('Not enough ")"');
Exit := true
end;
DataAn := not(Exit);
Size := J - 1
end;

procedure GetConMas(var CoM : cMas; var M : sMas; var Size1,Size2 : Integer);
var
I,J : Integer;
begin
J := 0;
For I := 1 to Size1 do
If ((length(Com[I]) = 1)) and (CoM[I][1] <= 'z') and (CoM[I][1] >= 'a') then
begin
J := J + 1;
M[J] := CoM[I][1]
end;
Size2 := J
end;

function placed(var M : sMas; Size : Integer; Ch : Char) : Boolean;
var
I : Integer;
Ans : Boolean;
begin
Ans := false;
I := 1;
while (I <= Size) and not(Ans) do
begin
If M[I] = Ch then
Ans := true;
I := I + 1
end;
placed := Ans;
end;

procedure GetString(var S : tStr);
var
I,J : Integer;
Exit : Boolean;
begin
Exit := false;
I := -1;
J := 1;
while not(Exit) do
begin
I := ord(readkey);
If (I<>13) and (I<>32) and (I<>27) then
begin
write(chr(I));
S.S[J] := chr(I);
J := J + 1
end
else
Exit := true
end;
S.Len := J - 1;
end;

var
OpM: uMas;
Com: cMas;
M : sMas;
F,H,Fo,Fout: Text;
I,K,L,Ch:Integer;
S,S2:String;
R:pTree;
E,Exit,A : Boolean;
C,Cha : Char;
S3 : tStr;
begin
clrscr;
TextColor(White);
writeln('Input a name of the used file: ');
GetString(S3);
assign(H,'H.txt');
rewrite(H);
A := false;
If (S3.S[S3.Len] = 't') and (S3.S[S3.Len-1] = 'x')
and (S3.S[S3.Len-2] = 't') and (S3.S[S3.Len-3] = '.') then
A := true;
for I := 1 to S3.Len do
write(H,S3.S[I]);
If not(A) then
write(H,'.txt');
reset(H);
read(H,S2);
close(H);
assign(F,S2);

assign(H,'H.txt');
assign(Fout,'fout.txt');
rewrite(Fout);

reset(F);
rewrite(H);
while not(Eof(F)) do
begin
Read(F,C);
write(H,C)
end;
writeln;
writeln;
E := false;
while not(E) do
begin
writeln('The function is: ');
If DataAn(H,OpM,CoM) then
begin
readkey;
create(R);
writeln;
K := 1;
L := Size;
MakeTree(R,Opm,K,L);
GetConMas(CoM,M,Size,K);

writeln;
Ch := 0;
while (Ch < ord('a')) or (Ch > ord('z')) do
begin
write('Input a derivation variable: ');
Ch := ord(readkey);
writeln(Chr(Ch));
writeln;
writeln;
end;
if placed(M,K,chr(Ch)) then
begin
S := Chr(Ch);
FillStartCond(R,OpM,CoM,S);
writeln;
writeln;
writeln('The operation tree is: ');
writeln;
writeln;
DrawTree(R,OpM,CoM,0);
readkey;
If Derivate(R,OpM,CoM) then;
clrscr;
write('F(',chr(Ch),')=');
write(Fout,'F(',chr(Ch),')=');
For I := 1 to R^.Func.Len do
begin
write(R^.Func.S[I]);
write(Fout,R^.Func.S[I]);
end;
writeln;
writeln;
writeln(Fout);
write('F`(',Chr(Ch),')=');
write(Fout,'F`(',Chr(Ch),')=');
assign(H,'H.txt');
rewrite(H);
For I := 1 to R^.Der.Len do
begin
write(R^.der.S[I]);
write(Fout,R^.der.S[I]);
write(H,R^.Der.S[I])
end;
writeln(Fout);
writeln(Fout);
readkey;
Dispose(R);
reset(H)
end
else
begin
write('F(',chr(Ch),')=');
write(Fout,'F(',chr(Ch),')=');
reset(H);
while not(Eof(H)) do
begin
read(H,Cha);
write(Cha);
write(Fout,Cha);
end;
writeln;
writeln;
writeln(Fout);
write('F`(',Chr(Ch),')=0');
write(Fout,'F`(',Chr(Ch),')=0');
writeln(Fout);
writeln(Fout);
assign(H,'H.txt');
rewrite(H);
write(H,'0');
reset(H);
readkey
end;

clrscr;
Exit := false;
while not(Exit) do
begin
clrscr;
write('Continue the derivation? (y/n) ');
C := readkey;
writeln(C);
If (C = 'y') or (C = 'Y') then
begin
Exit := true;
E := false
end;
If (C = 'N') or (C = 'n') then
begin
Exit := true;
E := true
end
end
{DrawTree(R,OpM,CoM,0);}
end
else
begin
writeln;
writeln;
writeln;
writeln('The function is incorrect!');
E := true
end;
writeln;
writeln;
end;

close(Fout)
end.
Соседние файлы в папке Аналитическое дифференцирование