Générer une chaine correctement parenthésée

Résolu
Theo_0055 Messages postés 273 Date d'inscription   Statut Membre Dernière intervention   -  
 Utilisateur anonyme -

Bonjour,

On m'a donné cet algorithme et on me demande de le traduire en C, sauf que c'est un peu difficile :

 
 p = PileVide()

   tant que non Vide(p) 
      choisir entre:
      { c est une parenthèse ouvrante }
	  c = parenthèse ouvrante
	  Empiler(p , c)
       c est une parenthèse fermante }
	  si non Vide(p) alors
	     c = parenthèse fermante correspondant à Sommet(p)
             Dépiler(p)
      { c est un caractère peu importe}
	  c = caractère qui n'a pas de parenthése
      afficher c

... dans lequel :

  • PileVide est une fonction qui crée une pile vide ;
  • Vide est une fonction qui renvoie true si et seulement si la pile est vide.

Voici par exemple des résultats valides :

(a(bvcbn))
(aevvjbb(er(yhh)))

Je ne sais pas si l'algorithme qu'on m'a donné est complet, car je ne vois pas comment il peut de générer une chaîne bien parenthésée.

Voici mes idées :

  • Pour l'histoire de choisir, ça me rappelle switch(..) en C
  • Pour générer un texte aléatoirement je crois qu'on peut faire :
char chaine = "abcdefghijklmnopqrstuvwxyz";
char chaine aleatoire[26] = " ";
chaine aletatoire = chaine[rand() % 26];
A voir également:

25 réponses

Theo_0055 Messages postés 273 Date d'inscription   Statut Membre Dernière intervention   1
 

@whismeril et @Dal j'ai fait ceci:

void empiler(PileCaractere *p, char x) {
  p->tab[p->n] = x;
  p->n = p->n + 1;
}

char depiler(PileCaractere *p) {
  p->n = p->n - 1;
  return p->tab[p->n];
}

char sommet(PileCaractere *p) { 
  return p->tab[p->n - 1]; 
}

char ouvrante_to_fermante(char ouvrante) {
  if (strcmp(ouvrante,'(') == 0)
    return ')';
  else if (strcmp(ouvrante,'{') == 0)
    return '}';
  else if (strcmp(ouvrante,'[') == 0)
    return ']'
}

void generer_texte_bien_parenthese() {
  char chaine[26] = "abcdefghijklmnopqrstuvwxyz";
  char ouvrant[3] = "({[";

  PileCaractere p = PileVide(&p);
  char random_ouvrant = ouvrant[rand() % 3];
  empiler(&p, random_ouvrant);
   
  while(!est_vide(&p)) {
    enum type_de_caractere suivant = rand() % 3;
    switch (suivant) {
      case Ouvrante:
        empiler(&p, random_ouvrant);
        printf("%c", random_ouvrant);
        break;
      case Fermante:
        char fermante = ouvrante_to_fermante(sommet(&p))
        printf("%c", fermante);
        break;
      case Quelconque:
        c = chaine[rand() % 26];
        printf("%c", c);
        break;
    }
  }
}
0
Utilisateur anonyme
 

L'as tu testé?

Je pense qu'il manque un truc au moment de fermer.


0
Theo_0055 Messages postés 273 Date d'inscription   Statut Membre Dernière intervention   1
 

Non pas encore testé

au moment de fermer vous vouliez dire quoi?

0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 

à quel moment utilises-tu la fonction depiler() dans ton code ?

0
Utilisateur anonyme > [Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention  
 

;)

0
Theo_0055 Messages postés 273 Date d'inscription   Statut Membre Dernière intervention   1
 

Ah ouais j'ai oublié d'écrire :

depiler(&p, sommet(&p));
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 

Bonjour Theo_0055 : Si tu as les réponses à toutes tes questions, peux-tu basculer ton sujet en résolu ? Sinon indique-nous les questions encore en suspens. 

0

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

Posez votre question
Theo_0055 Messages postés 273 Date d'inscription   Statut Membre Dernière intervention   1
 

Ah oui non c'est fini j'ai plus de questions

Merci a tous pour votre aide

0
Utilisateur anonyme
 

De rien

1