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 :

Doublons d'un tableau de char


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Etudiant ingénieur électronique et informatique industrielle
    Inscrit en
    Août 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant ingénieur électronique et informatique industrielle

    Informations forums :
    Inscription : Août 2015
    Messages : 28
    Par défaut Doublons d'un tableau de char
    Bonjour,

    Actuellement je suis sur un code pour un projet (réseau de métro Parisien) et je souhaite afficher toutes les stations d'une ligne.

    J'ai donc un code qui fonctionne parfaitement pour les afficher, mais le problèmes c'est qu'il les affiches 2 fois par station (dans une direction et dans le l'autre sur une ligne de métro)

    Alors j'essaye de ne les affiche qu'une fois, le plus simple pour moi serait une fonction permettant de supprimer tous les doublons du tableau afin de ne les afficher qu'une seule fois.

    Voici mon code actuel:

    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
    void mainListeStations(char nomLigne[])
    {
    	int i, j, k = 0, l;
    	char* listeStations[50];
     
    	for(i = 0; i < metroParisien.nombreDeStations; i++)
    	{
    		for(j = 0; j < metroParisien.listeStations[i].nombreDeSections; j++)
    		{
    			if( strcmp(metroParisien.listeStations[i].sectionsStation[j].referenceLigne.nomLigne, nomLigne) == 0 )
    			{
    				listeStations[k] = metroParisien.listeStations[i].nomStation;
    				k++;
    			}
     
    		}
    	}
     
    	for(l = 0; l < k; l++)
    	{
    		printf("%s\n", listeStations[l]);
    	}
     
    	//interfaceResultatListeStations(&metroParisien, numeroLigne);
    }
    Le tableau listeStations contient le nom de toutes les stations de la ligne donc, mais avec les doublons, par exemple si j'appel ma fonction avec une ligne (3 bis), j'ai le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Saint-Fargeau
    Saint-Fargeau
    Porte des Lilas
    Gambetta
    Pelleport
    Pelleport
    (Il n'affiche qu'une fois Gambetta et Porte des Lilas car se sont les terminus et ils sont présents qu'une seule fois dans une des deux directions).

    J'aimerais avoir quelque chose de ce type (peut importe l'ordre d'affichage des stations, dans l'ordre ou non, même si dans l'ordre serait mieux)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Saint-Fargeau
    Porte des Lilas
    Gambetta
    Pelleport
    Avez vous une idée de comment je peut réaliser une fonction permettant de supprimer les doublons d'un tableau de char et de l'affiche ensuite ?

    Merci, en espérant une réponse rapide.

    Cordialement,
    Share45.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Est-ce qu'on peut assumer que les doublons sont forcément l'un après l'autre dans la liste ou peuvent-ils être éparpillés ?

  3. #3
    Membre averti
    Homme Profil pro
    Etudiant ingénieur électronique et informatique industrielle
    Inscrit en
    Août 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant ingénieur électronique et informatique industrielle

    Informations forums :
    Inscription : Août 2015
    Messages : 28
    Par défaut
    J'ai bien l'impression que ce que tu dit est toujours vrai, j'ai fait plusieurs essais (en modifiant le numéro de la ligne) et tous les doublons sont à la suite.

    Par exemple pour une autre ligne (ligne 7):

    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
    Fort d'Aubervilliers
    Fort d'Aubervilliers
    Porte d'Ivry
    Porte d'Ivry
    Villejuif - Louis Aragon
    Porte d'Italie
    Porte d'Italie
    Gare de l'Est
    Gare de l'Est
    Crimée
    Crimée
    Jussieu
    Jussieu
    Place d'Italie
    Place d'Italie
    Les Gobelins
    Les Gobelins
    Châtelet
    Châtelet
    Le Kremlin-Bicêtre
    Le Kremlin-Bicêtre
    Corentin Cariou
    Corentin Cariou
    Sully - Morland
    Sully - Morland
    Porte de la Villette
    Porte de la Villette
    Mairie d'Ivry
    Riquet
    Riquet
    Chaussée d'Antin - La Fayette
    Chaussée d'Antin - La Fayette
    La Courneuve - 8 Mai 1945
    Pierre et Marie Curie
    Pierre et Marie Curie
    Château-Landon
    Château-Landon
    Cadet
    Cadet
    Poissonnière
    Poissonnière
    Aubervilliers - Pantin
    Aubervilliers - Pantin
    Le Peletier
    Le Peletier
    Villejuif - Léo Lagrange
    Villejuif - Léo Lagrange
    Pyramides
    Pyramides
    Censier - Daubenton
    Censier - Daubenton
    Pont Neuf
    Pont Neuf
    Louis Blanc
    Louis Blanc
    Pont Marie
    Pont Marie
    Villejuif - Paul Vaillant-Couturier
    Villejuif - Paul Vaillant-Couturier
    Stalingrad
    Stalingrad
    Palais Royal - Musée du Louvre
    Palais Royal - Musée du Louvre
    Tolbiac
    Tolbiac
    Place Monge
    Place Monge
    Porte de Choisy
    Porte de Choisy
    Opéra
    Opéra
    Maison Blanche
    Maison Blanche
    Maison Blanche

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    si les doublons se suivent de manière certaine alors il suffit de rajouter une condition pour s'assurer que metroParisien.listeStations[i].nomStation est différent de listeStations[k-1] avant de l'insérer dans la liste

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    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 769
    Par défaut
    Tout cela ce ne sont que des pansements sur une jambe de bois

    Parce qu’apparemment une station est affichée en double parce que 1) tu y arrives 2) tu la quittes

    Et avec le bout de code publié, il ne fait que 2 boucles for. Donc les doublons [ne] peuvent venir [que] de l'objet metroParisien.

    Tout est à refaire
    De plus nous ne travaillons pas comme en Java en enchainant les appels : metroParisien.listeStations[i].sectionsStation[j].referenceLigne.nomLigne.


    Moi j'avais codé le réseau de métro parisien à l'époque (c'était un projet en Ada) avec l'algo du plus court chemin de Dijkstra avec, de souvenir, une pondération à 1.

  6. #6
    Membre averti
    Homme Profil pro
    Etudiant ingénieur électronique et informatique industrielle
    Inscrit en
    Août 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant ingénieur électronique et informatique industrielle

    Informations forums :
    Inscription : Août 2015
    Messages : 28
    Par défaut
    Je vais du coup voir ce que je peut faire, car au premier tour ça risque de sortir du tableau avec k-1 il ne sera pas définit.

    Pour le fonctionnement peut importe, j'ai as le temps de tout refaire et le but premier est que cela soit fonctionnel, en 2 semaine j'ai pas le temps de faire des miracles, c'est sûrement pas parfait mais tanpis.

    Surtout que pour l'utilité qu'il en sera fait pour ce qui est optimisation ou rapidité n'est pas recherché sinon si c'est le cas je me pencherait dessus.

  7. #7
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par Share45 Voir le message
    Je vais du coup voir ce que je peut faire, car au premier tour ça risque de sortir du tableau avec k-1 il ne sera pas définit.
    c'est un vrai problème ça... if (k>=1)

  8. #8
    Membre averti
    Homme Profil pro
    Etudiant ingénieur électronique et informatique industrielle
    Inscrit en
    Août 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant ingénieur électronique et informatique industrielle

    Informations forums :
    Inscription : Août 2015
    Messages : 28
    Par défaut
    J'ai appliqué une autre méthode en vérifiant que l'emplacement n'était pas NULL mais ça revient au même.

    Je test ça tout à l'heure et je reviens donner le résultat et mettre en résolu si c'est bon

    Merci

  9. #9
    Membre averti
    Homme Profil pro
    Etudiant ingénieur électronique et informatique industrielle
    Inscrit en
    Août 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant ingénieur électronique et informatique industrielle

    Informations forums :
    Inscription : Août 2015
    Messages : 28
    Par défaut
    La solution trouvée fonctionne niquel, cela ne met plus les doublons dans le tableau.

    Merci de votre aide, sujet résolu !

  10. #10
    Membre averti
    Homme Profil pro
    Etudiant ingénieur électronique et informatique industrielle
    Inscrit en
    Août 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant ingénieur électronique et informatique industrielle

    Informations forums :
    Inscription : Août 2015
    Messages : 28
    Par défaut
    Je réouvre rapidement la discussion, car j'ai un probleme simillaire mais les doublons ne se suivent pas.

    Comment je peut faire pour les supprimer si il y a par exemple: 7 5 8 7 5 1 2 8

    Merci de votre aide.

  11. #11
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    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 769
    Par défaut
    Tu ne veux pas refaire ton code, mais tu vas passer ton temps à patcher dans tous les sens

    Un truc de bourrin comme cela (non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        unsigned short i, j, len /* <- size of tab*/;
     
        for(i = 0; i < len; ++i) {
            for(j = i; j < len; ++j) {
                if (tab[j] == tab[i]) { remove(j); }
            }
        }
    Par contre, l'ordre des stations n'est plus garanti

  12. #12
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pour chaque élément e1 faire
        pour chaque élément « autre » e2 faire
            si e1 = e2 alors « supprimer » e2
    J'ai lu en diagonale mais je crois avoir compris que les char * de ta liste sont des références additionnelles : tu ne t'en sers qu'en lecture seule et tu ne fais pas de free dessus ? Si c'est le cas alors « supprimer e2 » peut se traduire par affecter NULL à l'entrée correspondante du tableau à transmettre au code d'affichage.


    Cela dit je rejoins foetus : il y a quelque chose qui cloche au sein de ta structure de données et/ou de la manière dont tu l'interroges. Tout ça reste probablement inadapté au problème à résoudre.

    Côté implémentation je te recommanderais d'assigner un identifiant unique (uid) à chaque station. C'est plus fiable et plus commode à maintenir que de filtrer des listes avec des comparaisons de chaînes. Tu pourrais, par exemple, exploiter l'index de la station au sein du tableau qui les répertorie toutes.

  13. #13
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Si tu lis des données d'un fichier, ne serait-il pas plus malin de jeter les données déjà présentes dans la liste au fur et à mesure du chargement, plutôt que de tout charger et d'avoir ensuite à se taper la suppression des doublons d'une liste ?

    Je rejoins mes camarades sur le fait que tu devrais sans doute revoir la logique et peut-être la structure de données.

  14. #14
    Membre averti
    Homme Profil pro
    Etudiant ingénieur électronique et informatique industrielle
    Inscrit en
    Août 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant ingénieur électronique et informatique industrielle

    Informations forums :
    Inscription : Août 2015
    Messages : 28
    Par défaut
    Peut être mais là je dois avoir rendu le projet pour mercredi, donc je n'ai pas le temps de refaire toutes les fonctions, je bricole donc juste au tour.

    Par la suite, effectivement, je pourrais faire quelque chose de plus propre en modifiant le code, mais en 2 jours je n'aurais pas le temps surtout que j'ai encore des petites choses a faire dessus.

    @foetus: Peut importe l'ordre, je vais me baser sur ton morceau de code pour l'adapter au problème, désolé pour la correction, mais niveau temps c'est pas possible et niveau problème c'est un des seul que j'ai, tout le reste est fonctionnel

    @foetus2: La fonction remove prend un pointeur vers un fichier, apparaement il n'en veut pas pour l'utilisation actuelle, si j'applique tab[p] = "" ou NULL, cela ne fonctionne pas (il supprime tous les noms et n'affiche plus le contenu souhaité)

    @Mat: J'ai appliqué un code similaire a ce que tu propre, mais il ne fonctionne pas, rien ne change par rapport au code précédent. Merci quand même

  15. #15
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Alors il suffit de trier ta liste pour que les doublons soient voisins, tu as trouvé une solution pour ce cas, n'est-ce pas?
    Il y a une fonction standard pour le tri: http://www.cplusplus.com/reference/cstdlib/qsort/

  16. #16
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Voire même, si tu bosses sous Linux, un sort -u liste > liste.unique te crée un fichier déjà trié et sans doublons.
    Ainsi, tu n'as rien à écrire dans ton programme, et tu ne risques pas avoir de bug.

    Et pour Windows, Notepad++ (et son plugin textfx) te permet de faire la même chose.

Discussions similaires

  1. retrouver unesuite de caractères dans un tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 17
    Dernier message: 12/07/2005, 23h43
  2. Ansistring et tableau de char
    Par rabbi_jaccob dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/12/2004, 11h51
  3. Adresse d'un tableau de char
    Par Trap D dans le forum C
    Réponses: 8
    Dernier message: 23/12/2003, 12h02
  4. Réponses: 4
    Dernier message: 10/10/2003, 18h04
  5. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21

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