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

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

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 09.05.2009, 14:43   #1
Безбашик
 
Регистрация: 09.05.2009
Сообщений: 5
По умолчанию преобразования польской формы записи уравнения

Народ тут такое дело, вообщем курсач дали по теме решение логических уравнений ( например !A&B=A|C ), так вот, программа решает уравнения, но возникла проблема, препод дал мне уравнение записанное в польской форме, и мне нужно написать метод для преобразования польской формы записи уравнения в инфиксную, чтобы прога могла его решить, если у кого есть готовый код или кому не лень помогите =) Что такое польская форма записи объяснять не нужно, мне бы желательно метод чтобы человек дописал.
Для тех кто не понял объясню польская форма записи это когда операнд стоит после переменных самый простой пример AB&=1 и вот программа должна преобразовать его в вид A&B=1 а потом решить. Или к примеру посложнее AB&CD&||=1 метод должен преобразовать эту запись в (A&B) || (C&D)=1
PS Помогите пожалуйста я ж не просто так прошу мне курсовик в понедельник сдавать если не бесплатно то хотя бы за пиво =) Моя не до конца готовая но рабочая программа лежит в архиве.
Вложения
Тип файла: rar черновик.rar (12.5 Кб, 15 просмотров)
Безбашик вне форума
Старый 09.05.2009, 21:48   #2
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

алгоритм в письменном виде:

предположим уравнение вот такого вида:
ab*ab**ab*ab***
где a - первый операнд сравнения, b - второй операнд, * - логическая операция

преобразуем:
((a*b)*(a*b))*((a*b)*(a*b))

анализируем:
1.если за операндом стоит сразу логическая операция, то смещаем операцию на 1 порядок назад(1 порядок == 1 операнд):

ab* => a*b

2.если за операндом сразу два знака, то первый смещаем по методу (1), а второй на два порядка назад:

ab*ab** => a*b*a*b

(здесь и далее для удобства лучше ставить скобки по ходу парсинга - т.е. (a*b)*(a*b))

3. если за операндом сразу три знака, то первые два смещаем по правилам (1) и (2), а третий на 4 порядка:

ab*ab**ab*ab*** == a*b*a*b*a*b*a*b или понятнее: ((a*b)*(a*b))*((a*b)*(a*b))

4. если четыре знака, то на 8 порядков, если более, то каждыый раз удваиваем количество порядков( для 5 - 16, для 6 - 32 etc).

наиболее удобно если ставить скобки приоритета сразу же, чтобы не запутаться.

данный алгоритм подразумевает что вводимое значение будет строкой или массивом(что лучше -- массив объектов типа Object)


а вот как это реализовать - это уже Вам думать - вы же учитесь. а мне лень писать.

Удачи с курсовым проектом!

з.ы. 5 минут потребовалось на обдумывание и минут 15-20 на написание здесь.
Алгоритм только для симметричных выражений!
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 09.05.2009 в 21:50.
alexinspir вне форума
Старый 10.05.2009, 14:52   #3
Безбашик
 
Регистрация: 09.05.2009
Сообщений: 5
По умолчанию

Большое спасибо, легче алгоритма мне не предлагали. Однако, я тут нашёл парочку НО. 1) Что делать с операцией НЕ (её ещё называют отрицание), которая действует на 1 переменную, по какому принципу переставлять её??Например AB&! каким образом это преобразовать? Это будет !(A&B) или !A&B но если один из вариантов то тогда как получить другой? или например AB!& получается тут отрицание и операция И смещаются на 1 позицию оба? Непонятно 2) Скобки нужны обязательно, а можно объяснить как их ставить? А то вручную всё легко и просто, а на джаве я не могу догнать по какому принципу объяснить программе как,что и куда ставить.

Последний раз редактировалось Безбашик; 10.05.2009 в 15:44.
Безбашик вне форума
Старый 10.05.2009, 17:18   #4
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Безбашик Посмотреть сообщение
1) Что делать с операцией НЕ (её ещё называют отрицание), которая действует на 1 переменную, по какому принципу переставлять её??Например AB&! каким образом это преобразовать? Это будет !(A&B) или !A&B но если один из вариантов то тогда как получить другой? или например AB!& получается тут отрицание и операция И смещаются на 1 позицию оба?
надо посмотреть правила записи в польской форме (я кстати первый раз услышал что такая вообще есть)

скорее всего:
AB&! это !(A&B)
A!B& это (!A)&B
AB!& это A&(!B)

посмотрим что из этого может вытекать.
предположим у нас уравнение вот такого вида:
AB&CD&!||
по тем предположениям что я написал, это получается:
(A&B)||(!(C&D))
из этого следует, что знак отрицания надо смещать по правилам, а следующий за ним так как будто знака отрицания небыло
[-- для наглядности перепишу следующий пример без скобок: A&B||!C&D --]

Цитата:
Сообщение от Безбашик Посмотреть сообщение
Непонятно 2) Скобки нужны обязательно, а можно объяснить как их ставить? А то вручную всё легко и просто, а на джаве я не могу догнать по какому принципу объяснить программе как,что и куда ставить.
просто вставлять в массив(строку) там где надо. а потом уже писать парсер который будет считать значение в скобках:
для наглядности:
(A&B)||(!(C&D))
анализируем количество скобок, находим последнюю открывающуюся
берем содержимое этой скобки до закрывающейся скобки, а сами скобы выкидываем. итого:
(A&B)||(!(C&D))
значение в последней скобке:
С&D, считаем его, это у нас будет F(предположим).
тогда у нас получается:
(A&B)||(!F)
и так далее пока не кончатся скобки, как кончатся - просто считаем оставшиеся выражения.

для примера, парсер скобок в обычных математических выражениях:
Код:
class BracketSniffer //InSpir 10.02.2009 4:00 begin
{
	public static Vector act(Vector v)
	{
		Vector vBuff = new Vector(1,1);
		final char BracketOpen = '(';
		final char BracketClose = ')';
		boolean br = true; //flag
		if(!v.contains(new Character('('))) //if no bracket
		{
			br=false;
		}
		ListIterator vItr = v.listIterator();
		while(br)
		{
			vItr = v.listIterator();
			outer: while(vItr.hasNext())
			{
				char ch; //
				int lastIndex = v.lastIndexOf(new Character('('));
				vItr = v.listIterator(lastIndex);
				ch = (char)(Character)vItr.next();
				if(ch == BracketOpen)
				{
					vItr.remove();
					while(true)
					{
						
						ch = (char)(Character)vItr.next();
						
						if(ch == BracketClose) //if meet close bracket
						{
							
							vItr.remove();
							Stack stt = PlaceToStack.act(vBuff);
							vBuff.removeAllElements();
							Vector vBuff1 = DoubleToChar.act(Calculation.act(stt)); //Calculate inner expression and push it into temp vector
							ListIterator vBuff1Itr = vBuff1.listIterator();
							while(vBuff1Itr.hasNext()) //add result to sourse vector
							{
								char cht = (char)(Character)vBuff1Itr.next();
								vItr.add(new Character(cht));
							}
							break outer;
						}
						vBuff.addElement(new Character(ch));
						vItr.remove();
						
					}
				}
			}
			
			if(!v.contains(new Character('(')))
			{
				br=false;
			}
		}
		return v;
	}
}//InSpir 10.02.2009 4:00 end
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума
Старый 11.05.2009, 00:36   #5
Безбашик
 
Регистрация: 09.05.2009
Сообщений: 5
По умолчанию

Извини, видимо некорректно задал вопрос. Я о всё том же преобразовании из польской в инфиксную. Вот ABC&|| это будет (A||(B&C)) вот мне и интересно как заключать выражения в скобки =)
Безбашик вне форума
Старый 11.05.2009, 01:23   #6
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Безбашик Посмотреть сообщение
Извини, видимо некорректно задал вопрос. Я о всё том же преобразовании из польской в инфиксную. Вот ABC&|| это будет (A||(B&C)) вот мне и интересно как заключать выражения в скобки =)
Уважаемый, я уже все вам разжевал, дальше думайте сами, натаскивайте свои мозги на решение задач, на работе будут куда более сложные задачи.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума
Старый 12.05.2009, 10:25   #7
Безбашик
 
Регистрация: 09.05.2009
Сообщений: 5
По умолчанию

Всё спасибо, программа готова.
Безбашик вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
трехмерные фигуры и их преобразования. Klyan Паскаль, Turbo Pascal, PascalABC.NET 1 30.04.2009 18:42
Преобразования Pascal в Delphi non1ka Помощь студентам 21 05.06.2008 12:54
Преобразования систем исчисления Altera Общие вопросы Delphi 5 21.02.2008 08:43