@informaticienzero : je ne l'ai pas dit, mais si tu savais le temps que j'ai passé pour mon code tout ridicule...
C'est bizarre, pour quelqu'un ayant programmé plusieurs mini-OS ça devrait se faire les doigts dans le nez.
Qu'est-ce que tu fais sur le forum C++ toi ?
Bah oui, un mini-OS c'est faisable, mais j'ai jamais dit l'avoir fait tout seul sans doc'.
J'avoue avoir mis un peu plus de temps à coder l'exercice que je ne l'avais prévu...
Il y'a pas des exemples pour tester l'imbrication des accolades ?
Tu peux partir sur un truc simple. Tu considères que l'entrée utilisateur est correcte (aucune parenthèse manquante etc.).
Tu fais ta fonction 'evaluer'.
Pour chaque caractère, tu regardes :
- Si c'est une majuscule -> c'est une molécule, tu fais ce qu'il faut faire pour savoir s'il y a plusieurs lettres et récupérer la valeur de la molécule;
- Si c'est un chiffre -> c'est un coefficient, tu récupères le coefficient et tu le multiplies à la molécule trouvée avant;
- Si c'est une parenthèse ouvrante -> tu appelles la fonction 'evaluer' en positionnant la chaîne sur le caractère suivant (càd le caractère juste après la parenthèse)
- Si c'est une parenthèse fermante -> tu renvoies la valeur de l'expression trouvée
En pseudo-code ça pourrait donner ça :
Pour chaque caractère de la chaîne, faire :
Si le caractère est une majuscule :
Récupérer la molécule (et avancer la chaîne) et récupérer la valeur de cette molécule
Sinon si le caractère est un chiffre :
Récupérer le chiffre (et avancer la chaîne) et le multiplier à la valeur trouvée avant
Sinon si c'est une parenthèse ouvrante :
Positionner la chaîne sur le caractère suivant
Appeler la fonction 'evaluer' et récupérer ce qu'elle renvoie
Sinon si c'est une parenthèse fermante :
Retourner le résultat trouvé précédemment
lucas-84 >
C'est pas méchant ce que je te dis hein.
C'est juste pour souligner que 'mini-OS' ça fait un peu gros.
@Pouet_forever >> Merci pour l'aide, mais le code je l'ai fini il ne reste plus qu'a essayer si j'ai pas fait des bêtises. je vais faire le niveau 5 et poster le code pour avoir vos avis.
Tu peux partir sur un truc simple. Tu considères que l'entrée utilisateur est correcte (aucune parenthèse manquante etc.).
Tu fais ta fonction 'evaluer'.
Pour chaque caractère, tu regardes :
- Si c'est une majuscule -> c'est une molécule, tu fais ce qu'il faut faire pour savoir s'il y a plusieurs lettres et récupérer la valeur de la molécule;
- Si c'est un chiffre -> c'est un coefficient, tu récupères le coefficient et tu le multiplies à la molécule trouvée avant;
- Si c'est une parenthèse ouvrante -> tu appelles la fonction 'evaluer' en positionnant la chaîne sur le caractère suivant (càd le caractère juste après la parenthèse)
- Si c'est une parenthèse fermante -> tu renvoies la valeur de l'expression trouvée
Marrant, c'est exactement la description de mon code.
La faiblesse éventuelle est que les entrée invalides ne sont pas toutes détectées (exemple: 3(O2), O2)3, etc.), mon code par exemple ne gère que les atomes inexistants et les caractères inconnus (genre H2O?)...
Pour dire vrai j'ai pas regardé ton code.
Sinon pour éviter l'erreur de parenthèses, tu peux tout simplement garder une variable avec le nombre de parenthèses et si au final elle est différente de 0 c'est que ya un souci.
Sinon pour éviter l'erreur de parenthèses, tu peux tout simplement garder une variable avec le nombre de parenthèses et si au final elle est différente de 0 c'est que ya un souci.
Non, cette methode n'est pas bonne. Exemple : )H2O(.
Enfin bon, je n'ai pas dit qu'ajouter cette gestion est spécialement difficile, hein, simplement que ça ne s'inscrit pas forcément naturellement "à l'intérieur" de l'algo proposé (à vrai dire je n'y ai pas trop réfléchi).
Citation : paraze
Edit : Il y a une limite ?
La seule limite est ta patience. De toute façon, rien n'est noté, seule la participation compte.
Jveux pas dire mais... si on a déjà codé un programme qui calcule ce genre de chose: 2 * (4 + 5 * 7) / 4
(Et ce genre de programme est plutôt très connu)
Alors tout cet exo, le zMol, se résume simplement à de la conversion de chaîne...
str_replace(ma_chaine, 'He', '4.0026');
etc.
Parce qu'au final se serait idiot de faire un programme qui ne calcule QUE la masse molaire sans même pouvoir résoudre 2+2.
Yoch > non, si tu rencontres une par ouvrante tu incrementes de 1 et si tu rencontres une par fermante tu decrementes. En faisant ca tu es sur d'avoir le bon nom re de parentheses et bien ordonnees.
Tout a fait, apres tout dépends comme la conception est faite, il y a plusieurs écoles.
Ha Standford la méthode engagée aurait été beaucoup plus pointillé.
Mais tous ca c'est dû à l'échange des idées en prog...
Jveux pas dire mais... si on a déjà codé un programme qui calcule ce genre de chose: 2 * (4 + 5 * 7) / 4
(Et ce genre de programme est plutôt très connu)
Alors tout cet exo, le zMol, se résume simplement à de la conversion de chaîne...
str_replace(ma_chaine, 'He', '4.0026');
etc.
Parce qu'au final se serait idiot de faire un programme qui ne calcule QUE la masse molaire sans même pouvoir résoudre 2+2.
Ces exos sont pour débutants, et s'adressent principalement à un public qui n'a pas encore forcément réalisé de parser (mais c'est prévu dans la liste de GuilOooo ).
Pour calculer : cal ==> puis entrez le nom du molécule (normalement il gèrent l'imbrication des parenthèse).
Pour ajouter c'est : add puis entrez le nom de l’atome et ca masse molaire séparer d'un espace.
Pour quitter c'est end
Ps : je vais éditer dans une dizaines de minutes pour teste les atomes ajouté
Ces exos sont pour débutants, et s'adressent principalement à un public qui n'a pas encore forcément réalisé de parser (mais c'est prévu dans la liste de GuilOooo ).
J'en ai conscience. Mais l'exo aurait pu se résumer à convertir une chaine du genre : (CH4)2
en : (12.011 + 1.0079 * 4) * 2
Et pour ceux qui sont sur linux on leur aurait donné :
./zMol '(CH4)2' | bc
(histoire de voir directement le bon résultat)
parce que là j'ai peur ('fin c'est pas grave mais bon) qu'il y en ai qui fasse tout un parseur pas du tout générique
parce que là j'ai peur ('fin c'est pas grave mais bon) qu'il y en ai qui fasse tout un parseur pas du tout générique
Tu as sans doute raison, mais il y a quand même bien moins de choses à gérer que pour un parser, et ici, on peut très bien faire un calcul "a la volée", plutôt que de convertir toute la chaine.
Citation : kaka551
@_Fender_ N'oublie pas de m'ajouter a la liste des participants !!
Petit détail, ça serait mieux si tu disais "@Exercices C". (La je pense que schadocalex est en train de s'en occuper).
Si tu suis ce que j'ai mis plus haut, tu n'auras pas ce problème puisque tu reviendras à la fonction appelante sans avoir fini tes parenthèses (ou en trop).
Moi, je dirai qu'il ne faut pas écouter ce que dit Pouet : il n'est pas dans son état normal, 10h de jazz (répétitif) d'affilé, on met du temps à s'en remettre. http://www.youtube.com/watch?v=KHy7DGLTt8g
Normalement mon code gère toutes les possibilités d'erreurs et affiche ce qui va pas.
J'aime bien cette ligne-là tot_mass+=last_mass=mass_mol(molecule);
Par contre, tu ne peux pas comparer les doubles comme ça if(last_mass==0)
Edit: Mon code avec les expressions que tu as données :
>>> (
Erreur de syntaxe: Parenthèse fermante manquante.
>>> C(O
Erreur de syntaxe: Parenthèse fermante manquante.
>>> CO)
Erreur de syntaxe: Parenthèse ouvrante manquante.
>>> 2C
Coefficient non précédé d'une molécule.
>>> ()
Erreur de syntaxe: Epression manquante dans entre les parenthèses.
D'ailleurs, je viens de voir qu'il y a une chose que je gère pas, c'est le ().
Je corrige de suite.
Fix'd.
Pourquoi ne pas couper les lignes qui dépassent les 80 caractères ?
C'est embêtant sur le sdz en plus, on est obligé de scroller et c'est pas très agréable...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.