Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » [C] Faire des calculs dans des chaines de caractères
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

[C] Faire des calculs dans des chaines de caractères

Posté le 16/12/2014 19:35

Voilà tout est dans le titre

Je donne un exemple :
char test[100]={"5+8+9-6*2/4"};


Si vous avez des idées

C'est pour mon tableau périodique, je voudrais implanter un système qui calcule n'importe quelle masse molaire


1, 2 Suivante
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 16/12/2014 19:40 | #


19, de rien
...
...
...
...
...
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 16/12/2014 20:11 | #


ton commentaire ne m'est d'aucune utilité
In Arch, I trust ! And you ?
Fabcvlr Hors ligne Membre Points: 2259 Défis: 41 Message

Citer : Posté le 16/12/2014 21:00 | #


Qu'entends tu par calcul de masse molaire ? La masse molaire en fonction des particules dans l'atome (neutrons, protons) ou la masse en fonction d'un certain nombre d'atomes avec les moles d'une réaction ?

L'expérience des autres, c'est comme une chandelle que l'on tient allumée dans son dos par une nuit de tempête !
Julese50 Hors ligne Gourou Points: 315 Défis: 16 Message

Citer : Posté le 16/12/2014 21:28 | #


Sans prendre en compte les priorités, ce n'est pas très compliqué à réaliser, par congre en prenant compte des priorités ça me semble moins évident.
Globalement, tu as 3 variables :
- Une string (tmp)
- Un int. (nombre)
- Un char (op)
Tu parcours la chaine originale, si c'est un chiffre tu l'ajoute à tmp, sinon tu fait nombre = atoi(tmp); tu réinitialise tmp et tu met l'opération rencontré dans op. Tu continue, quand tu arrive à la fin d'un second nombre tu fait nombre += atoi (tmp) (si c'est une addition). Tu continue ainsi de suite et tu retourne nombre à la fin.
C'est un algorithme naïf et pas implémenté alors j'ai pu raconter de la merde, et ça peut ne pas être optimisé du tout
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 16/12/2014 21:30 | #


Ton deuxième point juste la masse polaire de molecules
In Arch, I trust ! And you ?
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

Citer : Posté le 16/12/2014 22:11 | # | Fichier joint


S'il y a des priorités, alors Il vaut mieux utilisé des arbres binaires, par exemple (5+8)*(6+3) donne :



Il est assez difficile de convertir une chaîne de caractère en AB, mais une fois convertit, il est très facile de calculer le résultat, il suffit juste de parcourir l'arbre en profondeur (récursivement)


[u]Structure[/u] tArbre //Permet de représenter 1 noeud de l'arbre
    valeur : int //contient un nombre
    symboleMath : caractère //contient soit '+', soit '-', soit '*', soit '/'
    FilsGauche : tArbre //pointeur sur le fils gauche du noeud
    FilsDroite : tArbre //pointeur sur le fils droit du noeud
[u]FinStructure[/u]



[u]Fonction[/u] Calcul ( Arbre : tArbre ) : Réel
    [u]Si[/u] (EstFeuille(Arbre))  //EstFeuille retourne VRAI si FilsDroite == NULL et FilsGauche == NULL
        retourner Arbre->valeur //on est dans une feuille
    [u]sinon[/u]
        [u]si[/u] (Arbre->symboleMath == '+')
            retourner Calcul( Arbre->FilsGauche ) + Calcul( Arbre->FilsDroite )
        [u]sinon si[/u] (Arbre->symboleMath == '-')
            retourner Calcul( Arbre->FilsGauche ) - Calcul( Arbre->FilsDroite )
        [u]sinon si[/u] (Arbre->symboleMath == '/')
            retourner Calcul( Arbre->FilsGauche ) / Calcul( Arbre->FilsDroite )
            //etc
            //etc
        [u]fsi[/u]
    [u]fsi[/u]
[u]Fin[/u]


-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 17/12/2014 07:19 | #


Exactement ce qu'il me faut smash car la masse molaire de l' O2 est donc de 2*16=32 g/mol
In Arch, I trust ! And you ?
Lephenixnoir En ligne Administrateur Points: 22770 Défis: 149 Message

Citer : Posté le 17/12/2014 13:17 | #


J'ai 20 fois plus simple
Il y a un syscall pour ça !
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 17/12/2014 15:44 | #


oui lephé ? ça m' intéresse cela
In Arch, I trust ! And you ?
Lephenixnoir En ligne Administrateur Points: 22770 Défis: 149 Message

Citer : Posté le 17/12/2014 18:28 | #


Lephenixnoir a écrit :
J'ai 20 fois plus simple
Il y a un syscall pour ça !

-florian66- a écrit :
oui lephé ? ça m' intéresse cela

Ah, la facilité, toujours la facilité !
Attention je pense, tu risques de devoir changer les '*' en '×' et j'en passe.

http://media.taricorp.net/prizm/simon_chm/fx_legacy_Expressions.HTM
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 18/12/2014 06:55 | #


cool ton truc et dans la compréhension du code, ça peut aider mais sinon la méthode de smash ou Jules était aussi bien

j'ai regardé ton truc mais je n'ai pas tout compris

Ajouté le 18/12/2014 à 18:25 :
je sais pas trop utiliser les syscall
In Arch, I trust ! And you ?
Lephenixnoir En ligne Administrateur Points: 22770 Défis: 149 Message

Citer : Posté le 18/12/2014 18:32 | #


Ben, tu passes les arguments comme ça :
const char *chaine = "1+2+4×5";
[red]TBCDvalue[/red] result;
char c = 0x31;
CalculateExpression([red]&[/red]chaine,&c,[red]&[/red]result,1);

La TBDCvalue est le type de variable du système, comme A~Z, θ, r ou Ans... tu peux le décoder avec d'autres syscalls éventuellement.
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 18/12/2014 19:34 | #


j'avais pas vu que tu m'avais repondu

merci bcp je vais essayer de faire quelque chose

Ajouté le 20/03/2015 à 18:08 :
L'appel du syscall a l'air de marcher mais maintenant ça me donne un problème avec le TBCDvalue
Faut-il que je déclare le syscall dans le header pour les arguments ?
In Arch, I trust ! And you ?
Lephenixnoir En ligne Administrateur Points: 22770 Défis: 149 Message

Citer : Posté le 20/03/2015 18:38 | #


Oui. Et il faut que tu ajoutes le header qui définit la structure.
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 20/03/2015 19:53 | #


http://media.taricorp.net/prizm/simon_chm/fx_legacy_BCDdouble.HTM

Quand j'ai ça je met en header directement ?
In Arch, I trust ! And you ?
Lephenixnoir En ligne Administrateur Points: 22770 Défis: 149 Message

Citer : Posté le 20/03/2015 20:10 | #


La documentation a écrit :
To convert BCD to/from double, the following code-piece could be used.

Est-ce que ça te semble correct ?
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 21/03/2015 11:02 | #


Faut donc je je mette tous cela dans un .hpp alors ?
In Arch, I trust ! And you ?
Lephenixnoir En ligne Administrateur Points: 22770 Défis: 149 Message

Citer : Posté le 21/03/2015 11:09 | #


Bordel mais lis le texte au moins ! Il est marqué que ça permet de convertir le binaire décimal en décimal !

Ce qui t'intéresse c'est juste la définition de la classe.
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 21/03/2015 13:30 | #


Donc je ne met que la classe, le reste ne sert à rien ?
In Arch, I trust ! And you ?
Lephenixnoir En ligne Administrateur Points: 22770 Défis: 149 Message

Citer : Posté le 21/03/2015 13:40 | #


... est-ce que tu comprends ce morceau de code ?

Parce que sinon, c'est sûr que tu vas pas aller bien loin...
1, 2 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2022 | Il y a 82 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd