Если вам надо написать программу, которая анализирует вводимое выражение (например функцию, график которой надо построить) то можно воспользоваться этой программой. Она выполняет построение графиков функций на основе синтаксического анализатора вводимых выражений; функция вводится в виде символьного выражения. Программа пригодится всем. Фактически это готовая курсовая работа.
program grafik;
{ построение графиков функций на основе синтаксического анализатора вводимых
выражений; функция вводится в виде символьного выражения}
{Для работы программы укажите путь к файлу еgavga.bgi,
комментарий в разделе операторов, процедура initgraph} USES Graph, Crt;
VAR
errorr1, errorr2 : boolean;
a, b, c, m, n, x, p, q, x1, x2 : real;
u, uu, uuu, uuuu : char;
cc, mn, nm, ii, i,jj, j, k, Gdriver, Gregim, cf, cd, dd, cs:integer;
st, dst, ddst, v : string;
{считывание строки}
procedure readxy(x,y:integer;var c:string);
var g:char;
Begin
c:='';
setcolor(red);
for k:=1 to 10 do
begin
str(k,v);
outtextxy(10,10+20*(k-1),'F'+v);
outtextxy(10,230+20*(k-1),'F'+v);
end;
setcolor(white);
outtextxy(35,10,' SIN');
outtextxy(35,30,' COS');
outtextxy(35,50,' TG');
outtextxy(35,70,' CTG');
outtextxy(35,90,' SEC');
outtextxy(35,110,' COSEC');
outtextxy(35,130,' ARCSIN');
outtextxy(35,150,' ARCCOS');
outtextxy(35,170,' ARCTG');
outtextxy(35,190,' ARCCTG');
outtextxy(15,210,'S H I F T');
outtextxy(35,230,' SH');
outtextxy(35,250,' CH');
outtextxy(35,270,' TH');
outtextxy(35,290,' CTH');
outtextxy(35,310,' SCH');
outtextxy(35,330,' CSCH');
outtextxy(35,350,' ARSH');
outtextxy(35,370,' ARCHPM');
outtextxy(35,390,' ARTH');
outtextxy(35,410,' ARCTH');
g:=' ';
while g<>#13 do
begin
repeat until keypressed;
g:=readkey;
if not(g in [#0,#8,#13]) then c:=c+g else
if g=#8 then c:=copy(c,1,length(c)-1) else
if g=#0 then
begin
g:=readkey;
case g of
#59:c:=c+'sin';
#60:c:=c+'cos';
#61:c:=c+'tg';
#62:c:=c+'ctg';
#63:c:=c+'sec';
#64:c:=c+'cosec';
#65:c:=c+'arcsin';
#66:c:=c+'arccos';
#67:c:=c+'arctg';
#68:c:=c+'arcctg';
#84:c:=c+'sh';
#85:c:=c+'ch';
#86:c:=c+'th';
#87:c:=c+'cth';
#88:c:=c+'sch';
#89:c:=c+'csch';
#90:c:=c+'arsh';
#91:c:=c+'archpm';
#92:c:=c+'arth';
#93:c:=c+'arcth';
end;
end;
bar(x,y,638,y+10);
outtextxy(x,y,c);
end;
bar(1,1,100,478);
End;
{приведение функции в нормальную форму}
function normal(s:string):string;
var i11:integer;
Begin
i11:=1;
while i11 begin
if (s[i11]='(') and (s[i11+2]=')') then
begin
delete(s,i11,1);
delete(s,i11+1,1);
i11:=i11-1;
end;
i11:=i11+1;
end;
i11:=1;
while i11 begin
if (copy(s,i11,2)='*1') or (copy(s,i11,2)='1*')
or (copy(s,i11,2)='^1') then
begin delete(s,i11,2); i11:=i11-1; end;
i11:=i11+1;
end;
normal:=s;
End;
{ *** }
{ * * }
{ * * * * * * * * * * * * * * * * * * * * * * * * }
{ * * * * * * * * * ** * * * * * * * * * }
{ ****** * * * * * * * * * * ** * * * * * * * * * }
{ * * * * * * * * * ** * * * * * * * * * }
{ * * * * * * * * * * * * * * * * * * * * }
function roundd(x:real):integer;
begin
if abs(x)<216
then roundd:=round(x)
else
roundd:=216*round(abs(x)/x);
end;
{очистка полосы экрана}
procedure clr;
begin
setfillstyle(1,blue);
bar(101,434,638,478);
end;
{ФУНКЦИЯ ВЫЧИСЛЕНИЯ СТРОКИ (ОБЩЕГО ВИДА)}
function f(s:string;x:real;var e:boolean):real;
var
i11,i22,jj1,jj2,jj3,jj4:integer;
a,r,w:real;
{ФУНКЦИЯ ВЫЧИСЛЕНИЯ СТРОКИ (БЕЗ ЗНАКОВ + -)}
function g(s:string;x:real;var e:boolean):real;
VAR
j1,j2,j3,j4,z1,z2,z3,z4,i1,i2,i3,u,y:integer;
a,b:real;
{ФУНКЦИЯ ВЫЧИСЛЕНИЯ СТРОКИ (БЕЗ ЗНАКОВ * : / ^)}
function h(s:string;x:real;var e:boolean):real;
VAR
i,l:integer;
c,b,r:real;
Begin
l:=length(s);
if l=0 then
b:=0
else
if s[1]='('then
b:=f(copy(s,2,l-2),x,e)
else
if s[1]='|'then
b:=abs(f(copy(s,2,l-2),x,e))
else
if s[1]='['then
begin
r:=f(copy(s,2,l-2),x,e);
if r >= 0
then
b := trunc(r)
else
b := trunc(r) - 1;
end
else
if s[1]='{'then
begin
r:=f(copy(s,2,l-2),x,e);
if r >= 0
then
b := frac(r)
else
b := frac(r+5+trunc(abs(r)));
end
else
if copy(s,1,2)='tg' then
begin
c:=h(copy(s,3,l-2),x,e);
if cos(c)=0 then
e:=true
else
b:=sin(c)/cos(c);
end
else
if copy(s,1,2)='ln' then
begin
c:=h(copy(s,3,l-2),x,e);
if c<=0 then
e:=true
else
b:=ln(c);
end
else
if copy(s,1,2)='lg' then
begin
c:=h(copy(s,3,l-2),x,e);
if c<=0 then
e:=true
else
b:=ln(c)/ln(10);
end
else
if copy(s,1,2)='sh' then
begin
c:=h(copy(s,3,l-2),x,e);
b:=(exp(c)-exp(-c))/2
end
else
if copy(s,1,2)='ch' then
begin
c:=h(copy(s,3,l-2),x,e);
b:=(exp(c)+exp(-c))/2
end
else
if copy(s,1,2)='th' then
begin
c:=h(copy(s,3,l-2),x,e);
b:=(exp(c)-exp(-c))/(exp(c)+exp(-c));
end
else
if copy(s,1,3)='cth' then
begin
c:=h(copy(s,4,l-3),x,e);
if c=0 then e:=true
else
b:=(exp(c)+exp(-c))/(exp(c)-exp(-c));
end
else
if copy(s,1,4)='csch' then
begin
c:=h(copy(s,4,l-3),x,e);
if c=0 then e:=true
else
b:=2/(exp(c)-exp(-c));
end
else
if copy(s,1,3)='sch' then
begin
c:=h(copy(s,4,l-3),x,e);
b:=2/(exp(c)+exp(-c));
end
else
if copy(s,1,3)='ctg' then
begin
c:=h(copy(s,4,l-3),x,e);
if sin(c)=0 then
e:=true
else
b:=cos(c)/sin(c);
end
else
if copy(s,1,3)='exp' then
b:=exp(h(copy(s,4,l-3),x,e))
else
if copy(s,1,3)='abs' then
b:=abs(h(copy(s,4,l-3),x,e))
else
if copy(s,1,3)='sin' then
b:=sin(h(copy(s,4,l-3),x,e))
else
if copy(s,1,5)='cosec' then
begin
c:=h(copy(s,6,l-5),x,e);
if sin(c)=0 then
e:=true
else
b:=1/sin(c);
end
else
if copy(s,1,3)='cos' then
b:=cos(h(copy(s,4,l-3),x,e))
else
if copy(s,1,3)='sec' then
begin
c:=h(copy(s,4,l-3),x,e);
if cos(c)=0 then
e:=true
else
b:=1/cos(c);
end
else
if copy(s,1,4)='arsh' then
begin
c:=h(copy(s,5,l-4),x,e);
b:=ln(c+sqrt(c*c+1));
end
else
if copy(s,1,4)='arth' then
begin
c:=h(copy(s,5,l-4),x,e);
if sqr(c)>=1 then
e:=true
else
b:=ln((1+c)/(1-c))/2;
end
else
if copy(s,1,5)='arcth' then
begin
c:=h(copy(s,6,l-5),x,e);
if sqr(c)<=1 then
e:=true
else
b:=ln((c+1)/(c-1))/2;
end
else
if copy(s,1,5)='archp' then
begin
c:=h(copy(s,6,l-5),x,e);
if c<1 then
e:=true
else
b:=ln(c+sqrt(c*c-1));
end
else
if copy(s,1,5)='archm' then
begin
c:=h(copy(s,6,l-5),x,e);
if c<1 then
e:=true
else
b:=ln(c-sqrt(c*c-1));
end
else
if copy(s,1,5)='arctg' then
b:=arctan(f(copy(s,6,l-5),x,e))
else
if copy(s,1,6)='arcctg' then
b:=pi/2-arctan(f(copy(s,7,l-6),x,e))
else
if copy(s,1,6)='arccos' then
begin
c:=h(copy(s,7,l-6),x,e);
if c*c>1 then
e:=true
else
if c>0 then
b:=arctan(sqrt(1-c*c)/c)
else
if c<0 then
b:=pi+arctan(sqrt(1-c*c)/c)
else
b:=pi/2;
end
else
if copy(s,1,6)='arcsin' then
begin
c:=(h(copy(s,7,l-6),x,e));
if c*c>1 then
e:=true
else
if c*c<>1 then
b:=arctan(c/sqrt(1-c*c))
else
b:=c*pi/2;
end
else
if copy(s,1,4)='sqrt' then
begin
c:=h(copy(s,5,l-4),x,e);
if c<0 then
e:=true
else
b:=sqrt(c);
end
else
if copy(s,1,2)='pi' then
b:=pi
else
if s[1]='e' then
b:=exp(1)
else
if s[1]='x' then
b:=x
else
begin
val(copy(s,1,l),b,i);
if i<>0 then
e:=true;
end;
h:=b;
End;{h}
Begin{g}
a:=1;i1:=1;
while i1<=length(s) do
begin
j1:=0;j2:=0;j3:=0;j4:=0;i2:=i1;
while (i2<=length(s)) and not((j1*j1+j2*j2+j3*j3+j4*j4=0)
and (s[i2] in ['*','/',':'])) do
begin
if s[i2]='(' then j1:=j1+1;
if s[i2]=')' then j1:=j1-1;
if s[i2]='[' then j2:=j2+1;
if s[i2]=']' then j2:=j2-1;
if s[i2]='{' then j3:=j3+1;
if s[i2]='}' then j3:=j3-1;
if s[i2]='|' then
begin
i:=i2;
while (s[i]='|') and (i<>0) do i:=i-1;
if (i=0) or
(s[i] in ['*','/',':','+','-','(','[','{','^'])
then
j4:=j4+1
else
j4:=j4-1;
end;
i2:=i2+1;
end;
z1:=0;z2:=0;z3:=0;z4:=0;i3:=i1;
while (i3 and (s[i3]='^')) do
begin
if s[i3]='(' then z1:=z1+1;
if s[i3]=')' then z1:=z1-1;
if s[i3]='[' then z2:=z2+1;
if s[i3]=']' then z2:=z2-1;
if s[i3]='{' then z3:=z3+1;
if s[i3]='}' then z3:=z3-1;
if s[i3]='|' then
begin
i:=i3;
while (s[i]='|') and (i<>0) do i:=i-1;
if (i=0) or
(s[i] in ['*','/',':','+','-','(','[','{','^'])
then
z4:=z4+1
else
z4:=z4-1;
end;
i3:=i3+1;
end;
if i3<>i2 then
begin
r:=h(copy(s,i1,i3-i1),x,e);
w:=h(copy(s,i3+1,i2-i3-1),x,e);
val(copy(s,i3+1,i2-i3-1),u,y);
if y=0 then
begin
if r=0 then b:=0
else
b:=exp(ln(abs(r))*w);
if odd(u) and (r<0) then b:=-b;
end
else
if r<0 then e:=true
else
if r=0 then b:=0
else
b:=exp(ln(r)*w);
end
else
b:=h(copy(s,i1,i2-i1),x,e);
if i1=1 then a:=b
else
if s[i1-1]='*' then a:=a*b
else
if s[i1-1] in ['/',':'] then
if b=0 then e:=true
else a:=a/b;
i1:=i2+1;
end;
g:=a;
End{g};
Begin{f}
i11:=1; a:=0;
while i11<=length(s) do
begin
jj1:=0;jj2:=0;jj3:=0;jj4:=0;i22:=i11;
while (i22<=length(s)) and not((jj1*jj1+jj2*jj2+jj3*jj3+jj4*jj4=0)
and (s[i22] in ['+','-']) and not(s[i22-1]='^')) do
begin
if s[i22]='(' then jj1:=jj1+1;
if s[i22]=')' then jj1:=jj1-1;
if s[i22]='[' then jj2:=jj2+1;
if s[i22]=']' then jj2:=jj2-1;
if s[i22]='{' then jj3:=jj3+1;
if s[i22]='}' then jj3:=jj3-1;
if s[i22]='|' then
begin
i:=i22;
while (s[i]='|') and (i<>0) do i:=i-1;
if (i=0) or
(s[i] in ['*','/',':','+','-','(','[','{','^'])
then
jj4:=jj4+1
else
jj4:=jj4-1;
end;
i22:=i22+1;
end;
if (i11=1) and (s[1]='-') then a:=0 else
if i11=1 then a:=g(copy(s,i11,i22-i11),x,e) else
case s[i11-1] of
'+': a:=a+g(copy(s,i11,i22-i11),x,e);
'-': a:=a-g(copy(s,i11,i22-i11),x,e);
end;
i11:=i22+1;
end;
f:=a;
End;{f}
{ * * * }
{ * * * * * * * * * * * * * * * * * * * * * * * * * * }
{ * * * * * * * ** * * * * * * * * * * * * * * }
{ * * * * * * * * * * ** * ** * * * * * * * * * * * * }
{ * * * * * ** * * * * * * * * * * * * * * * * }
{ * * * * * * * * * * * * * * * * * ** * ** * * * * * * }
function df(s:string):string;
var
i11,i22,jj1,jj2,jj3,jj4,i3:integer;
a,b:string;
function dg(s:string):string;
var
j1,j2,j3,j4,z1,z2,z3,z4,i1,i2,i3,u,y:integer;
a,b,r,w,o:string;
function dh(s:string):string;
var
j1,j2,j3,j4,z1,z2,z3,z4,i1,i2,i3,i,l:integer;
a,b,r,w:string;
d:real;
Begin {dh}
b:='';
l:=length(s);
if s[1]='('then
b:='('+df(copy(s,2,l-2))+')'
else
if s[1]='|'then
b:='|'+(copy(s,2,l-2))+'|/('+(copy(s,2,l-2))+')*'+
df(copy(s,2,l-2))
else
if copy(s,1,2)='tg' then
b:=dh(copy(s,3,l-2))+'/cos('+copy(s,3,l-2)+')^2'
else
if copy(s,1,2)='ln' then
b:=dh(copy(s,3,l-2))+'/'+(copy(s,3,l-2))
else
if copy(s,1,2)='lg' then
b:=dh(copy(s,3,l-2))+'/('+copy(s,3,l-2)+'*ln(10))'
else
if copy(s,1,2)='sh' then
b:='ch'+copy(s,3,l-2)+'*'+dh(copy(s,3,l-2))
else
if copy(s,1,2)='ch' then
b:='sh'+copy(s,3,l-2)+'*'+dh(copy(s,3,l-2))
else
if copy(s,1,2)='th' then
b:=dh(copy(s,3,l-2))+'/ch('+copy(s,3,l-2)+')^2'
else
if copy(s,1,3)='cth' then
b:='(-'+dh(copy(s,4,l-3))+')/sh('+copy(s,4,l-3)+')^2'
else
if copy(s,1,3)='sch' then
b:='(-2)*th('+copy(s,4,l-3)+')*sch('+copy(s,4,l-3)+')*'+
dh(copy(s,4,l-3))
else
if copy(s,1,3)='sec' then
b:='tg('+copy(s,4,l-3)+')*sec('+copy(s,4,l-3)+')*'+
dh(copy(s,4,l-3))
else
if copy(s,1,5)='cosec' then
b:='(-ctg('+copy(s,6,l-5)+')*cosec('+copy(s,6,l-5)+')*'+
dh(copy(s,6,l-5))+')'
else
if copy(s,1,4)='csch' then
b:='(-2)*cth('+copy(s,5,l-4)+')*csch('+copy(s,5,l-4)+')*'+
dh(copy(s,4,l-3))
else
if copy(s,1,3)='cth' then
b:='(1-cth('+copy(s,4,l-3)+')^2)*'+dh(copy(s,4,l-3))
else
if copy(s,1,3)='ctg' then
b:='(-'+dh(copy(s,4,l-3))+')/sin('+copy(s,4,l-3)+')^2'
else
if copy(s,1,3)='exp' then
b:='exp'+(copy(s,4,l-3))+'*'+dh(copy(s,4,l-3))
else
if copy(s,1,3)='sin' then
b:='cos'+copy(s,4,l-3)+'*'+dh(copy(s,4,l-3))
else
if copy(s,1,3)='cos' then
b:='(-sin'+copy(s,4,l-3)+')*'+dh(copy(s,4,l-3))
else
if copy(s,1,5)='arctg' then
b:=dh(copy(s,6,l-5))+'/(1+'+copy(s,6,l-5)+'^2)'
else
if copy(s,1,6)='arcctg' then
b:='(-'+dh(copy(s,7,l-6))+')/(1+'+copy(s,7,l-6)+'^2)'
else
if copy(s,1,6)='arccos' then
b:='(-'+dh(copy(s,7,l-6))+')/sqrt(1-'+copy(s,7,l-6)+'^2)'
else
if copy(s,1,6)='arcsin' then
b:=dh(copy(s,7,l-6))+'/sqrt(1-'+copy(s,7,l-6)+'^2)'
else
if copy(s,1,4)='sqrt' then
b:=dh(copy(s,5,l-4))+'/(2*sqrt'+copy(s,5,l-4)+')'
else
if copy(s,1,4)='arsh' then
b:=dh(copy(s,5,l-4))+'/sqrt(1+('+copy(s,5,l-4)+')^2)'
else
if copy(s,1,4)='arth' then
b:=dh(copy(s,5,l-4))+'/(1-('+copy(s,5,l-4)+')^2)'
else
if copy(s,1,5)='arcth' then
b:=dh(copy(s,6,l-5))+'/(1-('+copy(s,6,l-5)+')^2)'
else
if copy(s,1,5)='archp' then
b:=dh(copy(s,6,l-5))+'/sqrt(('+copy(s,6,l-5)+')^2-1)'
else
if copy(s,1,5)='archm' then
b:='(-'+dh(copy(s,6,l-5))+')/sqrt(('+copy(s,6,l-5)+')^2-1)'
else
if copy(s,1,2)='pi' then
b:='0'
else
if s[1]='e' then
b:='0'
else
if s[1]='x' then
b:='1'
else
begin
val(copy(s,1,l),d,i);
if i=0 then
b:='0';
end;
dh:=b;
End{dh};
Begin{dg}
a:='';i1:=1;
while i1<=length(s) do
begin
j1:=0;j2:=0;j3:=0;j4:=0;i2:=i1;
while (i2<=length(s)) and not((j1*j1+j2*j2+j3*j3+j4=0)
and (s[i2] in ['*','/',':'])) do
begin
if s[i2]='(' then j1:=j1+1;
if s[i2]=')' then j1:=j1-1;
if s[i2]='[' then j2:=j2+1;
if s[i2]=']' then j2:=j2-1;
if s[i2]='{' then j3:=j3+1;
if s[i2]='}' then j3:=j3-1;
if s[i2]='|' then
begin
i:=i2;
while (s[i]='|') and (i<>0) do i:=i-1;
if (i=0) or
(s[i] in ['*','/',':','+','-','(','[','{','^'])
then
j4:=j4+1
else
j4:=j4-1;
end;
i2:=i2+1;
end;
z1:=0;z2:=0;z3:=0;z4:=0;i3:=i1;
while (i3 and (s[i3]='^')) do
begin
if s[i3]='(' then z1:=z1+1;
if s[i3]=')' then z1:=z1-1;
if s[i3]='[' then z2:=z2+1;
if s[i3]=']' then z2:=z2-1;
if s[i3]='{' then z3:=z3+1;
if s[i3]='}' then z3:=z3-1;
if s[i3]='|' then
begin
i:=i3;
while (s[i]='|') and (i<>0) do i:=i-1;
if (i=0) or
(s[i] in ['*','/',':','+','-','(','[','{','^'])
then
z4:=z4+1
else
z4:=z4-1;
end;
i3:=i3+1;
end;
if i3<>i2 then
begin
r:=copy(s,i1,i3-i1);
w:=copy(s,i3+1,i2-i3-1);
val(w,u,y);
if y=0 then
begin
str(u-1,o);
b:='('+w+')*'+r+'^'+o+'*'+dh(r);
end
else
b:=r+'^'+w+'*('+dh(r)+'*'+w+'/'+r+'+ln'+r+'*'+dh(w)+')'
end
else
b:=dh(copy(s,i1,i2-i1));
if i1=1 then a:=b
else
if s[i1-1]='*' then a:='('+a+'*'+copy(s,i1,i2-i1)+'+'+
copy(s,1,i1-2)+'*'+b+')'
else
if s[i1-1] in ['/',':'] then
a:='('+a+'*'+copy(s,i1,i2-i1)+'-'+
copy(s,1,i1-2)+'*'+b+')/(('+copy(s,i1,i2-i1)+')^2)';
i1:=i2+1;
end;
dg:=a;
End{dg};
Begin{df}
i11:=1; a:='';
while i11<=length(s) do
begin
jj1:=0;jj2:=0;jj3:=0;jj4:=0;i22:=i11;
while (i22<=length(s)) and not((jj1*jj1+jj2*jj2+jj3*jj3+jj4=0)
and (s[i22] in ['+','-']) and not(s[i22-1]='^')) do
begin
if s[i22]='(' then jj1:=jj1+1;
if s[i22]=')' then jj1:=jj1-1;
if s[i22]='[' then jj2:=jj2+1;
if s[i22]=']' then jj2:=jj2-1;
if s[i22]='{' then jj3:=jj3+1;
if s[i22]='}' then jj3:=jj3-1;
if s[i22]='|' then
begin
i:=i22;
while (s[i]='|') and (i<>0) do i:=i-1;
if (i=0) or
(s[i] in ['*','/',':','+','-','(','[','{','^'])
then
jj4:=jj4+1
else
jj4:=jj4-1;
end;
i22:=i22+1;
end;
if (i11=1) and (s[1]='-') then a:='' else
if i11=1 then a:=dg(copy(s,i11,i22-i11)) else
if s[i11-1]='+'
then
a:=a+'+'+dg(copy(s,i11,i22-i11))
else
if s[i11-1]='-'
then
a:=a+'-'+dg(copy(s,i11,i22-i11));
i11:=i22+1;
end;
a:=normal(a);
df:=a;
End{df};
procedure menu(h:integer);
Begin
case h of
1:begin
bar(10,10,90,34);
outtextxy(15,12,' ВВОД ');
outtextxy(15,24,' ФУНКЦИИ ');
end;
2:begin
bar(10,50,90,74);
outtextxy(15,52,' ПРЕОБР. ');
outtextxy(15,64,' ГРАФИКОВ ');
end;
3:begin
bar(10,90,90,114);
outtextxy(15,92, ' ГРАФИК ');
outtextxy(15,104,' ФУНКЦИИ ');
end;
4:begin
bar(10,130,90,154);
outtextxy(15,132,' ГРАФИК ');
outtextxy(15,144,' F''(X) ');
end;
5:begin
bar(10,170,90,194);
outtextxy(15,172,' ГРАФИК ');
outtextxy(15,184,' F''''(X) ');
end;
6:begin
bar(10,210,90,234);
outtextxy(15,212,' ЗНАЧЕНИЕ ');
outtextxy(15,224,' В (.) ');
end;
7:begin
bar(10,250,90,274);
outtextxy(15,252,' МАСШТАБ ');
outtextxy(15,264,' ПО ОX ');
end;
8:begin
bar(10,290,90,314);
outtextxy(15,292,' МАСШТАБ ');
outtextxy(15,304,' ПО ОY ');
end;
9:begin
bar(10,330,90,354);
outtextxy(15,332,' ОЧИСТКА ');
outtextxy(15,344,' ЭКРАНА ');
end;
10:begin
bar(10,370,90,394);
outtextxy(15,372,' ЦВЕТ ');
outtextxy(15,384,' ЭКРАНА ');
end;
11:begin
bar(10,410,90,434);
outtextxy(15,412,' ЦВЕТ ');
outtextxy(15,424, 'ГРАФИКОВ ');
end;
12:begin
bar(10,450,90,474);
settextstyle(0,0,2);
outtextxy(11,455,'ВЫХОД');
settextstyle(0,0,1);
end;
end;
End{menu};
procedure graphh(s:string);
Begin
errorr1:=false;
errorr2:=false;
x1:=f(s,-270/m,errorr1);
for k:=-270 to 270 do
begin
if round(abs(k/13))=abs(k/13) then sound(600+20*round(k/13));
x2:=f(s,(k)/m,errorr2);
if (errorr1=false) and (errorr2=false) then
line(370+k,215-roundd(x1*n),371+k,215-roundd(x2*n))
else
errorr2:=false;
nosound;
x1:=x2;
errorr1:=errorr2;
end;
nosound;
End{graphh};
procedure begining;
Begin
setbkcolor(blue);
setcolor(Black);
setfillstyle(1,cs);
cleardevice;
bar(100,0,639,430);
line(100,215,640,215);
line(370,0,370,430);
line(640,215,630,220);
line(640,215,630,210);
line(370,0,375,10);
line(370,0,365,10);
outtextxy(377,5,'Y');
outtextxy(621,205,'X');
outtextxy(373,218,'O');
rectangle(0,0,639,479);
rectangle(101,0,639,430);
setfillstyle(1,white);
setcolor(blue);
setbkcolor(blue);
for k:=1 to 12 do menu(k);
for k:=-round(270 / m)+1 to round(270 / m)-1 do
begin
setcolor(lightgray);
setlinestyle(dottedln,0,normwidth );
if k<>0 then
line(370+round(k*m),0,370+round(k*m),430);
str(abs(k),v);setlinestyle(solidln,0,normwidth );
setcolor(black);
outtextxy(373+round(k*m),218,v);
if k<0 then
outtextxy(363+round(k*m),218,'-');
line(370+round(k*m),210,370+round(k*m),220);
end;
for k:=-round(215 / n)+1 to round(215 / n)-1 do
begin
setcolor(lightgray);
setlinestyle(dottedln,0,normwidth );
if k<>0 then
line(100,215+round(k*n),640,215+round(k*n));
str(-k,v);setlinestyle(solidln,0,normwidth );
setcolor(black);
outtextxy(373,round(k*n)+218,v);
line(365,215+round(k*n),375,215+round(k*n));
end;
End{begining};
procedure ddo(i:integer);
Begin
Case i of
1:begin
clr;
setfillstyle(1,blue);
bar(1,1,98,477);
outtextxy(20,440,'f(x)=');
readxy(60,440,st);
clr;setcolor(blue);
setfillstyle(1,white);
for k:=1 to 12 do menu(k);
setcolor(white);
dst:=df(st);
ddst:=df(dst);
outtextxy(110,435,'f(x)='+st);
outtextxy(110,450,'f''(x)='+dst);
outtextxy(110,465,'f''''(x)='+ddst);
end{1: };
2:begin
clr;
u:=' ';
outtextxy(110,435,'f(x)='+st);
outtextxy(110,450,'f''(x)='+dst);
outtextxy(110,465,'f''''(x)='+ddst);
bar(2,2,98,478);
setcolor(red);
for k:=1 to 10 do
begin
str(k,v);
outtextxy(10,60+30*(k-1),'F'+v);
end;
setcolor(white);
outtextxy(40,60,'f(x)+a');
outtextxy(40,90,'f(x+a)');
outtextxy(40,120,'f(a*x)');
outtextxy(40,150,'a*f(x)');
outtextxy(40,180,'f(|x|)');
outtextxy(40,210,'|f(x)|');
outtextxy(40,240,'f(1/x)');
outtextxy(40,270,'1/f(x)');
outtextxy(40,300,'f(-x)');
outtextxy(40,330,'-f(x)');
u:=' ';
while u<>#27 do
begin
repeat until keypressed;
u:=readkey;
if u<>#27 then
begin{ if u}
if u=#0 then u:=readkey;
setcolor(white);
case u of
#59:begin
outtextxy(5,370,'a=');
gotoxy(4,24);
readln(v);
bar(1,360,100,380);
if v[1]='-' then st:=st+v
else st:=st+'+'+v;
end;
#60:begin
outtextxy(5,370,'a=');
gotoxy(4,24);
readln(v);
bar(1,360,100,380);
k:=1;
while k<=length(st) do
begin
if st[k]='x' then
begin
insert('(',st,k);
if v[1]='-' then insert(v+')',st,k+2)
else insert('+'+v+')',st,k+2);
k:=k+1;
end;
k:=k+1;
end;
end;
#62:begin
outtextxy(5,370,'a=');
gotoxy(4,24);
readln(v);
bar(1,360,100,380);
st:=v+'*('+st+')';
end;
#61:begin
outtextxy(5,370,'a=');
gotoxy(4,24);
readln(v);
bar(1,360,100,380);
k:=1;
while k<=length(st) do
begin
if st[k]='x' then
begin
insert(')',st,k+1);
insert('('+v+'*',st,k);
k:=k+2+length(v);
end;
k:=k+1;
end;
end;
#63:begin
k:=1;
while k<=length(st) do
begin
if st[k]='x' then
begin
insert('|',st,k);
insert('|',st,k+2);
k:=k+3;
end;
k:=k+1;
end;
end;
#64:begin
st:='|'+st+'|';
end;
#65:begin
k:=1;
while k<=length(st) do
begin
if st[k]='x' then
begin
insert('(1/',st,k);
insert(')',st,k+4);
k:=k+3;
end;
k:=k+1;
end;
end;
#66:begin
st:='1/('+st+')';
end;
#67:begin
k:=1;
while k<=length(st) do
begin
if st[k]='x' then
begin
insert('(-',st,k);
insert(')',st,k+3);
k:=k+2;
end;
k:=k+1;
end;
end;
#68:begin
st:='-('+st+')';
end;
end{case u};
uuu:=' ';clr;
for k:=1 to 15 do
begin
setfillstyle(1,k);
bar(110+k*30,460,130+k*30,470);
end;
ii:=1; uu:=' ';
setcolor(white);outtextxy(145,440,'?');
while uu<>#13 do
begin
jj:=ii;
repeat until keypressed;uu:=readkey;
if uu=#0 then uu:=readkey;
case uu of
#77: if ii<>15 then ii:=ii+1 else ii:=1;
#75: if ii<>1 then ii:=ii-1 else ii:=15;
end;
setcolor(blue);
outtextxy(115+jj*30,440,'?');
setcolor(white);
outtextxy(115+ii*30,440,'?');
end{ while uu};
clr; outtextxy(110,435,'f(x)='+st);
setcolor(ii); graphh(st);
end {if u};
end {while u};
begining;
end{2: };
3:begin
setcolor(cf);
graphh(st);
end {3:};
4:begin
setcolor(cd);
graphh(dst);
end {4:};
5:begin
setcolor(dd);
graphh(ddst);
end{5:};
6:begin
gotoxy(30,1);
setcolor(red);
outtextxy(104,4, 'ВВЕДИТЕ ТОЧКУ :');
READ(x);
begining; str(x:10:4,v);
outtextxy(104,4,'ЗНАЧЕНИЕ В ТОЧКЕ X='+v);
STR(f(st,x,errorr1):10:4,v);
if errorr1=false then
outtextxy(104,24,'РОВНО '+v)
else outtextxy(104,24,'НЕ ОПРЕДЕЛЕНО');
end {6:};
7:begin
gotoxy(32,1);
outtextxy(104,4,'МАСШТАБ ПО ОСИ X=');
textcolor(white);
readln(m);
begining;
outtextxy(110,435,'f(x)='+st);
outtextxy(110,450,'f''(x)='+dst);
outtextxy(110,465,'f''''(x)='+ddst);
end {7:};
8:begin
gotoxy(32,1);
outtextxy(104,4,'МАСШТАБ ПО ОСИ Y=');
textcolor(white);
readln(n);
begining;
outtextxy(110,435,'f(x)='+st);
outtextxy(110,450,'f''(x)='+dst);
outtextxy(110,465,'f''''(x)='+ddst);
end {8:};
9:begin
begining;
outtextxy(110,435,'f(x)='+st);
outtextxy(110,450,'f''(x)='+dst);
outtextxy(110,465,'f''''(x)='+ddst);
end {9:};
10:begin
uuu:=' '; clr;
while uuu<>'y' do
begin
for k:=1 to 15 do
begin
setfillstyle(1,k);
bar(110+k*30,460,130+k*30,470);
end;
ii:=1;uu:=' ';
setcolor(white);outtextxy(145,440,'?');
while uu<>#13 do
begin
jj:=ii;
repeat until keypressed;uu:=readkey;
case uu of
#77:
if ii<>15 then ii:=ii+1
else ii:=1;
#75:
if ii<>1 then ii:=ii-1
else ii:=15;
end;
setcolor(blue);
outtextxy(115+jj*30,440,'?');
setcolor(white);
outtextxy(115+ii*30,440,'?');
end;
cs:=ii;
begining;
setcolor(white);
outtextxy(110,440,'НРАВИТСЯ ?(Y/N)');
repeat until keypressed; uuu:=readkey;
setfillstyle(1,blue);
bar(110,440,639,468);
end;
clr;
setcolor(white);
outtextxy(110,435,'f(x)='+st);
outtextxy(110,450,'f''(x)='+dst);
outtextxy(110,465,'f''''(x)='+ddst);
end {10: };
11:begin
clr; uuu:=' '; uu:=' ';
while uuu<>'y' do
begin
setcolor(white);
outtextxy(110,460,
' ЦВЕТ ГРАФИКОВ ФУНКЦИИ, ПЕРВОЙ ИЛИ ВТОРОЙ ПРОИЗВОДНОЙ ?(F/D/S)');
repeat until keypressed;uu:=readkey;
setfillstyle(1,blue);
bar(110,440,639,468);
for k:=1 to 15 do
begin
setfillstyle(1,k);
bar(110+k*30,460,130+k*30,470);
end {for k} ;
ii:=1;uu:=' ';
setcolor(white);outtextxy(145,440,'?');
while uu<>#13 do
begin
jj:=ii;
repeat until keypressed;uu:=readkey;
case uu of
#77:if ii<>15 then ii:=ii+1
else ii:=1;
#75:if ii<>1 then ii:=ii-1
else ii:=15;
end {case uu};
setcolor(blue);
outtextxy(115+jj*30,440,'?');
setcolor(white);
outtextxy(115+ii*30,440,'?');
end {while uu};
case uu of
'f':cf:=ii;
'd':cd:=ii;
's':dd:=ii;
end {case uu};
setcolor(white);
outtextxy(110,440,'НРАВИТСЯ ?(Y/N)');
setcolor(ii);
for ii:=10 to 64 do
line(10*ii+5,215-round(100*sin(1-ii/5)),
10*ii+10+5,215-round(100*sin(1-(ii+1)/5)));
repeat until keypressed; uuu:=readkey;
setfillstyle(1,blue);
bar(110,440,639,468);
end {while uuu};
clr; setcolor(white);
outtextxy(110,435,'f(x)='+st);
outtextxy(110,450,'f''(x)='+dst);
outtextxy(110,465,'f''''(x)='+ddst);
end {11:};
12:halt(1);
end {Case i};
End {ddo};
BEGIN {Раздел операторов}
errorr1:=false; errorr2:=false; u:='p';
Gdriver:=detect; {инициализация графического режима}
{!! в процедуре initgraph между апострофами путь к файлу
еgavga.bgi
измените на тот, который на вышем компьютере;
по умолчанию (между апострофами путь отсутствует) этот файл
находится в том же каталоге, что и программа}
initgraph(Gdriver,Gregim,'d:\tp\bgi');
{initgraph(Gdriver,Gregim,' ');}
setcolor(white);
for i:=0 to 12 do
begin
{ музыка }
{sound(300+30*i); delay(100);}
setfillstyle(1,i+2);
bar(round(640*i/13),0,round(640*(i+1)/13),480);
nosound;
end;
rectangle(1,1,639,479); setbkcolor(11);
setfillstyle(5,white); settextstyle(0,0,3);
bar(135,130,500,340); setcolor(red);
outtextxy(140,140,' ПОСТРОИТЕЛЬ ');
outtextxy(140,170,' ГРАФИКОВ ');
outtextxy(140,200,' ФУНКЦИЙ ');
outtextxy(140,230,' НА ОСНОВЕ ');
outtextxy(140,260,'СИНТАКСИЧЕСКОГО');
outtextxy(140,290,' АНАЛИЗАТОРА ');
Settextstyle(0,0,1);
setcolor(white);
repeat until keypressed;
U:=READKEY;
cf:=black; cd:=green; dd:=brown; cs:=white;
m:=75; n:=130;
begining;
{Образец функции - синус от экспоненты x}
st:='sin(exp(x))';
{st:='|x|^x';}{Друглй пример - модуль x в степени x}
dst:=df(st);
ddst:=df(dst);
outtextxy(110,435,'f(x)='+st);
outtextxy(110,450,'f''(x)='+dst);
outtextxy(110,465,'f''''(x)='+ddst);
setcolor(cf);
graphh(st);
setcolor(blue);
setfillstyle(1,blue);
bar(150,230,580,400);
setfillstyle(1,white);
bar(155,235,575,395);
setcolor(0);
outtextxy(165,240, 'С ПОМОЩЬЮ ЭТОГО ПОСТРОИТЕЛЯ ГРАФИКОВ ВЫ СМОЖЕТЕ ');
outtextxy(165,255, 'ВВЕСТИ В СИМВОЛЬНОМ ВИДЕ ФУНКЦИЮ, УВИДЕТЬ ЕЁ ГРАФИК, ');
outtextxy(170,270, 'ГРАФИКИ ПЕРВОЙ И ВТОРОЙ ПРОИЗВОДНЫХ, ПРОИЗВОДИТЬ');
outtextxy(170,285, 'ПРЕОБРАЗОВАНИЯ ФУНКЦИЙ, УВИДЕТЬ И ПОНЯТЬ, КАК ОНИ');
outtextxy(170,300, 'ОТРАЖАЮТСЯ НА ГРАФИКЕ, БУДЕТЕ ВИДЕТЬ ИЗМЕНЕНИЯ В ');
outtextxy(170,315, ' ФУНКЦИОНАЛЬНОЙ СТРОКЕ, СМОЖЕТЕ ОЧИСТИТЬ ЭКРАН');
outtextxy(170,330,' ДЛЯ ВВОДА НОВОЙ ФУНКЦИИ И И ЕЁ ПРЕОБРАЗОВАНИЙ, ');
outtextxy(170,345,' ВЫБРАТЬ НУЖНЫЙ МАСШТАБ ПО КАЖДОЙ ОСИ, ');
outtextxy(170,360,' МЕНЯТЬ ЦВЕТ ГРАФИКОВ И ЭКРАНА... ');
outtextxy(170,375,' РАБОТАЙТЕ, УЧИТЕСЬ, НАСЛАЖДАЙТЕСЬ! ');
repeat until keypressed;
U:=READKEY;
begining;
setcolor(white);
outtextxy(110,435,'f(x)='+st);
outtextxy(110,450,'f''(x)='+dst);
outtextxy(110,465,'f''''(x)='+ddst);
setcolor(white);
setfillstyle(1,red);
menu(1);mn:=1;
while uuuu<>#27 do
begin
nm:=mn;
repeat until keypressed;
uuuu:=readkey;
case uuuu of
#0:begin
uuuu:=readkey;
case uuuu of
#72:
if mn<>1 then
mn:=mn-1
else mn:=12;
#80:
if mn<>12 then
mn:=mn+1
else mn:=1;
end;
end;
#13: begin
setfillstyle(1,blue);
setcolor(white);
menu(mn);
ddo(mn);
setfillstyle(1,white);
setcolor(blue);
menu(mn);
end;
end;
setcolor(blue); setfillstyle(1,white);
menu(nm); setfillstyle(1,red);
setcolor(white); menu(mn);
end;
closegraph;
END.