Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation C » Interpreteur mathematique (5 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Benjy Ecrit le: Mardi 8 février 2005 à 18:36 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


Voila je souhaite faire un interpreteur mathematique et donc geogeo m'a proposer de m'aider. Donc je créer ce post pour en parle.
Le langage C y'a pas mieux!!!
    
./Post n°1   Marquer comme non lu.
Benjy Ecrit le: Mardi 8 février 2005 à 18:37 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


Donc déjà pourrais tu m'expliquer comment faire pour les tags merci.
Le langage C y'a pas mieux!!!
    
./Post n°2   Marquer comme non lu.
geogeo Ecrit le: Mardi 8 février 2005 à 19:09 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Bon j'vais essayer de t'expliquer ça en détails et de façon compréhensibles.
Donc ton objectif est d'interpréter des trucs de ce style:
cos(sin(2pi/52.1e^5)*5+x)

Bon déjà faut ce dire qu'on peut pas interpréteur ça directement, y a plusieurs étapes.
Premièrement il faut penser à créer une structure qui devra nous faciliter la tâche pour gérer les opérations mathématiques...

Moi je propose ceci (à modifier suivant tes besoins).

typdef struct {
  unsigned char pos;
  unsigned char size;
  unsigned char tag;
  unsigned char subtag;
} sStackExpr:


Chaque identité dans ton expression aura cette structure, quand je parle d'identité je parle de nombres, de fonctions (sin et cos dans notre exemple), les parenthèses...

pos = Début de ton identité dans ton expression.
size = Taille de ton identité.
tag = On attribue un TAG à ton identité genre:
   TAG_NUMBER = Pour les nombres.
   TAG_STRING = Pour les chaînes de caractères (préférence ici les fonctions et variables (à mieux définir)).
   TAG_MATH = Opération mathématiques
   TAG_PARENTH_OPEN = Parenthèse ouverte.
   TAG_PARENTH_CLOSE = Parenthèse fermée.

subtag = Donne plus d'infos genre pour ton TAG_MATH:
   SUBTAG_ADD = Addition.
   SUBTAG_SUB = Soustraction.
...


Admettons que ton expression compte au maximum 50 identités, il faudra donc 50 structures sStackExpr. Il faudra donc intialiser tout ça:

unsigned char n_StackExpr = 0; //Compte le nombre d'identités dans ton expression.
sStackExpr *StackExpr [50] = NULL; //Pointeur sur tes 50 structures.
StackExpr = calloc (50, sizeof (sStackExpr); //Allocation mémoire, ne pas oublier free pour effacer cette allocation


Donc nous avons fini la phase d'initalisation où tu as créé tes définitions, tes 50 structures...

La seconde étape consiste à lire ton expression et à compléter les TAGs.
Il faut donc lire octet par octet ta chaîne de caractères:
On va prendre l'exemple suivant:
cos(2pi/5.2)


Tu possèdes les variables suivantes qui t'indiques plusieurs choses.
unsigned char ident_pos; //Position du début l'indentité en cours.
unsigned char ident_len; //Taille de l'identité en cours.
unsigned char *ptr; //Pointe sur l'octet en cours de lecture.
unsigned char ident_tag; //TAG de l'identité en cours (TAG final supposé)!
unsigned char i; //Numéro de l'octet en cours dans la chaîne de caractères

A noter que tu peux te passer de toutes ses variables en utilisant la structure sStackExpr.
Par défaut elles sont toutes à 0, a savoir qu'il faut mieux définir un TAG_NONE et un SUBTAG_NONE.

Tu lis le premier octet et tu tombes sur c:
Tu vérifies si auparavant tu avais un TAG défini,  ici c'est pas le cas donc tu fais les choses suivantes:
ident_pos = i;  //Début de l'identité en cours.
ident_len++; //(auparavant = à zéro)
ident_tag = TAG_STRING;
ptr++;

Octet suivant tu tombes sur o:
Tu vérifies le tag précédent (ici y en a pas c'est toujours TAG_STRING donc pas de pb il suffit d'incrément len et ptr).

Tu répètes ça jusqu'à la prenthèse:
La parenthèse n'est pas un caractères compris en A et Z et a et z donc c'est une identité 
ainsi:
StackExpr [n_StackExpr].pos = ident_pos;
StackExpr [n_StackExpr].len = ident_len;
StackExpr [n_StackExpr].tag = ident_tag;
StackExpr [n_StackExpr++].subtag = SUBTAG_NONE;

Tu es tombé sur la prenthèse, la parenthèse est une identité donc:
StackExpr [n_StackExpr].pos = i;
StackExpr [n_StackExpr].len = 1;
StackExpr [n_StackExpr].tag = TAG_PARENTH_OPEN;
StackExpr [n_StackExpr++].subtag = SUBTAG_NONE;

Tu initialises tout histoire de préparer l'identité suivante:
ident_pos = i+1;
ident_len =0;
ident_tag = TAG_NONE;
ptr++;

Tu arrives sur le chiffre 2, c'est pareil qu'une chaîne de caractère, bref tu continues la lecture si l'octet est compris entre 0 et 9 (. compris si tu veux) et en même temps tu incrémentes indent_len.

Ensuite tu arrives à p:
Tu regardes ident_tag et il est différent de TAG_NONE et TAG_STRING, dans ce cas faut le stocker, même principe que la chaîne de caractères.

Et ainsi de suite jusqu'à temps d'arriver à la fin de la chaîne de caractères.
(Perso les chaînes de caractères et les nombres peuvent être traité facilement en 'même temps', c'est à dire dans le même bloque.
Bref je ferai 2 zones, une pour les nombres et les chaînes de caractères et une pour les opérations mathématiques, parenthèses... (bref les simples caractères).


Pour te faciliter la tâche je propose aussi de faire un tableau qui regroupera les signes mathématiques avec les SUBTAG correspondant et enfin un tableau qui contiendra les fonctions genre cos, sin...
Ainsi tu auras un TAG_STRING ou TAG_VAR pour les variables (genre x...) et un TAG_FUNC pour les fonctions.

Si déjà tu arrives à faire ça tu as fait 30% du boulot!
-Edité le Mardi 8 février 2005 à 19:12 par geogeo-
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°3   Marquer comme non lu.
Benjy Ecrit le: Lundi 21 février 2005 à 13:22 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


Bon alors voila j'ai commence, tou d'abord pour l'initialistion j'ai corrigé quelque probleme car ce que tu avai mit ne passai pas a la compilation donc juste savoir si c'est correct?

unsigned char n_StackExpr = 0; //Compte le nombre d'identités dans ton expression.
sStackExpr *StackExpr = calloc (50, sizeof (sStackExpr)); //Pointeur sur tes 50 structures.
unsigned char i; //Numéro de l'octet en cours dans la chaîne de caractères
unsigned char *expr = (char*)"cos(2pi/5.2)"; //expression


Ensuite je voudrai savoir comment on declare les tags et les sub_tags?
Et aussi comment on teste pour savoir si c'est un caractere comprit entre a et z, un chiffre comprit entre 0 et 9 et ainsi de suite merci.
Et quel fonction permet de connaitre des le depart la longeur d'une chaine de caractere?
-Edité le Lundi 21 février 2005 à 13:25 par benjy-
Le langage C y'a pas mieux!!!
    
./Post n°4   Marquer comme non lu.
Jfg Ecrit le: Lundi 21 février 2005 à 18:30 Déconnecté(e)    Voir le profil de Jfg Envoyer un email à Jfg Visiter le site WEB de Jfg Envoyer un message privé à Jfg  


"Et quel fonction permet de connaitre des le depart la longeur d'une chaine de caractere?"
Tu est obligé de compter le nombre de charactères en parcourant la chaîne et en t'arrêtant au charactère '\0'

"Et aussi comment on teste pour savoir si c'est un caractere comprit entre a et z, un chiffre comprit entre 0 et 9 et ainsi de suite merci."
C'est du C de base ça... Fait des recherches sur le code ASCII.

Kill Mario
    
./Post n°5   Marquer comme non lu.
geogeo Ecrit le: Lundi 21 février 2005 à 18:48 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Ensuite je voudrai savoir comment on declare les tags et les sub_tags?

De simple définitions:
#define TAG_MATH 2
...

Et aussi comment on teste pour savoir si c'est un caractere comprit entre a et z, un chiffre comprit entre 0 et 9 et ainsi de suite merci.

Genre tu fais ceci avec ta chaîne de caractères.
expr[i]>='A' ....

Bon je sais y a encore mieux avec un pointeur. Genre:
char * ptr = expr;
ensuite dans ta boucle tu tests:
if (*ptr>='0'....)

puis tu incrémentes le pointeur pour aller au caractère suivant:
ptr++;

Ta boucle peut devenir ainsi
while (*ptr)
{
if (*ptr>='0'....
ptr++;
}

Et quel fonction permet de connaitre des le depart la longeur d'une chaine de caractere?

strlen.
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
  :: Index » Forum Ti68K » Programmation C » Interpreteur mathematique (5 réponse(s))
Pages : 1/1     « [1] » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 51.73ms avec 18 requetes