1

Voila je voudrai faire la meme chose que ceci http://www.ticalc.org/archives/files/fileinfo/136/13600.html.
J'ai deja commencer mes mes resultats sont bien en dessous de ca et je voudrai obtenir les meme performance.
Pouvez vous m'aidez merci.

2

où est ce que t'as des problemes ? dans le traitement de l'expression de la fonction ou bien pour tracer la courbe
euh...

3

et bien c'est un peu des deux en faite bon voila deja ce que j'ai fait.
Mais il ya des problemes avec la sinusoïde elle est aussi belle que celle du programme ci dessus.
Et aussi je ne sait pas comment interpreter les expression du style sin(x) sin(x^2) des choses comme ca.
Et aussi la gestion de l'espace windows comme lui le fait.
Donc voila merci. #include <tigcclib.h> float vin_carre(float f,float t,float Vcc,float r) {      float P;      float v=0;      P=1/f;      //on regarde si t>P (on va travailler dans la premiere periode pour faire plus simple      while(t>P)           t-=P;      //donc on est dans l'intervalle de temps 0-P      //r*P est l'instant de commutation entre l'tat bas et l'état haut      if (t<=(r*P)) //on est a l'état haut           v=-(Vcc)/2;      else // on est a l'état bas           v=Vcc/2+1;      return v; } void trace(float yscl) {      short x=80,y=49,key=0;      float ysc=0;      char buffer[50];      while(key!=264)      {           DrawPix(x,y,A_XOR);           key=ngetchx();           DrawPix(x,y,A_XOR);           if (key==344) x+=1;            else if (key==338) x-=1;           else if (key==340) {y+=1; ysc-=yscl;}           else if (key==337) {y-=1; ysc+=yscl;}                      else if (key==4440) x+=10;           else if (key==4434) x-=10;           else if (key==4436) {y+=10; ysc-=(10*yscl);}           else if (key==4433) {y-=10; ysc+=(10*yscl);}           sprintf (buffer, "%f",ysc);           DrawStr(25, 1, buffer, A_REPLACE);      } } void grid(void) {      clrscr();      DrawLine (0, 49, 159, 49, A_NORMAL);   DrawLine (0, 0, 0, 99, A_NORMAL); } void _main(void) {   float frequence=10, //frequence en Hz   yscl=(fabs(12)+fabs(-12))/99,   //tension=(12*sqrt(2)), //tension alternative max v racine de 2   tension=12/yscl, //tension alternative max v sans racine de 2   nb_per=1, //nombre de periode souhaite   pix=nb_per/frequence/159, //temps par pix   dephasage=(PI*180/180), //dephasage   w=(2*PI*frequence), //omega= 2*PI*F   y,absisse,t,xp=1,yp=-1;      grid();   for(t=0,absisse=0;absisse<160;t=pix*absisse,absisse+=1)   {     y=tension*sin(w*t+dephasage);     DrawLine(xp,yp+49,absisse,y+49,A_NORMAL);     //DrawPix (absisse,y+49,A_NORMAL);     xp=absisse;     yp=y;   }   trace(yscl);      grid();      yscl=(fabs(2)+fabs(-2))/99;      xp=yp=0;   for(t=0,absisse=0;absisse<160;t=pix*absisse,absisse+=1)   {     y=vin_carre(10,t,4/yscl,0.5);     DrawLine(xp,yp+49,absisse,y+49,A_NORMAL);     //DrawPix (absisse,y+49,A_NORMAL);     xp=absisse;     yp=y;   }   ngetchx(); }

4

pk tu demande pas le code source à Christopher Waudby (porter) (quadby@geocities.com) ???

NTW !!!!!

5

Ben je suis tres mauvais en anglais!!

6

#trisotofl#
excuse me im a french beginner in C ,
could you send me the code of machin truc please ?
thx very much
NTW !!!!!

7

merci matthieu
Quoi que ca y'est je lui est ecrit et j'ai recu une notification disant

This is the Postfix program at host postfix3-1.free.fr.

I'm sorry to have to inform you that the message returned
below could not be delivered to one or more destinations.

For further assistance, please send mail to <postmaster>

If you do so, please include this problem report. You can
delete your own text from the message returned below.

The Postfix program
<quadby@geocities.com>: host mx2.mail.yahoo.com[64.156.215.18] said: 554
delivery error: dd This user doesn't have a geocities.com account
(quadby@geocities.com) [0] - mta326.mail.scd.yahoo.com (in reply to end of
DATA command)

8

c'est normal? Car a paramment l'aresse n'existe pas ou plus.
Alors est ce que vous pouvez m'aider a faire mon traceur svp merci.

9

t'as essayé à : c.waudby@virgin.net ?
NTW !!!!!

10

cerede2000
: et bien c'est un peu des deux en faite bon voila deja ce que j'ai fait.

tu parle de la source 826 ?
Mais il ya des problemes avec la sinusoïde elle est aussi belle que celle du programme ci dessus.

alors iléou le probleme ?
Et aussi je ne sait pas comment interpreter les expression du style sin(x) sin(x^2) des choses comme ca.

ba c'est simple tu interprete d'abord ce qu'il y a dans une parenthese et ensuite ce qu'il y a autour
tu te debrouille pour donner la priorité à tout ce qui n'est pas addition ou soustraction et la division est prioritaire sur la multiplication etc...


euh...

11

et comment gere la priorite des operations?

12

C'est le boulot d'un interpréteur mathématique.
Dans ce cas il faut utiliser soit l'algo de l'aiguillage soit un arbre syntaxique.

http://www.info.ucl.ac.be/notes_de_cours/LINF1251/projet/shunting.html
http://www.enseignement.polytechnique.fr/profs/informatique/Jean-Jacques.Levy/poly/main6/node15.html
http://forum.hardware.fr/hardwarefr/Programmation/sujet-49258-1.htm

Je risque d'être un peu méchant, mais je doute que ça soit de ton niveau. Ce genre de chose est assez complexe et j'en sais quelque chose. mais avec un peu de motivation et beaucoups de fueilles de papiers tu peux réussir à pondre quelque chose. smile
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

13

Enfin je comprend pas si je met une boite de dialogue texte ou l'utilisateur entre son equation par exemple il tape 2*sin(x) cela va dans une chaine de caractere apres il me suffit d'extraire ce "2*sin(x)" et de faire le calcul non? ce n'est pas aussi simple?

14

Le suffit de traiter est plus compliqué qu'on ne le pense.

C'est le même problème que mon interpréteur, je t'expose ma méthode qui n'est pas parfaite mais qui fonctionne à merveille.

- Au départ tu dois traiter les caractères dans le but de la création d'une pile de TAGs, un TAG est une représentaition sous forme de chiffre d'une chaîne, par exemple le TAG_NUMBER reprsésentre un nombre...

Voici la structure que j'utilise pour GFA Basic
//Structure d'un tag
typedef struct {
	//Phase 1
	unsigned char type;
	unsigned char tag;
	unsigned char subtag;
	
	//Phase 2
	unsigned char token_type;			//Token de command ou token de fonction
	unsigned char token_index;		//Index dans la table
	unsigned char symbol_index;		//Index du symbol
	
	//Phase 3
	unsigned char priority;				//Priorité de calcul
	
	//Stockage de données
	float fnum;
	long lnum;
	lstring string;
} s_tag;


Bien sûr tout ce qui est tokens et d'autres choses sont inutiles pour toi. Donc dans la première étape tu dois former une pile et reconnaitre les nombres, les symboles mathématiques, les fonctions...

Dans mon cas j'utilise 3 infos:

type = Type de la chaîne (Symbole (nombre, chaîne de caractères, variable), signe de calcul, signe négatif, fin de ligne, fonction...)

tag = Propriété avancé (Signe de calcul, signe de comparaison, variable, nombre, tableau).

subtag = Typage ou infos secondaires (Flottant, entier ou encore addition, soustraction, modulo, opération logique).

- La deuxième étape consiste à gérer les erreurs de syntaxes de bases, soit par exemple éliminer les erreurs du genre:
nombre nombre
, )
+*
...

Dans cette étape je gére aussi l'ajout de signe comme 3pi ou j'ajoute multiplier...

- La troisième étape consiste à affecter les priorités de calculs, c'est une étape assez facile quand on a tous les TAGs...

- La quatrième étape, une des plus importante consiste à remettre en ordre la pile. Pour ma part j'utilise l'algo de l'aiguillage mais modifié à ma sauce pour permettre de gérer des syntaxes assez lourdes (dans ton cas une version simplifié de l'algo suffit largement).

- Cinquième étape, executer la pile, c'est à dire lire les TAGs de gauche à droite. Dans ton cas c'est assez simple, un inconnu à incrémenter avec un pas et effectuer le calcul avec, le résultat doit être le premier item de la pile d'execution, si la pile d'executon contient plusieurs résultats c'est qu'il y a un bug. A partir de cette étape tu dois trouver tes propres idées et te débrouiller car pour ma part, mon interpréteur demande beaucoup plus d'étapes et l'étape d'execution est assez immense et exploite beaucoup de choses comme les virgules... ce qui n'est pas ton cas.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

15

Oua ca parrait super compliquer ca!! Je suis degoute de ne pas pouvoir avoir les source de graphit pour voir comment il fait mais j'ai l'impression qu'il ne fait pas comme ca! car le porg n'est pas si enorme que ca.

16

Bah dans ton cas ça prendra même pas 3 ko. Y a pas grand chose à gérer.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

17

ah bon eu tu peut m'expliquer un peut plus en detail stp. Comment tester ou extraire par exmple 2*sin(x) merci

18

Tu devrais lire les liens que je t'ai donné.

Sin ici est une fonction, c'est un cas assez compliqué.

Je prend l'exemple de -(5+2*3+6)
Tu dois repérer chaque opérations soit former une pile de TAGs suivant:

TYPE_NEGATIF TYPE_PARENTH_OPEN TYPE_SYMBOL TYPE_SIGN TYPE_SYMBOL TYPE_SIGN TYPE_SYMBOL TYPE_SIGN TYPE_SYMBOL TYPE_PARENTH_CLOSE

TAG_NONE TAG_NONE TAG_NUMBER TAG_CALC TAG_NUMBER TAG_SIGN TAG_NUMBER TAG_CALC TAG_NUMBER TAG_NONE

SUBTAG_NONE SUBTAG_NONE SUBTAG_FLOAT SUBTAG_ADD SUBTAG_FLOAT SUBTAG_MUL SUBTAG_FLOAT SUBTAG_ADD SUBTAG_FLOAT SUBTAG_NONE

Bien sûr dans ton cas il y a des infos inutile, je parle de subtag qui peut être enlevé.
Ensuite il faut remettre la pile dans l'ordre, ici je ne vais pas utiliser les TAGs histoire de voir les choses plus facilement.

-(5+2*3+6) doit devenir

5 2 3 * + 6 + (-)

L'algo de l'aiguillage fait ça à merveille. On retient que les parenthèses disparaisent, c'est le but de l'algo. Ainsi que la multiplication est prioritaire par rapport à l'additon.
Maintenant il faut executer le calcul, c'est assez simple, on empile les informations dans une pile soit:

Il faut lire à l'envers, soit 5 est en bas de la pile et * tout en haut.

5
2
3
* On multiplie les 2 derniers termes de la pile soit ici 5 et 2 et on stocke le résultat en haut de la pile ainsi on obtient la pile suivante


5
6
+
donne

11
6
+
donne

17
-
donne -17
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

19

Ouai je comprend bien mais bon! Au debut l'utilisateur rentre son equation avec une boite de dialogue. On obtient donc un char *expr.
Ce char contient l'expression qui donc pour le moment sans fonction est -(5+2*3+6). Mais en faisant avancer ce char donc je vai obtenir
-;(;5;+;2;*;3;+;6wink j'elimine donc ( et ) et donc la je suis coince car je voit pas comment faire lol. De quel type doit etre la pile et tou ca??

20

S'il vous plait eclaire moi merci.

21

algo de l'aiguillage, lis les liens que geogeo t'as donné !
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

22

ouai ca j'ai compris comment ca marche mais mon probleme maintenant c'est plus ca. C'est, en repartant de -(5+2*3+6)
donc en decomposant comme je l'ai fait -;(;5;+;2;*;3;+;6 on fai donc deux pile
une avec 5;2;3;6
et l'autre avec -;+;*;+ mai deja quel type de var accepte ces symbole a part les char! et ensuite il faut executer la pile mais la je voit encore moins
car on a un short avec 5 et un char avec + par exmple et encore un short avec 2 comment fair l'operation???

23

Bon j'ai trouve les sources d'un analyseur syntaxique en C et je les ai etudie, donc maintenant j'en suis au point suivant:
L'analyseur que j'ai pour le moment est capable de faire toute les operation +;-;*;/ et ( ). Et il gere les priorites de calculs.
Donc maitenant comment faire pour les fonctions telles que sin();cos()..... et aussi la gestion des lettres si on rentre sin(x). Voila merci

24

1.Utiliser AMS: push_parse_text / NG_approxESI ?
2. Utiliser MathEval: ftp://ftp.cs.univ-paris8.fr/mirrors/ftp.gnu.org/libmatheval

25

ok merci PpHd ca marche pour ton petit 1. mais est ce qu'il ya une solution si il y'a une lettre style sin(x)+log(2) car la si on rentre ca ca plante.

26

Faut tout leur chercher: should_and_did_push_approx_arg2, likely_approx_to_number, can_be_approxed, estack_number_to_Float, .
Puis pour remplacer 'x', tu crees une variable x de type Float, puis tu l'affectes.
ou plus simple:
push_parse_text("2.3->x") + NG_executeESI