формула::=цифра : (формула знак формула)
Цифра::=0123456789
Знак::=+ - *
Строка вводится с клавиатуры. Я написала программу, но она ничего не считает. В чем проблема? Конечно, может я написала все не правильно, потому что у меня сейчас температура под 39 и я ничего не соображаю, но все-таки надеюсь на вас. Заранее благодарю.
Код
program formula;
const
chislo='1234567890';
type
str=string[255];
function znak(E:str):boolean;
begin
znak:=(E='+') or (E='-') or (E='*');
end;
function chis(s:str):boolean;
begin
chis:=(pos(s,chislo)<>0);
end;
procedure devide(s:str;var s1,s2,s3:str;var c:boolean);
var
i,k:integer;
begin
c:=true;
if (length(s)<>1) then
begin
if (copy(s,1,1)<>'(') and (copy(s,1,1)<>')') then
c:=false
else
begin
s1:='';
k:=0;
i:=2;
repeat
s1:=s1+copy(s,i,1);
if (copy(s,i,1)='(') then
k:=k+1;
if (copy(s,i,1)=')') then
k:=k-1;
i:=i+1;
until
(k=0) or (i=length(s));
s2:=copy(s,i,1);
if (s2<>'+') or (s2<>'-') or(s2<>'*') then
c:=false
else
begin
s3:='';
i:=i+1;
k:=0;
repeat
s3:=s3+copy(s,i,1);
if (copy(s,i,1)='(') then
k:=k+1;
if (copy(s,i,1)=')') then
k:=k-1;
i:=i+1;
until
(k=0) or (i=length(s));
end;
end;
end;
end;
function phormula(s:str):boolean;
var
s2,s3,s1:str;
c:boolean;
begin
if (length(s)=1) and chis(s) then
phormula:=c
else
begin
devide(s,s1,s2,s3,c);
if (copy(s,1,1)='(') and phormula(s2) and (c) and phormula(s3) and (c) and (copy(s,length(s),1)=')') then
phormula:=true
else
phormula:=false;
end;
end;
function rasschet (s:str):integer;
var
c:boolean;
s1,s2,s3:str;
code,x:integer;
ch:char;
begin
devide(s,s1,s2,s3,c);
if (length(s)=1) then
begin
val(s,x,code);
rasschet:=x;
end
else
begin
ch:=s2[1];
case ch of
'+': rasschet:=rasschet(s1) + rasschet(s3);
'-': rasschet:=rasschet(s1) - rasschet(s3);
'*': rasschet:=rasschet(s1) * rasschet(s3);
end;
end;
end;
var
s:str;
begin
writeln('Vvedite stroku');
readln(s);
if phormula (s) then
begin
writeln('Dannaya stroka yavlyaetsa formuloy');
writeln('Eye znacheniye ravno= ',rasschet(s));
end
else
writeln('Dannaya stroka ne yavlyayetsya formuloy');
readln;
end.