C программирование дерева выражений для постфикса к решению с использованием строк, прочитанных из файла - PullRequest
0 голосов
/ 02 декабря 2010

Я ужасно новичок в программировании на Си. Я наткнулся на несколько ответов. Некоторые используют старый синтаксис.

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

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

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, массивы и объединения. Нам уже был предоставлен формат создания 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 Ответ

1 голос
/ 02 декабря 2010

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

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

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

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

...