Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2009, 23:58   #1
Anastasiya209
 
Аватар для Anastasiya209
 
Регистрация: 02.06.2009
Сообщений: 7
Лампочка Помогите, пожалуйста, дописать программу на C++ (построение эквивалентной логической функции)

Добрый вечер! Не могли бы Вы помочь дописать программу? Задание такое:

По заданной логической формуле построить эквивалентную логическую формулу, в которой знак отрицания встречается только перед переменными.
Указания. Воспользоваться эквивалентными преобразованиями
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]=='!')
				{
					.......
Anastasiya209 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение эквивалентной логической функции (C++) Anastasiya209 Помощь студентам 5 03.06.2009 20:28
Помогите пожалуйста с логической функцией ЕСЛИ OhNoes Microsoft Office Excel 2 19.05.2009 14:11
Помогите пожалуйста дописать программу Xan Помощь студентам 5 16.02.2009 09:18
Помогите дописать программу. ShnapS Паскаль, Turbo Pascal, PascalABC.NET 5 17.05.2008 19:50
Помогите дописать программу ALIZE Помощь студентам 2 09.12.2007 18:45