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

Algorithmes et structures de données Discussion :

Algo/pascal : Génération d'un langage correspondant à une expression régulière


Sujet :

Algorithmes et structures de données

  1. #1
    Invité
    Invité(e)
    Par défaut Algo/pascal : Génération d'un langage correspondant à une expression régulière
    (Supprimé)
    Dernière modification par Invité ; 09/08/2009 à 13h17.

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Lorsque tu as une notation suffixe, tu peux utiliser une pile :

    -> tu as une lettre ou une expression, tu empiles.
    -> tu tombes sur un opérateur, tu dépiles les deux éléments précédents et tu empiles l'arbre en question.

    Tu répètes le tout jusqu'à avoir fini d'analyser.

    Ensuite il faut aussi que tu gères les cas d'erreur (pile vide et opérateur, pile avec plus d'un élément etu plus rien à traiter, ...)

    J'ai honte de poster mon code parce que ça marche pas du tout
    Il ne faut pas, ton code peut nous aider à cerner là où tu as des problèmes.

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Mon conseil: inverse le probleme.

    Dans quelles cas une sequence de lettres n'est PAS valide ?

    - Est-ce qu'une sequence peut commencer par un "a" ?
    oui. Pourquoi ?

    - Est-ce qu'une sequence peut commencer par un "c" ?
    non. Pourquoi ?

    Une fois que tu as repondu a ces deux questions, l'algo devient plus facile.

    PS: c'est quand meme mechant comme ennoncé. Y a pas grand monde qui aura le bonus.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Le sous-programme devrait afficher à l'écran "ac, ad, bc, bd".
    Mince. J'avais zappé cette ligne . Bon oublie ce que j'ai dit, y a beaucoup plus simple (je me disais aussi que l'exo etait un peu balaise ). Comme j'ai oublié le Pascal depuis longtemps, ca va etre a toi de porter mon pseudo-java en Pascal.

    La stategie consiste a "developper" l'expression algebrique, comme en math: (a+b).(c+d) = ac+ad+bc+bd
    L'astuce consiste a gerer les resultats sous forme de liste L=(ab,ad,bc,bd)

    On ecrit les fonctions qui représentent les operations:
    • add(L1,L2) --> L3 tel que add( (a,b,...) , (c,d,...) ) -> (a,b,c,d,...)
    • mul(L1,L2) --> L3 tel que mul( (a,b,...) , (c,d,...) ) -> (ac,ad,bc,bd,...)


    Pour finir, on ecrit le parcours reccursif de l'arbre,en appelant les operations au fur et a mesure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List expand(None n) {
      if (n.value=="+") return add( expand(n.left) , expand(n.right) );
      if (n.value==".") return mul( expand(n.left) , expand(n.right) );
      // Dans les autre cas, on traite une valeur
      List l = new List();
      l.add( n.value );
      return l;
    }
    A la fin, expand() renvoie la liste des valeurs possibles
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par MasterMatt
    En tout cas merci beaucoup Pseudocode, ton aide a été précieuse.
    De rien. Ca m'a assez amusé de coder ca en java.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    import java.util.ArrayList;
    import java.util.List;
     
    public class TreeExpander {
     
    	// Node definition
    	class node {
    		public node left; 
    		public node right;
    		public String value;
    		public node(String v) {
    			this.value=v;
    		}
    	}
     
    	// build the Tree
    	private node buildTree() {
    		// (A+B).(C+D)
    		node root = new node(".");
    		root.left = new node("+");
    		root.left.left = new node("A");
    		root.left.right = new node("B");
    		root.right = new node("+");
    		root.right.left = new node("C");
    		root.right.right = new node("D");
    		return root;
    	}
     
     
    	// add operator: (a,b)+(c,d) -> (a,b,c,d)
    	private List<String> add(List<String> list1, List<String> list2) {
    		List<String> list3 = new ArrayList<String>();
    		list3.addAll(list1);
    		list3.addAll(list2);
    		return list3;
    	}
     
    	// mul operator: (a,b).(c,d) -> (ac,ad,bc,bd)
    	private List<String> mul(List<String> list1, List<String> list2) {
    		List<String> list3 = new ArrayList<String>();
    		for(String l1:list1)
    			for(String l2:list2)
    				list3.add(l1+l2);
    		return list3;
    	}
     
    	// expand the tree
    	private List<String> expand(node n) {
    		// operator +
    		if (n.value.equals("+"))
    			return add(expand(n.left),expand(n.right));
     
    		// operator .
    		if (n.value.equals("."))
    			return mul(expand(n.left),expand(n.right));
     
    		// otherwise it's a simple value
    		List<String> list = new ArrayList<String>();
    		list.add(n.value);
    		return list;
    	}
     
    	// test this class
    	private void test() {
    		node root = buildTree();
     
    		List<String> list = expand(root);
     
    		for(String s:list) System.out.println(s);
    	}
     
    	public static void main(String[] args) {
    		new TreeExpander().test();
    	}
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Génération d'un String à partir d'une expression régulière
    Par yang dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 06/03/2007, 14h21
  2. Réponses: 6
    Dernier message: 17/08/2005, 12h38
  3. Problème sur une expression régulière
    Par Verbal-Quint dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2004, 10h54
  4. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22
  5. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 17h06

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