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

[0] Index des messages

Sortir du mode mobile