Добрый вечер! Не могли бы Вы помочь дописать программу? Задание такое:
По заданной логической формуле построить эквивалентную логическую формулу, в которой знак отрицания встречается только перед переменными.
Указания. Воспользоваться эквивалентными преобразованиями
NOT NOT переменная ? переменная
NOT(формула1 OR формула2) ? NOT (формула1 ) AND NOT(формула2)
NOT(формула1 AND формула2) ? NOT (формула1 ) OR NOT(формула2)
Программа сделана в виде работы со строкой путём проверки, удаления, замены и перемещения символов...
Код:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;
#define N 100
void main()
{
char func[50];
cout<<"vvedite funkciu"<<endl;
gets(func);
int n=strlen(func);
//проверка допустимых символов. мы используем в качестве переменных a,b,c
//и операции: отрицание(!), конъюнкция (&), дизъюнкция (v)
for (int i=0;i<n;i++)
{
{
if(func[i]!='('&func[i]!=')'&func[i]!='!'&func[i]!='v'&func[i]!='&'&func[i]!='a'&func[i]!='b'&func[i]!='c')
{
cout<<"func error"<<endl;
return;
}
}
}
//проверка правильности расположения символов
int mas1[N]; int mas2[N];
for(int i=0;i<n;i++)
{
mas1[i]=0; mas2[i]=0;
}
for (int i=0;i<n;i++)
{
if(func[i]=='(')
{
if(i!=0)
{
if (func[i-1]!='&'&func[i-1]!='v'&func[i-1]!='!'&func[i-1]!=')'&func[i-1]!='(')
{
cout<<"func error"<<endl;
return;
}
}
if(i!=n-1&i!=n-2)
{
if (func[i+1]!='a'&func[i+1]!='b'&func[i+1]!='c'&func[i+1]!='!'&func[i+1]!='(')
{
cout<<"func error"<<endl;
return;
}
}
if(i==n-1&i==n-2)
{
cout<<"func error"<<endl;
return;
}
}
if (func[i]==')')
{
if(i!=0&i!=1)
{
if(func[i-1]!='a'&func[i-1]!='b'&func[i-1]!='c'&func[i-1]!=')')
{
cout<<"func error"<<endl;
return;
}
}
if(i!=n-1)
{
if(func[i+1]!='&'&func[i+1]!='v'&func[i+1]!=')')
{
cout<<"func error"<<endl;
return;
}
}
if(i==0&i==1)
{
cout<<"func error"<<endl;
return;
}
}
if(func[i]=='!')
{
if(i!=0)
{
if(func[i-1]!='('&func[i-1]!='!'&func[i-1]!='v'&func[i-1]!='&')
{
cout<<"func error"<<endl;
return;
}
}
if(i!=n-1)
{
if(func[i+1]!='a'&func[i+1]!='b'&func[i+1]!='c'&func[i+1]!='('&func[i+1]!='!')
{
cout<<"func error"<<endl;
return;
}
}
if(i==n-1)
{
cout<<"func error"<<endl;
return;
}
}
if(func[i]=='v'||func[i]=='&')
{
if(i!=0)
{
if(func[i-1]!=')'&func[i-1]!='a'&func[i-1]!='b'&func[i-1]!='c')
{
cout<<"func error"<<endl;
return;
}
}
if(i!=n-1)
{
if(func[i+1]!='a'&func[i+1]!='b'&func[i+1]!='c'&func[i+1]!='('&func[i+1]!='!')
{
cout<<"func error"<<endl;
return;
}
}
if(i==0||i==n-1)
{
cout<<"func error"<<endl;
return;
}
}
if(func[i]=='a'||func[i]=='b'||func[i]=='c')
{
if(i!=0)
{
if(func[i-1]!='('&func[i-1]!='!'&func[i-1]!='v'&func[i-1]!='&')
{
cout<<"func error"<<endl;
return;
}
}
if(i!=n-1)
{
if(func[i+1]!=')'&func[i+1]!='v'&func[i+1]!='&')
{
cout<<"func error"<<endl;
return;
}
}
}
if(func[i]=='(')
{
mas1[i]++;
}
if(func[i]==')')
{
mas2[i]++;
}
}
int s1;int s2; s1=0; s2=0;
for(int i=0;i<n;i++)
{
s1+=mas1[i];
s2+=mas2[i];
}
if(s1!=s2)
{
cout<<"func error"<<endl;
return;
}
//начало преобразования.
//если перед отрицанием стоит ещё одно отрицание, то их просто убираем.
//если перед отрицанием стоит открывающаяся скобка, то определяем выражение в скобках и раскрываем по закону де моргана.
//но каким образом это сделать?...
for(int i=0;i<n-1;i++)
{
if(func[i]=='!')
{
if(func[i+1]=='!')
{
.......