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 = set of 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) do begin
while (s[i] in delimiter) and (i <= length(s)) do inc(i);
curr_len := 0; while not (s[i] in delimiter) and (i <= length(s)) do begin inc(i); inc(curr_len); end;
if curr_len > 0 then begin inc(count); with words[count] do begin 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;
begin for zero := false to true do for i := 1 to num_vars do contains[zero, i] := false;
count := get_words(s, mult_words, [#32, '*']); for i := 1 to count do begin 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) and not zero do begin
if contains[false, i] <> contains[true, i] then begin
if contains[false, i] then _result := _result + '\'; _result := _result + chr(ord('a') + i - 1) + '*';
end else if contains[false, i] = true then zero := true;
inc(i); end;
if zero then _result := '0*'; check_part := copy(_result, 1, pred(length(_result))); end;
for i := 1 to count do begin part := check_part(copy(s, plus_words[i].start, plus_words[i].len));
if part <> '0' then begin if pos(' ' + part, r_str) = 0 then begin if 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 В следующий раз копируй программу ПОЛНОСТЬЮ - со всеми пробелами !!! Ты упустил какой-то пробел (ищи теперь сам где он был), и теперь будешь получать неверный результат... У меня только что нормально отработало.