[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
}
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
}

Poser une question


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...
http://fr.wikipedia.org/wiki/Mode_%...istique%29
-- Alain.
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 :
L'occurrence de quoi ?
De la valeur du mode c'est ça ? Du mode ou de la valeur qu'on est en
train de voir ?
C'est le mode ou le nombre de valeurs ? Si c'est un nombre de valeur,
pourquoi ça s'appelle mode ?
[...]
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 ?
Que vient faire le compteur de boucle là -dedans ?
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.
Tu vois j'ai enlevé tes commentaires, et on comprend plus rien, juste Ã
cause de tes noms de variables.
Je craque, c'est trop compliqué pour moi. Voici quelques remarques au
hasard :
Ici j == v.size()-1, donc tu testes v[j-1] == v[j]
[...]
Ah tiens, tu testes dans l'autre sens maintenant ?
[...]
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 {
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.
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 {}.
(Marc Espie) a écrit :
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.