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 :

mélanger un mot


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Points : 3
    Points
    3
    Par défaut mélanger un mot
    Bonsoir,

    Voilà je souhaiterais créer un programme me permettant de mélanger un mot !!

    voici mon 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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    #define N 5
     
    char * un_mot(){
     
       int i;
       char *dico[N]= {"maison", "mitochondrie", "escherichia", "institut", "programation"};  //remplissage de notre tableau de mot
     
     
        srand((unsigned int) time(NULL));
        i=rand()%N;                         //on choisit un chiffre aléatoire compris entre o et N-1
     
        //printf("%s \n",dico[i]);            // on affiche le mot choisi aléatoirement
     
        return dico[i];
    }
     
     
    char * enlever_une_lettre(char * mot){ 
     
      char *motReponse;
      char motinitial[]={strlen(mot)};
      strcpy(motinitial,mot);
     
      int longueur_mot,c,i,j;
      char *copieChaine;
     
      longueur_mot=strlen(motinitial);
      srand((unsigned int) time(NULL));
     
      copieChaine=malloc(sizeof(char)*(longueur_mot+1));//on crée une chaine de caractere qui aura la même taille que notre chaine initiale
      motReponse=malloc(sizeof(char));
     
     
      for(i=0;i<longueur_mot;i++){
        c=rand()%(longueur_mot-1);//on cherche à obtenir un nombre aléatoire compris etre 0 et la longueur de la chaine étudiée
        copieChaine[i] =motinitial[c]; //on copie le caratere de la position aléatoire dans notre chaine copie
     
        for(j=c;j<longueur_mot;j++){
          motinitial[j]=motinitial[longueur_mot-1]; //le dernier caractere de notre chaine prend la place du caratere à la position "c", ainsi à chaque tour de boucle le caratere est éliminé
          mot[longueur_mot-1]='\0';
     
        }
     
      }
     
      printf("le mot melange: %s \n", copieChaine);
     
      printf("votre réponse:\n");
      scanf("%s",motReponse);
     
      return 0;
    }
     
    int main(){
     
      enlever_une_lettre(un_mot());
     
     
      return 0;
    }
    Ma première fonction permet de générer un mot aléatire dans un dictionnaire que j'ai crée!
    La seconde permet de mélanger le mot choisi, dans un premier temps je crée une première boucle for où chaque caractère de la position trouvé aléatoirement est copié dans ma chaîne copie puis ce caractère est remplacé par le dernier caractère dans la chaîne de départ grâce à la seconde boucle for.

    À la compilation je me retrouve avec une erreur de segmentation!!
    Je ne comprends pas l'erreur et j'aurais voulu savoir si mon code est cohérent!!
    Merci

  2. #2
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    Je suis assez sceptique à prpos de cette initialisation de tableau:
    char motinitial[]={strlen(mot)};
    Que voulais tu faire par là?
    Je présume que tu voulais créer un tableau de longueur strlen(mot), mais je doute que ça marche, de plus il faut prévoir la place du '\0', donc on aurait un tableau de strlen(mot)+1 caractères, je procèderais par allocation dynamique:
    char* motinitial=malloc((strlen(mot)+1)*sizeof(char))

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    voici mon nouveau code, on m'a aidé à corriger certain faute dans mon algo!!

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    #define N 5
     
    char * un_mot(){
     
       int i;
       char *dico[N]= {"maison", "mitochondrie", "escherichia", "institut", "programation"};  //remplissage de notre tableau de mot
     
     
        srand((unsigned int) time(NULL));
        i=rand()%N;                         //on choisit un chiffre aléatoire compris entre o et N-1
     
        //printf("%s \n",dico[i]);            // on affiche le mot choisi aléatoirement
     
        return dico[i];
    }
     
     
    char * enlever_une_lettre(char * mot){ 
     
      char *motReponse;
      char  motinitial[strlen(mot)+1];
      strcpy(motinitial,mot);
     
      int longueur_mot,c,i,j;
      char *copieChaine;
     
      longueur_mot=strlen(motinitial);
      srand((unsigned int) time(NULL));
     
      copieChaine=malloc(sizeof(char)*(longueur_mot+1));//on crée une chaine de caractere qui aura la même taille que notre chaine initiale
      motReponse=malloc(sizeof(char));
     
     
      for(i=0;i<longueur_mot;i++){
        c=rand()%(longueur_mot);//on cherche à obtenir un nombre aléatoire compris etre 0 et la longueur de la chaine étudiée
        copieChaine[i] =motinitial[c]; //on copie le caratere de la position aléatoire dans notre chaine copie
     
        for(j=c;j<longueur_mot;j++){
          motinitial[j]=motinitial[j+1]; //le dernier caractere de notre chaine prend la place du caratere à la position "c", ainsi à chaque tour de boucle le caratere est éliminé
          motinitial[j+1]='\0';
     
        }
     
      }
     
      printf("le mot melange: %s \n", copieChaine);
     
      printf("votre réponse:\n");
      scanf("%s",motReponse);
     
      return 0;
    }
     
    int main(){
     
    	enlever_une_lettre(un_mot());
     
     
      return 0;
    }


    En fait dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char motinitial[]={strlen(mot)};
    je voulais créer une copie de mon mot choisi aléatoirement dans ma fonction "un_mot" pour pouvoir le manipuler dans la fonction "enlever_une_lettre".

    À présent le nouveau code fonctionne mais je me trouve fasse à un autre problème, l chaine de caractère qui s'envoi dans mon terminal ne correspond à aucun mot!! C'est comme si elle a été coupé!! Il doit donc y avoir une erreur au sein de mes boucles :o

    le mot melange: unittst
    votre réponse:
    Comme on le voit "unittst" ne correspond à aucun mot entré initialement dans ma fonction un_mot :p

  4. #4
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    ta selection aléatoire est incorrecte:
    c=rand()%(longueur_mot-1);//
    Tu ne tiens pas compte du rétrécissement de ta la chaine "motintial",
    il faut pour cela retrancher le nombre de caractères déjà pris dans le modulo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c=rand()%(longueur_mot-1-i);//

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    oui voilà c'est bien ça le problème la longueur de ma chaine n'est pas recalculée!!!

    j'ai essayée avec ce que vous m'avez dit mais là ça me fait :

    Exception en point flottant

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    problème résolu merci de votre aide:

    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
    76
    77
    78
    79
    80
    81
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    #define N 5
     
    char * un_mot(){
     
       int i;
       char *dico[N]= {"maison", "mitochondrie", "escherichia", "institut", "programation"};  //remplissage de notre tableau de mot
     
     
        srand((unsigned int) time(NULL));
        i=rand()%N;                                                                           //on choisit un chiffre aléatoire compris entre o et N-1
     
        return dico[i];
    }
     
     
    char * enlever_une_lettre(char * mot){ 
     
      char *motReponse;
      char  motinitial[strlen(mot)+1];
      strcpy(motinitial,mot);
     
     
      char  comp[strlen(mot)+1];              //va nous servir à la comparaison du mot mélanger et du mot taper sur le clavier par le joueur!!
      strcpy(comp,mot);
     
      int longueur_mot,c,i,j;
      char *copieChaine;
     
      longueur_mot=strlen(motinitial);
      srand((unsigned int) time(NULL));
     
      copieChaine=malloc(sizeof(char)*(longueur_mot+1));       //on crée une chaine de caractere qui aura la même taille que notre chaine initiale
      motReponse=malloc(sizeof(char));
     
     
      for(i=0;i<longueur_mot;i++){
        c=rand()%(strlen(motinitial));                             //on cherche à obtenir un nombre aléatoire compris etre 0 et la longueur de la chaine étudiée                                                                 ,attention pour que la longueur de la chaine soit recalculée à chaque tour de la boucle il                                                                ne faut pas ecrire longueur_mot mais bie strlen(chaine)
        copieChaine[i] =motinitial[c];                         //on copie le caratere de la position aléatoire dans notre chaine copie
     
        for(j=c;j<strlen(motinitial);j++)           
          motinitial[j]=motinitial[j+1];            //le dernier caractere de notre chaine prend la place du caratere à la position "c", ain                                                                      si à chaque tour de boucle le caratere est éliminé
        motinitial[strlen(motinitial)]='\0';
     
     
          // longueur_mot --;
     
     
      }
      // copieChaine[longueur_mot-1]=motinitial[0];
     
      printf("le mot melange: %s \n", copieChaine);
     
      printf("votre réponse:\n");
      scanf("%s",motReponse);
     
      if (strcmp(comp, motReponse) == 0) // Si strcmp renvoie 0 (chaînes identiques)
        {
          printf("%s \n",comp);
            printf("Bravo!\n");
        }
        else
        {
          printf("%s \n",comp);
            printf("Perdu!\n");
        }
     
     
      return 0;
    }
     
    int main(){
     
    	enlever_une_lettre(un_mot());
     
     
      return 0;
    }

  7. #7
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    Oui car il faut mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c=rand()%(longueur_mot-i);//
    en effet lorsque i vaut 0, tu veuxun c compris entre 0 et longeur_mot-1(dernière lettre), tu dois donc faire un modulo longueur_mot
    Sinon autre erreur qui peut avoir son importance, tu ne mets pas de '\0' à la fin de copieChaine, ce qui peut être dangeureux...

Discussions similaires

  1. Extraction de mots clés
    Par Olive1808 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 01/02/2016, 20h49
  2. mélanger les lettres d'un mot
    Par isa150183 dans le forum Langage
    Réponses: 3
    Dernier message: 07/03/2007, 18h31
  3. Réccupération du mot de passe d'une connexion
    Par zinaif dans le forum Bases de données
    Réponses: 1
    Dernier message: 02/12/2002, 18h32
  4. Au sujet des mots de passe
    Par FranT dans le forum Langage
    Réponses: 6
    Dernier message: 17/09/2002, 22h16
  5. [langage] Reconnaissance de mots
    Par Flo. dans le forum Langage
    Réponses: 2
    Dernier message: 10/08/2002, 23h34

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