2010-12-02 4 views
0

Ich bin schrecklich neu bei C-Programmierung. Ich bin auf ein paar Antworten gestoßen. Einige verwenden die alte Syntax.C Programmierung Ausdruck Baum zu Postfix zu Lösung mit Zeilen aus einer Datei lesen

Das Problem ist, ich muss ein Programm erstellen das wird eine Textdatei lesen und verwenden Sie die Postfix-Zeilen lesen, um in eine Infix-Gleichung zu konvertieren.

Die Textdatei so etwas wie dies würde:

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 

Die C-Datei wird in dem Ubuntu-Terminal gelesen werden, wenn die Textdatei der einzige Eingang und der Ausgang ist die Infix Form.

Ein paar Vorschläge, wie ich dies mit Struct, Arrays und Unionen erreichen werde. Uns wurde bereits ein Format zum Erstellen von Struct Opnode, Vnode und deren Vereinigung gegeben. Der Array-Teil Ich bin ratlos, wie man vom Lesen zum Array selbst überträgt. C ist so seltsam im Vergleich zu Java ab diesem Moment.

[EDIT]

Leider habe ich vergessen zu erwähnen, dass diese Hausaufgaben ist ... nicht mehr Postfix Infix. Es ist Postfix, um die Gleichung zu lösen.

Ohne vorherige Kenntnisse der Syntax und verwendet, um objektorientierte Programmierung Ich weiß nicht, wie zu bearbeiten.

#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 
*/ 

/* Dieser liest Textdatei String-Eingang in Terminal * Dann befiehlt die Textdatei * usw. * und alles andere eigentlich */

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

Sind das Hausaufgaben? Es sollte in diesem Fall als solches markiert werden. – unwind

+0

Technisch, da die Operationen vor den Werten stehen, das ist kein Postfix, wird das Präfix auch als polnische Notation bezeichnet. – JeremyP

+0

Warum möchten Sie eine Struktur, ein Array oder eine Union dafür verwenden? Das sieht nach Hausaufgaben aus.Ein dummer Lehrer kommt mit einem Problem und zwingt Sie dann, unnötige Programmierkonstrukte zu verwenden, nur um Ihnen zu zeigen, wie Sie sie benutzen können. Erinnert mich an eine Interviewfrage, bei der der Interviewer wollte, dass ich eine for-Schleife benutze, aber ich kam mit einer while-Schleife und einigen Bitmasken zu einer hochoptimierten Lösung. Nachdem ich geantwortet hatte, fragte er: "Weißt du, wie man eine for-Schleife benutzt? Wie würdest du das mit einer for-Schleife lösen?" Gleicher Deal hier. Das sind Hausaufgaben, oder? – AlastairG

Antwort

1

ich die Grund erraten gelesen werden Algorithmus sollte sein:

  • Lesen Sie die Anzahl für die Anzahl der Zeilen (nicht sicher, warum dies notwendig ist, wäre einfacher zu einfach halten so lange lesen, wie es ist indata Verfügung gestellt, aber was auch immer)
  • Für jede erwartete Linie:
    • parsen die erwarteten vier Unterketten
    • die erste ignorieren, die eine sinnlose Zeilennummer zu sein scheint
    • Druck aus dem Teil in einem neu gemischt, um die "Infix"
  • Be

ich nicht und fertig aussehen zu schaffen den Teil über den "v" Operator, vielleicht solltest du diesen Teil klären.

Das scheint ein bisschen zu viel wie Hausaufgaben für uns, nur blind Code zu posten ... Sie müssen zuerst Ihren eigenen Versuch zeigen, zumindest.

+0

Ich habe mit einem Code bearbeitet. Ich hatte gerade scanf benutzt. Mehrere Fehler mit der tatsächlichen Syntax beim Kompilieren. Erklärung? Instantiierung? – Ree