Forum Security-X > Programmation
ASCII et nombres en mémoire :p
(1/1)
sayce:
Inauguration 8-)
Yop :)
Voila, j'ai un petit problème.
On doit faire un programme qui transforme une expression de ce type : (5*5) en 5 5 * c'est à dire en expression postifixée.
Ainsi l'user entre ceci par exemple : (5*5)
On l'enregistre dans un tableau de char
Ensuite on copie cette chaine dans un tableau de Terme, structure définie de cette façon :
--- Code: ---typedef struct
{
int ope;
int valeur;
} Terme;
--- Fin du code ---
Ainsi, on aura :
--- Citer ---Affichage du tableau de Terme :
Indice : 0 Valeur : 40 << Code ASCII de (
Indice : 1 Valeur : 5 << Nombre 5 réel
Indice : 2 Valeur : 42 << Code ASCII de *
Indice : 3 Valeur : 5 << Nombre 5 réel
Indice : 4 Valeur : 41 << Code ASCII de )
--- Fin de citation ---
Que l'on copie ensuite dans un tableau de int on obtient ainsi l'expression postfixé :
--- Citer ---Expression postfixee :
5 5 42
--- Fin de citation ---
Donc 2 fois le chiffre 5 réel, et le ASCII de *
Pour finir il faut faire le calcul. On utilise donc une structure pile :
--- Code: ---typedef struct pile
{
Terme element;
struct pile *suivant;
} Pile;
--- Fin du code ---
Mon problème est donc
Comment, reconnaître en mémoire, le code ASCII de '*' par exemple et le nombre 42 ?
:)
Je vous remercie ;)
C'est embêtant car sa me génère une SF :p
En effet en tapant : (42*2) on a :
--- Citer ---Affichage du tableau de Terme :
Indice : 0 Valeur : 40
Indice : 1 Valeur : 42 << Nombre
Indice : 2 Valeur : 42 << ASCII
Indice : 3 Valeur : 2
Indice : 4 Valeur : 41
--- Fin de citation ---
Puis :
--- Citer ---Expression postfixee :
42 2 42
--- Fin de citation ---
++
Egwene:
Salut Sayce,
--- Citer ---typedef struct
{
int ope;
int valeur;
} Terme;
--- Fin de citation ---
C'est imposé par le sujet ? Parce que sinon pour résoudre ce genre de problème, le mieux c'est d'utiliser une pile :)
En plus pas besoin d'un int pour stocker l'opérateur.
Enfin tableau de char, puis tableau de int, c'est pas très opti toussa :D
--- Citer ---Comment, reconnaître en mémoire, le code ASCII de '*' par exemple et le nombre 42 ?
--- Fin de citation ---
Ben apriori tu peux pas :QQQ avec ta méthode.
Regarde donc du côté de la structure de données de la pile et vois si tu peux résoudre ton problème avec (tu peux :NNN ).
sayce:
Yop Eg :)
Merci de ta réponse ;)
--- Citer ---C'est imposé par le sujet ? Parce que sinon pour résoudre ce genre de problème, le mieux c'est d'utiliser une pile
--- Fin de citation ---
Ouép :). La pile on l'utilise après, pour le passage en expression postfixée, et pour son calcul :)
C'est au moment du calcul que la SF arrive :)
--- Citer ---Regarde donc du côté de la structure de données de la pile et vois si tu peux résoudre ton problème avec (tu peux :NNN ).
--- Fin de citation ---
Le problème c'est comment est géré l'empilage/désempilage dans la pile donc ?
En le modifiant, je peux virer ce problème ?
Egwene:
--- Citer ---La pile on l'utilise après, pour le passage en expression postfixée, et pour son calcul
--- Fin de citation ---
Il me semble que ce que tu cherches à faire c'est passer en expression postfixée non ?
Ah ton problème c'est peut-être parser les expressions arithmétiques que tu reçois en entrée de ton programme ? Et pour cela ton prof t'as demandé d'utiliser une certaine méthode ?
Fais un lexer :QQQ
sayce:
Re
parser ? un lexer ? C'est quoi ? :P ::)
En fait ça me fait un SF, car quant je rentre (42*2)
La tableau de terme contient 40, 42, 42, 2, 41
Le tableau de int contenant l'expression postfixé contient : 42 2 42
Pour le calcul il est nécessaire de faire la différence entre un opérateur et un chiffre/nombre.
Hors la entre 42 et '*' il ne peut pas.
Du coup quand il lit le 1er 42 qui est un chiffre il le prend pour l'opérateur '*' et tente de dépiler la pile 2 fois de suite (ce qui est normal, car quand il lit un opérateur il dépile 2 fois, et empile le résultat de l'opération entre les 2 opérandes et l'opérateur) hors il n'y a qu'une valeur dans la pile du coup il tente d'accèder à une partie de la mémoire qui est inexistante (je pense) ;))
Navigation
Sortir du mode mobile