1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Помогите решить задачу! Данные: строка содержащая булевскую функцию от переменных A, B, .....(отрицание А записывается как \А), для определения которой использованы только операции +, *, \ (скобки отсутствуют). Задание упростить функцию, исключив повторяющиеся слагаемые или сомножетели и нулевые слагаемые. Заранее спасибо!
const
max_word = 255;
delimiter = [#32, '+'];
type
wrd_info = record
start, len: byte;
end;
twords = array[1 .. max_word] of wrd_info;
char_set = setof char;
function get_words(s: string; var words: twords;
delimiter: char_set): integer;
var
i, count, curr_len: integer;
begin
count := 0; i := 1;
while i <= length(s) dobeginwhile (s[i] in delimiter) and (i <= length(s)) do inc(i);
curr_len := 0;
whilenot (s[i] in delimiter) and (i <= length(s)) dobegin
inc(i); inc(curr_len);
end;
if curr_len > 0thenbegin
inc(count);
with words[count] dobegin
start := i - curr_len;
len := curr_len
end;
end;
end;
get_words := count;
end;
const
num_vars = 2;
var
mult_words: twords;
function check_part(s: string): string;
var
contains: array[false .. true, 1 .. num_vars] of boolean;
i, count: integer;
curr_var: string;
_result: string;
zero: boolean;
beginfor zero := false to true dofor i := 1to num_vars do
contains[zero, i] := false;
count := get_words(s, mult_words, [#32, '*']);
for i := 1to count dobegin
curr_var := copy(s, mult_words[i].start, mult_words[i].len);
contains[not (curr_var[1] = '\'),
ord(curr_var[length(curr_var)]) - ord('a') + 1] := true;
end;
_result := '';
i := 1; zero := false;
while (i <= num_vars) andnot zero dobeginif contains[false, i] <> contains[true, i] thenbeginif contains[false, i] then _result := _result + '\';
_result := _result + chr(ord('a') + i - 1) + '*';
endelseif contains[false, i] = true then zero := true;
inc(i);
end;
if zero then _result := '0*';
check_part := copy(_result, 1, pred(length(_result)));
end;
var
plus_words: twords;
count: byte;
i: byte;
r_str: string;
part: string;
const
s: string = 'a*\a*b+a*\b+b';
{
s: string = 'a*\b + b';
}begin
r_str := s;
repeat
s := r_str;
count := get_words(s, plus_words, [#32, '+']);
r_str := ' '; { Пробел }for i := 1to count dobegin
part := check_part(copy(s, plus_words[i].start, plus_words[i].len));
if part <> '0'thenbeginif pos(' ' + part, r_str) = 0thenbeginif r_str <> ' 'then r_str := r_str + ' + ';
r_str := r_str + part;
end;
end;
end;
until s = r_str;
writeln('the result: ', r_str);
end.
To: rol5en Погоняй на разных примерчиках, в принципе (хотя это и не проверялось !!!) должно работать с любым количеством переменных, НО (!!!) обозначения переменных должны быть по порядку: (a, b, c, d, ...) Само желаемое количество переменных задается здесь:
const
num_vars = 2; { <-- }
Найдешь глюки - говори, на каких значениях поймал их. Задание, кстати, довольно интересное
А вот ещё если написать строчку s: string = 'a*\a*b+a*\b+b'; как s: string = 'a*\a*b+a*\b+b+b; по идее должно получиться a*\b + 2*b' там ведь в задание написаноисключив повторяющиеся слагаемые я это понимаю как b+b=2*b или я что не так понял
To: rol5en То, что ты написал в предыдущем посте на вяжется никак с названием топика. У тебя тема какая?
Цитата
Булевские ф-ции, упрощение булевских ф-ций
Допустим, b = True... Что имеем? True + True = 2 * True?
Нет, в булевой алгебре True + True = True or True = True !!! А то, что ты написал - это приведение подобных, и к булевой алгебре никакого отношения не имеет...
Я тут знаешь подумал над твоим True + True = True or True = True!!! и пришёл к выводу что исключение повторяющихся слагаемых значит b+b=b т.е. a*\a*b+b+b будет равно b! Как бы это сделать???
Извини да ступил! Но раз это последняя версия то убери может тогда // s: string = 'a*\b + b'; и ещё если написать a+b+a*\b+a то получиться +a+b+a*\b как убрать плюс???
To: rol5en В следующий раз копируй программу ПОЛНОСТЬЮ - со всеми пробелами !!! Ты упустил какой-то пробел (ищи теперь сам где он был), и теперь будешь получать неверный результат... У меня только что нормально отработало.