Partage
  • Partager sur Facebook
  • Partager sur Twitter

nombre d’occurrence d'un élément dans un tableau

25 août 2017 à 14:51:31

Je veux un programme qui affiche l'élément le plus répété dans le tableau 
exemple : 2 1 2 4 4 3 9 9 8 9 
l'élément le plus répétez c'est 9 

dans le cas où le tableau est composé de 9 2 3 4 4 3 2 4 2 3

qu'on affiche 3 4

  • Partager sur Facebook
  • Partager sur Twitter
Seth Siméon
25 août 2017 à 15:02:12

et comment t'y prendrais-tu?
  • Partager sur Facebook
  • Partager sur Twitter
25 août 2017 à 15:03:30

Seth Siméon a écrit:

Je veux un programme qui affiche l'élément le plus répété dans le tableau 
exemple : 2 1 2 4 4 3 9 9 8 9 
l'élément le plus répétez c'est 9 

dans le cas où le tableau est composé de 9 2 3 4 4 3 2 4 2 3

qu'on affiche 3 4


warning: missing courtesy, explanations and tests already done [forum rules]
  • Partager sur Facebook
  • Partager sur Twitter
25 août 2017 à 15:08:54

#include<stdio.h>
int main()
{
	int n, i,j, T[10], taille, occurence[10], memo;
	taille= sizeof(T)/4;
    for(i=0; i<taille; i++)//je remplis mon tableau
        {
   		printf("Entrer l'element %d :", i);
   		scanf("%d",&T[i]);
        occurence[i]=0; // j'initialise les occurence de mon tableau à 0
        }

	for(i=0; i<taille; i++) //je trie mon tableau du plus petit au plus grand
        {
            for(j=i; j<taille; j++)
            {
              if(T[i] > T[j])
              {
                  memo=T[i];
                  T[i]=T[j];
                  T[j]=memo;
              }
             }
        }

	for(i=0; i<taille; i++) //j'incrémente l'occurence de chaque élément à chaque fois qu'il est retrouvé 
        {
        for(j=0; j<taille; j++)
        {
   		if(T[i] == T[j])
   			{

 			occurence[j]=occurence[j]+1;

   			}
        }

        printf(" %d- ", occurence[i]);
        }

     for(i=1; i<taille; i++) //j'affiche le nombre qui a la plus grande occurence
     {
           if (occurence[i]>=occurence[i+1])

                printf("\n%d", T[j]);
     }



	return 0;
}

ceci est mon code je ne sais pas où se trouve l'erreur mais j'ai besoin d'une correction
  • Partager sur Facebook
  • Partager sur Twitter
Seth Siméon
25 août 2017 à 15:52:58

Salut,

Voila une solution répondant a l’énoncé :

#include &lt;stdio.h&gt;

int main(void) {
	int tab1[] = { 2, 1, 2, 4, 4, 3, 9, 9, 8, 9 };
	int tab2[] = { 9, 2, 3, 4, 4, 3, 2, 4, 2, 3 };
	printf("%d\n", 9);
	printf("%d %d\n", 3, 4);
	return 0;
}

-
Edité par Pouet_forever 25 août 2017 à 15:58:56

  • Partager sur Facebook
  • Partager sur Twitter
25 août 2017 à 16:31:19

Dans l'ennoncé, rien ne précise la taille des éléments d'un tableau. 

Trier le tableau est une bonne idée.

Cela évite de faire un tableau d'occurrence dont tu ne peux pas connaître la taille simplement.

Une fois trié les valeurs identiques sont adjacentes.

il suffit d'une variable pour stocker la taille d'un.bloc max.

et de refaire un parcourt pour afficher toutes les réponses.

  • Partager sur Facebook
  • Partager sur Twitter
25 août 2017 à 20:01:12

Salut autre solution.

Comme les valeurs entrer dans le tableau ne sont (pour l'instant) que des caracteres ASCII,

On pourrai creer un tableau de toutes les valeurs possibles. (donc un tableau de 129 case).

puis on met toutes le valeurs a zeros : int tabpossibilite[129] = {0};

Enfin on fait une boucle qui prend chacun des elements et incremente la position de l'element dans

le tableau de possibilite. : tabpossibilite[tab[i]] += 1;

et on refait une boucle parcourant tabpossibilite pour trouver la case

la plus grande.

Voilà.

PS :

Pour le cas ou il y plusieurs reponses possible, il n'y a qu'a

creer un tableau de possibilite.

-
Edité par scotthamilton 25 août 2017 à 20:07:47

  • Partager sur Facebook
  • Partager sur Twitter
26 août 2017 à 23:00:11

neuneutrinos a écrit:

Dans l'ennoncé, rien ne précise la taille des éléments d'un tableau. 

Trier le tableau est une bonne idée.

Cela évite de faire un tableau d'occurrence dont tu ne peux pas connaître la taille simplement.

Une fois trié les valeurs identiques sont adjacentes.

il suffit d'une variable pour stocker la taille d'un.bloc max.

et de refaire un parcourt pour afficher toutes les réponses.


Pour que ça gagne quelque chose par rapport  à la méthode basique, il faut jeter à la poubelle les tris classiques (bulles, insertion, selection) qui sont quadratiques, et que les enseignants malfaisants exposent à leurs élèves,  et se programmer (ou utiliser) un tri dont la complexité est en n.log(n). Sinon, ça ne gagne rien, ça ne fait que des complications

Mais ça l'étonnerait que ça soit l'exercice, à cette saison. Un bon tri, + un traitement de séquences ? hum hum.

Sinon, la première méthode qui devrait venir à l'esprit est la meilleure  : utiliser la fonction "nombre_d_occurences" qu'on a certainement écrit dans l'exercice précédent, et on retombe sur un schéma classique : trouver dans un tableau l'élément qui a le meilleur ceci-cela.

pour trouver la valeur qui a le plus d'occurrences
     dans le tableau T :
{
     variables locales 
         V = n'importe quoi                       # meilleur élément trouvé jusque là
         N = 0                                    # son nombre d'occurrences

     pour tout élément E de T {
         soit NE = nombre_d'occurences de E dans T   # appel fonction
         si NE > N alors {
             V = E                                # on a trouvé mieux
             N = NE
         }
     }

     retourner V
}

faut décomposer en fonctions, les gars.



-
Edité par michelbillaud 26 août 2017 à 23:05:19

  • Partager sur Facebook
  • Partager sur Twitter
28 août 2017 à 11:56:42

Tous les tris naïfs ne sont pas à jeter.

Après faut aussi qu'il cherche un peu ;) 

  • Partager sur Facebook
  • Partager sur Twitter
28 août 2017 à 13:43:52

#include <stdio.h>
#include <stdlib.h>

int occurence(int nb)

{
    int tableau[10]={1,1,1,3,1,1,1,5,6,2}, occurence=0,taille, i;
    taille = sizeof(tableau)/4;
     for(i=0; i<taille; i++) //j'incrémente l'occurence de chaque élément à chaque fois qu'il est retrouvé
        {
               if(tableau[i] == nb)
               occurence++;

        }

    return occurence; //je renvoie le nombre d'occurence
}

int main ()
{
    int nombre[10]= {0,1,2,3,4,5,6,7,8,9}; //le nombre à tester combien de fois il est apparu
    int resultat[10];
    int taille, i, j;
    int resultmax; //variable tempon pour stocker la plus grande occurence
    //nombre[10] ;
    taille = sizeof (nombre)/4;
    int *presult;
    presult=&resultat[0];


    for (i=0; i<taille; i++)
        {
        resultat[i]=occurence(nombre[i]); // appel de ma fonction occurence pour chaque élément du tableau
        printf("%d - ", *(presult+i) );
        }

    resultmax= *presult; // j'affecte dans cette variable le premier élémenet de mon tableau


   for (i=1; i<taille; i++)
        {
                for (j=i+1; j<taille; j++)
            {
                if (resultmax <= *(presult+j))
                    {
                        resultmax= resultat[j];
                        printf("%d - ", nombre[j] );
                        break;

                    }
            }
        }
return 0;
}

 il essaye de fois de tourner mais après il me donne des résltats non attendu... svp s'il y a quelqu'un pour me corriger je suis prêt à recevoir la correction
  • Partager sur Facebook
  • Partager sur Twitter
Seth Siméon
28 août 2017 à 13:44:50

Tu connais des tris naifs de complexité n.log(n) ?

La question est de savoir si faire un tri puis trouver la plus longue séquence consécutive, c'est une bonne réduction du problème de trouver l'élément qui a le plus d'occurrences. Ca va être le premier réflexe (on sait pas quoi faire alors on va trier, ça donne l'impression qu'on a travaillé) mais c'est pas forcément le bon (en plus, on paume le tableau d'origine, bien joué les gars).

Et d'abord ce qu'on considère comme _bon_ comme solution, dans le contexte où est posé l'exercice.

Il est probable (à 99%) que quand on pose cet exercice, le débutant n'a aucune notion de complexité, n'a jamais écrit de tri de complexité moindre que quadratique, et n'est pas en état de le faire. L'objectif pédagogique est simplement de faire écrire des traitements qui ne se résument pas à une simple boucle + un test.

Donc si le critère n'est pas la complexité optimale, il s'agit de faire le code le plus simple possible.  Pour un débutant, trouver la plus longue séquence consécutive, c'est dans la catégorie "algos de traitement de rupture de séquence", (*) c'est beaucoup plus difficile que trouver l'élément qui maximise quelque chose.

--- en plus, il y a une grosse indication

  • dans le  titre  c'est écrit en gros "nombre d'occurrences d'un élement dans un tableau"
  • et c'est dans le sujet que vient "trouver l'élement qui en a le plus"

ce qui suggère fortement que pour faire le 2, le 1 aide beaucoup. Mais bon, depuis quand faut-il lire les énoncés ?

(*) un balayage du tableau, en conservant

  • la valeur et le nombre d'occurrences du meilleur candidat trouvé jusque là
  • la valeur et le nombre d'occurrences de la sous-séquence courante

 donc pour chaque élément, test pour voir si on est toujours dans la même sous-séquence, et test pour savoir si la sous-séquence est meilleure que celle trouvée jusque là.

En résumé, 4 variables, une boucle, deux tests, et des initialisations un peu délicates au début.  A comparer avec 2 variables et 1 test.

-
Edité par michelbillaud 28 août 2017 à 13:53:39

  • Partager sur Facebook
  • Partager sur Twitter
28 août 2017 à 16:50:14

La complexité ne fais pas tout hein ?

un tri par insertion sera plus rapide qu'un tri rapide pour un petit n.

et les tris naïfs ont un bon atout pédagogique. simple à comprendre et rapide à coder.

Pour une utilisation concrète ce ne seront pas les tris naïfs qui seront utilisé ( Ou mélangé à un tri rapide)

Si le tableau ne contient qu'un nombre limité de valeur, un tri panier est envisageable sans être complexe à coder.

et un parcourt de tous les paniers permettraient de répondre à l'ennoncé. 

Apres. .. entre ce qui est dit et le vrai ennoncé...

  • Partager sur Facebook
  • Partager sur Twitter
28 août 2017 à 17:57:21

La question n'est pas l'intérêt des tris naïfs (*) mais celui d'utiliser un tri de tableau pour résoudre le problème posé. Vu que derrière, il faut se coltiner en plus un algorithme qui n'est pas si simple.

Vu qu'il s'agit d'un pur exercice d'école, personne ne sait si les données sont toujours volumineuses, ou toujours petites, ou de tailles variables (et avec quelle distribution statistique). Il est donc assez douteux de spéculer sur ce qui serait le plus performant concrètement, puisqu'il n'y a pas d'utilisation concrète.

Ce qui est demandé,  c'est que l'étudiant présente une solution simple, raisonnable, et si on est optimiste qu'il soit capable d'expliquer pourquoi il a choisi de faire comme ça (autrement que "j'ai commencé à écrire des trucs et ça a l'air de marcher").

Parce que par exemple, si on sort l'argument <<

Trier le tableau est une bonne idée. Cela évite de faire un tableau d'occurrence dont tu ne peux pas connaître la taille simplement.

>>

désolé, ça tient pas la route, pour deux raisons

1. Absolument rien n'oblige à faire un tableau d'occurrences (on peut les calculer et les utiliser "au vol")

2. On peut très bien se passer à la fois de tableau d'occurence et de tri. Le "ça évite" est un "non sequitur"

et qui plus est, en général,  on évite de modifier un tableau de données sur lequel on calcule quelque chose. Ca oblige à en faire une copie.

(*) il faudrait rétablir la peine de mort pour ceux qui montrent le Bubble Sort

  • Partager sur Facebook
  • Partager sur Twitter
28 août 2017 à 18:19:12

pour le bubble sort je veux bien aiguiser la lame de la guillotine.

Après j'ai proposer en respectant au max ce qui a été proposé. Peut être pas là meilleur façon de répondre finalement.

  • Partager sur Facebook
  • Partager sur Twitter
20 mai 2018 à 15:01:04

svp qui peut me resoudre se propleme

Exercice Soit le début de programme suivant :

#include<iostream>

using namespace std;

int main()

{ int T[30]={1, 7,14, 0, 9, 4,18,18, 2, 4, 5, 5, 1, 7, 1,11,15, 2, 7,16,11, 4, 2,13,12, 2, 1,16,18,15}; int i,X,*p=NULL, N=30, nX, I1, I2; bool rep; 

Faire un copie/coller de ce morceau de programme de cette feuille vers le fichier " nom_appogée_Variante X.cpp " Répondez aux questions suivantes dans la suite du programme. 1) Afficher les éléments du tableau T. 2) lire au clavier un nombre entier X. 3) rechercher X dans le tableau T ; si X existe dans le tableau T, alors donner à la variable rep la valeur true, sinon donner à rep la valeur false. Et compter nX le nombre de fois que X apparait dans T. 4) Si rep est true, donner I1 l’indice de la première apparition de X dans T. Et donner I2 l’indice de la dernière apparition de X dans T. Par exemple : Si X=7, alors I1=1 et I2=18. Si X=14, alors I1=2 et I2=2. 5) En utilisant un pointeur p, copier les éléments de T de I1 à I2 dans un nouveau tableau A, qu’il faudra déclarer. 6) Ecrire une fonction premier qui prend en argument un entier k et retourne la valeur true si k est premier, sinon elle doit retourner false. Son prototype sera : bool premier(int k); 7) Appeler premier depuis main, en l’appliquant à tous les éléments de T, avec l’affiche pour chaque T[i] i=0,1,2…N-1 s’il est premier ou non. 

  • Partager sur Facebook
  • Partager sur Twitter
20 mai 2018 à 15:53:25

FatimaZohra16 a écrit:

svp qui peut me resoudre se propleme

Personne
  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

20 mai 2018 à 15:56:56

Bonjour,

Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Déterrage

Citation des règles générales du forum :

Avant de poster, demandez-vous si ce que vous allez dire apporte quelque chose au sujet. Si votre message n'apporte rien, vous ferez perdre du temps à tout le monde et le sujet pourrait dévier ou devenir difficile à suivre.

Aussi, vérifiez la date du topic. Le déterrage de topic nuit au bon fonctionnement du forum et est interdit. Utilisez les boutons pouce en haut pour dire merci. Si le topic date de plus de deux mois sans réponses, mieux vaut ne pas répondre. Si vous avez une question similaire, créez plutôt votre propre sujet en détaillant votre contexte

Je ferme ce sujet.

  • Partager sur Facebook
  • Partager sur Twitter