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

Я ужасно новичок в программировании на 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, где текстовый файл является единственным вводом, а вывод - в форме инфикса.

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

[РЕДАКТИРОВАТЬ]

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

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

#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;
}

}

person Ree    schedule 02.12.2010    source источник
comment
Это домашнее задание? В этом случае он должен быть помечен как таковой.   -  person unwind    schedule 02.12.2010
comment
Технически, поскольку операции идут перед значениями, это не постфикс, а префикс, также известный как польская нотация.   -  person JeremyP    schedule 02.12.2010
comment
Почему вы хотите использовать для этого структуру, массив или объединение? Это похоже на домашнее задание. Какой-то тупой учитель придумывает проблему, а затем заставляет вас использовать ненужные конструкции программирования только для того, чтобы показать, что вы знаете, как их использовать. Напоминает мне вопрос на собеседовании, где интервьюер хотел, чтобы я использовал цикл for, но я придумал высокооптимизированное решение с использованием цикла while и некоторых битовых масок. После того, как я ответил, он спросил, знаете ли вы, как использовать цикл for? Как бы вы решили это, используя цикл for? Здесь такая же сделка. Это домашнее задание, не так ли?   -  person AlastairG    schedule 02.12.2010


Ответы (1)


Я предполагаю, что основной алгоритм должен быть таким:

  • Прочитайте количество строк (не уверен, почему это необходимо, было бы проще просто продолжать чтение до тех пор, пока есть предоставленные данные, но что угодно)
  • For each expected line:
    • Parse out the expected four sub-strings
    • Игнорируйте первый, который кажется бессмысленным номером строки
    • Распечатайте подстроки в перемешанном порядке, чтобы создать «инфиксный» вид
  • Готово

Я не понимаю часть об операторе "v", может быть, вам следует пояснить эту часть.

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

person unwind    schedule 02.12.2010
comment
Я редактировал кодом. Я только что использовал scanf. Несколько ошибок с реальным синтаксисом при компиляции. Декларация? Создание? - person Ree; 03.12.2010