Classes, héritage et polymorphisme [Résolu]

Signaler
-
 Neverrrr -
Bonjour,


Je débute en C++ à la fac, j'en ai fais 3 mois à tout casser, on a fait le tour de pas mal de choses pour ne pas dire tout, m'en voilà rendu aux classes, polymorphisme etc

Mon partiel final étant prévu pour dans une dizaine de jours j'ai un sujet de l'année dernière que j'aimerai bien faire. J'ai commencé, essayé pas mal de choses, mes connaissances dans ce domaine étant un peu limitées j'aurai voulu avoir un peu de votre aide, si quelqu'un à suffisamment de patience à m'accorder. ( Nous codons sous le logiciel CodeBlocks )

Voilà le sujet :
http://imagesia.com/img196_4oj7
http://imagesia.com/img197_4oj8
http://imagesia.com/img198_4oj9

Voici mon code:

Fichier election.h

#ifndef ELECTION_H_INCLUDED
#define ELECTION_H_INCLUDED

class election 
{
protected:

int nbelecteurs;
int nbvotants;
int nbcandidats;
string* nomDesCandidats;
int* nbVoixDesCandidats;

public:

election(int nCand, string* noms);
virtual~election();
void saisieResultat();
void triResultat();
double tauxDeParticipation();
int suffragesExprimes();
double tauxDeBlancs();
void afficheResultatExprimes();
void afficheResultatElecteurs();
virtual void afficheSelectionnes()=0;
};



#endif // ELECTION_H_INCLUDED





Fichier legislative.h

#ifndef LEGISLATIVE_H_INCLUDED
#define LEGISLATIVE_H_INCLUDED

class legislative : public election
{
legislative (int nCand, string*noms)
};

#endif // LEGISLATIVE_H_INCLUDED




J'espère que jusqu'ici c'est bon normalement, maintenant c'est l'élaboration des fonctions dans les fichiers.cpp qui me posent pas mal de problèmes.

Fichier election.cpp

#include 
#include <string>
#include "election.h"

using namespace std;

election :: election (int nCand, string*noms)
{
nbelecteurs=0;
nbvotants=0;
nbcandidats=nCand;
noms[nbCandidats]= /* ???? recopier un tableau dans un autre 
                      tableau dynamique pointant vers je sais 
                       pas quoi ça me dépasse...*/
}

41 réponses

Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
else
{for(int i=0;i<nCand;i++)
if(100*_nbVoixDesCandidats[i]/_nbElecteurs) > 12,5/100*_nbElecteurs);
{std::cout<<"Le candidat "<<_nomsDesCandidats[i]<<" est selectionne pour le deuxieme tour";
break;
}
} // comme ça ?

C'est juste, sauf pour le break qui fait l'inverse de ce que tu veux. En effet, tu arrêtes ta boucle dès le premier candidat qui satisfait la condition. Tu n'afficheras donc que le premier candidat, dans tous les cas.
(Sans le break, c'est ok, bien que moins optimisé).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Bonjour.

J'ai bien lu les consignes, et un truc me choque: Le design décrit dans cet exercice est extrêmement mauvais ! C'est un très mauvais exemple d'utilisation de classe (L'héritage n'a pas d'utilité ici !), il y a une mauvaise utilisations des types (std::string* alors qu'on a std::vector<std::string>...), les normes d'écritures ne sont pas terribles (Une classe porte par convention une majuscule, et un attribut est différencié d'une variable par un signe distinctif, généralement un "_").

Bref passons, et suivont les consignes.

Quelques conseils:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Une classe devrait porter une majuscule. Ex: election => Election
- Utilise du camelCase (Chaque mot porte une majuscule sauf la première. Si c'est une classe, alors la première lettre aussi doit être en majuscule.). Ex: nbcandidats => nbCandidats
- Un attribut devrait avoir un signe distinctif. Ex: nbelecteurs => _nbElecteurs
- Une liste d'initialisation est préférable quand c'est possible.
Ex:
election :: election (int nCand, string*noms)
{
nbelecteurs=0;
nbvotants=0;
nbcandidats=nCand;
noms[nbCandidats]= /*? je reviendrais là-dessus après*/
}

devrait être:
Election::Election(int nCand, std::string* noms)
 : _nbElecteurs(0), _nbVotants(0), _nbCandidats(nCand)
{
 _noms[_nbCandidats] = /*? je reviendrais là-dessus après*/
}


Par rapport au consignes qui ont été donné, tu les as suivis, et il n'y a pas de soucis particuliers. Maintenant que tu as écris les prototypes, il ne te reste qu'à coder l'implémentation.

noms[nbCandidats]= /* ???? recopier un tableau dans un autre
tableau dynamique pointant vers je sais
pas quoi ça me dépasse...*/

Voici quelques éléments de réponse:
1- Créer un tableau de 10 éléments: std::string* tab = new std::string[10];
2- Supprimer un tableau: delete[] tab;
3- Recopier un tableau vers un autre:
* Créer un tableau de même contenance (voir 1-)
* Recopier à l'aide d'une boucle chacun des éléments.

Dans ton exemple: "_noms" est le tableau qui doit recevoir "noms". (Donc il te faut créer N case dans _noms, voir 1-, puis recopier chacun des éléments un à un de "noms" vers"_noms").

Si pour toi, un tableau et un pointeur, ce n'est pas la même chose, ou si tu n'es pas à l'aise avec les pointeurs, mets immédiatemment en pause cet exercice et réalise de nombreux exercices sur la maniement de la mémoire et les pointeurs (un cours ici: http://0217021.free.fr/Cours/pointeurs.pdf)

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Vous êtes la deuxième personne à me dire que cette méthode de programmation est en gros "minable", que les conventions de programmation ne sont pas respectés, les majuscules pour les noms des variables, classes, les "_" devant les méthodes etc... Ca vous dirait d'intervenir au près de mon prof d'amphi ? Comment voulez vous que nous apprenions quelque chose de correct..

Bref j'ai bien compris ce que vous m'avez dis, mais quand on apprend d'une autre manière ça complique, ne serait ce que pour le using namespace, on a toujours mis ça comme ça..

Ensuite, implémentation.

Premier point : "Recopier le tableau noms de _nbCandidats éléments dans un tableau dynamique pointé par nomDesCandidats. " (si je reprends votre notation, d'ailleurs je ne vois pas pourquoi vous mettez _noms, noms n'est pas un attribut mais un tableau, enfin un pointeur de string ?)

et vous dites : "_noms" est le tableau qui doit recevoir "noms". (Donc il te faut créer N case dans _noms, voir 1-, puis recopier chacun des éléments un à un de "noms" vers"_noms").

Qu'est ce que "voir 1-" ? Je ne fais la différence entre noms et _noms ...

_noms[_nbCandidats] = new nomDesCandidats [noms]; // ?
for (int i=o; i<_nbCandidats; i++)
?? trop de tableau de tableau
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Ca vous dirait d'intervenir au près de mon prof d'amphi ?

Même si ça serait avec plaisir (j'ai enseigné 2 ans et suis capable de tenir un amphi), je doute que ton administration et ton prof soient d'accord :p

Qu'est ce que "voir 1-" ?

Le point 1 de mon explication (j'avais numéroté certaines idées).

Je ne fais la différence entre noms et _noms ...


Soit Election.hh:
#ifndef ELECTION_HH_
# define ELECTION_HH_

class Election 
{
public:
 Election(int nCand, std::string* noms);
 virtual ~Election();
 void saisieResultat();
 void triResultat();
 double tauxDeParticipation();
 int suffragesExprimes();
 double tauxDeBlancs();
 void afficheResultatExprimes();
 void afficheResultatElecteurs();
 virtual void afficheSelectionnes() =  0;

protected:
 int _nbElecteurs;
 int _nbVotants;
 int _nbCandidats;
 std::string* _nomDesCandidats;
 int* _nbVoixDesCandidats;
};

#endif /* !ELECTION_HH_ */


Alors, dans Election.cc :
Election::Election(int nCand, std::string* noms)
 : _nbElecteurs(0), _nbVotants(0), _nbCandidats(nCand)
{
  _noms  = new std::string[nCand]; // nCand ou _nbCandidats, c'est pareil
  for (int i = 0; i < _nbCandidats; ++i)
    _noms[i] = noms[i];
}


Ne pas confondre l'attribut "_noms" (déclaré dans Election.hh) avec l'argument "noms" (visible dans le prototype du constructeur Election)

PS: On utilise, au choix, .hh/.cc ou .hpp/.cpp (le .h étant par convention pour du C).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Pourquoi nous font-ils apprendre des choses fausses et obsolètes ...

Le "_noms" soit disant déclaré dans Election.hh est ou ? C'est l'attribut _nomDesCandidats c'est ça ?

Election::Election(int nCand, std::string* noms)
 : _nbElecteurs(0), _nbVotants(0), _nbCandidats(nCand)
{
  _noms = new std::string[nCand]; // nCand ou _nbCandidats, c'est pareil
  for (int i = 0; i < _nbCandidats; ++i)
    _nomDesCandidats[i] = noms[i];     // Si _noms et en fait _nomDesCandidats

}


Ensuite,

Pour initialiser les éléments du tableau dynamique à 0 comment fait on ?
int _nbVoixDesCandidats=0;
_nbVoixDesCandidats =  new int[nCand];// pointeur=new type[taille] ? Y'a t'il besoin de faire une boucle pour initialiser tous les éléments du tableau à 0 ?



Election::~Election()
{
delete [] _nomDesCandidats;
delete [] _nbVoixDesCandidats;
}
A priori ça devrait être ça, on libère juste la mémoire en supprimant les tableaux dynamiques.
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Le "_noms" soit disant déclaré dans Election.hh est ou ? C'est l'attribut _nomDesCandidats c'est ça ?

Oui, j'ai été un peu vite, je ne me suis pas relu. C'est bel et bien _nomDesCandidats.

Election::Election(int nCand, std::string* noms)
 : _nbElecteurs(0), _nbVotants(0), _nbCandidats(nCand)
{
  _nomDesCandidats= new std::string[nCand]; // nCand ou _nbCandidats, c'est pareil
  for (int i = 0; i < _nbCandidats; ++i)
    _nomDesCandidats[i] = noms[i];
}



Pour initialiser les éléments du tableau dynamique à 0 comment fait on ?

Dans l'exemple présent, étant donné que tu initialise déjà _nomDesCandidats par ce qui est contenu dans "noms", c'est inutile de mettre tout à zéro avant, pour juste après réécraser.

D'une manière générale, si on a un tableau comme suit:
- int* tab = new int[10] (ou int tab[10]), pour mettre tous les éléments à 0, il faut faire une boucle et mettre 0 dans chacune des cases (et oui ce n'est pas automatique).
- Dans le cas std::string* tab = new std::string[10] (ou std::string tab[10]), il n'y a rien à faire, car lors de la création des X cases, std::string étant une classe le constructeur est appelé à chaque création de case. Comme le constructeur de std::string initialise à "" (chaîne vide, de taille 0), alors le simple fait de faire un tableau de std::string, te fait automatiquement X std::string déjà initialisé.

En gros:
- Type pod (plain old data), comme int, double, float, char, short, etc... => Il faut initialiser.
- Type classe (avec un constructeur qui initialise correctement) => Pas besoin d'initialiser.

int _nbVoixDesCandidats=0;
_nbVoixDesCandidats = new int[nCand];// pointeur=new type[taille] ? Y'a t'il besoin de faire une boucle pour initialiser tous les éléments du tableau à 0 ?

Si tu as bien compris mon exemple précédent, tu connais déjà la réponse :). Indice: oui, il faut faire une boucle.

A priori ça devrait être ça, on libère juste la mémoire en supprimant les tableaux dynamiques.

Oui, rien de bien compliqué sur cette partie.

A noter:
Tu verras des fois l'écriture suivante:
if (_nomDesCandidats) // ou if (_nomDesCandidats != 0)
  delete [] _nomDesCandidats;

C'est une lourdeur inutile puisque la fonction delete, vérifie déjà si la variable est nulle. La bonne écriture est bien celle que tu as mise. (Petit hors sujet, mais j'en profite pour te donner quelques erreurs communes).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
J'ai l'impression de comprendre enfin ! Vos conventions de notation sont beaucoup plus claires, je vous remercie de votre patience !

Donc :

Pas besoin d'initialiser _nbVoixDesCandidats à 0 avant si c'est pour supprimer après puisqu'on initialise _nbVoixDesCandidats par ce qui est contenu dans _nbCandidats (ou nCand ) ?

int étant un pod on initialise :

_nbVoixDesCandidats = new int[nCand]; 
for (int i=0;i<nCand;i++)
_nbVoixDesCandidats [i]= 0 ?
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Pas besoin d'initialiser _nbVoixDesCandidats à 0 avant si c'est pour supprimer après puisqu'on initialise _nbVoixDesCandidats par ce qui est contenu dans _nbCandidats (ou nCand ) ?

Oui, c'est cela. (par ce qui est contenu dans "noms", _nbCandidats n'étant que le nombre de candidats)

int étant un pod on initialise :
_nbVoixDesCandidats = new int[nCand];
for (int i=0;i<nCand;i++)
_nbVoixDesCandidats [i]= 0 ?

Oui, c'est comme cela qu'il faudrait initialiser le tableau "_nbVoixDesCandidats". Mais comme tu l'as bien compris, cette initialisation n'est pas utile car tu affectes déjà "noms" dans "_nbVoixDesCandidats".

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Oui mais j'ai un int, et vous avez dis qu'il fallait initialiser dans ce cas la, mais plus dans ce cas présent ? Ou alors c'est moi qui ne comprend pas le terme initialiser ?
Ca veut dire faire une boucle pour initialiser tous les éléments nCand du tableau dynamique _nbVoixDesCandidats ?
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Oui mais j'ai un int, et vous avez dis qu'il fallait initialiser dans ce cas la, mais plus dans ce cas présent ? Ou alors c'est moi qui ne comprend pas le terme initialiser ?
Ca veut dire faire une boucle pour initialiser tous les éléments nCand du tableau dynamique _nbVoixDesCandidats ?


Il faut initialiser, s'il n'y pas de valeur à mettre dans l'immédiat. Là, il y en a. Un exemple simplifié:
int a = 0; // J'initialise a à 0.
int b = 5; // J'intialise b à 5.

Initialiser, c'est mettre une valeur par défaut.

Maintenant, il est inutile d'initialiser, si tu mets une valeur derrière. Ex:
int c 0; // Pas forcément utile, vu qu'on a: c 5 derrière.
c = 5;

// Pourrait s'écrire:
int c;
c = 5;


Dans ton exemple, avec le tableau, si on initialise toutes les cases à 0, puis on initialise toutes les cases aux mêmes valeurs que "noms", l'initialisation à 0 devient inutile.
Ex:
  _nomDesCandidats= new std::string[nCand];

  // Initialisation à 0
  for (int i = 0; i < _nbCandidats; ++i)
    _nomDesCandidats[i] = 0;

  // Copie de noms vers _nomDesCandidats
  for (int i = 0; i < _nbCandidats; ++i)
    _nomDesCandidats[i] = noms[i];

Ici, on voit bien que l'initialisation à 0 de toutes les cases n'est pas utile, puisque tu copies "noms" vers "_nomDesCandidats" juste derrière...

Pour vulgariser, l'initialisation, c'est la mise à une valeur par défaut lorsqu'on ne sait pas encore quoi mettre. Si on ne t'avait pas précisé qu'il fallait que "_nbCandidats" devait avoir les mêmes valeurs que "noms", alors tu aurais fait une initialisation à 0 de toutes les cases. (Je rappelle qu'une valeur pod non initialisée est indéfinie, c-à-d indeterminée/aléatoire).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Pas d'initialisation puisqu'on sait qu'on va mettre 0, Ok.

La maintenant on veut faire pointer _nbVoixDesCandidats vers un tableau dynamique d'entier de _nbCandidats initialisés à 0. Ce sont des nombres, plus des noms, on ne fait plus intervenir std::string*noms si ?

donc ça donne bien :

_nbVoixDesCandidats = new int[nCand];
for ( int i = 0; i<nCand; i++)
_nbVoixDesCandidats [i] = noms [i]; // dites moi que c'est ça
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
La maintenant on veut faire pointer _nbVoixDesCandidats vers un tableau dynamique d'entier de _nbCandidats

_nbVoixDesCandidats [i] = noms [i]; // dites moi que c'est ça


Les variables sont vraiments très mal nommées, et prêtent à confusion. Je pense avoir confondu _nbVoixDesCandidats et _nomDesCandidats, quand j'ai regardé ce que tu m'avais envoyé. Et t'ai fait une explication, commme si tu ne parlais que de "_nomDesCandidats".
(On ne nomme pas un tableau en commençant par "nb", c'est délirant ! Un seul tableau contenant les deux informations dans chaque case (nom + nb_voix) aurait été préférable... Bref, ce n'est pas ta faute).


Je vais donc résumer, en essayant d'être clair:
  _nomDesCandidats = new std::string[nCand]; // Création du tableau des noms des candidats.
  // Copie de noms vers _nomDesCandidats
  for (int i = 0; i < nCand; ++i)
    _nomDesCandidats[i] = noms[i];

  _nbVoixDesCandidats = new std::string[nCand]; // Création du tableau des voix obtenues par chaque candidat.
  // Initialisation à 0 de _nbVoixDesCandidats
  for (int i = 0; i < nCand; ++i)
    _nbVoixDesCandidats[i] = 0;


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Ca me rassure de voir que le problème vient avant tout de l'énoncé !

Là çe me va mieux, mis à part le
 _nbVoixDesCandidats = new std::string[nCand];
pourquoi std::string[nCand] et pas new int[nCand] ?

Après ce dernier éclaircissement je vais pouvoir continuer un peu je l'espère, je vous ferais part de mon travail demain, je ne voudrais pas m'accaparer tous vos services non plus !
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
_nbVoixDesCandidats = new std::string[nCand];
pourquoi std::string[nCand] et pas new int[nCand] ?

Parce que j'ai fait un copier coller sans me relire :p. Ma faute.
C'est bien new int[nCand] !

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Alléluia merci ! =D
Dès qu'on sort un peu des sentiers battus, je suis perdu, on nous demande toujours plus que ce que nous avons l'habitude de faire en TD et en TP.. A savoir qu'on fait les TD sur feuille.. Et les partiels aussi, et celui que nous sommes en train de faire est de même calibre que celui que je vais avoir à faire la semaine prochaine. Vous en pensez quoi vous qui avez été dans l'enseignement ? Trois mois c'est suffisant pour maitriser ces notions abordées ? Est ce qu'en deux heures de temps c'est possible de traiter intégralement ce sujet de partiel ?

Bref revenons en à mes moutons :

"saisieResultat sans paramètre ne renvoyant rien, cette méthode demandera à l'utilisateur d'entrer le nombre d'electeurs inscrits et stockera ce nombre dans _nbElecteurs"

void Election :: saisieResultat
{
std:: cout<<"nombre d'electeurs inscrits"<<std::endl; // si je ne me trompe pas avec vos notations
std:: cin>>_nbElecteurs;


"elle lui demandera aussi le nombre de votant"

std:: cout<<"nombre de votants"<<std::endl;
std:: cin>> _nbVotants;


"et pour chaque candidat, le nombre de voix qu'il a obtenu"
là je ne suis pas sur de la variable dans laquelle je dois stocker les nombres de vois

std:: cout<<"voix que le candidat à obtenu"<<std::endl;
std:: cin>>_nbVoixDesCandidats; /* mais vu que c'est un pointeur et par conséquent un tableau j'imagine qu'il faut faire une boucle pour pouvoir remplir le nombre de voix obtenu par chaque candidat ? */
for ( int i=0; i<nCand; i++)
_nbVoixDesCandidats[i] = _nomsDesCandidats [i]; // pas très sur de savoir à quoi c'est égal


Ensuite:

"triResultat, sans paramètre ne renvoyant rien. cette méthode trie les tableaux _nomDesCandidats et _nbVoixDesCandidats dans l'ordre décroissant du nombre de voix obtenues par le candidat"

En règle générale j'ai des paramètres dans ma fonction, méthode, là rien,
sinon j'aurai posé :
int k;
for ( int i=0; i<nCand; i++)
{
k=i;
 for ( int j=i+1; j<nCand; j++)

if (_nbVoixDesCandidats[j] = _nbVoixDesCandidats[i])
k=j;

if (k!=i)
{int z = _nbVoixDesCandidats[i];
_nbVoixDesCandidats[i] = _nbVoixDesCandidats[k];
_nbVoixDesCandidats[k] = z; // mais je ne fais aucun lien avec le tableau _nomDesCandidats
}
 
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Trois mois c'est suffisant pour maitriser ces notions abordées ?

Pour maîtriser le C++, il faut plusieurs années (je découvre encore des choses après plusieurs années de pratiques intensives).
Pour maîtriser les bases, quelques mois sont nécessaires (je dirais 6 mois).
Pour maîtriser ce qui est demandé dans ce sujet (classes très basiques, parcours simple de tableau, demande de valeur, lecture fichier), une seule semaine (intensive) est largement suffisante (j'évaluerais ça à < 15h de cours).

Est ce qu'en deux heures de temps c'est possible de traiter intégralement ce sujet de partiel ?

20 min sont nécessaires pour traiter ce sujet, si on est à l'aise. Si je devais le donner à un ensemble d'étudiants aux niveaux disparates, alors je viserais plus large, et je laisserais 1h pour réaliser ce sujet.
2h c'est extrêmement généreux pour un sujet aussi simple (et je parle proportionnelement, pour un étudiant venant de débuter, pas un professionnel).
Néanmoins, je parle ici dans le cas où l'informatique serait la matière principale. Si chez toi, l'informatique n'est qu'une option (ça à l'air d'être le cas), alors 1h30 à 2h est nécessaire, et reste un temps relativement correct.

"saisieResultat sans paramètre ne renvoyant rien, cette méthode demandera à l'utilisateur d'entrer le nombre d'electeurs inscrits et stockera ce nombre dans _nbElecteurs"

Ok.

"elle lui demandera aussi le nombre de votant"

Ok.

"et pour chaque candidat, le nombre de voix qu'il a obtenu"

Il te faut faire une boucle et demander le nombre de voix pour chaque candidat.
Tu stockeras le résultat, à chaque tour, dans _nbVoixDesCandidats[i] (avec i qui réprésente le candidats en cours).

"triResultat, sans paramètre ne renvoyant rien. cette méthode trie les tableaux _nomDesCandidats et _nbVoixDesCandidats dans l'ordre décroissant du nombre de voix obtenues par le candidat"

Le plus simple est de faire un tri à bulle, car simple à coder, simple à comprendre, et assez efficace. (Voir wikipédia pour l'algorithme qui est déjà écrit).

if (_nbVoixDesCandidats[j] = _nbVoixDesCandidats[i])

Erreur classique. Tu confonds "=" et "==". Ici, tu ne compares pas les deux variables, mais tu affectes celle de droite à gauche.

// mais je ne fais aucun lien avec le tableau _nomDesCandidats

Il faut bouger les deux tableaux en parallèle.
Ex:
Si tu échanges la case 3 de _nbVoixDesCandidats et la case 5 de _nbVoixDesCandidats,
alors au même moment, il faudrait échanger la case 3 de _nomsDesCandidats avec la case 5 de _nomsDesCandidats.


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Tu stockeras le résultat, à chaque tour, dans _nbVoixDesCandidats (avec i qui réprésente le candidat en cours).


Les [ et ] ont sauté, je récris la phrase:

Tu stockeras le résultat, à chaque tour, dans _nbVoixDesCandidats[ i] (avec i qui réprésente le candidat en cours).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
std:: cout<<"voix que le candidat à obtenu"<<std::endl;
for ( int i=0; i<nCand; i++)
std:: cin>>_nbVoixDesCandidats[i]; //ça parait évident écrit comme ça;
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
std:: cout<<"voix que le candidat à obtenu"<<std::endl;
for ( int i=0; i<nCand; i++)
std:: cin>>_nbVoixDesCandidats[i]; //ça parait évident écrit comme ça;


C'est juste. On peut néanmoins améliorer un petit peu ça en faisant:
for (int i = 0; i < nCand; ++i)
{
  std::cout << "Voix que le candidat " << _nomDesCandidats[i] << " a obtenu: ";
  std::cin >> _nbVoixDesCandidats[i];
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question