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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2009, 02:30   #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 <stdlib.h>
#include <ctype.h>
#include <string.h>

#define N 3

int main()
{
   char foo[100];
   printf("Vvedite func: ");
   gets(foo);
   const char *ep = foo + strlen(foo), *p;//то что должно передаваться в параметры.ep - ограничивающий параметр.
Затрудняюсь в том, с чего нужно начать. Не могли бы вы подсказать примерный план действий в этом задании? А как именно всё написать - постараюсь разобраться.

Последний раз редактировалось Stilet; 03.06.2009 в 13:46.
Anastasiya209 вне форума Ответить с цитированием
Старый 02.06.2009, 02:49   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Задачка на рекурсию, не сложная, но требует аккуратности В общих чертах, примерно так:
Создаёте функцию, на вход которой подаётся строка, которая бежит по строке до первого NOT. Далее варианты
1. Если после NOT стоит ещё один NOT, то оба просто убираете и бежите дальше
2. Если после NOT стоит переменная, то ничего не делаем
3. Если после NOT стоит открывающая скобка, то вычленяем выражение стоящее в скобках в отдельную строку и рекурсивно применяем к ней функцию. (Тут можно делать немного по другому, например, передавать функции в качестве параметра не саму строку, а индексы её первого и последнего элементов в исходной строке). После того как рекурсивная функция отработала, в вызывающей функции преобразовываем выражение (то что вы написали называется законами Де Моргана). Фактически просто отыскиваем OR (AND), ставим перед ним закрывающую скобку, заменяем его на AND (OR) NOT и ставим открывающую скобку
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 03.06.2009, 01:12   #3
Anastasiya209
 
Аватар для Anastasiya209
 
Регистрация: 02.06.2009
Сообщений: 7
Вопрос

Greblin, спасибо за подсказку!

Я решила подойти к написанию программы не так, как хотела сначала, а, наверное, своеобразным способом

функция вводится, как строка, и далее идёт проверка допустимых символов. я использую три переменных a,b,с. и остальные символы для обозначения операций. если в введенной функции все символы допустимые, далее проверяю, в правильном ли порядке расположены символы, чтобы функция имела смысл.

Код:
void main()
{
	char func[50];
	cout<<"vvedite funkciu"<<endl;
	gets(func);
	int n=strlen(func);
	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;
			}
		}
	}

//(далее-проверка правильности расположения символов - множество длинных условий.....)
.............................................
если функция введена корректно, выполняем преобразование.
for(int i=0;i<n-1;i++)
		{
			if(func[i]=='!')
			{
				if(func[i+1]=='!')
				{
					func[i]=' ';func[i+1]=' ';
				}
// первый случай, когда идёт !! подряд. заменяем их пробелами. не совсем красиво смотрится, но это не страшно.

второй случай - когда ! стоит перед открывающейся скобкой. но я затрудняюсь, как правильно написать фрагмент, который выделит из функции выражение в скобках, чтобы далее его можно было преобразовать?

Последний раз редактировалось Stilet; 03.06.2009 в 13:47.
Anastasiya209 вне форума Ответить с цитированием
Старый 03.06.2009, 13:43   #4
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Ну вам ведь надо фактически получить индексы начала и конца данной подстроки
Вобщем это делается так. Пусть i - индекс начала подстроки (т.е. индекс открывающей скобки). Заводим какую-то переменную int s. Дальше бежим по строке, начиная с i, причём если очередной символ - это открывающая скобка (в том числе и символ с индексом i), то увеличиваем s на 1, а если закрывающая, то уменьшаем s на 1. В тот момент, когда s станет равным 0, i будет указывать на конец подстроки (при условии, что баланс скобок в выражении не нарушен).
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 03.06.2009, 14:38   #5
Anastasiya209
 
Аватар для Anastasiya209
 
Регистрация: 02.06.2009
Сообщений: 7
По умолчанию

Спасибо, с индексами, кажется, разобралась.
Но возникла трудность в написании самого преобразования.
Сейчас выложу полный текст программы. Не могли бы вы помочь её дописать? И ещё, в первом случае, если есть двойное отрицание, на самом деле, тоже неправильно заменять !! пробелами. Пожалуй, нужно делать как-то сдвиг. А со вторым условием, когда после ! стоит ( будет посложнее...
И верно ли записаны все условия проверки правильности написания функции?

Последний раз редактировалось Anastasiya209; 03.06.2009 в 20:28.
Anastasiya209 вне форума Ответить с цитированием
Старый 03.06.2009, 20:28   #6
Anastasiya209
 
Аватар для Anastasiya209
 
Регистрация: 02.06.2009
Сообщений: 7
По умолчанию

Код:
#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);

    //проверка допустимых символов

	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]=='!')
				{
					func[i]=' ';func[i+1]=' ';
				}
				if(func[i+1]=='(')
				{
					.....

Последний раз редактировалось Anastasiya209; 03.06.2009 в 20:31.
Anastasiya209 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение графика функции на QBasic artemon999 Помощь студентам 2 30.03.2009 15:16
Построение графика функции Java Folly Общие вопросы по Java, Java SE, Kotlin 3 19.03.2009 11:16
Построение графика функции (Паскаль) Scream of the soul Помощь студентам 4 16.03.2009 02:57
Построение графика функции Жека:) Общие вопросы C/C++ 5 11.11.2008 19:05
Графика. Построение функции AngelOfDeath Общие вопросы Delphi 2 14.10.2008 13:44