2010-12-02 32 views
0

Je suis terriblement nouveau à la programmation en C. Je suis tombé sur quelques réponses. Certains utilisent l'ancienne syntaxe.C programmation arbre d'expression à postfixer à la solution en utilisant des lignes lues dans un fichier

Le problème est que je dois créer un programme pour lire un fichier texte et utiliser les lignes de suffixe en lecture pour convertir en une équation infixe.

Le fichier texte serait quelque chose comme ceci:

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 

Le fichier C sera lu dans le terminal Ubuntu où le fichier texte est la seule entrée et la sortie est la forme infixe.

Quelques suggestions sur la façon dont j'y arriverai en utilisant struct, tableaux et unions. On nous a déjà donné un format de création de struct opnode, vnode, et de les unir. La partie du tableau Je ne sais comment transférer de la lecture au tableau lui-même. C est tellement bizarre par rapport à Java à partir de ce moment.

[EDIT]

Désolé, j'oublié de mentionner que ce travail à domicile ... plus postfix à infix. C'est postfix pour résoudre l'équation.

Sans connaissance préalable de la syntaxe et utilisé pour la programmation orientée objet je ne sais pas comment éditer.

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

/* Cette lit entrée de chaîne de fichier texte dans le terminal * commande ensuite le fichier texte soit lu * etc. * et tout le reste en fait */

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

Est-ce ce devoir? Il devrait être étiqueté comme tel, dans ce cas. – unwind

+0

Techniquement, puisque les opérations viennent avant les valeurs, ce n'est pas un suffixe, c'est le préfixe, la notation polonaise. – JeremyP

+0

Pourquoi voudriez-vous utiliser une structure, un tableau ou une union pour cela? Cela ressemble à des devoirs.Un prof idiot a un problème et vous oblige à utiliser des constructions de programmation inutiles pour vous montrer comment les utiliser. Cela me rappelle une question d'interview où l'intervieweur voulait que j'utilise une boucle for mais j'ai trouvé une solution hautement optimisée en utilisant une boucle while et des bitmasks. Après avoir répondu, il m'a demandé: «Savez-vous comment utiliser une boucle for? Comment résoudre ce problème en utilisant une boucle for? Même chose ici. Ce sont les devoirs, n'est-ce pas? – AlastairG

Répondre

1

Je suppose que la base algorithme devrait être:

  • Lire le nombre de lignes (je ne sais pas pourquoi cela est nécessaire, serait plus facile de juste continuer à lire aussi longtemps que il est InData fourni, mais peu importe)
  • Pour chaque ligne prévu:
    • Parse les attendus quatre sous-chaînes
    • Ignore la première, ce qui semble être un linenumber inutile
    • Imprimer les sous-chaînes dans un ordre aléatoire pour créer le « infix » look
  • être fait

Je ne und Pour en savoir plus sur l'opérateur "v", vous devriez peut-être clarifier cette partie.

Cela semble un peu trop comme des devoirs pour nous de juste afficher du code aveuglément ... Vous devez d'abord montrer votre propre tentative, au moins.

+0

J'ai modifié avec un code. Je venais d'utiliser scanf. Plusieurs erreurs avec la syntaxe actuelle dans la compilation. Déclaration? Instanciation? – Ree