Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2009, 04:50   #1
Foky
Пользователь
 
Регистрация: 14.03.2008
Сообщений: 32
По умолчанию Программа на булевы функции

Пытаюсь доделать задачу на булевы функции, но никак не дойду до конца. Перепроверяла много раз, но ошибки не нахожу в коде. Функция задана 4 переменными(x,y,z,t) и имеет значения f=(1011 0011 1000 0111).Программа считает значения 3 методами и должна выдавать одинаковый результат. Все предшествующие действия посчитаны мной вручную, я лишь задаю условия, чтобы получился правильный результат. Функция f_karno и Jegalkin выдают одинаковый результат, но вместо 0 и 1 почему-то двойки, пятерки и т.д. Функции Jegalkin я присваиваю противоположное значение, т.к., произведя все вычисления мне нужно добавить 1, если написать Jegalkin:=r выдаст правильный результат, но наоборот 0100 1100 0111 1000. Function BdR считает правильно, за исключением последних 4 значений, на месте которых выдает тройки и двойки. Помогите додедать, пожалуйста, кто может. Вот код:
Код:
Program mat_5_1;
  uses Crt;

Type
 matr=array[1..5,0..15] of byte; {1..m+1,0..n}

const n=15; {m^2 -1}
      m=4;{кол-во пер-ых}

var i: byte;
    a: matr;
{============================================================================}
{число из десятичной формы представляет в двоичной.Нужно для таблицы значений}
procedure razlojenie(var x: matr; osnova: byte);
var k,i: byte;
begin
  k:=osnova;
  for i:=1 to m do begin
   x[4-i+1,osnova]:=k mod 2;
   k:=k div 2;
  end;
end;
{============================================================================}
function f_karno(x,y,z,t: byte): byte;
var r: byte;
begin
  r:= not(x) and z or y and z;
  r:= r or not(y) and  not(z) and not(t);
  r:= r or x and y and t;
  f_karno:=r;
end;
{============================================================================}
function Jegalkin(x,y,z,t: byte): byte;
var r: byte;
begin
  r:=t xor y;
  r:= r xor ((y and z) and t);
  r:=r xor (y and t);
  r:=r xor(z and t);
  r:=r xor((x and y) and (z and t));
  r:=r xor((x and y) and t);
  r:=r xor(y and z);
  r:=r xor((x and y) and z);
  r:=r xor(x and z);
  Jegalkin:=not(r);
end;
{============================================================================}
function BDR(x,y,z,t: byte): byte;
var f: byte;
begin
if x=0 then if y=1 then if z=1 then f:=1
                        else f:=0
            else if z=1 then f:=1
                 else if t=0 then f:=1
                      else f:=0
else if y=0 then if z=1 then f:=0
                 else if t=1 then f:=0
                      else if t=0 then f:=1
else if z=1 then f:=1
     else f:=t;
  BDR:=f;
end;
{============================================================================}
procedure Vivod(a: matr);
var i: byte;
begin
  write('(');
  for i:=0 to n do begin
   write(a[5,i]);
   if (i+1) mod m=0 then
      if i=n then writeln(');')
      else write(' ');
  end;
end;
{============================================================================}
begin
  ClrScr;
  for i:=0 to n do razlojenie(a,i);
  WriteLn('Карно:');
  for i:=0 to n do a[5,i]:= f_karno(a[1,i],a[2,i],a[3,i],a[4,i]);
  Vivod(a);
  WriteLn('Жегалкин: ');
  for i:=0 to n do a[5,i]:= Jegalkin(a[1,i],a[2,i],a[3,i],a[4,i]);
  Vivod(a);
  WriteLn('БДР: ');
  for i:=0 to n do a[5,i]:= BDR(a[1,i],a[2,i],a[3,i],a[4,i]);
  Vivod(a);
  Readln;
end.

Последний раз редактировалось Foky; 23.02.2009 в 05:01.
Foky вне форума Ответить с цитированием
Старый 26.02.2009, 08:20   #2
roach1967
Пользователь
 
Регистрация: 21.02.2009
Сообщений: 28
По умолчанию

Ошибка в том, что логические операции с числами работают над каждым битом в отдельности. Для примера: если a:= 1, то not a выдаст 255. Вот исправленная программа:
Код:
Program mat_5_1;
  uses Crt;

const n=15; {m^2 -1}
	  m=4;{кол-во пер-ых}

Type
 matr=array[1..m + 1,0..n] of boolean; {1..m+1,0..n}

var i: byte;
	a: matr;

{============================================================================}
{число из десятичной формы представляет в двоичной.Нужно для таблицы значений}
procedure razlojenie(var x: matr; osnova: byte);
var k,i: byte;
begin
  k:=osnova;
  for i:= 1 to m do begin
   x[4 - i + 1, osnova]:= (k mod 2) = 1;
   k:= k div 2;
  end;
end;
{============================================================================}
function f_karno(x, y, z, t: boolean): boolean;
var r: boolean;
begin
  r:= not(x) and z or y and z;
  r:= r or not(y) and  not(z) and not(t);
  r:= r or x and y and t;
  f_karno:= r;
end;
{============================================================================}
function Jegalkin(x, y, z, t: boolean): boolean;
var r: boolean;
begin
  r:=t xor y;
  r:= r xor ((y and z) and t);
  r:=r xor (y and t);
  r:=r xor(z and t);
  r:=r xor((x and y) and (z and t));
  r:=r xor((x and y) and t);
  r:=r xor(y and z);
  r:=r xor((x and y) and z);
  r:=r xor(x and z);
  Jegalkin:=not(r);
end;
{============================================================================}
function BDR(x, y, z, t: boolean): boolean;
var f: boolean;
begin
if not x then if y then if z then f:= true
						else f:= false
			else if z then f:= true
				 else if not t then f:= true
					  else f:= false
else if not y then if z then f:= false
				 else if t then f:= false
					  else if not t then f:= true
else if z then f:= true
	 else f:= t;
  BDR:= f;
end;
{============================================================================}
procedure Vivod(a: matr);
var i, b: byte;
begin
  write('(');
  for i:= 0 to n do begin
   if a[5,i] then b:= 1 else b:= 0;
   write(b);
   if ((i + 1) mod m) = 0 then
	  if i = n then writeln(');')
	  else write(' ');
  end;
end;
{============================================================================}
begin
  ClrScr;
  for i:= 0 to n do razlojenie(a, i);
  WriteLn('Карно:');
  for i:= 0 to n do a[5, i]:= f_karno(a[1, i], a[2, i], a[3, i], a[4, i]);
  Vivod(a);
  WriteLn('Жегалкин: ');
  for i:= 0 to n do a[5, i]:= Jegalkin(a[1, i], a[2, i], a[3, i], a[4, i]);
  Vivod(a);
  WriteLn('БДР: ');
  for i:= 0 to n do a[5, i]:= BDR(a[1, i], a[2, i], a[3, i], a[4, i]);
  Vivod(a);
  Readln;
end.
В споре рождается истина.
roach1967 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа табулирования функции...так ли!? gree Помощь студентам 7 24.12.2008 23:14
программа, которая с точностью определяет значения функции y=ln(1-x),а модуль х<1, АлександрFRONT Паскаль, Turbo Pascal, PascalABC.NET 2 10.12.2008 01:37
Программа на VBA в виде функции пользователя Strel'nikova Помощь студентам 3 31.10.2008 13:53
Программа с использованием функции Cartman18 Помощь студентам 1 10.12.2007 16:29
Delphi. Программа, которая использует системные функции для получения информации о файловой системе metamfetamin Помощь студентам 16 08.11.2007 13:24