Помогите решить задачу! Данные: строка содержащая булевскую функцию от переменных A, B, .....(отрицание А записывается как \А), для определения которой использованы только операции +, *, \ (скобки отсутствуют). Задание упростить функцию, исключив повторяющиеся слагаемые или сомножетели и нулевые слагаемые. Заранее спасибо!
klem4
16.11.2005 19:39
Мог бы ты написать пару примеров входных и выходных данных ?
volvo
16.11.2005 20:33
To: klem4 А зачем? Без данных слабо?
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; { <-- }
Найдешь глюки - говори, на каких значениях поймал их. Задание, кстати, довольно интересное
rol5en
16.11.2005 20:50
Перед последним begin`ом в строчке // s: string = 'a*\b + b'; ставит курсор на // и пишет begin expected
klem4
16.11.2005 20:53
В BP и TP нету комментария вида //, убери // и все что за ним стоит или заключи это между { и }
я думаю дело в этом ...
volvo
16.11.2005 20:53
Вот что значит FPC Замени на
{ s: string = 'a*\b + b'; }
а можешь вообще удалить, это было просто для теста...
rol5en
16.11.2005 20:55
Ему не нравиться переменная //s можно поменять на ps !!!
rol5en
16.11.2005 21:02
А вот ещё если написать строчку 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 или я что не так понял
volvo
16.11.2005 21:11
To: rol5en То, что ты написал в предыдущем посте на вяжется никак с названием топика. У тебя тема какая?
Цитата
Булевские ф-ции, упрощение булевских ф-ций
Допустим, b = True... Что имеем? True + True = 2 * True?
Нет, в булевой алгебре True + True = True or True = True !!! А то, что ты написал - это приведение подобных, и к булевой алгебре никакого отношения не имеет...
rol5en
16.11.2005 21:13
Да ты прав! Извини!
rol5en
16.11.2005 22:23
Я тут знаешь подумал над твоим True + True = True or True = True!!! и пришёл к выводу что исключение повторяющихся слагаемых значит b+b=b т.е. a*\a*b+b+b будет равно b! Как бы это сделать???
volvo
16.11.2005 22:26
Цитата
Как бы это сделать???
Уже сделано... Я исправил программу, проверяй новую версию... Она как раз это и делает...
rol5en
16.11.2005 22:29
А где её взять? Новую версию? Или ты ту отредактировал?
volvo
16.11.2005 22:32
Цитата
Или ты ту отредактировал?
Именно... Пост №3... Все исправления будут вноситься мной туда... Там всегда будет самая последняя и правильная версия...
rol5en
16.11.2005 22:36
А как мне туда перейти? Кинь ссылку=)
volvo
16.11.2005 22:42
А что, в начало этой же страницы ты без ссылки не сможешь подняться?
rol5en
16.11.2005 22:51
Извини да ступил! Но раз это последняя версия то убери может тогда // s: string = 'a*\b + b'; и ещё если написать a+b+a*\b+a то получиться +a+b+a*\b как убрать плюс???
volvo
16.11.2005 22:57
To: rol5en В следующий раз копируй программу ПОЛНОСТЬЮ - со всеми пробелами !!! Ты упустил какой-то пробел (ищи теперь сам где он был), и теперь будешь получать неверный результат... У меня только что нормально отработало.
rol5en
16.11.2005 23:02
Ещё раз извини!
rol5en
16.11.2005 23:04
Ещё вопрос это я упустил или а*а даёт ноль?
rol5en
16.11.2005 23:09
Всё всё всё это я лузер!
Lomik
17.11.2005 21:44
Помогите организовать всё тоже самое только ещё со скобками! Вложенных скобок нет! Спасибо заранее!
volvo
17.11.2005 22:03
To: Lomik Ха, ну попробуй реализуй... Я посмотрю, как у тебя это получится... Кстати, помочь - это не значит сделать за тебя. Ты уже видишь алгоритм решения подобной задачи, попробуй подумать, что нужно делать в первую очередь, а что потом, для того чтобы получить правильный результат...
Полностью ЗА ТЕБЯ этого делать никто не будет...
А вот правила еще никто не отменял.
Цитата(Правила Форума)
9. Запрещена регистрация нескольких профилей. В случае обнаружения нарушителей, один из профилей удаляется.
За создание второго аккаунта будешь наказан...
Altair
18.11.2005 2:13
полуоффтоп
НЕ булевские а булевы!
Guest
29.11.2005 22:24
Исходная информация: строка, содержащая булевскую функцию от переменных A, B,...(отрицание А записывается как \А), для определения которой использованы только операции +.*,\ и скобки. Задание: преобразовать функцию к нормальной совершенной форме
volvo
29.11.2005 22:26
Цитата
преобразовать функцию к нормальной совершенной форме