Hunter, Alexander довольно подробно расписал, что нужно сделать Подобных решений я пока не встречал. Насчет того ГДЕ рисовать. Представим, что ширина кирпичика - 40px. Тогда первые элементы строятся до i * 40 пиксела. Дальше продолжаются линии. Вторые элементы до i * 40 (где i уже равно 2-м). Поддерживаю также проект сообщество молодых сисадминов
Ну. типа разметить область. Я бы вообще рисовал сначала блоки, а потом рисовал соединительные линии. Насчет того, что написал Alexander по-поводу перестановки: Если следовать порядку действий (приоритет операций) то ничего не меняется! A and B or C = C or A and B!!! А законы Де моргана тут как-то не вяжутся. Алгебру-логику и т.д. я знаю не плохо. У нас была "Прокопенко". Дмитрий знает кто это. Я могу попробывать накатать рисовальные функции. А вот с распознаванием формул придется помучиться самому.
program Hunteru; uses crt, graph; var gm, gd: integer; s: string; i, j, k, code: integer;
procedure Konj(posx, posy: integer); var x, y: integer; begin y := posy * 50 + 12; x := posx * 100 + 50; line(x, y + 13, x - 25, y + 13); line(x, y + 63, x - 25, y + 63); line(x + 50, y + 38, x + 75, y + 38); rectangle(x, y, x + 50, y + 75); outTextXY(x + 10, y + 10, 'AND'); end;
procedure Dizj(posx, posy: integer); var x, y: integer; begin y := posy * 50 + 12; x := posx * 100 + 50; line(x, y + 13, x - 25, y + 13); line(x, y + 63, x - 25, y + 63); line(x + 50, y + 38, x + 75, y + 38); rectangle(x, y, x + 50, y + 75); outTextXY(x + 10, y + 10, 'OR'); end;
begin initgraph(gd, gm, 'c:\tp\bgi');
{s := 'C*B+A';} for i := 1 to length(s) do begin if s[i] = 'A' then s[i] := '0'; {posiciya po oY} if s[i] = 'B' then s[i] := '1'; if s[i] = 'C' then s[i] := '2'; end;
j := 0; for i := 1 to length(S) do begin
if s[i] = '*' then begin val(s[i - 1], k , code); Konj(j, k); inc(j); end;
if s[i] = '+' then begin val(s[i - 1], k, code); Dizj(j, k); inc(j); end; end;
readkey; closegraph; end.
Вот такой вот кусочек программы. Думаю, надо идти в этом направлении. Тут надо еще дописать код, который будет рисовать линии. И самое главное в этой задаче - это придумать механизм распознавания и занесения в очередь операций. Я не знаю как это сделать. Сказать легко, но трудно сделать. Еще подумаю. А сейчас такой вот "сорец".
ты тут переставляешь AND и OR! А не члены операции А заставить я паскаль не смогу, это надо самому писать. Вот поэтому и написал, что не работает, так как не дописана программа. Прочитай предыдущие посты.
добрый день. спасибо за то что помогли разобраться. прошло достаточно времени задание немного изменилось (упростилось) можно чтобы програма работала только с 3мя переменными и небыло скобок.
вот собственно что у меня получилось:
Code
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;
{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);