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; { <-- }
Найдешь глюки - говори, на каких значениях поймал их. Задание, кстати, довольно интересное