probleme structure chaine de caracteres

probleme structure chaine de caracteres - C - Programmation

Marsh Posté le 03-05-2006 à 20:53:30    

slt tlm,
alors voila je suis pas très doué en langage c autant vous le dire tout de suite.
et la j'ai un probleme. J'ai creer une structure  
 

Code :
  1. struct Element_
  2. {
  3.        int valeur;
  4.        char* expression;
  5. };
  6. typedef struct Element_* Element;


et je voudrais effectuer des opérations dessus en fait.
Donc voici ma fonction de calcul:
 

Code :
  1. Element calcul(Element a, Element b, char op)
  2. {
  3. Element a = malloc(sizeof (struct Element_));
  4. Element b = malloc(sizeof (struct Element_));     
  5. Element c = malloc(sizeof (struct Element_));
  6.        ;
  7.      
  8. switch(op)
  9.     {
  10.            case '+':
  11.                 c->valeur=a->valeur+b->valeur;
  12.                 c->expression=a->expression+b->expression;
  13.                 return c;
  14.                 break;
  15.     }
  16. }


/*(oui j'ai mis seulement le cas +)*/
 

Code :
  1. int main()
  2. {
  3. int i;
  4.     char op;
  5.         scanf("%d %d %c",&a->valeur,&b->valeur,&op);
  6. a->expression=a->valeur;  /* je voudrais initialiser l'expression à la valeur de l'element.*/
  7. b->expression=b->valeur;
  8. printf("%d\n",c->valeur);
  9. printf("%s\n",c->expression);
  10. return 0;
  11. }


Moi ce que je voudrais c'est lorsque je rentre 3 4 +,
ca me retourne
7
3 + 4.
 
Voila. Je sais qu'il y a du boulot, qu'il y a des problemes de conversion de types, de concaténation de chaines, mais la ca m'enerve je ne sais plus par quel bout commencer. J'ai donc besoin d'aide.
 
Merci d'avance

Message cité 1 fois
Message édité par picsou42 le 03-05-2006 à 20:58:25
Reply

Marsh Posté le 03-05-2006 à 20:53:30   

Reply

Marsh Posté le 03-05-2006 à 21:09:24    

En gros, tu rentres une expression postfixée, et tu veux obtenir

  • son évaluation
  • son écriture en infixe  

C'est ça ?

Reply

Marsh Posté le 03-05-2006 à 21:14:52    

non pas forcément je peux rentrer aussi l'inverse.
En fait je veux que mon élement soit décrit par sa valeur et par l'expression qui a permi d'aboutir à la valeur. Mais je pense que j'utiliserai les expressions post fixées pour travailler

Reply

Marsh Posté le 03-05-2006 à 22:14:30    

Moi je partirai sur une représentation en mémoire de ce genre pour 4 7 - 6 +
 
      +
     / \
    /   \
   -    6
  / \
 /   \
4    7
 
J'ai donc besoin de ce genre de définition :
 
// définition du type de noeud
typedef enum {valeur, operateur} t_noeud;
 
// Déclaration du data du noeud
typedef struct  
{
  t_noeud type;
  union
  {
     // l'opérateur est codé par son signe habituel '+' '-' '*' '/'  
     char operateur;
     // on se limite aux entiers
     int valeur;
  };
} data_noeud;
 
 
// déclaration d'un noeud de l'arborescence
typedef struct noeud
{
 data_noeud noeud;
 struct noeud *gauche;
 struct noeud *droite;
} noeud;
 
Le plus simple est de lire en postfixé et de construire l'arbre en utilisant une pile.
Après l'écriture de l'expression et son évaluation ne présentent pas de difficultés, c'est plus coton pour lire en infixe.
 
Il faut aussi écrire un analyseur syntaxique pour dire si on a lu un opérateur ou un nombre.


Message édité par Trap D le 03-05-2006 à 22:16:13
Reply

Marsh Posté le 03-05-2006 à 22:34:59    

mais en fait ce que je voudrais qu'on me corrige c'est ma syntaxe. Parce que j'arrive pas a executer tout le programme. Il buggue. L'algo de postfixé je l'ai c'est pas un probleme.
Mais ma syntaxe doit etre fausse.
Comme par exemple a-t-on le  droit d'ecrire a->expression=a->valeur.??Si non comment dois je faire?

Reply

Marsh Posté le 04-05-2006 à 09:31:57    

a-t-on le  droit d'ecrire a->expression=a->valeur.??
Ben non puisque a->valeur est de type int, et a->expression est de type pointeur de caractères.
 
Il faut vraiment que tu te plonges dans l'évaluation des expressions arithmétiques, sinon tu vas bricoler sans arriver à rien.

Reply

Marsh Posté le 04-05-2006 à 11:09:36    

en fait ca je le sais que c'est pas du meme type. Mais comment puis je faire alors pour initialiser mon expression à sa valeur.
Car la premiere fois ma valeur et mon expression seront la meme chose.

Reply

Marsh Posté le 04-05-2006 à 12:45:22    

sprintf()
 
 
et +1 Trap D, assure-toi de maîtriser les aspects du langage que tu t'apprètes à utiliser.


Message édité par Elmoricq le 04-05-2006 à 12:45:40
Reply

Marsh Posté le 04-05-2006 à 14:21:30    

Citation :

Code :
  1. c->expression=a->expression+b->expression;



fais attention, les manipulations de chaines de caractères ne sont pas aussi simples que ça. Renseigne-toi sur la gestion des chaines de caractères en C. En particulier, strcat(), strlen(), strcpy(), ... pourraient t'être utiles. Toutes ces fonctions sont déclarées dans le fichier d'en-tête <string.h>
 
+1 Trap D pour l'utilisation d'arbres dans ce type de problèmes.
 
 
EDIT: prise en compte des remarques d'Emmanuel

Message cité 1 fois
Message édité par franceso le 04-05-2006 à 14:30:39

---------------
TriScale innov
Reply

Marsh Posté le 04-05-2006 à 14:26:04    

franceso a écrit :

Toutes ces fonctions sont définies dans le fichier d'en-tête string.h


Pas définies. Déclarées... Et c'est <string.h>.
 
http://mapage.noos.fr/emdel/notes.htm#definitions


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-05-2006 à 14:26:04   

Reply

Marsh Posté le 04-05-2006 à 14:29:59    

Emmanuel Delahaye a écrit :

Pas définies. Déclarées... Et c'est <string.h>

Effectivement ; autant utiliser les termes exacts...
 
Merci pour la correction :jap:


---------------
TriScale innov
Reply

Marsh Posté le 05-05-2006 à 19:05:04    

picsou42 a écrit :

Code :
  1. struct Element_
  2. {
  3.        int valeur;
  4.        char* expression;
  5. };
  6. typedef struct Element_* Element;



Tu devrais essayer de nommer tes structures "s_qqchose" et tes types "t_qqchose". Ca rendra le code plus lisible, t'évitera de mettre des "_" inutiles et te permettra d'utiliser le token "Element" pour un nom de variable.

Code :
  1. struct s_Element
  2. {
  3.        int valeur;
  4.        char* expression;
  5. };
  6. typedef struct s_Element* t_Element;


 
Par ailleurs, je sais pas si c'est bien propre de masquer l'étoile dans le nom du type (Emmanuel ?)
 

picsou42 a écrit :

Code :
  1. c->expression=a->expression+b->expression;



Je présume que tu voudrais concaténer dans "c->expression" une chaîne issue des deux chaînes "a->expression" et "b->expression". Bon, avant de tenter de remplir "c->expression" avec quoi que ce soit, t'es-tu rendu compte que tu vas remplir un pointeur pointant vers une zone de la mémoire que tu ne connais pas. Peut-être qu'à cet endroit tu as des variables utiles au programme... mais hop, on les écrase.
 
Soit tu définis le membre "expression" comme un tableau de caractères suffisamment grand pour contenir l'ensemble des expressions qui vont y aller (c'est pas évident vu que tu ne sais pas à l'avance ce qui va s'y accumuler); soit tu alloues de la mémoire à "expression" (malloc) avant d'y mettre quoi que ce soit.
 
Quand on manipules des pointeurs (style "type *pt" ), il ne faut jamais toucher à "*pt" sans avoir écrit auparavant "pt=<qqchose>"; le "qqchose" étant une instruction garantissant que "pt" contiendra une adresse valide pour qu'on puisse travailler avec ce qu'il y a à cette adresse ("*pt" ).


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 05-05-2006 à 19:24:17    

Sve@r a écrit :

Code :
  1. struct s_Element
  2. {
  3.        int valeur;
  4.        char* expression;
  5. };
  6. typedef struct s_Element* t_Element;


 
Par ailleurs, je sais pas si c'est bien propre de masquer l'étoile dans le nom du type (Emmanuel ?)
 


Je le déconseille...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed