Algo : Extraire un nombre d'une chaine de caractères

Voir le sujet précédent Voir le sujet suivant Aller en bas

Algo : Extraire un nombre d'une chaine de caractères

Message  -ed- le Lun 26 Mai 2008 - 22:07

Pas vraiment de la conception, plus une question d'algorithmique que je me posais. Désolée par avance si ce n'est pas le bon emplacement...

Supposons que j'ai une chaine de caractères "345*12" et que je veuille la traiter de manière à pouvoir faire effectuer à mon programme le calcul 345 * 12.

Ma première idée était de parcourir la chaine de caractères de manière à trouver les indices de début et fin de chaque nombre.

Une fois que j'aurai récupéré la sous-chaine "345", je pourrai stocker le nombre 345 dans une variable entière en faisant le calcul:
('3' - '0') * 100 + ('4' - '0') * 10 + ('5' - '0') * 1

Ce calcul me semble tout à fait généralisable à n'importe quelle chaine constituée uniquement de chiffres (et ce sera le cas, puisque j'aurai préalablement extrait des sous-chaines ne contenant que des chiffres), mais j'ai quelques petites questions:

Question Première chose, ca suppose que les valeurs ASCII des chiffres soient toujours dans l'ordre croissant et à la suite les uns des autres. Il me semble que c'est le cas, mais j'aimerais être sure que ce soit bien le cas.


Question Deuxième chose, cette façon de procéder me semble quand même bien compliquée. N'y aurait-il pas un moyen plus simple de passer de ma chaine de départ au stockage des deux nombres dans deux variables entières?

L'exemple de "345*12" était simplement pour illustrer ma question particulière, mais à terme, je compte pouvoir traiter une chaine plus complexe:

(45 + (234 - 65) * 32) / 145

sscanf ne suffit donc pas ici

Je veux que l'utilisateur saisisse une expression mathématique, quelle qu'elle soit, comprenant des parenthèses et les 4 opérateurs mathématiques de base, mais sans que le programme ne le sache à l'avance.

Donc je dois récupérer la saisie d'une chaine de caractère et la traiter ensuite pour séparer les différents éléments qui la composent.
En dehors du petit problème de transcodage chiffre -> binaire en retirant '0', bien connu et bien rodé et tout à fait portable pour '0' à '9', tu poses le cas général de l'analyse syntaxique. Il se trouve que c'est un problème assez complexe qui est formalisé depuis longtemps par les notions de syntaxe, de sémantique, de grammaire et par les outils qui vont avec (lex et yacc, flex et bison etc.)

Si tu veux faire ton analyseur d'expression arithmétique toute seule, tu risques de passer beaucoup de temps à réinventer la roue et à oublier des cas !

Et la gestion de la priorité des opérateurs et des parenthèses ne va rien arranger...

Bref, tu t'embarques dans du sévère, à moins que des règles très précises de limitation aient été fixées au départ. C'est un exercice ?

Au fait, la NPI (Notation polonaise inversée) se traite beaucoup plus facilement à l'aide d'une pile, évitant l'arbre syntaxique...

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum