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

Langage Pascal Discussion :

[LG]Combinaison de plusieurs caractères


Sujet :

Langage Pascal

  1. #1
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut [LG]Combinaison de plusieurs caractères
    salut
    j'ai ecris un programme qui ne fait pas tellement ce que je veux,
    au fait le programme devait fournir les diffferente combinaisons possible de mot de 5 caractères avec 5 caractères, je sais qu'il ya 120 possibilités quand on fait Arrangement de 5 dans 5 on a 120
    voici le programme
    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
     
    uses crt;
    type tableau=array[1..5] of char;
    var
      letre,cont,reap:tableau;
      i,j,k,n:integer;
    begin
      clrscr;
      (*lire le 5 caractŠres et les ranger dans deux  tableaux*)
      write('Entrer 5 caractŠres:');
      for i:=1 to 5 do
      begin
        cont[i]:=readkey;
        reap[i]:=cont[i];
        write(cont[i]:5);
      end;
      writeln;
      randomize;
      (*mette dans un ordre aleatoire les  5 caracŠres*)
      for k:=1 to 120 do
      begin
        for i:=5 downto 1 do
        begin
        (*on choisit un nombre aleatoire entre<=1 et >=5*)
          j:=random(i)+1;
          (*ensuite on le met dans le tableau letre*)
          letre[i]:=cont[j];
          (*apres on met le dernier element du tableau a la position courante*)
          cont[j]:=cont[i];
          write(letre[i]);
        end;
        write('   ');
       (*on remet les 5 caractŠres dans le tableau pour un nouveau tirage*)
        for n:=1 to 5 do cont[n]:=reap[n];
      end;
      readln;
    end.
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  2. #2
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Je trouve ta façon de lire les 5 caractères assez peu orthodoxe... ça marche ?

    Pour ce qui est de ton problème, j'ai bien une solution mais elle est tout sauf esthétique et elle ne fonctionne qu'avec 5 caractères.
    Mon idée est de fixer les n premiers caractères et de "permutter" ceux qui restent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    abcd - e
    abc - ed
    ab - d - c - e
    ab - d - e - c
    ab - e - c - d
    ab - e - d - c
    etc...
    J'ai fais le programme mais je te préviens c'est vraiment la grosse artillerie:
    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
    for i:= 1 to 5 do
    begin
         for j:= 1 to 5 do
         begin
         if j<>i then
            begin
            for k:= 1 to 5 do
                begin
                if (k<>i) and (k<>j) then
                   begin
                   for l:=1 to 5 do
                       begin
                       if (l<>i) and (l<>j) and (l<>k) then
                          begin
                          for m:= 1 to 5 do
                              begin
                              if (m<>i) and (m<>j) and (m<>k) and (m<>l) then
                              writeln(mot[i],mot[j],mot[k],mot[l],mot[m]);
                              end;
                              end;
                          end;
                       end;
                   end;
                end;
            end;
         end;
    end;
    Je t'avais prévenu !

  3. #3
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Ce sera toujours la grosse artillerie, à moins de passer par une fonction de type récursif, qui prend en entrée le mot de 5 caractères et un paramètre entier qui indique quels sont les n derniers caractères à permunter entre eux avec les 5 - n caractères fixés au préalable.

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  4. #4
    Membre chevronné
    Avatar de sovo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 389
    Points : 1 788
    Points
    1 788
    Par défaut
    Bonjour
    Je tout voudrais d'abord te dire que lorsque tu penses a faire les arrangements pour la resolution de ton probleme, a moins que je n' ai pas tres bien compris ton probleme, je penses que tu te trompe. En fait ici tu veut trouver des mots (de 5 lettres) que tu peux former avec 5 lettres entrer au clavier, si tel est le cas alors tu ne doit pas faire les arrengements mais plutot les permutation car voici comment les choses ce passe:
    La premiere lettre peut prendre 5 lettres (il va en rester 4)
    La deuxieme 4 (il va en rester 3)
    La troisieme 3
    la quatrieme 2
    et enfin la derniere prend la lettre qui reste
    ceux qui te fait 5x4x3x2x1 possibilite pour former ton mot de 5 lettres avec 5 lettres.


    A present parlons un peut de tin programme, en fait il est bien pense mais tu n'as pas fait attention il y a une petite erreur (qui deviendra tres grosse a la fin ) c'est que lorsque tu choisi un numeros (lettre) dans le tableau cont, au la porchain random ( par exemple si tu etait a 4 et que tu passe a 3), tu ne verifie pas que la lettre que tu veut choisir a deja ete choisi alors c'est normale que ton programme ne fonctionne pas .
    Je croit que en fait c'est pour cela que ton programme ne fonctionne pas
    "Toute question a une reponse. Et chaque reponse est une nouvelle question." Albert EINSTEIN

    En cas de Question resolu, n'oubliez pas

  5. #5
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Citation Envoyé par sovo
    Bonjour
    tu ne doit pas faire les arrangements mais plutot les permutation car voici comment les choses ce passe:
    La premiere lettre peut prendre 5 lettres (il va en rester 4)
    La deuxieme 4 (il va en rester 3)
    La troisieme 3
    la quatrieme 2
    et enfin la derniere prend la lettre qui reste
    ceux qui te fait 5x4x3x2x1 possibilite pour former ton mot de 5 lettres avec 5 lettres.
    Je suis d'accord avec toi, mais as-tu pris la peine de calculer 5! (=5x4x3x2x1) ? Apparement non : le résultat fait 120. A mon avis, il s'est juste trompé dans les termes et a utilisé "arrangement" au lieu de "permutation", mais sinon il était dans le vrai.

  6. #6
    Membre chevronné
    Avatar de sovo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 389
    Points : 1 788
    Points
    1 788
    Par défaut
    certe le resultat fait 120, il faudrais specifier la methode car c'est peut la raison pour laquelle il n'a peut bien faire son programme car les reflexions son differentes dans les 2 cas
    "Toute question a une reponse. Et chaque reponse est une nouvelle question." Albert EINSTEIN

    En cas de Question resolu, n'oubliez pas

  7. #7
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Dans ce genre de "problèmes" tu as deux façons de considérer les choses :
    • par les arrangements : tu "remet à zéro" à chaque fois. Donc, dans ce cas, tu peux réutiliser la même lettre plusieurs fois, ce qui te fait un nombre de cas possibles de 5^5 = 3125.
    • par les permutations : tu ignores les éléments utilisés. Donc, à chaque tour, tu utilises un élément de moins qu'au tour précédent. Ici, le nombre de cas possibles est 5! = 120.


    Je ne veux surtout pas polémiquer, mais ne sois pas de mauvaise fois !

  8. #8
    Membre chevronné
    Avatar de sovo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 389
    Points : 1 788
    Points
    1 788
    Par défaut
    Voila on dit tous la "meme" chose mais personne ne donne une solution concrete alors voila la solution au probleme ( en ce basant sur le principe des permutation) il est tout simple et je croit tres efficace (je dit je croit parceque j'ai fait la trace mais je ne l'ai pas teste sous pascal, mais je croit qu'il va marcher)


    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
     
    Program permut;
    uses crt;
     
       var  
               tab,tab1 : array [0..5] of char;
               rd, i : integer;
     
       begin
              for i:=5 down to 0 do 
                      tab1[i]:=readkey;
              randomize;
              for i:=5 down to 0 do 
                      begin 
                            rd:=random(i+1);
                            tab[i]:=tab1[rd];
                            if rd<i then
                                      repeat 
                                           tab1[rd]:=tab1[rd+1] ;
                                           inc(rd);
                                      until rd=i;
                      end;
     
              for i:=0 to 5 do 
                      write(tab[i]);
         end.
    bon je croit que ca ira
    "Toute question a une reponse. Et chaque reponse est une nouvelle question." Albert EINSTEIN

    En cas de Question resolu, n'oubliez pas

  9. #9
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    salut merci a tous pour l'aide que vous m'apportez,
    excuser moi pour mon absence ,
    loceta ton programme bien, mais je vais essayer de faire un truc recursif et je renverai bientot,
    je suis desolé mais sovo ton programme ne fait pas ce qu'on veut et en plus on ne vas l'executer 120 fois pour obtenir le resulat escompté, bref je pense que ton programme ne fait pas ce qu'on veut,mais j'avoue que ça m'a aidé a comprendre un peu la situation.
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  10. #10
    Membre chevronné
    Avatar de sovo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 389
    Points : 1 788
    Points
    1 788
    Par défaut
    Slut
    ton d'abord je ne sais pas quel type de compilateur tu utilise mais moi lorsque j'exsecute le dit programme il marche tres bien, en fait il fait exactement ce que tu as decrit, a moins que ce que tu as decris ne soit pas ce que tu veux car moi j'ai fait plusieur test et a tout les cout j'avais le resultat escompte, alors si c'est moi qui es mal compris ton probleme, priere de bien vouloir me le redefinir.

    en suite, par rapport a ce que tu dit a savoir "que mon programme s'execute 120 fois je croit que tu te trompe car lors que je fait la trace ( et aussi d'autre personne que moi) et je me suis rendu compte que il etait tres simple et tres rapide. Alors je te conseille de revoir le programme et surtout de le reexecuter et aussi de refaire la trace
    "Toute question a une reponse. Et chaque reponse est une nouvelle question." Albert EINSTEIN

    En cas de Question resolu, n'oubliez pas

  11. #11
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Non non Sovo, ton programme n'effectue pas du tout ce qui est demandé, à savoir afficher, pour 5 lettres données, les 120 "mots" possibles en effectuant des permutations...

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  12. #12
    Membre chevronné
    Avatar de sovo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 389
    Points : 1 788
    Points
    1 788
    Par défaut
    Citation Envoyé par Hdd34
    à savoir afficher, pour 5 lettres données, les 120 "mots" possibles en effectuant des permutations
    c vrai maintenant que je relie bien le probleme poser je me rend compte que je ne l'avais pas tres bien lu, je m'excuse ;
    mais pour me racheter je vais cherche une solution a ce PB

    Aussi krachik je suis content d'avoir pu t'aider a avoir aau moins une idee.
    concernant la recursivite je croit aussi que c la cle du probleme
    "Toute question a une reponse. Et chaque reponse est une nouvelle question." Albert EINSTEIN

    En cas de Question resolu, n'oubliez pas

  13. #13
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Eurêka !

    Non, je rigole, mais j'ai trouvé comment faire pour ton programme.

    Non pas que ma première "version" ne fonctionnait pas correctement, mais celle-ci est plus belle et permet de traiter des mots de longueur variable (inférieure ou égale à dix quand même parce que sinon le calcul est énorme). Note que tu peux aussi, en changeant quelques lignes de code, ne permuter qu'un certain rang de caractères si ça t'arrange.

    Le principe est en gros le même que celui que j'avais utilisé la première fois.

    Voilà la trace du programme (sommairement) :

    A chaque lettre du mot donné correspond un chiffre : mot[i] -> i, que l'on rentre dans un tableau (grille)
    la variable caz correspond à la case de la grille sur laquelle on désire travaille.

    - On remplit la grille de 0 et on va à la 1ere case.
    - On regarde la valeur de cette case (i <=> la lettre #i)
    - Si i = l (l=longueur du mot), on revient à la case précédente.
    - Sinon, on regarde si i n'est pas déjà dans la grille
    - Si ça y est, on augmente i (passe à la lettre i+1 du mot initial)
    - Sinon, on écrit i dans la case courante et on passe à la case suivante.
    - Lorsqu'on arrive à la dernière lettre de notre mot "final", on écrit ce mot, on change la valeur de la case en 0 et on revient à la case précédente.
    - Là, on recommence l'opération : on augmente la l'indice i, s'il est dans le tableau, on le réaugmente, si c'est la dernière lettre (i=l), on redescend d'une case et sinon, on passe à la case suivante.


    J'ai bien conscience de ne pas être clair du tout dans mon explication alors j'espère que mon code parlera de lui-même, encore que je te conseille d'essayer de le faire d'abord avec ce que je viens de dire, ça te sera plus profitable.


    Voici le code :
    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
    type matrice = array[1..10] of byte;
     
    function existe(caz : byte; grille : matrice) : boolean;
    var i : byte;
        a : boolean;
    begin
    i:=1; a:=FALSE;
    while (i<caz) and (not a) do
          begin
          if grille[i]=grille[caz] then a:=TRUE
          else inc(i); 
          end;
    existe:=a;
    end;
     
    var i,l,caz : byte;
        grille : matrice;
        mot : string;
    begin
    write('Donner un mot. ');readln(mot);writeln;
    l:=length(mot);
    caz:=1; //initialisation des variables
    for i:=1 to l do grille[i]:=0;
    repeat
    if grille[caz]<l then
       begin
       inc(grille[caz]); //passe à la lettre suivante du mot initial
       if not existe(caz,grille) then //vérifie qu'elle n'est pas déjà utilisée
          begin
          if caz=l then //on est à la fin de "notre" mot alors :
             begin
             for i:=1 to l do write(mot[grille[i]]);
             writeln;
             grille[caz]:=0;
             dec(caz); //on revient à la lettre précédente
             end
          else inc(caz); //on n'est pas arrivé à la fin de notre mot : on passe à la lettre suivante
          end;
       end
    else begin //si on est là, on a déjà traité toutes les combinaisons suivant cette lettre.
         grille[caz]:=0; 
         dec(caz);
         end;
    until caz = 0;
    end.

  14. #14
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    merci beaucoup ,j'ai vu le programme et j'essaie de le comprender il faut dire la t'a frappé tres fort,merci beaucoup
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  15. #15
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    C'est vrai que je viens de le relire et il n'est pas très simple à comprendre, d'autant que mes explications ne sont pas très claires .

    Si tu veux que je t'explique un "passage", demande toujours, je ferais un effort d'explication.
    Sinon, dis-toi qu'il fait exactement la même chose que mon premier code (si tu t'intéresse à un mot de 5 lettres et que tu utilises ce programme ou le précédent, tu auras les mêmes combinaisons dans le même ordre), seulement il le fait d'une façon plus générale, ce qui permet de ne pas se limiter à un nombre de lettres fixé lors de la programmation.

    Merci du compliment quand même.

    PS : tag résolu ?
    PPS : si tu essayes avec un mot de 10 caractères ou plus et que tu demandes au programme de te sauvegarder les résultats dans un fichier texte (pour plus de lisibilité), ouvre le avec le WordPad ; surtout ne l'ouvre pas avec Word (ou équivalent) ou avec le NotePad (BlocNote) : ça mettra trop de temps à se charger. Parce que déjà avec 10 lettres ça te génère 3 628 800 combinaisons et un fichier de 41,5 Mo.

  16. #16
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    merci je crois que ça j'ai finalement compris, merci beaucoup
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 28/10/2010, 12h45
  2. Combinaison de plusieurs etats avec le pattern State
    Par papaetoo dans le forum Design Patterns
    Réponses: 0
    Dernier message: 18/08/2009, 11h16
  3. Combinaison de plusieurs cascades
    Par sialamed dans le forum OpenCV
    Réponses: 0
    Dernier message: 30/06/2008, 12h08
  4. Fonction REPLACE pour remplacer plusieurs caract?
    Par Davjack dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/06/2008, 17h39
  5. [C#][SVG] Combinaison de plusieurs graphe sur une même page
    Par doudoustephane dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/11/2006, 09h19

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