Urgent

meryben7 Messages postés 4 Date d'inscription samedi 24 décembre 2005 Statut Membre Dernière intervention 28 décembre 2005 - 28 déc. 2005 à 01:11
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008 - 1 janv. 2006 à 09:52
programme en c , c'est une sorte de calculatrice
En fait il faut empiler l'expression completement parenthésée dans une pile et le but du programme c'est de nous renvoyer le resultat.
exemple: (((2+4)+(4/2))*3 )devrait me renvoyer 24
Les opérations sont sur des entiers de 0 à 9 et les opérandes +,-, /, *
Au niveau de l'empilement il n'y a pas de soucis par contre je ne sais pas vraiment comment m'y prendre pour le calcul
et il faut que je rendre le projet dans une semaine
Si vous avez des tuyaux a me filer ca serait trop cool

8 réponses

neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
28 déc. 2005 à 09:54
Tu peut essayer d'analyser le premier groupe de parenthèse: tu récupère le contenu, ce qui donne:



((2+4)+(4/2))*3



Tu extrait l'opérateur (qui ne doit pas être entre des parenthèses),
donc *, puis tu traite la partie gauche et droite. Si une opérande
n'est pas directement un chiffre, tu refait le traitement pour le
nouveau groupe de parenthèse, puis calcul le résultat.



opérande 2 :

3 (c'est terminé pour l'opérande 2)



opérande 1:

((2+4)+(4/2))



calcul de l'opérande 1:

(2+4)+(4/2)

opérateur: +

sous-opérande 1: (2+4)

sous-opérande 2: (4/2)



ainsi de suite...



A chaque fois qu'une opérande n'est pas un chiffre, tu descend d'un
niveau... Tu remonde les niveau en calculant les différentes étapes.

neodelphi
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
29 déc. 2005 à 01:27
Pour ma part je pencherai plutot pour une reecriture de l'expression a calculer

Voici un algorythme possible

Debut
Faire
Obtenir un groupe minimal
faire le calcul
remplacer ce groupe dans l'expression par le resultat du calcul
Tant qu'il y a des operateurs dans l'expression
Fin

Les differentes etapes de l'execution de cet algorythme donnerai ceci :
1 : expression = ((2+4)+(4/2))*3
2 : expression = (6+(4/2))*3
3 : expression = (6+2)*3
4 : expression = 8*3
5 : expression = 24 <-plus d'operation a executer, on a donc le resultat

Je pense que cette solution est très simple à mettre en oeuvre et ne devrait te poser aucune difficultée

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
29 déc. 2005 à 03:12
Moi j'ai fais un truc comme ça mais en écriture préfixée, mais bon c'est quasi pareil

Donc pour ma part, je calculer le nombre de parenthèse, je me
positionner à la moitié et j'effectué le calcul, et je recommencer avec
2 parenthèses en moins ;)



Si ça t'intéresse c'est la source Dr Joky, va voir dans mes sources parce que j'ai pas le lien dans la tête :D



;)

Bonne soirée ;)
if(!Meilleur("Joky")) return ERREUR;<
0
cs_Klephte Messages postés 22 Date d'inscription mardi 20 mai 2003 Statut Membre Dernière intervention 4 janvier 2022
29 déc. 2005 à 05:18
Voici ma réponse sous forme de fonction récursive de 40 lignes.
Je te laisse mettre les commentaires dans le code
Je précise que je ne fais pas de contrôle du séquencement des parenthèses et que je ne gère pas les priorités de calcul des opérateurs et j'espère pour toi que ton prof ne connais pas ce site ....

#include "stdafx.h"

int iPos=0;
int iNewPos=0;

double Calcul(char* szChaine,int iPos){

double Operande = 0;

if(szChaine[iPos]=='('){
iNewPos=0;
Operande = Calcul(szChaine,++iPos);
iPos = iNewPos;
}
else{
Operande = szChaine[iPos]-48;
}

if(szChaine[iPos+1] == '+'){
iNewPos=iNewPos+2;
return Operande+Calcul(szChaine,iPos+2);
}

if(szChaine[iPos+1] == '-'){
iNewPos=iNewPos+2;
return Operande-Calcul(szChaine,iPos+2);
}

if(szChaine[iPos+1] == '*'){
iNewPos=iNewPos+2;
return Operande*Calcul(szChaine,iPos+2);
}

if(szChaine[iPos+1] == '/'){
iNewPos=iNewPos+2;
return Operande/Calcul(szChaine,iPos+2);
}

if(szChaine[iPos+1] == '\0' || szChaine[iPos+1] == ')'){
iNewPos = iPos+1;
return Operande;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
//char buffer[]="((((2+4)+(4/2))*3)*2)";
//char buffer[]="(2+4)+6";
char buffer[]="(1+3)+6+6+(2*4)";
//char buffer[]="2+4";

printf("%f",Calcul(buffer,iPos));

return 0;
}

Arnaud Grandville
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
30 déc. 2005 à 10:41
Au moins on est tous d'accord pour que ce soit une fonction récursive !

neodelphi
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
31 déc. 2005 à 11:04
Euh, non, pas forcément, la récursivitée n'est pas nécéssaire dans notre cas. L'algo que j'ai donné peut très bien se passer de recursivité.
un "Faire tant que" correspond a une boucle type while ou autre.

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0
cs_Klephte Messages postés 22 Date d'inscription mardi 20 mai 2003 Statut Membre Dernière intervention 4 janvier 2022
31 déc. 2005 à 14:28
Je suis tout à fait d'accord
avec toi, il est possible de s'en sortir sans récursivité. Le code sera
d'ailleurs vraisemblablement plus long, mais aussi certainement plus
compréhensible.
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
1 janv. 2006 à 09:52
Oui... Après c'est une question de style. L'embriquement de parenthèse,
indicant l'existence d'une arborescence de groupes, me pousse
naturelement à traiter le problème de façon récursive.



Je pense qu'avec de l'expérience, la récursivité est plus facile dans ce genre de problème...

neodelphi
0
Rejoignez-nous