IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> булевская функция, помогите разобратся с заданием на булевские функции
blackhard
сообщение 31.10.2007 20:19
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


задача такаяисходная информация:строка содержащая булевскую функцию от переменных А,В....,приведенную к нормальной совершенной форме.
задание:вывести таблицу истинности этой функции.
указание:количество переменных и их обозначения должны определяться программно.
подскажите кто может smile.gif 1)как выглядит функция в нормальной совершенной форме?что значит количество переменных и их обозначения должны определяться программно.
и если можите подскажите еще алгоритм решения.спасибо! smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 31.10.2007 20:53
Сообщение #2


Гость






Цитата
1)как выглядит функция в нормальной совершенной форме?

См. здесь: Википедия: Дизъюнктивная нормальная форма (ДНФ) и ниже...

Цитата
что значит количество переменных и их обозначения должны определяться программно.
Это значит, что ты не должен говорить программе, сколько переменных у тебя будет использоваться, а программа должна работать с произвольной строкой, и сама определять, является ли введенная строка СДНФ или СКНФ. Ну, к примеру, при вводе:

'AB\C+A\B\C' программа должна будет определить, что выражение состоит из трех переменных, а в случае:
'A\B+\AB' - из двух, и соответственно этому строить таблицу... Кстати, задачка-то уже решалась на форуме:

переход от ДНФ к табличному виду
(но сначала все-таки попробуй решить ее сам)

+ к этому, на форуме есть еще по крайней мере 2 задачи (связанные с упрощением логических функций), которые тебе тоже будет полезно разобрать...

Вот одна из них:
Булевские ф-ции

Вторую с ходу найти не могу, как найду - дам ссылку...
 К началу страницы 
+ Ответить 
blackhard
сообщение 31.10.2007 21:12
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Цитата(volvo @ 31.10.2007 20:53) *

См. здесь: Википедия: Дизъюнктивная нормальная форма (ДНФ) и ниже...

Это значит, что ты не должен говорить программе, сколько переменных у тебя будет использоваться, а программа должна работать с произвольной строкой, и сама определять, является ли введенная строка СДНФ или СКНФ. Ну, к примеру, при вводе:

'AB\C+A\B\C' программа должна будет определить, что выражение состоит из трех переменных, а в случае:
'A\B+\AB' - из двух, и соответственно этому строить таблицу... Кстати, задачка-то уже решалась на форуме:

переход от ДНФ к табличному виду
(но сначала все-таки попробуй решить ее сам)

+ к этому, на форуме есть еще по крайней мере 2 задачи (связанные с упрощением логических функций), которые тебе тоже будет полезно разобрать...

Вот одна из них:
Булевские ф-ции

Вторую с ходу найти не могу, как найду - дам ссылку...

спасибо smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
blackhard
сообщение 11.11.2007 12:01
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


function fromdec(n, radix: longint): string;
var
s: string;
const
digit: string[16] = '0123456789ABCDEFQ';
begin
s := '';
repeat
s := digit[(n mod radix) + 1] + s;
n := n div radix;
until n = 0;

while length(s) < 2 do s := '0' + s;
fromdec := s;
end;
const
s: string = 'A*/B+/A*/C*/D+B*/C*D';
type
tmatrix = array[0 .. 3, 0 .. 3] of 0 .. 1;
var
mx: tmatrix;
p, i: integer;
mask, sub_s: string;

function matches(s, mask: string): boolean;
var i: integer;
begin
matches := true;
for i := 1 to length(s) do begin

if (mask[i] = 'X') or (s[i] = mask[i]) then {}
else matches := false

end;
end;

procedure print_mx(const mx: tmatrix);
var i, j: integer;
begin
for i := 0 to 3 do begin
for j := 0 to 3 do write(mx[i, j]:3);
writeln;
end;
end;

procedure fill_mx(var mx: tmatrix;
first, second: string);
var i, j: integer;
begin
for i := 0 to 3 do
for j := 0 to 3 do

if matches(fromdec(i, 2), first) and matches(fromdec(j, 2), second)
then mx[i, j] := 1;

end;


{var
mx: tmatrix;
p, i: integer;
mask, sub_s: string; }

begin
s := s + '+';
repeat
p := pos('+', s);
if p > 0 then begin

sub_s := copy(s, 1, p-1);
mask := '';

for i := 1 to 4 do mask := mask + 'X';

for i := 1 to length(sub_s) do begin

if sub_s[i] in ['A' .. 'D'] then
if (i > 1) and (sub_s[i - 1] = '/') then
mask[ord(sub_s[i]) - ord('A') + 1] := '0'
else
mask[ord(sub_s[i]) - ord('A') + 1] := '1';

end;

fill_mx(mx, copy(mask, 1, 2), copy(mask, 3, 2));
delete(s, 1, p);

end;
until p = 0;
print_mx(mx);
readln;
end.

может кто поможет разобраться с этой прогой!? smile.gif тут она работает с заданной функцией а мне бы надо чтоб функцию вводить с клавиатуры smile.gif я чето не могу допиреть как тут че работает сильно жестоко для меня а я в этом деле новичек smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.11.2007 12:41
Сообщение #5


Гость






Цитата
тут она работает с заданной функцией а мне бы надо чтоб функцию вводить с клавиатуры
Функция задана в переменной (ну, типизированной константе, неважно, она себя все равно ведет как переменная) s, так что для того чтобы задать свою функцию, надо просто ввести ее первой строкой основной программы:

begin

write('Функция: '); readln(s); { <--- вот это добавь }
s := s + '+';
repeat
p := pos('+', s);


Цитата
я чето не могу допиреть как тут че работает сильно жестоко для меня а я в этом деле новичек
Задание-то не очень подходящее для новичка, так что придется тебе разобраться smile.gif

Где именно непонятно, что делается?
 К началу страницы 
+ Ответить 
blackhard
сообщение 11.11.2007 20:46
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Цитата(volvo @ 11.11.2007 12:41) *

Функция задана в переменной (ну, типизированной константе, неважно, она себя все равно ведет как переменная) s, так что для того чтобы задать свою функцию, надо просто ввести ее первой строкой основной программы:

begin

write('Функция: '); readln(s); { <--- вот это добавь }
s := s + '+';
repeat
p := pos('+', s);


Задание-то не очень подходящее для новичка, так что придется тебе разобраться smile.gif

Где именно непонятно, что делается?

мнеб вначале понять по какому принципу она вообще составляет таблици истинности
например я ввожу функцию A*B*C+\A*\B*C
и выдается вот эта таблица
0 0 0 0
0 0 0 0
0 0 0 0
0 0 1 1
и мне кажется что это неверно smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.11.2007 21:31
Сообщение #7


Гость






Ну, начнем с того, что ты выбрал не совсем подходящую тебе программу. Что делает скопированный тобой код (кстати, надо было сначала разобраться, а потом говорить что-то о правильности!) - описано в посте №1 той же темы: переход от ДНФ к табличному виду

(см. таблицу №2 там)

Тебе же нужно не табличное представление (которое напрямую может использоваться для минимизации методом Карно), а таблица истинности - это совсем разные вещи. Я привел тебе ссылку для примера, КАК ВООБЩЕ работать с подобными заданиями, ты же почему-то решил, что это - написанная именно по твоему заданию "под ключ" программа, которую достаточно просто взять и сдать... Этого не будет. Я "под ключ" теперь программы не пишу.

Сообщение отредактировано: volvo - 11.11.2007 21:31
 К началу страницы 
+ Ответить 
blackhard
сообщение 11.11.2007 22:27
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


да теперь всепонятно.
вот это как я понимаю задается сама таблица
 tmatrix = array[0 .. 3, 0 .. 3] of 0 .. 1; 

ну а если у меня будет функция допустим А*/В ли другая то выходит что в таблице должно быть 4 строки можно
както сделать чтобы массив задавался уже исходя из входных данных?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.06.2025 20:24
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"