IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Булевские функции, проверка на НСДФ
NoRToN
сообщение 12.11.2004 21:13
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Дано: строка , содержащая булевскую функцию от переменных А,В ….. (отрицание к А запписывается как \А) с использованием операций +, * ,\
Задание: проверить, приведена ли функция к нормальной совершенной форме
Указание: количество имеющихся булевских переменных и их конкретные обозначения должны определяться программно . Учесть , что нормальная форма не может содержать повторяющихся слогаемых .
Помогите !
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 5)
Nevil
сообщение 12.11.2004 21:25
Сообщение #2


Гость






blink.gif Мля, мне еще учиться и учться чтобы такие задачки решать.
 К началу страницы 
+ Ответить 
volvo
сообщение 12.11.2004 21:37
Сообщение #3


Гость






NoRToN

Приведи примеры функций для проверки (меня интересует их сложность), и рядом с каждой - результат, который хочешь получить...
 К началу страницы 
+ Ответить 
NoRToN
сообщение 13.11.2004 13:19
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


надо только проверить,преобразовывать не надо. Она(строка)должна состоять из суммы слагаемых (каждый из которых есть произведение аргументов исходной функции или их отрицание)Пример не знаю sad.gif Если соответствует то верно если нет,соответственно не верно
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.11.2004 15:00
Сообщение #5


Гость






Вот эта программа проверяет, является ли строка, заданная в S, приведенной к НСДФ (изменив несколько символов, можно сделать функцию, проверяющую на НСКФ) :D

Код

function noSpace(s: string): string;
 var p: byte;
 begin
   repeat
     p := pos(' ', s);
     if p <> 0 then
       delete(s, p, 1)
   until p = 0;
   noSpace := s
 end;

const
 maxTokens = 20;
 stackIndex: integer = 0;
type
 stackType = array[1 .. maxTokens] of string;
var
 stack, localStack: stackType;
 firstPass: boolean;


{ returns True if st already exists in s }
function insertStack(st: string; var s: stackType;
        var index: integer): boolean;
 var
   i: integer;
 begin
   insertStack := True;

   for i := 1 to index do
     if s[i] = st then exit;

   inc(index); s[index] := st;
   insertStack := False
 end;

{bubble sort}
procedure sort(var a: stackType; len: integer);
 var
   i, j: integer;
   T: string;
 begin
   for i := 1 to len do
     for j := 1 to len - i do
       if a[j] >= a[j+1] then
         begin
           T := a[j]; a[j] := a[j+1]; a[j+1] := T;
         end;
 end;

function equalStacks(var a, b: stackType;
        len: integer): boolean;
 var i: integer;
 begin
   equalStacks := false;
   for i := 1 to len do
     if a[i] <> b[i] then exit;
   equalStacks := true
 end;

function getToken(delim: char;
        var s: string): string;
 var p: byte;
 begin
   getToken := '';
   p := pos(delim, s);
   if p <> 0 then
     begin
       getToken := Copy(s, 1, pred(p));
       delete(s, 1, p); exit
     end;
   getToken := s; s := ''
 end;

function checkToDf(delim: char;
        s: string): boolean;
 var
   localStack: stackType;
   nextToken: string;
   i, index: integer;
   exists: boolean;
 begin
   checkToDf := false;

   index := 0;
   while s <> '' do
     begin
       nextToken := getToken(delim, s);
       if nextToken[1] = '\' then
         delete(nextToken, 1, 1);

       if insertStack(nextToken, localStack, index)
         then exit;

       if firstPass then
         if insertStack(nextToken, stack, stackIndex) then exit;
     end;

   checkToDf := true;

   if firstPass then
     sort(stack, stackIndex)
   else
     if index = stackIndex then
       begin
         sort(localStack, index);
         checkToDf := equalStacks(stack, localStack, index)
       end
     else checkToDf := false
 end;

const
 s: string = 'b*\a*c + \a*\b*c + a*\b*c + a*\b*\c'; {Ok}
 (*
 s: string = 'b*\a*c + \a*\b*c + a*\b*c + a*\b*\a*c'; {Ошибка}
 *)
var
 nextToken: string;

const
 b: boolean = True;

begin
 firstPass := True;
 s := noSpace(s);

 while (s <> '') and b do
   begin
     nextToken := getToken('+', s);
     b := checkToDf('*', nextToken);
     firstPass := False;
   end;

 if b then
   writeln( 'This function is Ok' )
 else
   writeln( 'Error - wrong function' )
end.


Сообщение отредактировано: volvo - 13.11.2004 16:00
 К началу страницы 
+ Ответить 
NoRToN
сообщение 13.11.2004 20:01
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Спасибо за помощь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.06.2025 16:41
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"