Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1147 connectés 

  FORUM HardWare.fr
  Programmation
  C

  probleme structure chaine de caracteres

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

probleme structure chaine de caracteres

n°1359032
picsou42
Posté le 03-05-2006 à 20:53:30  profilanswer
 

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
mood
Publicité
Posté le 03-05-2006 à 20:53:30  profilanswer
 

n°1359035
Trap D
Posté le 03-05-2006 à 21:09:24  profilanswer
 

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

  • son évaluation
  • son écriture en infixe  

C'est ça ?

n°1359038
picsou42
Posté le 03-05-2006 à 21:14:52  profilanswer
 

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

n°1359057
Trap D
Posté le 03-05-2006 à 22:14:30  profilanswer
 

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
n°1359074
picsou42
Posté le 03-05-2006 à 22:34:59  profilanswer
 

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?

n°1359218
Trap D
Posté le 04-05-2006 à 09:31:57  profilanswer
 

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.

n°1359333
picsou42
Posté le 04-05-2006 à 11:09:36  profilanswer
 

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.

n°1359447
Elmoricq
Modérateur
Posté le 04-05-2006 à 12:45:22  profilanswer
 

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
n°1359600
franceso
Posté le 04-05-2006 à 14:21:30  profilanswer
 

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
n°1359608
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-05-2006 à 14:26:04  profilanswer
 

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/
mood
Publicité
Posté le 04-05-2006 à 14:26:04  profilanswer
 

n°1359611
franceso
Posté le 04-05-2006 à 14:29:59  profilanswer
 

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
n°1360655
Sve@r
Posté le 05-05-2006 à 19:05:04  profilanswer
 

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.
n°1360660
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-05-2006 à 19:24:17  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  probleme structure chaine de caracteres

 

Sujets relatifs
[OpenGl] Problème actualisation du tampon de profondeurProblème de récupération de variable
probleme javascript avec un divProbleme BDD
probleme vba excel TRES FACILE[Javascript] Problème de champ.focus.
Tableau de structureprobleme d'id pour cree un forum php
Problème .obj[C] [Debutant] Petit problème avec un programme tout bete
Plus de sujets relatifs à : probleme structure chaine de caracteres


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR