IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

pile est chaine bien balancée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 163
    Par défaut pile est chaine bien balancée
    Bonsoir à Tous,
    j'ai un exercice dont l'enoncé est comme suit:

    Un problème fréquent d’un compilateur et des traitements de textes est de
    déterminer si les parenthèses d’une chaîne de caractères sont balancées et
    proprement incluses l’une dans l’autre. Par exemple, la chaîne ((( ) ) ( ) ) ( ) est
    bien balancée et proprement écrite. Mais les chaînes )( )( ou ( ) ) ne le sont pas.
    Ecrire une fonction :
    1. Qui retourne vrai si une chaîne de caractères est proprement écrite et bien
    balancée, et faux sinon.
    2. Qui retourne la position de la première parenthèse qui déroge à cette règle si
    la chaîne n’est pas bien écrite et bien balancée.

    la première question est bien claire sauf que la deuxième pas vraiment.
    si on prend la chaine "(()", est ce la position de la première parenthèse qui déroge à cette règle est la position de la première parenthèse fermante ou quoi? et si ma chaine est "(()(", quelle sera la position?

    merci pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 785
    Par défaut
    Ton cas est un cas spécial

    Pour la petite histoire, pour vérifier si les parenthèses sont bien fermées, on utilise un compteur : ( -> +1, ) -> -1

    Dans le cas "'(()", c'est un test supplémentaire "count > 0" qui est fait à la fin et qui dit "missing/ expected %d close-bracket(s)" et pour la position c'est bernique : cette parenthèse fermante peut-être n'importe où

    Édit : le compteur va surtout s'assurer qu'il n'y ait aucune parenthèse fermante en trop. Mais c'est à la toute fin, qu'il faut s'assurer qu'il n'y ait aucune parenthèse ouvrante en trop

  3. #3
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    J'aurai géré ça avec une pile :
    si le caractère est '(', j'empile son indice dans la chaîne
    si le caractère est ')', 2 cas se présentent :
    soit la pile est vide : c'est une ')' en trop : on stoppe et on retourne son indice
    soit la pile n'est pas vide, on dépile
    une fois la chaîne lue en entier, si la pile est vide, on a une chaîne équilibrée,
    si elle n'est pas vide, on a la liste de tous les indices avec une '(' en trop.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 860
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par thouraya24 Voir le message
    Ecrire une fonction :
    1. Qui retourne vrai si une chaîne de caractères est proprement écrite et bien
    balancée, et faux sinon.
    2. Qui retourne la position de la première parenthèse qui déroge à cette règle si la chaîne n’est pas bien écrite et bien balancée.
    Amusant. Quand j'étais à l'école, deux de mes copines avaient eu ce truc à faire en projet. Il fallait quand-même aller plus loin et gérer toute chaine d'encadrement (guillemets, crochets, parenthèses, accolades).
    Bien entendu, c'est moi qui ai fait ce projet (en plus du mien). Et au résultat, le prof m'a dit "pour ton projet je t'ai mis 20/20 et pour le projet de tes copines je t'ai mis 16/20"

    Citation Envoyé par straasha Voir le message
    si on prend la chaine "(()", est ce la position de la première parenthèse qui déroge à cette règle est la position de la première parenthèse fermante ou quoi?
    Non. Le programme se termine et la pile n'est pas vide => tu affiches alors la position du dernier caractère situé dans la pile.

    Citation Envoyé par straasha Voir le message
    et si ma chaine est "(()(", quelle sera la position?
    Pareil.

    Citation Envoyé par straasha Voir le message
    J'aurai géré ça avec une pile :
    si le caractère est '(', j'empile son indice dans la chaîne
    si le caractère est ')', 2 cas se présentent :
    soit la pile est vide : c'est une ')' en trop : on stoppe et on retourne son indice
    soit la pile n'est pas vide, on dépile
    une fois la chaîne lue en entier, si la pile est vide, on a une chaîne équilibrée,
    si elle n'est pas vide, on a la liste de tous les indices avec une '(' en trop.
    Exact. Mais si j'étais toi, pour épater ton prof, je ferais un code ouvert vers l'évolution et qui permettrait, avec un minimum de modifications, de gérer d'autres groupes que les parenthèses.

    Par exemple tu pourrais créer un tableau d'items, tableau contenant (par exemple) "()" et "[]".
    Ensuite, si un caractère correspond à un premier caractère d'un des items du tableau, tu l'empiles.
    Et à la lecture d'un caractère fermant, tu dépiles le dernier caractère de la pile. Et là 2 cas se présentent
    • le caractère dépilé correspond à l'homologue ouvrant du caractère lu => ok
    • le caractère dépilé ne correspond pas au caractère lu (ou bien la pile est vide) => souci

    Et si le programme se termine avec la pile non vide => souci

    Ainsi, si demain il faut gérer les accolades "{}", tu les rajoutes simplement dans le tableau et tu recompiles.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  2. Réponses: 4
    Dernier message: 07/09/2006, 15h41
  3. [CONTEXT_FILETXT] Est-ce bien pour faire un menu contextuel
    Par Furius dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 18/11/2005, 21h31
  4. Réponses: 9
    Dernier message: 04/10/2005, 13h50
  5. Est ce bien la meilleure façon de faire un histogramme ?
    Par rvzip64 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 10/05/2005, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo