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;
}
}
Est-ce ce devoir? Il devrait être étiqueté comme tel, dans ce cas. – unwind
Techniquement, puisque les opérations viennent avant les valeurs, ce n'est pas un suffixe, c'est le préfixe, la notation polonaise. – JeremyP
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