2010-12-02 2 views
0

Я ужасно новичок в программировании на С. Я наткнулся на несколько ответов. Некоторые используют старый синтаксис.Дерево выражений программирования C для постфикса к решению с использованием строк, считанных из файла

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

Текстовый файл будет выглядеть примерно так:

6   #this is the number ofcontainters 
1 + 3 4  # it's no_operation_if op!=v then read value of nos mention 
2 + 5 6 
3 v 2.1 
4 v 2.4 
5 v 3.5 
6 v 1.5 

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

Несколько предложений относительно того, как я это сделаю, используя структуру, массивы и союзы . Нам уже предоставили формат создания struct opnode, vnode и их объединение. Массивная часть Я не знаю, как перейти от чтения к самому массиву. C такой странный по сравнению с java с этого момента.

[EDIT]

К сожалению, я забыл упомянуть, что это домашнее задание ... больше не постфикс к инфиксу. Это постфикс для решения уравнения.

Без предварительного знания синтаксиса и использования для объектно-ориентированного программирования Я не знаю, как редактировать.

#include <stdio.h> 
#include<stdlib.h> 
#define MAXLENGTH 512 

/* Codes by DocM 
* struct opnode, vnode, union 
*/ 

struct opnode{ 
char operator 
int loperand; 
int roperand; 
}; 
struct vnode { 
char letterv; 
double value; 
}; 
union { 
struct opnode op; 
struct vnode val; 
} nodes[100]; 

/*node[2].op.loperand 
*node[6].val.value 
*/ 

/* Это читает строку ввода текстового файла в терминале * Затем команды текстовый файл можно прочитать * и т.д. * и все остальное на самом деле */

int main() 
{ 
char text[MAXLENGTH]; 
fputs("enter some text: ", stdout); 
fflush(stdout); 

int i = 0; 
int f = 0; 

if (fgets(text, sizeof text, stdin) != NULL) 
{ 
    FILE *fn; 
    fn = fopen(text, "r"); 
} 

    /* The code below should be the body of the program 
* Where everything happens. 
*/ 


fscanf (text, "%d", &i); 
int node[i]; 

for(int j = 0; j<i;j++) 
{ 
    int count = 0; 
    char opt[MAXLENGTH]; 
    fscanf(text,"%d %c", &count, &opt); 
    if(opt == -,+,*,) 
    { 
     fscanf(text,"%d %d", &node[j].op.loperand,&node[j].op.roperand); 
     node[j].op,operator = opt; 
    } 
    else 
    { 
     fscanf(text, "%lf", &node[j].val.value); 
    } 
    fscanf(text,"%lf",&f); 
} 
evaluate(1); 
return 0; 
} 

/* Code (c) ADizon below 
* 
*/ 

double evaluate(int i) 
{ 
if(nodes[i].op.operator == '+' | '*' | '/' | '-') 
{ 
    if (nodes[i].op.operator == '+') 
    return evaluate(nodes, nodes[i].op.loperator) + evaluate(nodes[i].op.roperator); 
    if (nodes[i].op.operator == '*') 
    return evaluate(nodes, nodes[i].op.loperator) * evaluate(nodes[i].op.roperator); 
    if (nodes[i].op.operator == '/') 
    return evaluate(nodes, nodes[i].op.loperator)/evaluate(nodes[i].op.roperator); 
    if (nodes[i].op.operator == '-') 
    return evaluate(nodes, nodes[i].op.loperator) - evaluate(nodes[i].op.roperator); 
} 
else 
{ 
    printf nodes[i].val.value; 
    return nodes[i].val.value; 
} 

} 
+1

Это домашнее задание? В этом случае он должен быть помечен как таковой. – unwind 2010-12-02 08:41:04

+0

Технически, поскольку операции выполняются перед значениями, это не постфикс, это префикс, а также польская нотация. – JeremyP 2010-12-02 10:09:47

ответ

1

Я думаю, основная алгоритм должен быть:

  • Прочитать кол-во для количества строк (не уверен, почему это необходимо, было бы проще просто продолжайте читать до тех пор, пока там входных данных, при условии, но все)
  • Для каждой ожидаемой линии:
    • Разбираем из ожидаемых четырех суб-строки
    • Игнорируйте первое, что кажется бессмысленным номер_строки
    • распечатайте подстрок в перемешиваются с целью создания «инфикс» смотреть
  • быть сделано

Я не унд выдержать роль оператора «v», возможно, вам следует уточнить эту часть.

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