Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C, C++, C#] Калькулятор для манипуляции выражений, Программа читающая префиксную форму 
:(
    Опции темы
KatrinIceLand
Дата 18.9.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 16.3.2006

Репутация: нет
Всего: нет



Все привет! Может у кого-нибудь есть программа которая считывает префиксную форму выражения (только числа и операторы: + - *), а выводит инфиксную (скобки имееют значение), префиксную, постфиксную формы и считает сумму выражения. 

Язык может быть: С, С++, С# 
--------------------
[... кто изобрел математику? А зачем?...
PM MAIL   Вверх
KatrinIceLand
Дата 19.9.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 16.3.2006

Репутация: нет
Всего: нет



Ну вот программа почти готова, но ошибка во время компиляции, со стаком связанная вылезает  smile 
Может посмотрите, что не так. 

И еще программа должна спрашивать ввести выражение в префиксном виде и манипулировать это выражение и вывести в разных формах.
Код

#include "stdafx.h"
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <ctype.h>  
   
#define MAX 10  
#define EMPTY -1  

struct node  
{  
char kind;  
char op;  
int number;  
struct node *left,*right;  
};  
     
   struct stack  
   {  
       struct node *data[MAX];  
       int top;  
   };  
     
   int isempty(struct stack *s)  
   {  
       return (s->top == EMPTY) ? 1 : 0;  
   }  
     
   void emptystack(struct stack* s)  
   {  
       s->top=EMPTY;  
   }  
     
   void push(struct stack* s, struct node *item)  
   {  
       if(s->top == (MAX-1))  
       {  
           printf("\nSTACK FULL");  
       }  
       else  
       {  
           ++s->top;  
           s->data[s->top]=item;  
     
       }  
   }  
     
   struct node* pop(struct stack* s)  
   {  
       struct node *ret=NULL;  
       if(!isempty(s))  
       {  
           ret= s->data[s->top];  
           --s->top;  
       }  
       return ret;  
   }  
     
   void postfix2exptree(char* postfix, struct node **root)  
   {  
       struct stack X;  
       struct node *newnode,*op1,*op2;  
       char numberextract[5];  
       char *p;  
     
       emptystack(&X);  
       p = &postfix[0];  
       strcpy(numberextract,"");  
       while(*p)  
       {  
     
           while(*p == ' ' || *p == '\t')  
           {  
               p++;  
           }  
     
           if(isdigit(*p))  
           {  
               while(isdigit(*p))  
               {  
                   strcat(numberextract,p);  
                   p++;  
               }  
     
               newnode = (struct node*)malloc(sizeof(struct node));  
               newnode->kind = 'N';  
               newnode->number = atoi(numberextract);  
               newnode->left = NULL;  
               newnode->right = NULL;  
               push(&X,newnode);  
               strcpy(numberextract,"");  
           }  
           else  
           {  
               op1 = pop(&X);  
               op2 = pop(&X);  
               newnode = (struct node*)malloc(sizeof(struct node));  
               newnode->kind = 'O';  
               newnode->op = *p;  
               newnode->left = op2;  
              newnode->right = op1;  
              push(&X,newnode);  
          }  
          p++;  
      }  
      *root = pop(&X);  
  }  
    
  int evaluatetree(struct node *x)  
  {  
     if( x->kind == 'O' )  
      {  
        int op1 = evaluatetree( x->left );  
        int op2 = evaluatetree( x->right );  
        switch ( x->op )  
          {  
           case '+':  return op1 + op2;  
           case '-':  return op1 - op2;  
           case '*':  return op1 * op2;  
           //case '/':  return op1 / op2;  
           default:   return 0;  
        }  
     }  
      else  
         return (x->number);  
  }  
    
  void inorder(struct node *x)  
  {  
      if(x != NULL)  
      {  
          inorder(x->left);  
    
          if(x->kind == 'O')  
              printf("%c ",x->op);  
          else  
              printf("%d ",x->number);  
    
          inorder(x->right);  
      }  
  }  
    
  void preorder(struct node *x)  
  {  
      if(x != NULL)  
      {  
          if(x->kind == 'O')  
              printf("%c ",x->op);  
          else  
              printf("%d ",x->number);  
    
          preorder(x->left);  
          preorder(x->right);  
      }  
  }  
    
  void postorder(struct node *x)  
  {  
      if(x != NULL)  
      {  
          postorder(x->left);  
          postorder(x->right);  
    
          if(x->kind == 'O')  
              printf("%c ",x->op);  
          else  
              printf("%d ",x->number);  
      }  
  }  
    
  int main()  
  {  
     struct node *r;  
      //printf("Please type the expression: ");
      //scanf ("&s", str);
      postfix2exptree("100 50 - 2 /",&r);  
      printf("Inorder = ");  
      inorder;  
      printf("\nPreorder = ");  
      preorder;  
      printf("\nPostprder = ");  
      postorder;  
      printf("\nResult = %d\n",evaluatetree);  
      return 0;  
  }  
  /* OUTPUT: 
  Inorder = 
  Preorder =  
  Postprder =  
  Result = 
  */  


P.S. Может кому-нибудь эта программа облегчит жизнь  smile 
--------------------
[... кто изобрел математику? А зачем?...
PM MAIL   Вверх
KatrinIceLand
Дата 22.9.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 16.3.2006

Репутация: нет
Всего: нет



Программа почти готова, читает префиксную форму, выводит постфиксную, но почему то не выводится инфиксная форма.. 
Никак не могу понять в чем дело  smile  Есть идеи в чем проблема?
Код

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

static char s[50], i;
static char a[50];

void push(int data) {
    s[i++] = data;
}

char pop() {
    return s[--i];
}

// prefix -> infix
// prefix -> postfix
void prefix() {

    puts("Enter a prefix expression:");
    fgets(a, 50, stdin);
    int a_size = strlen(a);

    puts("Prefix -> Infix:");
    char *token, delim[] = {" \n"}, match[] = {"*+/-"};
    int j = 0, m_size = strlen(match);
    token = strtok(a, delim);
    while (token != NULL) {
        if (isdigit(*token)) {
            printf("%d ", atoi(token));
            if (i >= 0)    printf("%c ", pop());
        }
        else
            while (j < m_size) {
                if (*token == match[j]) {
                    push(*token);
                    break;
                }
                j++;
            }        
        token = strtok(NULL, delim);
        j = 0;
    }

    puts("");
    puts("Prefix -> Postfix:");
    int k = a_size;
    while (k >= 0) {
        if (a[k] == '\0' || a[k] == ' ') k--;
        printf("%c ", a[k--]);
    }
    puts("");
}

void postfix() {
}

void main(void) {

    prefix();

    fflush(stdin);
    
    prefix();
}

--------------------
[... кто изобрел математику? А зачем?...
PM MAIL   Вверх
dolby
Дата 30.9.2008, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.2.2008
Где: Минск

Репутация: нет
Всего: нет



Напомни, что такое инфиксная форма? =)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.2861 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.