Re: Pascal - Функциональная логическая схема
Добавлено: 24 май 2008, 20:46
добрый день. спасибо за то что помогли разобраться.
прошло достаточно времени задание немного изменилось (упростилось)
можно чтобы програма работала только с 3мя переменными и небыло скобок.
вот собственно что у меня получилось:
осталось добавить знаки действия в квадратики, только проблема в том что она не работает с формулами A&B&C и AvBvC
не подскажите как исправить?
прошло достаточно времени задание немного изменилось (упростилось)
можно чтобы програма работала только с 3мя переменными и небыло скобок.
вот собственно что у меня получилось:
Код: Выделить всё
Program shem;
Uses Graph, Crt;
var gd,gm:integer; s,s1,s2,cr,inf,inf0:string;
f,n1,n2,n3,fn:string;
j,i:integer;
dx1,dx2,dy1,dy2,ly1,ly2,ly3,kx1,kx2,ky1,ky2,ey,k:integer;
procedure inv(k,ly1,ly2,ly3:integer);
begin
if k=1 then begin
rectangle (60,ly1,160,ly1+60);
line (160,ly1+30,220,ly1+30);
line (60,ly2,220,ly2);
line (60,ly3,220,ly3);
end else if k=2 then begin
rectangle (60,ly1,160,ly1+60);
line (160,ly1+30,220,ly1+30);
rectangle (60,ly2-30,160,ly2+30);
line (160,ly2,220,ly2);
line (60,ly3,220,ly3);
end else if k=3 then begin
rectangle (60,ly1,160,ly1+60);
line (160,ly1+30,220,ly1+30);
rectangle (60,ly2-30,160,ly2+30);
line (160,ly2,220,ly2);
rectangle (60,ly3-30,160,ly3+30);
line (160,ly3,220,ly3);
end; end;
procedure disj(dx1,dy1,dx2,dy2:integer);
begin
rectangle (dx1,dy1,dx1+100,dy1+200);
line (dx1+100,dy1+100,dx1+160,dy1+100);
line (dx2,dy2,dx2+160,dy2);
end;
procedure konj(dx1,dy1,dx2,dy2:integer);
begin
rectangle (kx1,ky1,kx1+100,ky1+200);
line (kx1+100,ky1+100,kx1+160,ky1+100);
line (kx2,ky2,kx2+160,dy2);
end;
procedure line1(n1,n2,n3:string);
begin
settextstyle(3,0,2);
line (0,140,60,140);
OutTextXY (5,110,n1);
line (0,260,60,260);
OutTextXY (5,230,n2);
line (0,380,60,380);
OutTextXY (5,350,n3);
end;
procedure endline(k,y:integer;f:string);
begin
settextstyle(3,0,1);
if (k>0) then
line (540,y,640,y)
else
line (380,y,640,y);
OutTextXY (545,y-30,f);
end;
begin
{VVOD FORMULU}
write (' ');
writeln ('| & - KONUNKCIYA ; v - DIZUNKCIYA ; ! - INVERSIYA |');
write (' ');
writeln ('| PRIMER: A&BvC |');
write (' ');
writeln ('|_________________________________________________|');
writeln; writeln ('Vvedite formulu:'); readln (f);
{end VVOD}
{Peremennue}
j:=1; for i:=1 to length(f)
do begin
if (f[i]<>'!')and(f[i]<>'V')and(f[i]<>'&')and(f[i]<>'v')
then begin
fn[j]:=f[i]; j:=j+1;
end;end;
n1:=fn[1]; n2:=fn[2]; n3:=fn[3];
{end peremennue}
{inversiya}
for i:=1 to length(f)
do begin
if (f[i]='!') then begin k:=k+1;
if (f[i+1]=n1) then begin
ly1:=110; ly2:=260; ly3:=380; end
else if (f[i+1]=n2) then begin
ly1:=230; ly2:=140; ly3:=380; end
else if (f[i+1]=n3) then begin
ly1:=350; ly2:=260; ly3:=140; end;
end;end;
{end inversiya}
{konjunkciya}
for i:=1 to length(f)
do begin
if (f[i]='&') then begin
if (f[i+1]=n2)or(f[i+2]=n2) then begin
ky1:=100; ky2:=380; end
else if (f[i+1]=n3)or(f[i+2]=n3) then begin
ky1:=220; ky2:=140 end;
if (k>0) then begin kx1:=220; kx2:=220; end
else begin kx1:=60; kx2:=60; end;
end;end;
{end konjunkciya}
{disjunkciya}
for i:=1 to length(f)
do begin
if (f[i]='v')or(F[i]='V') then begin
if (f[i+1]=n2)or(f[i+2]=n2) then begin
dy1:=130; dy2:=380; ey:=230; end
else if (f[i+1]=n3)or(f[i+2]=n3) then begin
dy1:=190; dy2:=140; ey:=290; end;
if (k>0) then begin dx1:=380; dx2:=-200; end
else begin dx1:=220; dx2:=-200; end;
end;end;
{GLAVNAYYA CHAST ANALIZATORA}
gd:=9; gm:=2;
InitGraph (gd,gm, 'C:\Apps\tp\bgi');
If GraphResult = 0 then begin
{interface}
cr:='Hunter'; inf0:='Uslovnie oboznacheniya:';
inf:='& - KONUNKCIYA ; V - DIZUNKCIYA ; ! - INVERSIYA';
settextstyle(2,0,0); setcolor (7); OutTextXY (518,470,cr);
setfillstyle(1,8); Bar (120,10,520,50);
settextstyle(0,0,0); setcolor (15);
OutTextXY (135,35,inf); OutTextXY (230,16,inf0);
{end of interface}
line1 (n1,n2,n3);
if k>0 then
inv (k,ly1,ly2,ly3);
disj (dx1,dy1,dx2,dy2);
konj (kx1,ky1,kx2,ky2);
endline (k,ey,f);
readkey;
closeGraph;
end else begin
writeln ('Oshibka pri inicializacii grafiki'); readln;
end; end.
не подскажите как исправить?