0

私は 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 に比べて非常に奇妙です。

[編集]

申し訳ありませんが、これは宿題であることを忘れていました... infixへの後置ではなくなりました。方程式を解くのは後置です。

構文の事前知識がなく、オブジェクト指向プログラミングに慣れていないため、編集方法がわかりません。

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

}
4

1 に答える 1

1

基本的なアルゴリズムは次のようになるはずです。

  • 行数のカウントを読み取ります (なぜこれが必要なのかはわかりません。indata が提供されている限り、読み取り続ける方が簡単ですが、何でも)
  • 予想される行ごとに:
    • 予想される 4 つの部分文字列を解析する
    • 無意味な行番号のように見える最初のものを無視します
    • シャッフルされた順序で部分文字列を出力して、「中置」の外観を作成します
  • 終わり

「v」演算子に関する部分がわかりません。その部分を明確にする必要があるかもしれません。

これは、やみくもにコードを投稿するには宿題のように思えます...少なくとも、最初に自分の試みを示す必要があります。

于 2010-12-02T08:31:33.623 に答える