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

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

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

> булевская функция, помогите разобратся с заданием на булевские функции
сообщение
Сообщение #1


Бывалый
***

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

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


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


Гость






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

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

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

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

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

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

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

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


Бывалый
***

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

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


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

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

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

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

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

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

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

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

спасибо smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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

begin

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


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

Где именно непонятно, что делается?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






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

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

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

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


Бывалый
***

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

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


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

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

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

 





- Текстовая версия 29.03.2024 19:01
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name