Security-X

Forum Security-X => Programmation => Discussion démarrée par: sayce le février 29, 2012, 18:09:54

Titre: ASCII et nombres en mémoire :p
Posté par: sayce le février 29, 2012, 18:09:54
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 :

typedef struct
{
int ope;
int valeur;
} Terme;

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 )

Que l'on copie ensuite dans un tableau de int on obtient ainsi l'expression postfixé :

Citer
Expression postfixee :
   5 5 42
               
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 :

typedef struct pile
{
Terme element;
struct pile *suivant;
} Pile;

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

Puis :

Citer
Expression postfixee :
   42 2 42

++
Titre: Re : ASCII et nombres en mémoire :p
Posté par: Egwene le mars 01, 2012, 11:21:40
Salut Sayce,

Citer
typedef struct
{
   int ope;
   int valeur;
} Terme;

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 ?

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 ).
Titre: Re : ASCII et nombres en mémoire :p
Posté par: sayce le mars 01, 2012, 13:20:02
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

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 ).

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 ?

Titre: Re : ASCII et nombres en mémoire :p
Posté par: Egwene le mars 01, 2012, 13:30:00
Citer
La pile on l'utilise après, pour le passage en expression postfixée, et pour son calcul

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
Titre: Re : ASCII et nombres en mémoire :p
Posté par: sayce le mars 01, 2012, 13:46:01
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) ;))