Я ужасно новичок в программировании на С. Я наткнулся на несколько ответов. Некоторые используют старый синтаксис.Дерево выражений программирования 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;
}
}
Это домашнее задание? В этом случае он должен быть помечен как таковой. – unwind 2010-12-02 08:41:04
Технически, поскольку операции выполняются перед значениями, это не постфикс, это префикс, а также польская нотация. – JeremyP 2010-12-02 10:09:47