Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

9 réponses
Avatar
Olivier BURELLI
Bonjour,

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

Devant determiner le MODE d'une suite de nombres plac=C3=A9e dans un
vector, apr=C3=A8s l'avoir tri=C3=A9e, j'ai r=C3=A9alis=C3=A9 le code sis e=
n bas du
pr=C3=A9sent post.

apr=C3=A8s avoir saisie la suite : 1, 1, 2, 3, 3, 3, 4

je n'obtiens pas le r=C3=A9sultat 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=C2=B0 1
Lecture de v[0] et v[1]
Compteur d'occurence temporaire : 0
Nouvelle occurence > Ancienne Occurence : 1 > 0
boucle N=C2=B0 1
Lecture de v[3] et v[4]
Compteur d'occurence temporaire : 1
boucle N=C2=B0 2
Lecture de v[4] et v[5]
Compteur d'occurence temporaire : 1 <-- devrait =C3=AAtre modifi=C3=A9
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=C3=A9sultat
attendu est correct.

Probl=C3=A8me 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=3D0; // variable stockant la valeur de l'occurence
// trouve a l instant t
int compteur =3D 1; // compteur des occurence
int temp_mode =3D 0; // variable temporaire stockant le nombre d'occurence
// jusqu'=C3=A0 trouver une occurence plus grande=20



for (unsigned int j =3D 1; j < v.size(); ++j)
{
if (v[j - 1] =3D=3D v[j])
{
=09
// Debugage
=09
cout << "boucle N=C2=B0 " << compteur << endl;
cout << "Lecture de v[" << j - 1 << "] et v["
<< j << "]" << endl;
=09
cout << " Compteur d'occurence temporaire : "
<< temp_mode << endl;=20

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

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

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

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

// Stocker alors le nombred'occurence
temp_mode =3D compteur;
=09
// r=C3=A9initialiser le compteur d'occurence
compteur =3D 0;

// stocker la valeur de cette occurence
mode =3D v[j];
}
=09
}
=09
=09
// Sinon si la position du vector n est la derni=C3=A8re position
else if (j =3D=3D v.size() - 1)
{

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

if ((compteur > temp_mode) && (v[j - 1] =3D=3D v[v.size()-1]))
{
cout << "Nouvelle occurence > Ancienne
Occurence : ";=20
=09
cout << compteur << " > " << temp_mode << endl;
=09
// Stocker alors le nombre d'occurences
temp_mode =3D compteur;

// r=C3=A9initialiser le compteur d'occurences=20
compteur =3D 0;
=09
// stocker la valeur de cette occurence
mode =3D v[j];
}
=09
if ((compteur > temp_mode) && (v[j - 1] !=3D v[j]))
{
// DEBUGGAGE
cout << "Nouvelle occurence > Ancienne
Occurence : ";

cout << compteur << " > " << temp_mode << endl;
=09
// Stocker alors le nombre d'occurence
temp_mode =3D compteur;

// r=C3=A9initialiser le compteur d'occurence
compteur =3D 0;
=09
// stocker la valeur de cette
occurence mode =3D v[j - 1];
}=09
}
++compteur; // incrementer le compteur d'occurences=09
} =09

9 réponses

Avatar
espie
In article ,
Olivier BURELLI wrote:
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...
Avatar
Alain Ketterlin
Qu'est-ce que tu appelles le MODE d'une suite de nombres ?



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

-- Alain.
Avatar
Alain Ketterlin
Olivier BURELLI writes:

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.
Avatar
Pascal J. Bourguignon
Olivier BURELLI writes:

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 {}.
Avatar
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.

Merci bcp.

Olivier.
Avatar
Olivier BURELLI
Le Mon, 04 Jul 2011 22:31:14 +0200,
Alain Ketterlin a écrit :

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... :)
Avatar
Olivier BURELLI
Le Mon, 04 Jul 2011 22:31:14 +0200,
Alain Ketterlin a écrit :

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.
Avatar
Alain Ketterlin
Olivier BURELLI writes:

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.
Avatar
Olivier BURELLI
Le Tue, 05 Jul 2011 09:34:16 +0200,
Alain Ketterlin a écrit :

Olivier BURELLI writes:

> 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... :)