unit droby;
interface
type
natur = 1..high(longint);
frac = record
p : longint; {числитель дроби}
q : natur {знаменатель дроби}
end;
procedure sokr(var a: frac);
procedure summa(a, b: frac; var c: frac);
procedure raznost(a, b: frac; var c: frac);
procedure proizvedenue(a, b: frac; var c: frac);
procedure chastnoe(a, b: frac; var c: frac);
procedure stepen(a: frac; n : natur; var c: frac);
{раздел реализации модуля}
implementation
{нахождение наибольшего общего делителя (нод) двух чисел - вспомогательная функция}
function nodevklid(a, b: natur): natur;
begin
while (a <> b) do
if (a > b) then
if (a mod b <> 0)
then
a := (a mod b)
else
a := b
else
if (b mod a <> 0)
then
b := (b mod a)
else
b := a;
nodevklid := a
end;
procedure sokr; {сокращение дроби}
var m, n : natur;
begin
if (a.p <> 0)
then begin
if (a.p < 0)
then
m := abs(a.p)
else
m := a.p; {совмещение типов, т.к. a.p - longint}
n := nodevklid(m, a.q);
a.p := a.p div n;
a.q := a.q div n
end
end;
procedure summa; {сумма дробей}
begin
c.q := (a.q * b.q) div nod(a.q, b.q);
c.p := a.p * c.q div a.q + b.p * c.q div b.q;
sokr(c)
end;
procedure raznost; {разность дробей}
begin
c.q := (a.q * b.q) div nod(a.q, b.q);
c.p := a.p * c.q div a.q - b.p * c.q div b.q;
sokr(c)
end;
procedure proizvedenue; {умножение дробей}
begin
c.q := a.q * b.q;
c.p := a.p * b.p;
sokr(c)
end;
procedure chastnoe; {деление дробей}
begin
c.q := a.q * b.p;
c.p := a.p * b.q;
sokr(c)
end;
procedure stepen; {возведение в степень}
var i : natur;
begin
c.q := 1;
c.p := 1;
sokr(a);
for i := 1 to n do
proizvedenue(a, c, c)
end;
{раздел инициализации модуля}
begin
end.
program drob;
{$APPTYPE CONSOLE}
uses
SysUtils,
droby in 'Projects\droby.pas';
function drobtostr(a:frac):string;
var s,s1:string;
begin
str(a.p,s);
s:=s+'/';
str(a.q,s1);
drobtostr:=s+s1;
end;
procedure printdrob(a:frac);
begin
write(drobtostr(a));
end;
function alltrim (s:string):string; {?????? ???????}
var p:integer;
begin
repeat
p:=pos(' ',s);
if p>0 then delete (s,p,1);
until p=0;
alltrim:=s;
end;
function parentheses(s:string):string;
var k,bracketcount,open,close:integer;
begin
k:=pos('(',s);
bracketcount:=0;
if k=0 then begin parentheses:='' ;exit end
else
begin
open:=k;
while k<=Length(s) do
begin
if s[k]='(' then inc(bracketcount);//otryvayuwaya
if s[k]=')' then begin dec(bracketcount); close:=k; end; //zakryvayuwaya
inc(k);
end;
if bracketcount<>0 then begin write('wrong expression');parentheses:='';exit end;
parentheses:=copy(s,open+1,close-open-1);
end;
end;
function eval(s:string):frac;
var simple:boolean;
k,c:integer;
p:longint;
q : natur;
r1, r2,r3:frac;
sub,sub1:string;
begin
k:=pos('(',s);
sub:=parentheses(s);
if sub<>'' then
begin
r1:=eval(sub);
sub1:=drobtostr(r1);
Delete(s,k,Length(sub)+2);
Insert(sub1,s,k);
eval:=eval(s);
exit;
end;
k:=pos('+',s)+pos('-',s)+pos('*',s);
if k=0 then
begin
simple:=true;
end;
if simple then
begin
k:=pos('/',s);
if k=0 then
begin
writeln('wrong expression');
eval.p:=0;
eval.q:=1;
end
else
begin
Val(copy(s,1,k-1),p,c);
eval.p:=p;
Val(copy(s,k+1,Length(s)-k),q,c);
if (q>0) then
eval.q:=q
else
writeln('wrong expression');
end
end
else
begin
k:=pos('+',s);
if (k>1) then
begin
r1:=eval(copy(s,1,k-1));
r2:=eval(copy(s,k+1,Length(s)-k));
summa(r1,r2,r3);
eval:=r3;
exit;
end;
k:=pos('-',s);
if (k>1) then
begin
r1:=eval(copy(s,1,k-1));
r2:=eval(copy(s,k+1,Length(s)-k));
raznost(r1,r2,r3);
eval:=r3;
exit;
end;
k:=pos('*',s);
if (k>1) then
begin
r1:=eval(copy(s,1,k-1));
r2:=eval(copy(s,k+1,Length(s)-k));
proizvedenue(r1,r2,r3);
eval:=r3;
exit;
end;
k:=pos('/',s);
if (k>1) then
begin
r1:=eval(copy(s,1,k-1));
r2:=eval(copy(s,k+1,Length(s)-k));
chastnoe(r1,r2,r3);
eval:=r3;
exit;
end;
end;
end;
var r:frac;
v1:string;
begin
write('vvedite vyrazhenie');
readln (v1);
v1:=alltrim(v1);
r:=eval(v1);
printdrob(r);
readln;
end.
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.