[Debutant] Determiner le mode d'une suite de nombre.

Le
Olivier BURELLI
Bonjour,

Je ne souhaite pas abuser de votre patience, mais ne sais vers qui me
tourner. Vivi, j'ai du mal à assimiler les boucles :p

Devant determiner le MODE d'une suite de nombres placée dans un
vector, après l'avoir triée, j'ai réalisé le code sis e=
n bas du
présent post.

après avoir saisie la suite : 1, 1, 2, 3, 3, 3, 4

je n'obtiens pas le résultat attendu, je reviens sans arret sur mon al=
go
mais tatillone. ne comprenant pas la sortie suivante :

Entrer une suite de nombres pour alimenter le vector v : 1
Entrer une suite de nombres pour alimenter le vector v : 1
Entrer une suite de nombres pour alimenter le vector v : 2
Entrer une suite de nombres pour alimenter le vector v : 3
Entrer une suite de nombres pour alimenter le vector v : 3
Entrer une suite de nombres pour alimenter le vector v : 3
Entrer une suite de nombres pour alimenter le vector v : 4
Entrer une suite de nombres pour alimenter le vector v : ^D

boucle N° 1
Lecture de v[0] et v[1]
Compteur d'occurence temporaire : 0
Nouvelle occurence > Ancienne Occurence : 1 > 0
boucle N° 1
Lecture de v[3] et v[4]
Compteur d'occurence temporaire : 1
boucle N° 2
Lecture de v[4] et v[5]
Compteur d'occurence temporaire : 1 <-- devrait être modifié
il y a 1 nombres identiques
le mode vaut : 1 < Il devrait valoir trois.


Lorsque la suite ne se termine pas par le chiffre 4, le résultat
attendu est correct.

Problème d'algo ou de traduction en code ?

Par avance, merci.


voici Le code de la boucle traitant les occurences :

vector<unsigned int> v; // vector stockant la suite de chiffre.

int mode=0; // variable stockant la valeur de l'occurence
// trouve a l instant t
int compteur = 1; // compteur des occurence
int temp_mode = 0; // variable temporaire stockant le nombre d'occurence
// jusqu'à trouver une occurence plus grande



for (unsigned int j = 1; j < v.size(); ++j)
{
if (v[j - 1] == v[j])
{

// Debugage

cout << "boucle N° " << compteur << endl;
cout << "Lecture de v[" << j - 1 << "] et v["
<< j << "]" << endl;

cout << " Compteur d'occurence temporaire : "
<< temp_mode << endl;

// Si la position n du vector n'est pas la
// derniere position

if ( j+1 < v.size() - 1)
{

// Si compteur de boucle > nbre d'occurence
// precedente ET que la valeur de n != de la valeur n
// suivante

if ((compteur > temp_mode) && (v[j] != v[j+1]))
{
// DEBUGGAGE
cout << "Nouvelle occurence > Ancienne
Occurence : "; cout << compteur << " > " <<
temp_mode << endl;

// Stocker alors le nombred'occurence
temp_mode = compteur;

// réinitialiser le compteur d'occurence
compteur = 0;

// stocker la valeur de cette occurence
mode = v[j];
}

}


// Sinon si la position du vector n est la dernière position
else if (j == v.size() - 1)
{

// Si compteur de boucle > nbre d'occurence precedente
// ET que valeur de n-1 == valeur du dernier n

if ((compteur > temp_mode) && (v[j - 1] == v[v.size()-1]))
{
cout << "Nouvelle occurence > Ancienne
Occurence : ";

cout << compteur << " > " << temp_mode << endl;

// Stocker alors le nombre d'occurences
temp_mode = compteur;

// réinitialiser le compteur d'occurences
compteur = 0;

// stocker la valeur de cette occurence
mode = v[j];
}

if ((compteur > temp_mode) && (v[j - 1] != v[j]))
{
// DEBUGGAGE
cout << "Nouvelle occurence > Ancienne
Occurence : ";

cout << compteur << " > " << temp_mode << endl;

// Stocker alors le nombre d'occurence
temp_mode = compteur;

// réinitialiser le compteur d'occurence
compteur = 0;

// stocker la valeur de cette
occurence mode = v[j - 1];
}
}
++compteur; // incrementer le compteur d'occurences
}
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #23532241
In article Olivier BURELLI
Bonjour,

Je ne souhaite pas abuser de votre patience, mais ne sais vers qui me
tourner. Vivi, j'ai du mal à assimiler les boucles... :p

Devant determiner le MODE d'une suite de nombres placée dans un
vector, après l'avoir triée, j'ai réalisé le code sis en bas du
présent post.



Qu'est-ce que tu appelles le MODE d'une suite de nombres ?
Faudrait commencer par nous definir ce que tu veux faire. On pourra p'tet
t'aider, apres...
Alain Ketterlin
Le #23532381
Qu'est-ce que tu appelles le MODE d'une suite de nombres ?



http://fr.wikipedia.org/wiki/Mode_%28statistique%29

-- Alain.
Alain Ketterlin
Le #23532471
Olivier BURELLI
Je ne souhaite pas abuser de votre patience, mais ne sais vers qui me
tourner. Vivi, j'ai du mal à assimiler les boucles... :p



Tu as un problème d'algorithmique, pas de c++. Mais comme tu ne donnes
pas ton algo, on en revient à essayer de déchiffrer ton code. Mon
verdict (qui n'engage que moi) : il est beaucoup trop compliqué.

D'abord tes variables :

int mode=0; // variable stockant la valeur de l'occurence
// trouve a l instant t



L'occurrence de quoi ?

int compteur = 1; // compteur des occurence



De la valeur du mode c'est ça ? Du mode ou de la valeur qu'on est en
train de voir ?

int temp_mode = 0; // variable temporaire stockant le nombre d'occurence
// jusqu'à trouver une occurence plus grande



C'est le mode ou le nombre de valeurs ? Si c'est un nombre de valeur,
pourquoi ça s'appelle mode ?

for (unsigned int j = 1; j < v.size(); ++j)
{
if (v[j - 1] == v[j])
{


[...]
if ( j+1 < v.size() - 1)



Allons bon, pourquoi faudrait-il se préoccuper de la position où on se
trouve ? Ton algo a besoin de savoir ça ? Pourquoi ? Tu viens de tester
par rapport à la valeur précédente, pourquoi as-tu besoin de savoir s'il
en reste après ?

{

// Si compteur de boucle > nbre d'occurence



Que vient faire le compteur de boucle là-dedans ?

// precedente ET que la valeur de n != de la valeur n
// suivante

if ((compteur > temp_mode) && (v[j] != v[j+1]))



Bon, il faut que tu décides : soit tu t'occupes de savoir si on a trou vé
une valeur différente de la précédente, soit tu t'occupes de savoir si
on cherche une valeur différente de la suivante. Mais si tu fais les
deux en même temps, tu cherches les ennuis.

{
temp_mode = compteur;
compteur = 0;
mode = v[j];
}



Tu vois j'ai enlevé tes commentaires, et on comprend plus rien, juste à
cause de tes noms de variables.

}
// Sinon si la position du vector n est la dernière position
else if (j == v.size() - 1)
{



Je craque, c'est trop compliqué pour moi. Voici quelques remarques au
hasard :

if ((compteur > temp_mode) && (v[j - 1] == v[v.size()-1]))



Ici j == v.size()-1, donc tu testes v[j-1] == v[j]

{


[...]
}

if ((compteur > temp_mode) && (v[j - 1] != v[j]))



Ah tiens, tu testes dans l'autre sens maintenant ?

{


[...]
}
}
++compteur; // incrementer le compteur d'occurences



Quoi, comme ça, sans condition ? Bizarre.


C'est trop compliqué ton truc, on perd de vue le problème initial.
Commence par écrire ton algo correctement. Quelque chose du genre :

// Les deux suivantes pour représenter le mode sur v[0] .. v[i-1]
mode = v[0]
occurrences_mode = 1
// Celles-là pour représenter un potentiel nouveau mode
valeur_courante = v[0]
occurrences_valeur_courante = 1
// On tourne sur le vecteur privé de son premier élément
for ( i=1 ; i<v.size() ; i++ )
{
if ( v[i] == v[i-1] )
{
// on a trouvé une occurrence supplémentaire
// de valeur_courante
// peut-être est-ce le nouveau mode ?
}
else // ici v[i] != v[i-1]
{
// bon passons à une nouvelle valeur courante
// dont on a vu une seule occurrence (peut pas être mo de)
}
}

Et après tu remplaces les commentaires dans la boucle par du code. Et à
la fin tu vérifies dans le dictionnaire si "occurrence" s'écrit c omme ça
parce que je n'en suis plus très sûr.

Cela dit, tu devrais trouver un autre groupe. Ici on ne s'occupe que du
langage c++.

-- Alain.
Pascal J. Bourguignon
Le #23532881
Olivier BURELLI
Le Mon, 4 Jul 2011 19:45:02 +0000 (UTC),
(Marc Espie) a écrit :


Qu'est-ce que tu appelles le MODE d'une suite de nombres ?
Faudrait commencer par nous definir ce que tu veux faire. On pourra
p'tet t'aider, apres...



La phrase exacte dans l'exercice qui m'est demandé.

Le nombre qui apparait le plus souvent dans une suite s'appelle le mode.



Donc:

int mode=make_histogram(suite.begin(),suite.end()).biggest();



--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Olivier BURELLI
Le #23532461
Le Mon, 4 Jul 2011 19:45:02 +0000 (UTC),
(Marc Espie) a écrit :


Qu'est-ce que tu appelles le MODE d'une suite de nombres ?
Faudrait commencer par nous definir ce que tu veux faire. On pourra
p'tet t'aider, apres...



La phrase exacte dans l'exercice qui m'est demandé.

Le nombre qui apparait le plus souvent dans une suite s'appelle le mode.

Merci bcp.

Olivier.
Olivier BURELLI
Le #23532621
Le Mon, 04 Jul 2011 22:31:14 +0200,
Alain Ketterlin
Cela dit, tu devrais trouver un autre groupe. Ici on ne s'occupe que
du langage c++.

-- Alain.



Merci beaucoup pour tes remarques.

Si je donne l'impression que je change de pt de vue en route, je dois
avoir une mauvaise appréhension de la problématique suivante :

En fonction de la position du parseur i de la position du vector.

* Déterminer l'égalité de v[i -1] et v[i]
* v[i - 1] == v[i] <-- Occurence 1

*Si v[i] != v[i + 1] ou v[i] == v[i + 1] (dernière position poss ible)
alors l'ocurrence était fini et commencait une seconde.

Je vais revoir l'algo, essayais de faire plus simple.

De même pour les commentaires et le choix de mes variables.

Je te remercie pour les pistes de travail indiquées.

Cdt,

Olivier.

P.S. occurrence s'écrit bien ainsi... :)
Olivier BURELLI
Le #23532871
Le Mon, 04 Jul 2011 22:31:14 +0200,
Alain Ketterlin
Allons bon, pourquoi faudrait-il se préoccuper de la position oà ¹ on se
trouve ? Ton algo a besoin de savoir ça ? Pourquoi ? Tu viens de
tester par rapport à la valeur précédente, pourquoi as-tu besoin de
savoir s'il en reste après ?



(...)

oui je me suis compliqué la vie pour rien...

ce code répond au besoin :


for (unsigned int j = 1; j < v.size(); ++j)
{
if (v[j - 1] == v[j])
{

// Occurrence en cours > la précédente
if (nbr_occurrence > backup_occurrence)
{
// Sauvegarder alors le nombre d'occurence
backup_occurrence = nbr_occurrence;

// réinitialiser nbr_occurrence
nbr_occurrence = 0;

// Sauvegarder la valeur du mode
mode = v[j];
}

++nbr_occurrence;
}
}


Merci beaucoup.
Alain Ketterlin
Le #23533411
Olivier BURELLI
ce code répond au besoin :


for (unsigned int j = 1; j < v.size(); ++j)
{
if (v[j - 1] == v[j])
{
// Occurrence en cours > la précédente
if (nbr_occurrence > backup_occurrence)
{
// Sauvegarder alors le nombre d'occurence
backup_occurrence = nbr_occurrence;
// réinitialiser nbr_occurrence
nbr_occurrence = 0;
// Sauvegarder la valeur du mode
mode = v[j];
}
++nbr_occurrence;



Hmmm. L'indentation est trompeuse...

}
}



T'es sûr ? Est-ce que tu as bien le bon nombre d'occurrences du mode à
la fin (dans backup_occurrence) ? Que se passe-il avec la suite
1 2 2 2 2 3 3 3 ?

-- Alain.

P/S: je te laisse continuer seul, on est largement hors-charte ici.
Olivier BURELLI
Le #23536491
Le Tue, 05 Jul 2011 09:34:16 +0200,
Alain Ketterlin
Olivier BURELLI
> ce code répond au besoin :
>
>
> for (unsigned int j = 1; j < v.size(); ++j)
> {
> if (v[j - 1] == v[j])
> {
> // Occurrence en cours > la précédente
> if (nbr_occurrence > backup_occurrence)
> {
> // Sauvegarder alors le nombre d'occurence
> backup_occurrence = nbr_occurrence;
> // réinitialiser nbr_occurrence
> nbr_occurrence = 0;
> // Sauvegarder la valeur du mode
> mode = v[j];
> }
> ++nbr_occurrence;
> }
> }

T'es sûr ? Est-ce que tu as bien le bon nombre d'occurrences du mode à
la fin (dans backup_occurrence) ? Que se passe-il avec la suite
1 2 2 2 2 3 3 3 ?



je vais continuer seul oui merci,

je pense effectivement qu'il faut tester si l'occurence est paire ou
impaire effectivement g des pb sur le nb d'occurrence. mais cette
suite me donne bien le mode 2.


Merci beaucoup pour tes remarques et désolé d'avoir été hors charte.

A l'avenir, je prendrai une pause au soleil plutot que de faire chauffer
le ciboulot et de poster à la va vite... :)
Publicité
Poster une réponse
Anonyme