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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2012, 14:39   #1
allozavr
Новичок
Джуниор
 
Регистрация: 19.02.2012
Сообщений: 1
По умолчанию проблема с типами(char и int) в опз (язык с++)

Программа переводит выражение в обратную польскую запись и считает ее. Но вывод результата не правильный например(1+2 равно с). Что не провильно сделано?
Вот код:
Код:
#include "stdafx.h" 
#include <iostream> 
#include "string.h" 
#include "ctype.h" //для isalnum 

using namespace std; 

char stack[50],opz[50],sp=0; 

int prior(char ch) //определяет приоритет символа 
{ 
 switch (ch) 
 { 
 case '(': return 0; 
 case ')': return 1; 
 case '+': case '-': return 2; 
 case '*': case '/': return 3; 
 case ' ':return -2; 
 default: if (isalnum(ch)) 
 return -1; 
 else return 99; //код ошибки (ошибочный символ) 
 } 
} 
int get_token() 
{ 
 static int i=0; //i-номер последнего запиханного в стек символа 
 char ch; 
 cin.get(ch); //сh-очередной считанный из вх. потока символ 
 if (ch=='\n') //если конец ввода то 
 { 
 if (stack[i]!=' ') //если стек не пуст 
 for(i;i>=0;i--) 
 opz[sp++]=stack[i]; //то выталкиваем все символы из стека 
 return 0; //0-код завершения обработки 
 } 
 switch (prior(ch)) //проверяет приоритет символа 
 { 
 case -1: { opz[sp++]=ch; return 1;} //если это цифра 
 case -2: return 1; //если пробел, пропускает его 
 case 99: return -1; //если ошибка, возвращает код ошибки 
 default: //если же это символ операции 
 if (ch==')') //если это закр. скобка 
 { 
 for (i; stack[i]!='('; i--) //выталкивает из стека все символы до ( 
 { 
 opz[sp++]=stack[i]; 
 stack[i]=' '; 
 } 
 stack[i--]=' '; //стирает ( 
 } 
 else 
 if (ch!='(' && stack[i]!=' ' && prior(ch)<=prior(stack[i])) 
 { //иначе если это не (, стек не пуст и приоритет выше, чем у предыд. 
 int fl=0; 
 for(i;fl==0 && i>=0;i--) //выталкивает символы из стека, пока не встретит символ с более выс. приоритетом 
 { 
 if (i!=0 && prior(stack[i-1])<prior(ch)); 
 stack[i]=' '; 
 } 
 stack[++i]=ch;   //записывает символ в стек 
         } 
         else 
            if (stack[i]!=' ')      //иначе если стек не пуст 
               stack[++i]=ch;   //записывает в стек и увеличивает i
            else 
               stack[i]=ch;      //если стек пуст, записывает без увеличения i 
      return 1; 
 } 
} 

void main() 
{ 
 setlocale(LC_CTYPE,"Russian"); 
 int k,p=0; 
 for (k=0;k<50;k++) 
 stack[k]=' '; 
 cout << "Введите выражение:"; 
 while (cin) 
 { 
 k=get_token(); //результат обработки очередного символа 
 if (k==0) //0-окнончание работы 
 break; 
 if (k==-1) //-1-ошибка 
 { 
 cout<<"\n Ошибка!";break; 
 } 
 else continue; //иначе продолжение 
 } 
 cout << opz << endl; 
 for (k=0;k<50;k++) 
 stack[k]=' '; 
 for (k=0;k<sp;k++)
   {
      if (prior(opz[k])==-1)
         stack[p++]=opz[k];
 else 
 { 
 switch (opz[k]) 
 { 
 case '+': 
 {stack[p-2]=stack[p-2]+stack[p-1]; 
 p--; 
 break;} 
 case '-': 
 {stack[p-2]=stack[p-2]-stack[p-1]; 
 p--; 
 break;} 
 case '*': 
 {stack[p-2]=stack[p-2]*stack[p-1]; 
 p--; 
 break;} 
 case '/': 
 {stack[p-2]=stack[p-2]/stack[p-1]; 
 p--; 
 break;} 
 default: 
 {cout << "ERROR";break;} 
 } 
 } 
 } 
 cout << stack[p-1] << endl; 
 system("PAUSE"); 
}

Последний раз редактировалось Stilet; 19.02.2012 в 15:35.
allozavr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
из int в char 3dg_fan Помощь студентам 2 26.12.2010 00:16
из char в int AxenicX Помощь студентам 2 16.11.2009 22:31
из char в int llin Общие вопросы C/C++ 13 11.07.2008 06:51
из char в int?? Mika Общие вопросы C/C++ 4 20.06.2008 15:18
Есть таблица - В ней три поля int, char, char нужно чтобы данные заносились в таблицу Mysql Muahahaha PHP 8 27.03.2008 11:17