Generateur de mot

tezca_system Messages postés 25 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 5 mars 2007 - 5 mars 2007 à 04:39
cs_chris91 Messages postés 54 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 4 avril 2007 - 5 mars 2007 à 23:09
Bonjour,
Cela fait 3 jours que je travail sur un générateur de mot. C'est de niveau débutant.
Concretement je souhaiterai que le programme genere tous les mots qui contiennent 12 caracteres maximum contenant uniquement des caracteres alphanumeriques.
il commencerait donc à "a" et finirait à "999999999999".
J'ai crée un tableu de 36 caracteres qui contient tous les caracteres à utiliser pour generer le mot:
char ref[]="abcdefghijklmnopqrstuvwxyz0123456789";
char mot[12]; <-------- le mot generé et affiché sur l'ecran.
Concretement mon pb c qu'au dessus de 2 caracteres cela m'affiche n'importe koi.
Avez vous juste une idée de l'algorythme qu'il faut que j'utilise.Il est pas evident de faire comprendre au programme que lorsque le caractere à la position n "9", il faut passer à "a" et incrementer la valeur du caractere à la position n+1 en fonction de sa position sur le tableau ref (definit si dessus), et pire encore le caractere à la position n+1 "9" aussi le passer à "a" et incrementer la valeur du caractere à la position n+2 en fonction de sa position sur le tableau ref.

Si vous avez des idées se serait vraiment gentil de votre part.
merci par avance.

P.S: voici dans l'odre chronologique quelques exemples de ce que le programme devrait m'afficher comme je l'ai imaginé:
a
b
...
9
aa
...
99
aaa
baa
caa
9aa
aba
.....
89a
99a
aab
etc etc juqu'a 999999999999

3 réponses

vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 3
5 mars 2007 à 12:27
const char *car= "\0a.....z0.....9";

Ajoute à ces caractères alphanumériques le caractère nul, il emputera naturellement ta chaine de caractères...le défaut de mon algorithme c'est qu'il prend plus de temps à générer des chaines de 12 caractères "tronquées" qui si on se préocuper de la taille de la chaine.

char *mot[13];            //12 +1 =13 oublie pas le caractère null final
mot [13]= '\0';

int i0 =0, i1= 0, i2=0,................i11=0; //12 entiers ( char au lieu de int optimiserait le temps ?)

et maintenant for () va s'averer tres utile

for (i11 =0;i11 != 38;i11++) //37 c'est la "taille" de car (1 + 26 +10)
    for (i10 =0;i10 != 38;i10++)
........................................................
........................................................

                         for (i0 =0;i0 != 38;i0++)
                            {
                             mot[0]=char[i0];
                             ..........................  //c'est lourd mais pas de calc d'incrementation
                             mot [11] = char [i11];
                             puts (mot);
                            }

voilà ça devrait (peut-être) marcher, sinon fais des retouches ou insipre toi de l'idée car je fais des fautes qd je ponds des algo en live...

ne t'étonne pas si ton pc ramme à fond : 37^12 = 6,58295201 × 1018   à 2000 cycle CPU l'iteration par exemple...

vinc1008881

                           
                            
0
cs_chris91 Messages postés 54 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 4 avril 2007
5 mars 2007 à 22:58
bonsoir,


void tabcpt()
{
char tab[] = "aaaaaaaaaaaa\r\n";
char *p, *ps, *pe;


pe = tab + 11;
ps = pe;


while(1)
{
// affichage chaîne ps ici (ex: puts(ps); )
p = pe;
while(1)
{
if(*p == 'z')
{
*p = '0';
break;
}

if(*p == '9')
{
if(p == tab) return;
*p-- = 'a';
if(p < ps) ps = p;
continue;
}
(*p)++;
}
}
}


mais attention le temps... 36^12 solutions !!
avec une chaîne de 6 chars, ça fait déjà 2176782336 solutions (>2Mds).
donc code non testé ;)
0
cs_chris91 Messages postés 54 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 4 avril 2007
5 mars 2007 à 23:09
avec un break; après (*p)++; ça fonctionne beaucoup mieux.
0
Rejoignez-nous