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

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> переход от ДНФ к табличному виду, Паскаль или Си(++)
сообщение
Сообщение #1


Пионер
**

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

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


Задание такое: Написать программу, которая осуществляет переход от ДНФ к табличному заданию.
Как я понял, так:

Пусть ДНФ: f=A*/B+/A*/C*/D+B*/C*D, где + - дизъюнкция, * - конъюнкция, / - отрицание.
Тогда таблица получится такой:

CD  00  01  11  10
AB
00 1 0 0 0
01 1 1 0 0
11 0 1 0 0
10 1 1 1 1


Каким образом это сделать?..
Можно таблицу представить как array[1..2,1..2] of array[1..2,1..2] of boolean, и получится она немного другой:

CD   00  01  10  11
AB
00 1 0 0 0
01 1 1 0 0
10 1 1 1 1
11 0 1 0 0


Сорри за таблички... никак не могу их нормально выровнять...

Сообщение отредактировано: volvo -


--------------------
go ask Alice
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


боюсь, я не совсем поняла проблему sad.gif
ДНФ не задается пользователем, а известна заранее?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

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

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


ДНФ задается пользователем. Просто я привел пример


--------------------
go ask Alice
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Сильно оптимизировать не стал, иначе в алгоритме будет сложно разобраться... Вот так?

function fromdec(n, radix: longint): string;
var
s: string;
const
digit: string[16] = '0123456789ABCDEF';
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;


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);
end.

 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

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

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


volvo, так! спасибо большое! во всем разобрался!
      ...
end;

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

Здесь должно быть так, правильно?

Сообщение отредактировано: Unknown -


--------------------
go ask Alice
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Не совсем... Copy получает начальный индекс и количество копируемых символов, то есть не "начиная с 1-го по 2-ой, и начиная с 3-го по 4-ый", а "начиная с первого 2 символа, и с начиная третьего тоже 2 символа"...

Чувствуешь разницу?

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

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

 





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