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 :

Recherche de nombre d'occurences dans un tableau d'entier


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 112
    Points : 42
    Points
    42
    Par défaut Recherche de nombre d'occurences dans un tableau d'entier
    Salut,
    Je suis débutante en c++.Je manipule un tableau qui est déjà rempli au préalable par des entiers.Je voulais développer une fonction qui me calcule le nombre d'occurrence de chaque élément,mais je ne sais pas pourquoi ça ne fonctionne pas.Cette fonction me retourne de faux résultats et j'arrive pas à voir la provenance du problème.Le code est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int get_occurence(int *t,int N,int valeur)
    {
    	int nb_occurence=0;
     
    	for(int s=0;s<N;s++)
    	{
    		if (t[s]==valeur)
    		{
    		nb_occurence=nb_occurence+1;
    		}	
    	}
    	return(nb_occurence);
    }
    et pour l'appel de la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int *col ;
    int main(int argc, char* argv[])
    {
    ....
    int supp[100];
    for (int k=0;k<nbcol;k++)  //nbcol c'est la taille du tableau col déja rempli
    {
    	supp[k]=get_occurence(col,nbcol,col[k]);
    }
    return 0;
    }

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Cette fonction me retourne de faux résultats et j'arrive pas à voir la provenance du problème.
    La fonction retourne bien le bon résultat. Le problème est ailleurs.

    Peut-être voulez-tu appeler la fonction plutôt comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	supp[k]=get_occurence(col,nbcol,k);
    (tout en considerant que le pointeur col pointe bien sur un tableau)

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Là, via "supp[k]=get_occurence(col,nbcol,col[k])", tu cherches à connaître, pour chaque élément du tableau "col", le nombre d'occurrences de chacun des nombres contenu dedans.

    Donc, sur un tableau col valant { 1, 1, 2, 2, 3, 3, 4, 1 }, ton tableau "supp" vaudra { 3, 3, 2, 2, 2, 2, 1, 3, 0, ... }.

    En effet, la valeur à l'indice I du tableau "supp" est le nombre d'occurrences du nombres de même indice dans le tableau "col".
    Donc, supp[0] est le nombre d'occurrences de col[0] dans le tableau col, donc le nombre d'occurrences du chiffre "1".

    Était-ce bien ce que tu cherchais à faire ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #4
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 112
    Points : 42
    Points
    42
    Par défaut
    Salut,

    Merci pour vos réponses.En fait,ce que je veux faire avec la fonction get_occurence(col,nbcol,col[k]) est de connaitre, pour chaque élément du tableau "col", le nombre d'occurrences de chacun des nombres contenu dedans,mais sans redondance.Je m'explique:

    pour un tableau "col" qui contient les valeurs suivantes { 1,1,2,2,2,2,3,3,4,1} mon tableau "supp" contiendra les valeurs suivantes {3,4,2,1}.

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par FstDsi Voir le message
    En fait,ce que je veux faire avec la fonction get_occurence(col,nbcol,col[k]) est de connaitre, pour chaque élément du tableau "col", le nombre d'occurrences de chacun des nombres contenu dedans,mais sans redondance.Je m'explique:

    pour un tableau "col" qui contient les valeurs suivantes { 1,1,2,2,2,2,3,3,4,1} mon tableau "supp" contiendra les valeurs suivantes {3,4,2,1}.
    Alors ton algo est faux, même si ta fonction get_occurence est par contre juste...

    Je t'explique : d'une part, un "int", c'est 32 bits en général, donc les valeurs peuvent monter jusqu'à deux milliards environ. Ton tableau "supp" n'est bien sûr pas assez grand, la mémoire de ton ordinateur non plus d'ailleurs...

    De plus, ton tableau "supp" ne contient plus l'information "quel est le nombre compté ?" : comment savoir à quel nombre correspond le "2" contenu dans supp[2], dans ton exemple ? (N'oublie pas, en C/C++, les indices de tableau commencent à zéro...)
    Car en effet, "col[2]", lui, contient "2"... Et ce n'est pas le nombre correspondant !


    Donc, si tu veux savoir combien de fois chaque chiffre est contenu dans le tableau "col", pas trop le choix : il va falloir associer le chiffre et son cardinal dans le tableau "col", et autrement que via un indice étant donné le domaine de définition d'un int. En général, on utilise des structures pour ça, et dans ton cas tu vas simplement devoir chercher si tu as déjà compté un nombre donné avant de le faire, pour ne pas avoir de redondances.

    Toutefois, tu peux aussi passer par la bande, en faisant une copie de ton tableau "col", en le triant, puis en comptant beaucoup plus facilement les occurrences... Reste à savoir ce qu'il te fallait faire : implémenter un algorithme particulier, ou simplement avoir le résultat...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par FstDsi Voir le message
    pour un tableau "col" qui contient les valeurs suivantes { 1,1,2,2,2,2,3,3,4,1} mon tableau "supp" contiendra les valeurs suivantes {3,4,2,1}.
    J'ai du mal à comprendre la structure du résultat, sauf si tu as la garantie que ton tableau initial ne contient que des très petits nombres.

    Le moyen le plus simple de faire ça dans le cas général est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    map<int, int> occurences;
    for (int i = O, i<nbCol ; ++i)
    {
      occurences[col[i]]++;
    }
    Et maintenant, la map contient pour chaque nombre le nombre de fois où il apparait.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 112
    Points : 42
    Points
    42
    Par défaut
    Oui c'est vrai je me rends compte maintenant que je dois utiliser un tableau de structure (composée de deux entiers) pour que je puisse garder le contenu du nombre dont je cherche l'occurrence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct couple 
    {
    int ind_ligne;
    int ind_colonne;
    };
    Je vais vous expliquer mon problème exactement.Ce que je suis en train de faire c'est de lire à partir d'un fichier composé de 0 et 1 et ce que j'essaie de faire c'est d'extraire les positions de 1(num_ligne,num_colonne) sachant que je sais d'avance le nombre de lignes et le nombre de colonnes dans ce fichier.
    Le fichier aura donc cette forme:

    1 0 0 1 0 0
    0 1 1 1 1 0
    1 0 0 0 0 0
    ....
    J'ai stocké ces indices dans deux tableaux l'un pour les lignes et l'autre pour les colonnes
    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
     
    int main(int argc, char* argv[])
    {
    	ligne=new int[9999];// tableau pour stocker l'indice des lignes
    	col=new int[9999];// tableau pour stocker l'indice des colonnes
     
     if(!(fichier = fopen("c:\\aa.data", "rb")))
         {
           printf("Ouverture de %s impossible.\n");
           return 1;
         }
    int i=0;
    int cptl=0;
    int cptc=0;
     
    while(!feof(fichier))
        {
    	 fscanf ( fichier, "%s", &tmp);
         if(cptc>=nbcol)//nbcol et nbligne déjà extraits avant 
    	{
         cptl++;
         cptc=0;
    	}
    	 if(tmp[0]=='1')
    	{
    	 ligne[i]=cptl;
    	col[i]=cptc;
    	i++;
    	}
    cptc++;	
    }
     
    for(int j=0;j<i-1;j++)
    {
    printf("%d | %d \n",ligne[j],col[j]);//affiche les indices de tous les 1 dans le fichier
     
    }
    return 0;
    }
    Ce que je veux faire après c'est trier les colonnes selon le nombre de 1 qu'elles contiennent c'est pour cela que je cherche le nombre d'occurrence des éléments de la table col.Pour l'exemple que je viens de mentionner on obtient les résultats suivants:
    ligne={0,0,1,1,1,1,2}
    col={0,3,1,2,3,4,0}
    normalement le tableau supp qui sera une structure va me retourner:
    supp=[0|2,1|1,2|1,3|2,4|1,5|0]

    Je sais que c'est un peu compliqué mais je me retrouve confondu avec les indices. Apparemment je n'est pas choisi de bonnes structures dès le départ.Pourriez vous m'aider svp

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par FstDsi Voir le message
    Je sais que c'est un peu compliqué mais je me retrouve confondu avec les indices. Apparemment je n'est pas choisi de bonnes structures dès le départ.Pourriez vous m'aider svp
    Comme l'a souligné JolyLoic, si tu veux être "C++" complètement, une map est le meilleur choix : c'est (en résumé grossier) un vecteur de taille quelconque, adaptative, et associant une donnée à une autre... Ce qui correspondrait à ton besoin.

    Là, ton code est plus du C que du C++, en fait.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 112
    Points : 42
    Points
    42
    Par défaut
    Merci pour vos réponses.Je sais que ce que j'est écrit est plutôt du C non pas du C++ mais je suis en train de lire un tutorial concernant le langage C++ pour me rafraichir la mémoire parce que ça fait longtemps que je l'ai étudié mais entre temps j'ai développé ce bout de code pour que je puisse avancer dans mon projet.Concernant les "maps" quelle bibliothèque faut il utiliser avec?? parce que ça me retourne une erreur quand je déclare "map<int, int> occurences;" error C2065: 'map' : undeclared identifier

  10. #10
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par FstDsi Voir le message
    Pour l'exemple que je viens de mentionner on obtient les résultats suivants:
    ligne={0,0,1,1,1,1,2}
    col={0,3,1,2,3,4,0}
    Je ne comprends pas bien les résultats.

    Mais à mon avis, en découpant en struct le problème sera plus simple à résoudre. Par exemple, si j'ai bien compris, tu cherches à faire quelque chose comme :
    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
     
    #include <vector> // pour bénéficier des vecteurs de la STL
    #include <algorithm> // pour bénéficier de sort(), l'algo de trie de la STL
     
    // prédicat de trie personalisé
    bool TrieParNombreDe_1(const Rangee& r1, const Rangee& r2)
    {
        return r1.nombre_de_1 < r2.nombre_de_1; 
    } 
     
    struct Rangee
    {
       Rangee():indice(0),nombre_de_1(0){}
       Rangee(int indice_, int nombre_de_1_):
       indice(indice_),
       nombre_de_1(nombre_de_1_)
       {}
     
       int indice;
       int nombre_de_1;
    };
     
     
    std::vector<Rangee> lignes;
    std::vector<Rangee> colonnes;
     
    // remplir lignes et colonnes en lisant le fichier
    //...
     
    // puis trier
    std::sort(lignes.begin(), lignes.end(), TrieParNombreDe_1);
    std::sort(colonnes.begin(), colonnes.end(), TrieParNombreDe_1);
    Reste à trouver le mot adéquat pour décrire la struct qui contient l'indice de la ligne/colonne et le nombre de 1 sur la ligne/colonne. Rangée, c'est pas terrible...

  11. #11
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 112
    Points : 42
    Points
    42
    Par défaut
    Merci bcp. svp est ce que vous pourriez me détailler un peu plus la structure que vous proposez.J'ai pas su comment insérer dedans les valeurs que je veux stocker

  12. #12
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Comme dans la faq.
    Par exemple, si la ligne 4 contient 15 'un', alors on ajoute cette info avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int indiceLigne = 4;
    int nombre_de_1 = 15;
     
    lignes.push_back(Rangee(indiceLigne ,nombre_de_1));

  13. #13
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par FstDsi Voir le message
    Concernant les "maps" quelle bibliothèque faut il utiliser avec?? parce que ça me retourne une erreur quand je déclare "map<int, int> occurences;" error C2065: 'map' : undeclared identifier
    Il faut un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <map>
     
    using namespace std;
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  14. #14
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 112
    Points : 42
    Points
    42
    Par défaut
    Est il préférable que j'utilise les vecteurs ou les maps, sachant que je traite des fichiers de grandes tailles donc je dois économiser en mémoire.

  15. #15
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Un vecteur (std::vector) est un tableau, certes encapsulé et avec plus de possibilité qu'un tableau C, mais ça reste un simple tableau.

    Une map (std::map) est en fait une manière d'associer deux choses n'ayant à priori rien à voir entre elles, comme par exemple un numéro de dossier et le nom du gugusse qui a imprimé le document... Ou, dans ton cas, un entier et son cardinal dans un vecteur !

    Donc : col devient un std::vector<int>, et supp une std::map<int,int>. La FAQ et l'aide en ligne du compilateur t'aideront à comprendre comment ces deux éléments fonctionnent.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Recherche séquentielle d'une occurence dans un tableau
    Par benjamin_malaussene dans le forum Débuter
    Réponses: 5
    Dernier message: 31/10/2014, 15h56
  2. [XI] Nombre d'occurences dans un tableau
    Par DALIDON2005 dans le forum Deski
    Réponses: 2
    Dernier message: 15/12/2008, 09h31
  3. Réponses: 3
    Dernier message: 18/07/2008, 03h16
  4. Compter le nombre d'occurence dans un tableau
    Par titou250 dans le forum Excel
    Réponses: 2
    Dernier message: 08/01/2008, 16h25
  5. recherche du nombre d'occurences dans une table
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/01/2004, 20h03

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