Member 14042057 Ответов: 2

Временного исправления для преобразования постфиксного


привет, ребята.я сделал программу для преобразования ifix в постфикс, но компилятор не дает результат, который я хотел.пожалуйста, помогите мне и посмотрите, есть ли какая - либо ошибка в моем коде спасибо

Что я уже пробовал:

#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
void disp(char postfix[],int size)
{
    for (int i=0;i<size;i++)
    {
        cout<<postfix[i];
    }
}
int priority(char);
int main()
{
    char weight;
    char c;
    int tcount=0;  //counter loop to count the  number of brackets//
    int ecount=0;   //counter loop to count the  number of brackets//
    int size=8;
 char equ[8];
 stack<char> s;
 char postfix[8];
 cin.getline(equ,size);
  for(int i=0;i<size;i++ )
    {
        if(equ[i]=='(')
        {
            tcount++;
        }
        if(equ[i]==')')
        {
            ecount++;
        }
    }
    if(tcount==ecount)
    {
        cout<<"equation is valid"<<endl;
    }
    else
        cout<<"equation is not valid"<<endl;
 for(int i=0;i<size;i++)
 {
      c=equ[i];
      if(c!='+' || c!='-' || c!='*' || c!='/')
      {
          postfix[i]=c;
      }
     else if(c=='(')
    s.push(c);

     else if(c==')')
     {
        while( !s.empty() && s.top()!= '(' )
        {
         postfix[i]=s.top();
         s.pop();
     }}

     if(c=='+' || c=='-' || c=='*' || c=='/')
        {
            weight=priority(c);
           if(weight<=priority(s.top()))
         {
                postfix[i]=s.top();
                s.pop();
                s.push(c);
          }
          else
                s.push(c);

while (!s.empty()) {
		postfix[i] = s.top();
		s.pop();}
}
}

disp(postfix,size);
    return 0;
}

int priority(char s)
{
    if(s=='+' || s=='-')
        return 0;
    if(s=='*' || s=='/')
        return 1;
}

jeron1

"компилятор не выдает результат, который я хотел", поэтому ваш код не компилируется и, следовательно, не способен работать? или ваш код компилируется и запускается, но вы не получаете ожидаемых результатов? В любом случае необходимы более конкретные детали.

Member 14042057

однако я хочу, чтобы выход, который преобразует временного исправления, чтобы постфикс

Member 14042057

он не дает постфикс в качестве выходного сигнала,а только показывает, является ли уравнение действительным или нет

2 Ответов

Рейтинг:
1

KarstenK

Это ваша задача-отлаживать код. Напишите несколько простых тестовых данных и проверьте результаты. Чем писать более сложные тестовые данные.

Я вижу, что ваш код не имеет правильного отступа, и поэтому некоторые фигурные скобки могут быть неправильными. Всегда используйте фигурные скобки в коде else. Ваша функция disp() пуста.

Сделайте некоторые выходные данные в критических кодовых путях, чтобы найти ошибки.

Счастливая охота на жуков ;-)


Рейтинг:
0

CPallini

Всего пара моментов:

Цитата:
если(c==e)
{
cout<<"уравнение действительно"<<endl;
}
здесь ваш код использует неинициализированный переменная c.

Цитата:
если(c!='+' || c!='-' || c!='*' || c!='/')
Это неправильно: такие неравенства должны быть ANDed, а не ORed, иначе блок if будет всегда выполненный.

Возможно, есть и другие ошибки, но неудачные короткие имена, которые вы использовали для переменных, препятствуют дальнейшему анализу.


[обновление]
Вы не исправили сигнальные ошибки!

Во всяком случае, обычно такие преобразования выполняются с рекурсивными вызовами, основанными на грамматике, как показано в следующем коде:

#include <iostream>
using namespace std;

/* grammar
  exp  := term + exp |
          term - exp |
          term

  term := fact * term |
          fact / term |
          fact

  fact :=  '(' exp ')' |
          digit
*/

class Expression
{
  const string ifx;
  size_t index;
  string pfx;

  void exp();
  void term();
  void fact();
  char next(){ return ifx[index]; }
  void consume()
  {
    if ( index < ifx.size()-1)
      ++index;
  }
  void emit(char c)
  {
    pfx += ' ';
    pfx += c;
  }

public:
  Expression(string infix_text) : ifx(infix_text){}

  string infix(){return ifx;}
  string postfix()
  {
    if ( pfx == "")
    {
      index = 0;
      exp();
    }
    return pfx;
  }
};

int main()
{
  // some test cases...
  Expression te[3]={{"1+2"}, {"2*4/5+3*(4+2-7)+8"}, {"2*(3+(4-2))"}};
  for (size_t n=0; n<3; ++n)
  {
    cout << te[n].infix()  << " -> " << te[n].postfix() << endl;
  }
}

void Expression::exp()
{
  term();
  char c = next();
  if ( c == '+' || c == '-')
  {
    consume();
    exp();
    emit(c);
  }
}

void Expression::term()
{
  fact();
  char c = next();
  if ( c == '*' || c == '/')
  {
    consume();
    term();
    emit(c);
  }
}

void Expression:: fact()
{
  char c = next();
  if ( c == '(')
  {
    consume();
    exp();
    if ( next() != ')')
      throw invalid_argument("no closing brace");
    consume();
  }
  else
  {
    if ( c < '0' || c>'9' )
      throw invalid_argument("digit expected");
    consume();
    emit(c);
  }
}


[/обновление]


Member 14042057

#include<iostream>
#include<cstring>
#включить<стек>
использование пространства имен std;
void disp(char postfix[],int size)
{
for (int i=0;i<size;i++)
{
cout<<постфикс[i];
}
}
int priority(char);
тап_п()
{
вес обугливания;
чар с;
int tcount=0; //контур счетчика для подсчета количества скобок//
int ecount=0; //контур счетчика для подсчета количества скобок//
int size=8;
голец н[8];
stack<char> s;
char постфикс[8];
cin.getline(equ,размер);
for(int i=0;i<size;i++ )
{
if(equ[i]=='(')
{
tcount++;
}
если(equ[i]==')')
{
ecount++;
}
}
if(tcount==ecount)
{
cout<<"уравнение действительно"<<endl;
}
еще
cout<<"уравнение недопустимо"<<endl;
for(int i=0;i<size;i++)
{
с=н[я];
если(c!='+' || c!='-' || c!='*' || c!='/')
{
постфикс[i]=c;
}
иначе если(c=='(')
С. подтолкнуть(с);

иначе если(c==')')
{
хотя( !С. пустая () и усилитель; & ы.топ()!= '(' )

{
постфикс[i]=s.top();
С. поп();

}}

если(c=='+' || c=='-' || c=='*' || c=='/')
{
вес=приоритет(c);
если(вес&л;=приоритет(ы.топ()))
{
постфикс[i]=s.top();
С. поп();
С. подтолкнуть(с);
}

еще
С. подтолкнуть(с);

хотя (!С. пустые()) {
постфикс[i] = s.top();
С. поп();}
}
}

disp(постфикс,размер);
возвращает 0;
}



int priority(char s)
{
если(s=='+' || s=='-')
возвращает 0;
если(s=='*' || s=='/')
возврат 1;

}

Member 14042057

я изменяю свой код, пожалуйста, проверьте его сейчас.

CPallini

Пожалуйста, ознакомьтесь с моим обновленным решением.