1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
боюсь, я не совсем поняла проблему ДНФ не задается пользователем, а известна заранее?
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
Сильно оптимизировать не стал, иначе в алгоритме будет сложно разобраться... Вот так?
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';
Не совсем... Copy получает начальный индекс и количество копируемых символов, то есть не "начиная с 1-го по 2-ой, и начиная с 3-го по 4-ый", а "начиная с первого 2 символа, и с начиная третьего тоже 2 символа"...