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 :

Suppression des doublons dans un tableau de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Par défaut Suppression des doublons dans un tableau de caractères
    Bonsoir,

    J'ai essayé de coder une procédure qui permet de supprimer les doublons dans un tableau de caractères, ils sont remplacés par un caractère vide et placés à la fin du tableau, mais ça ne marche pas :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #define NMAX 200
     
    void gen_aleat( char v[], int n )
    {
     int i;
     /* rand() retourne un entier aléatoire de l'ens {0,1,2,..,RAND_MAX} (RAND_MAX fixé à 32767 sous VC++)*/
     for(i = 0; i < n; i++) v[i] = rand()%(122-97) +97;/* pour avoir aussi des nbrs<0 */
    }
     
    void aff_vect( char v[], int n )
    {
     int i;
     for( i = 0; i < n; i++ )
     {
    	 printf( "%c", v[i] );
         if ( (i+1) % 10 == 0 ) printf( "\n" );
     }
     printf( "\n" );
    }
     
    void doublons (char v[], int n)
    {
        int i;
        int j;
        int cpt;
        char echange;
     
        i = 0;
        while (i < n)
        {
            j = i + 1;
            while (j< n)
            {
                while (v[i]==v[j])
                {
                    cpt = cpt + 1;
                    v[j]=' ';
                    echange = v[j];
                    v[j] = v[n-cpt];
                    v[n-cpt]=echange;
                }
                j = j +1;
            }
            i = i + 1;
        }
    }
     
    int main()
    {
        char v[NMAX];
        int n;
        int ok;
     
        srand(time(NULL));
     
        do
        {
         printf( "Entrer le nb d'elements du vecteur ( <= %d ) : ", NMAX );
         ok = scanf( "%d", &n );
    	 while( getchar( ) != '\n' );  /* ou fgets(vb,80,stdin)  avec  char vb[81];  */
       }while( !ok || n < 0 || n > NMAX );
     
        gen_aleat( v, n );
        printf( "Voici le tableau genere :\n" );
        aff_vect( v, n );
     
        printf("Voici le tableau apres suppression des doublons : \n");
        doublons(v,n);
     
        return 0;
    }

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Bonsoir
    Citation Envoyé par Armays Voir le message
    ils sont remplacés par un caractère vide et placés à la fin du tableau,
    "vide" ça n'existe pas en prog. Donc tout caractère dédoublé est remplacé par un espace. Et au final tous les espaces dédoublés ils sont remplacés par quoi ???

    Citation Envoyé par Armays Voir le message
    mais ça ne marche pas :
    Oui ben ici c'est un forum d'aide, pas un forum où on va réfléchir à ta place. A toi de mettre du printf() là où il faut pour vérifier que tes éléments correspondent à ce que tu attends...

    Citation Envoyé par Armays Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                while (v[i]==v[j])
                {
                    cpt = cpt + 1;
                    v[j]=' ';
                    echange = v[j];
                    v[j] = v[n-cpt];
                    v[n-cpt]=echange;
                }
    Je ne comprends pas cette boucle tant que v[i] est égal à v[j] alors que dans le corps, v[j] change. Fatalement au premier tour de boucle, ils ne sont plus égaux (sauf si v[i] est égal à un espace ce qui ramène à ma première question). Accessoirement écrire v[j]=truc puis juste en dessous v[j]=chose c'est un peu idiot non ? Surtout pour la variable (mot signifiant "qui varie") "echange" qui ne contient en tout et pour tout qu'un simple espace et qui, donc, ne "varie" absolument pas...

    Citation Envoyé par Armays Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /* ou fgets(vb,80,stdin)  avec  char vb[81];  */
    J'ai déjà écrit un truc à ce sujet. Ce n'est pas la peine de poser des questions sur les forums si tu ne lis pas ce qu'on t'écrit !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Tu es au taquet avec tes tableaux: insertion dans un tableau, suppression de doublons, échange de cases:
    PS: tu n'en as pas marre de faire des algos "sur place"

    Sinon cpt = cpt + 1;, est indéterminée parce que cpt n'est pas initialisée.
    Cela te pendait au nez en séparant la déclaration et l'initialisation

    Et enfin tu t'y prends mal (ou alors je ne comprends pas ce que tu veux faire *) parce que cpt doit être décrémenté parce que initialisée à la dernière case.

    * -> Tu préfères utiliser un nombre de cases remplies qu'une vrai case

  4. #4
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Par défaut
    Désolé je suis désespéré, j'ai modifié ma procédure mais ça ne marche toujours pas :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #define NMAX 200
     
    void gen_aleat( char v[], int n )
    {
     int i;
     /* rand() retourne un entier aléatoire de l'ens {0,1,2,..,RAND_MAX} (RAND_MAX fixé à 32767 sous VC++)*/
     for(i = 0; i < n; i++) v[i] = rand()%(122-97) +97;/* pour avoir aussi des nbrs<0 */
    }
     
    void aff_vect( char v[], int n )
    {
     int i;
     for( i = 0; i < n; i++ )
     {
    	 printf( "%c", v[i] );
         if ( (i+1) % 10 == 0 ) printf( "\n" );
     }
     printf( "\n" );
    }
     
    void doublons (char v[], int n)
    {
        int i;
        int j;
     
        i = 0;
        while (i < n)
        {
            j = i + 1;
            while (j < n-1)
            {
                if (v[i]==v[j] && v[i]!= ' ')
                    {
                        while (j < n-1)
                        {
                            v[j]=v[j+1];
                            j = j+1;
                        }
                        v[n-1]=' ';
                    }
                j = j +1;
            }
            i = i + 1;
        }
     
     
    }
     
    int main()
    {
        char v[NMAX];
        int n;
        int ok;
     
        srand(time(NULL));
     
        do
        {
         printf( "Entrer le nb d'elements du vecteur ( <= %d ) : ", NMAX );
         ok = scanf( "%d", &n );
    	 while( getchar( ) != '\n' );
       }while( !ok || n < 0 || n > NMAX );
     
        gen_aleat( v, n );
        printf( "Voici le tableau genere :\n" );
        aff_vect( v, n );
     
        printf("Voici le tableau apres suppression des doublons : \n");
        doublons(v,n);
        aff_vect( v, n );
     
        return 0;
    }

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Armays Voir le message
    Désolé je suis désespéré, j'ai modifié ma procédure mais ça ne marche toujours pas :
    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
    while (i < n)
        {
            j = i + 1;
            while (j < n-1)
            {
                if (v[i]==v[j] && v[i]!= ' ')
                    {
                        while (j < n-1)
                        {
                            v[j]=v[j+1];
                            j = j+1;
                        }
                        v[n-1]=' ';
                    }
                j = j +1;
            }
            i = i + 1;
        }
    Ben oui. Tant que tu n'auras pas dessiné sur un papier ton tableau avec tes lettres et schématisé le fonctionnement tu ne pourras pas le coder correctement (ce que foetus dit quand il parle d'algos "sur place").
    Ici tu boucles tant que j < n-1 (pourquoi "n-1" alors que pour moi, si je dois comparer la première lettre du tableau avec toutes les autres, il me faudra alors dérouler le tableau de la suivante jusqu'à la fin et non m'arrêter une case avant !!!) puis en dessous de nouveau une boucle identique. Avec j qui s'incrémente. Donc quand la seconde boucle se termine, j est arrivé à la fin et la première boucle s'arrête aussi.
    Si tu réfléchis 2mn avant de coder, tu te rendras compte que pour éliminer les doublons, il faut prendre la première lettre et comparer toutes les autres ; puis prendre la seconde et comparer toutes les autres ; et etc. Donc c'est deux boucles et non 3 !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Par défaut
    C'est bon ça marche, j'ai remplacé j par k dans la 3e boucle et je l'ai initialisé à j :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #define NMAX 200
     
    void gen_aleat( char v[], int n )
    {
     int i;
     /* rand() retourne un entier aléatoire de l'ens {0,1,2,..,RAND_MAX} (RAND_MAX fixé à 32767 sous VC++)*/
     for(i = 0; i < n; i++) v[i] = rand()%(122-97) +97;/* pour avoir aussi des nbrs<0 */
    }
     
    void aff_vect( char v[], int n )
    {
     int i;
     for( i = 0; i < n; i++ )
     {
    	 printf( "%c", v[i] );
         if ( (i+1) % 10 == 0 ) printf( "\n" );
     }
     printf( "\n" );
    }
     
    void doublons (char v[], int n)
    {
        int i;
        int j;
        int k;
     
        i = 0;
        while (i < n)
        {
            j = i + 1;
            while (j < n-1)
            {
                if (v[i]==v[j] && v[i]!= ' ')
                    {
                        k =j;
                        while (k < n-1)
                        {
                            v[k]=v[k+1];
                            k = k+1;
                        }
                        v[n-1]=' ';
                    }
                j = j +1;
            }
            i = i + 1;
        }
     
     
    }
     
    int main()
    {
        char v[NMAX];
        int n;
        int ok;
     
        srand(time(NULL));
     
        do
        {
         printf( "Entrer le nb d'elements du vecteur ( <= %d ) : ", NMAX );
         ok = scanf( "%d", &n );
    	 while( getchar( ) != '\n' );
       }while( !ok || n < 0 || n > NMAX );
     
        gen_aleat( v, n );
        printf( "Voici le tableau genere :\n" );
        aff_vect( v, n );
     
        printf("Voici le tableau apres suppression des doublons : \n");
        doublons(v,n);
        aff_vect( v, n );
     
        return 0;
    }

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Armays Voir le message
    C'est bon ça marche, j'ai remplacé j par k dans la 3e boucle et je l'ai initialisé à j :
    Non, ça ne marche pas
    En faisant des tests, j'ai remarqué que "cbshadapys" devenait "cbshadpys". Certes le "a" dédoublé disparait mais le "s" dédoublé reste dédoublé.
    Rajoute l'instruction strcpy(v, "cbshadapys") en fin de gen_alea() et tu pourras le vérifier toi-même. Et je t'ai déjà dit que 3 boucles ce n'était pas utile (et en prog, "pas utile" signifie "à ne pas faire" !!!)

    Citation Envoyé par Armays Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void gen_aleat( char v[], int n )
    {
     int i;
     /* rand() retourne un entier aléatoire de l'ens {0,1,2,..,RAND_MAX} (RAND_MAX fixé à 32767 sous VC++)*/
     for(i = 0; i < n; i++) v[i] = rand()%(122-97) +97;/* pour avoir aussi des nbrs<0 */
    Pourquoi 122-97 ? Pourquoi pas directement 26 (au fait, 122-97 ça fait 25 !!!)
    Donc tu veux une lettre entre 'a' et 'z' tu demandes bêtement un rand() % 26 + 'a', ça t'évitera au-moins les erreurs de calcul !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Suppression des doublons dans une variable de type tableau
    Par damsmut dans le forum Général VBA
    Réponses: 2
    Dernier message: 23/07/2019, 10h36
  2. Suppression des doublons dans un tableau des chaines
    Par rimenis dans le forum Langage
    Réponses: 3
    Dernier message: 22/02/2013, 12h26
  3. [Tableaux] suppression des doublons dans un tableau
    Par hammag dans le forum Langage
    Réponses: 3
    Dernier message: 17/06/2009, 19h13
  4. problème avec la suppression des doublons dans arraylsit
    Par ulysse031 dans le forum Langage
    Réponses: 13
    Dernier message: 04/03/2007, 12h52
  5. [Tableaux] Retirer des doublons dans un tableau
    Par Xunil dans le forum Langage
    Réponses: 2
    Dernier message: 07/11/2006, 18h04

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