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

и если можите подскажите еще алгоритм решения.спасибо!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
blackhard |
![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
задача такаяисходная информация:строка содержащая булевскую функцию от переменных А,В....,приведенную к нормальной совершенной форме.
задание:вывести таблицу истинности этой функции. указание:количество переменных и их обозначения должны определяться программно. подскажите кто может ![]() и если можите подскажите еще алгоритм решения.спасибо! ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата 1)как выглядит функция в нормальной совершенной форме? См. здесь: Википедия: Дизъюнктивная нормальная форма (ДНФ) и ниже... Цитата что значит количество переменных и их обозначения должны определяться программно. Это значит, что ты не должен говорить программе, сколько переменных у тебя будет использоваться, а программа должна работать с произвольной строкой, и сама определять, является ли введенная строка СДНФ или СКНФ. Ну, к примеру, при вводе:'AB\C+A\B\C' программа должна будет определить, что выражение состоит из трех переменных, а в случае: 'A\B+\AB' - из двух, и соответственно этому строить таблицу... Кстати, задачка-то уже решалась на форуме: переход от ДНФ к табличному виду (но сначала все-таки попробуй решить ее сам) + к этому, на форуме есть еще по крайней мере 2 задачи (связанные с упрощением логических функций), которые тебе тоже будет полезно разобрать... Вот одна из них: Булевские ф-ции Вторую с ходу найти не могу, как найду - дам ссылку... |
blackhard |
![]()
Сообщение
#3
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
См. здесь: Википедия: Дизъюнктивная нормальная форма (ДНФ) и ниже... Это значит, что ты не должен говорить программе, сколько переменных у тебя будет использоваться, а программа должна работать с произвольной строкой, и сама определять, является ли введенная строка СДНФ или СКНФ. Ну, к примеру, при вводе: 'AB\C+A\B\C' программа должна будет определить, что выражение состоит из трех переменных, а в случае: 'A\B+\AB' - из двух, и соответственно этому строить таблицу... Кстати, задачка-то уже решалась на форуме: переход от ДНФ к табличному виду (но сначала все-таки попробуй решить ее сам) + к этому, на форуме есть еще по крайней мере 2 задачи (связанные с упрощением логических функций), которые тебе тоже будет полезно разобрать... Вот одна из них: Булевские ф-ции Вторую с ходу найти не могу, как найду - дам ссылку... спасибо ![]() |
blackhard |
![]()
Сообщение
#4
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
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.
может кто поможет разобраться с этой прогой!? ![]() ![]() ![]() |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата тут она работает с заданной функцией а мне бы надо чтоб функцию вводить с клавиатуры Функция задана в переменной (ну, типизированной константе, неважно, она себя все равно ведет как переменная) s, так что для того чтобы задать свою функцию, надо просто ввести ее первой строкой основной программы:begin
write('Функция: '); readln(s); { <--- вот это добавь }
s := s + '+';
repeat
p := pos('+', s);
Цитата я чето не могу допиреть как тут че работает сильно жестоко для меня а я в этом деле новичек Задание-то не очень подходящее для новичка, так что придется тебе разобраться ![]() Где именно непонятно, что делается? |
blackhard |
![]()
Сообщение
#6
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
Функция задана в переменной (ну, типизированной константе, неважно, она себя все равно ведет как переменная) s, так что для того чтобы задать свою функцию, надо просто ввести ее первой строкой основной программы: begin
write('Функция: '); readln(s); { <--- вот это добавь }
s := s + '+';
repeat
p := pos('+', s);
Задание-то не очень подходящее для новичка, так что придется тебе разобраться ![]() Где именно непонятно, что делается? мнеб вначале понять по какому принципу она вообще составляет таблици истинности например я ввожу функцию A*B*C+\A*\B*C и выдается вот эта таблица 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 и мне кажется что это неверно ![]() |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Ну, начнем с того, что ты выбрал не совсем подходящую тебе программу. Что делает скопированный тобой код (кстати, надо было сначала разобраться, а потом говорить что-то о правильности!) - описано в посте №1 той же темы: переход от ДНФ к табличному виду
(см. таблицу №2 там) Тебе же нужно не табличное представление (которое напрямую может использоваться для минимизации методом Карно), а таблица истинности - это совсем разные вещи. Я привел тебе ссылку для примера, КАК ВООБЩЕ работать с подобными заданиями, ты же почему-то решил, что это - написанная именно по твоему заданию "под ключ" программа, которую достаточно просто взять и сдать... Этого не будет. Я "под ключ" теперь программы не пишу. Сообщение отредактировано: volvo - |
blackhard |
![]()
Сообщение
#8
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 151 Пол: Мужской Реальное имя: иван Репутация: ![]() ![]() ![]() |
да теперь всепонятно.
вот это как я понимаю задается сама таблица tmatrix = array[0 .. 3, 0 .. 3] of 0 .. 1;
ну а если у меня будет функция допустим А*/В ли другая то выходит что в таблице должно быть 4 строки можно както сделать чтобы массив задавался уже исходя из входных данных? |
![]() ![]() |
![]() |
Текстовая версия | 17.04.2025 7:42 |