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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2012, 20:41   #1
дотнет
Новичок
Джуниор
 
Регистрация: 16.10.2012
Сообщений: 1
По умолчанию Магия вычисления постфиксного выражения

Ввожу строку, преобразовывает ок, но считает как-то криво
Например 100+2 = 200, а 123+3 = 446
хотя в основном считает нормально, отслеживая пошагово, то действия выполняются правильно

Полный код
Код:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <conio.h>


struct list {
  int data;
  struct list * next;
};

typedef struct stack 
{ 
  struct list *top; 
} Stack;

void makenull (Stack  *S)
{  
  struct list *p;
  while (S->top)
  {
    p = S->top;
    S->top = p->next;
    delete(p);
  } 
}

void create (Stack *S)
{  
  S->top = NULL;
}

int top (Stack *S)
{
  if (S->top)
    return (S->top->data);
  else 
    return 0; 
}

int pop(Stack *S)
{
  int a;
  struct list *p;
  p = S->top;
  a = p->data;
  S-> top = p->next;
  delete(p);
  return a;
}

void push(int a, Stack *S)
{
  struct list *p;
  p = new struct list;
  p->data = a;
  p->next = S-> top;
  S->top = p ;
}


int empty (Stack *S)
{
  return (S->top == NULL);
}

int major(char o)
{
  if ((o=='+') || (o=='-'))
    return 2;
  
  else if ((o=='(') || (o==')'))
    return 1;
  
  else if ((o=='*') || (o=='/'))
    return 3;
}

int major(Stack *o)
{
  if ((o->top->data=='+') || (o->top->data=='-'))
    return 2;

  else if ((o->top->data=='(') || (o->top->data==')'))
    return 1;
  
  else if ((o->top->data=='*') || (o->top->data=='/'))
    return 3;
}

void main()
{
  Stack * S = new Stack;
  create(S);

  int k=0;
  char x;
  char s_in[256]={0}, s_out[256]={0};
  scanf("%s", &s_in);
  int len = strlen(s_in);
  for (int i=0; i<len; i++)
  {
    x=s_in[i];

    if ((x!='+')&&(x!='-')&&(x!='*')&&(x!='/')&&(x!='(')&&(x!=')')&&(x!=' '))
    {
      s_out[k++]=x;
      if ((s_in[i+1]=='+')||(s_in[i+1]=='-')||(s_in[i+1]=='*')||(s_in[i+1]=='/')||(s_in[i+1]=='(')||(s_in[i+1]==')')||(s_in[i+1]==' '))
      {
        s_out[k++]=' ';
      }
    }  
    else if (x=='(')
      push(x, S);

    else if ((x=='+')||(x=='-')||(x=='*')||(x=='/')&&(x!='(')&&(x!=')'))
    {
      while ((empty(S)!=1)&&(major(S)>=major(x)))
        s_out[k++]=pop(S); 

      push(x,S);
    }
    else if (x==')')
    {
      while (S->top->data!='(')
        s_out[k++] = pop(S);
      
      pop(S);
    }
    
  }
  if (empty(S)!=1)
  {
    while (empty(S)!=1)
      s_out[k++]=pop(S); 
    
    s_out[k++]=' ';
  }

  std::cout<<s_out;
  makenull(S);

  char b[256]={0}; int l=0;

  int len2 = strlen(s_out);
  for (int i=0; i<len2; i++)
  {
    x = s_out[i];
    if ((x!='+')&&(x!='-')&&(x!='*')&&(x!='/')&&(x!=' '))
    {
      b[l++]=x;

      if ((s_out[i+1]=='+')||(s_out[i+1]=='-')||(s_out[i+1]=='*')||(s_out[i+1]=='/')||(s_out[i+1]==' ')||(s_out[i+1]==0))
      {
        push(atoi(b), S);
        *(b)=0; l=0;
      }
      
    }
    else if ((x=='+')||(x=='-')||(x=='*')||(x=='/'))
    {
      int m=0;
      switch (x)
      {
      case '+': m=pop(S)+pop(S);
        break;
      case '-': m=pop(S)-pop(S);
        break;
      case '/': m=pop(S)/pop(S);
        break;
      case '*': m=pop(S)*pop(S);
        break;
      }

      push(m, S);
    }
  }

  if (empty(S)!=1)
  {
    std::cout <<"="<<S->top->data;
  }
  makenull(S);
  getch();
}

Конкретный код вычисления выражения
Код:
char b[256]={0}; int l=0;

  int len2 = strlen(s_out);
  for (int i=0; i<len2; i++)
  {
    x = s_out[i];
    if ((x!='+')&&(x!='-')&&(x!='*')&&(x!='/')&&(x!=' '))
    {
      b[l++]=x;

      if ((s_out[i+1]=='+')||(s_out[i+1]=='-')||(s_out[i+1]=='*')||(s_out[i+1]=='/')||(s_out[i+1]==' ')||(s_out[i+1]==0))
      {
        push(atoi(b), S);
        *(b)=0; l=0;
      }
      
    }
    else if ((x=='+')||(x=='-')||(x=='*')||(x=='/'))
    {
      int m=0;
      switch (x)
      {
      case '+': m=pop(S)+pop(S);
        break;
      case '-': m=pop(S)-pop(S);
        break;
      case '/': m=pop(S)/pop(S);
        break;
      case '*': m=pop(S)*pop(S);
        break;
      }

      push(m, S);
    }
  }

  if (empty(S)!=1)
  {
    std::cout <<"="<<S->top->data;
  }
Не могу найти что не так.
Заранее спасибо!
дотнет вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
пример вычисления математического выражения portible C# (си шарп) 1 20.09.2012 07:25
составить программу вычисления выражения Al'f!ra Паскаль, Turbo Pascal, PascalABC.NET 2 22.05.2012 16:02
Построение дерева из постфиксного арифметического выражения. (Pascal[консольный режим Delphi]) [COOLER] Помощь студентам 0 26.02.2012 00:54
Исправтье программу вычисления выражения? unnoder Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 30.05.2011 06:22