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, където текстовият файл е единственият вход, а изходът е инфикс формата.

Няколко предложения за това как ще постигна това с помощта на struct, arrays и unions. Вече ни беше даден формат за създаване на struct 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
    • Игнорирайте първия, който изглежда безсмислен номер на ред
    • Разпечатайте поднизовете в разбъркан ред, за да създадете "infix" вида
  • Бъдете готови

Не разбирам частта за оператора "v", може би трябва да изясните тази част.

Това изглежда твърде много като домашна работа за нас, за да публикуваме сляпо код ... Трябва първо да покажете собствения си опит.

person unwind    schedule 02.12.2010
comment
Редактирах с код. Току-що бях използвал scanf. Няколко грешки с действителния синтаксис при компилация. Декларация? Инстанция? - person Ree; 03.12.2010