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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2009, 23:13   #1
alexobenikov
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 15
Смущение Обратная польская запись

Премного извиняюсь, но не могли бы подсказать , где ошибка?

Код:
#include <stdio.h>
#include <iostream>
#include <string.h>

int prioritet(char a);
int main()
{
	char a[100];
	char vihod[100];
	char stek[100];
	int j=0,m=0,i=0;

	scanf("%s",&a);

		while(a[i]!='0' || a[i]!='=')
		{
			if ( a[i] >= 'a' && a[i] <= 'z' )
			{
				vihod[m]=a[i];
				m++;
			}
			if ( a[i] == '(' )
			{
				stek[j]=a[i];
				j++;
			}
			if ( a[i] == '+' || a[i] == '-' || a[i] == '/' || a[i] == '*' )
			{
				if (j==0)
				{
					stek[j]=a[i];
					j++;
				}
				else 
				{
					if( prioritet( stek[j-1] ) < prioritet( a[i] ) )
					{
						stek[j]=a[i];
						j++;
					}
					else//если пpиоpитет меньше пеpеписываем в выходную стpоку все опеpации с большим или pавным пpиоpитетом записываем в стек поступившую опеpацию
					{
						while ( prioritet ( stek[j-1] ) >= prioritet( a[i] ) )
						{
							vihod[m]=stek[j];
							j--;
							m++;
						}

					}
				}
			}
			if ( a[i] == ')' )
			{
				int k=i;
				while ( a[k]!='(' )
				{
					vihod[m]=stek[j];
					j--;
					k--;
					m++;
				}
				j--;
			}
			i++;
		}
	
		int z=0;
		while(stek[z]!='0')
		{
			vihod[m]=stek[z];
			z++;
		}

		printf("%s\n",vihod);

	return 0;
}

int prioritet(char a)
{
	switch(a)
  {
    case '*':
    case '/':
         return 3;

    case '-':
    case '+':
         return 2;

    case '(':
         return 1;
  }
}

Компилятор ошибок не выдает, но во время запуска выдает
"Unhandled exception at 0x726f7373 in Obratnaja polskaja zavisimost.exe: 0xC0000005: Access violation reading location 0x726f7373."

Последний раз редактировалось alexobenikov; 19.11.2009 в 23:40.
alexobenikov вне форума Ответить с цитированием
Старый 19.11.2009, 23:37   #2
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Во-первых для вывода исходного кода в сообщении есть теги CODE и /CODE , можно просто выделить код и нажать на решетку на панели сверху

Во-вторых покажи то что выводит компилятор, какие ошибки
NiCola999 вне форума Ответить с цитированием
Старый 20.11.2009, 10:07   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Во-первых:
Нет проверки на выход за пределы массива:
Код:
	while(a[i]!='0' || a[i]!='=' && i<100)
Во-вторых
В конце поставь паузу чтоб видеть что на экране:
Код:
	system("pause");
	return 0;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2009, 12:18   #4
alexobenikov
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 15
По умолчанию

неа не помогло=(
alexobenikov вне форума Ответить с цитированием
Старый 20.11.2009, 13:24   #5
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Код:
scanf("%s",&a);
посмотрите в Help-e
там
Код:
scanf("%s",a);
, но при этом все равно не работает.
Не понимает
Код:
while(a[i]!='0' || a[i]!='=')
почему не знаю.
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 20.11.2009, 15:05   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

1.
Код:
						while ( j >= 1 && prioritet ( stek[j-1] ) >= prioritet( a[i] ) )
						{
							vihod[m]=stek[j-1];
							m++;
							j--;
						}
						stek[j] = a[i];
						++j;
2.
Код:
			if ( a[i] == ')' )
			{
				while ( stek[j-1]!='(' )
				{
					vihod[m]=stek[j-1];
					j--;
					m++;
				}
				j--;
			}
3.
Код:
		--j;
		while (j >= 0)
		{
			vihod[m]=stek[j];
			++m;
			--j;
		}
		vihod[m] = '\0';
pu4koff вне форума Ответить с цитированием
Старый 20.11.2009, 17:18   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Код:
int prioritet(char a)
{
	switch(a)
  {
    case '*':
    case '/':
         return 3;

    case '-':
    case '+':
         return 2;

    case '(':
         return 1;
  }
}
разьве ту не надо выходить из условия break ом?

case ... :
...
break;
NiCola999 вне форума Ответить с цитированием
Старый 20.11.2009, 18:32   #8
alexobenikov
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 15
По умолчанию

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

PS если у кого-то есть исходник,то скиньте плз(в инете есть исходники - но там в основном со связными списками (которые пока не шарю) и всякими push и т.д.)
alexobenikov вне форума Ответить с цитированием
Старый 20.11.2009, 21:57   #9
alexobenikov
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 15
По умолчанию

а может кто-то скинуть исходник на С ?
alexobenikov вне форума Ответить с цитированием
Старый 20.11.2009, 22:17   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Исправления мои хоть пробовал проверить?
Не работает так?
Код:
int main()
{
	char a[100];
	char vihod[100];
	char stek[100];
	int j=0,m=0,i=0;
	int len;

	scanf("%s",a);

	len = strlen(a);

		while((i < len) && (a[i]!='0' || a[i]!='='))
		{
			if ( a[i] >= 'a' && a[i] <= 'z')
			{
				vihod[m]=a[i];
				m++;
			}
			else if ( a[i] == '(' )
			{
				stek[j]=a[i];
				j++;
			}
			else if ( a[i] == '+' || a[i] == '-' || a[i] == '/' || a[i] == '*' )
			{
				if (j==0)
				{
					stek[j]=a[i];
					j++;
				}
				else 
				{
					if( prioritet( stek[j-1] ) < prioritet( a[i] ) )
					{
						stek[j]=a[i];
						j++;
					}
					else//если пpиоpитет меньше пеpеписываем в выходную стpоку все опеpации с большим или pавным пpиоpитетом записываем в стек поступившую опеpацию
					{
						while ( j >= 1 && prioritet ( stek[j-1] ) >= prioritet( a[i] ) )
						{
							vihod[m]=stek[j-1];
							m++;
							j--;
						}
						stek[j] = a[i];
						++j;
					}
				}
			}
			if ( a[i] == ')' )
			{
				while ( stek[j-1]!='(' )
				{
					vihod[m]=stek[j-1];
					j--;
					m++;
				}
				j--;
			}
			i++;
		}
	
		--j;
		while (j >= 0)
		{
			vihod[m]=stek[j];
			++m;
			--j;
		}
		vihod[m] = '\0';

		printf("%s\n",vihod);
		system("pause");

	return 0;
}
Ввожу: "а+b+c+d="
получаю: "ab+c+d+"
Ввожу: "a*(b+c)="
Получаю: "abc+*"
Что-то не так?
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратная польская нотация Sexy Fox Помощь студентам 9 22.09.2011 14:57
Обратная польская нотация Izhic Свободное общение 17 02.10.2009 23:43
Обратная польская запись Катуха Помощь студентам 6 27.12.2008 10:23
Обратная польская запись Роман Радер Общие вопросы Delphi 0 09.12.2008 18:18
Обратная польская нотация Sexy Fox Помощь студентам 2 22.06.2007 13:27