Пятница, 24.01.2025
Pascal 4 All
[ · Новые сообщения · Участники · Правила форума · Поиск · RSS ]

 

  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: Seqular, Pavel  

Функциональная логическая схема
SeqularДата: Суббота, 03.05.2008, 08:52 | Сообщение # 16
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
Hunter, Alexander довольно подробно расписал, что нужно сделать smile Подобных решений я пока не встречал. Насчет того ГДЕ рисовать. Представим, что ширина кирпичика - 40px. Тогда первые элементы строятся до i * 40 пиксела. Дальше продолжаются линии. Вторые элементы до i * 40 (где i уже равно 2-м).

Поддерживаю также проект сообщество молодых сисадминов
 
PavelДата: Суббота, 03.05.2008, 09:45 | Сообщение # 17
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Ну. типа разметить область. Я бы вообще рисовал сначала блоки, а потом рисовал соединительные линии. Насчет того, что написал Alexander по-поводу перестановки: Если следовать порядку действий (приоритет операций) то ничего не меняется! A and B or C = C or A and B!!! А законы Де моргана тут как-то не вяжутся. Алгебру-логику и т.д. я знаю не плохо. У нас была "Прокопенко". Дмитрий знает кто это.
Я могу попробывать накатать рисовальные функции. А вот с распознаванием формул придется помучиться самому.
 
PavelДата: Суббота, 03.05.2008, 10:57 | Сообщение # 18
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Code
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.

Вот такой вот кусочек программы. Думаю, надо идти в этом направлении. Тут надо еще дописать код, который будет рисовать линии. И самое главное в этой задаче - это придумать механизм распознавания и занесения в очередь операций. Я не знаю как это сделать. Сказать легко, но трудно сделать. Еще подумаю. А сейчас такой вот "сорец".

 
PavelДата: Суббота, 03.05.2008, 11:02 | Сообщение # 19
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Она работает, если операции указаны в правильном порядке. Т.е. сначала ^ а потом V
 
AlexanderДата: Суббота, 03.05.2008, 23:02 | Сообщение # 20
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Quote
A and B or C = C or A and B!!!

Я ведь на примере показал что это не так!
1 and 3 or 5 = 5
1 or 3 and 5 = 1
Quote
Она работает, если операции указаны в правильном порядке. Т.е. сначала ^ а потом V

И как вы хотите заставить паскаль выполнять операции именно в этом порядке?


Скажем дружно- нафиг нужно!

Сообщение отредактировал Alexander - Воскресенье, 04.05.2008, 01:40
 
PavelДата: Воскресенье, 04.05.2008, 11:28 | Сообщение # 21
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Quote (Alexander)
1 and 3 or 5 = 5
1 or 3 and 5 = 1

ты тут переставляешь AND и OR! А не члены операции
А заставить я паскаль не смогу, это надо самому писать. Вот поэтому и написал, что не работает, так как не дописана программа. Прочитай предыдущие посты.
 
HunterДата: Воскресенье, 04.05.2008, 17:41 | Сообщение # 22
Новичок
Группа: Пользователи
Сообщений: 8
Репутация: 0
Замечания: 0%
Статус: Offline
помоему переставлять можно только по определеным правилам и формулам. а зачем собственно это нужно?
 
PavelДата: Воскресенье, 04.05.2008, 17:54 | Сообщение # 23
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Quote (Hunter)
помоему переставлять можно только по определеным правилам и формулам. а зачем собственно это нужно?
Вот и я про тоже. Нужно, чтобы преобразовывать выражение из сложного в простое.
 
HunterДата: Воскресенье, 25.05.2008, 03:43 | Сообщение # 24
Новичок
Группа: Пользователи
Сообщений: 8
Репутация: 0
Замечания: 0%
Статус: Offline
добрый день. спасибо за то что помогли разобраться.
прошло достаточно времени задание немного изменилось (упростилось)
можно чтобы програма работала только с 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;

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.


осталось добавить знаки действия в квадратики, только проблема в том что она не работает с формулами A&B&C и AvBvC
не подскажите как исправить?
 
AlexanderДата: Среда, 28.05.2008, 23:28 | Сообщение # 25
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Рисуешь три прямоугольника и рисуешь в них символы операций! Если A&B&C, то в обоих "&", аналогично со всеми вариантами.

Скажем дружно- нафиг нужно!
 
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Copyright MyCorp © 2025
Используются технологии uCoz
javascript:;" rel="nofollow" onclick="loginPopupForm(); return false;