繁体   English   中英

C编程表达式树,用于使用从文件读取的行后缀到解决方案

[英]C programming expression tree to postfix to solution using lines read from a file

我是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并将它们组合在一起的格式。 数组部分我一无所知,如何从读取转移到数组本身。 到目前为止,与Java相比,C太奇怪了。

[编辑]

抱歉,我忘了提到这是家庭作业……不再是后缀。 它是方程式的后缀。

没有语法的先验知识并且习惯于面向对象的编程,我不知道如何编辑。

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

}

我猜基本算法应该是:

  • 读取行数的计数(不确定为什么这样做是必要的,只要提供了indata就会更容易保持读取状态,但是无论如何)
  • 对于每个预期行:
    • 解析预期的四个子字符串
    • 忽略第一个,这似乎是毫无意义的行号
    • 按混排顺序打印出子字符串,以创建“中缀”外观
  • 完成

我不了解有关“ v”运算符的部分,也许您应该对此部分进行澄清。

对于我们来说,盲目地编写代码似乎有点像家庭作业……至少您需要首先展示自己的尝试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM