Classes, héritage et polymorphisme

Résolu
Neverrrr - 7 janv. 2013 à 19:34
 Neverrrr - 15 janv. 2013 à 18:14
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

Effectivement !

Concernant le tri à bulle, je ne connaissais pas, je viens de regarder un peu, mais de là à l'écrire pour trier deux tableaux en parallèles... On me donne ça:

 // tri à bulle 
#define TRUE 1
#define FALSE 0
void tri_a_bulle(int*t,int n)
{ 
int j =0;
int tmp =0;
int en_desordre =1;
while(en_desordre)
{
en_desordre = FALSE; 

for
(j =0; j < n-1; j++){  
if
(t[j] > t[j+1])
{tmp = t[j+1];
t[j+1] = t[j];
t[j] = tmp;
en_desordre = TRUE;
}}}}

Je comprends ce qu'il fait, on prend l'élément 0 du tableau on regarde si il est supérieur ou non à l'élément 1, si oui on échange sinon on bouge pas, ensuite élément 1 comparé à 2 etc...

Je vois l'idée des deux tableaux, si on change deux éléments de tableaux de _nbVoixDesCandidats alors ça change aussi dans _nomDesCandidats, les voix étant déjà reliées à chaque candidat, faut il juste rajouter un " && " ?

C'est comme si on avait :

void triResulat (string*_nomDesCandidats, int *_nbVoixDesCandidats, int nCand)

int j =0;
int tmp =0;
int en_desordre =1;
while(en_desordre)
{
en_desordre = FALSE; 

for(j =0; j < n-1; j++)
{  
if(_nbVoixDesCandidats[j] > _nbVoixDesCandidats[j+1] )
{
tmp _nbVoixDesCandidats[j+1] _nomDesCandidats[j+1]
_nbVoixDesCandidats[j+1] = _nbVoixDesCandidats[j] && _nomDesCandidats[j+1] = _nomDesCandidats[j];
_nbVoixDesCandidats[j] = _nomDesCandidats[j] = tmp ;
en_desordre = TRUE;
}}}}


en écrivant ça je me comprends, mais vous non à mon avis
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 janv. 2013 à 17:44
if(_nbVoixDesCandidats[j] > _nbVoixDesCandidats[j+1] )
{
tmp _nbVoixDesCandidats[j+1] _nomDesCandidats[j+1]
_nbVoixDesCandidats[j+1] = _nbVoixDesCandidats[j] && _nomDesCandidats[j+1] = _nomDesCandidats[j];
_nbVoixDesCandidats[j] = _nomDesCandidats[j] = tmp ;
en_desordre = TRUE;
}


Changer deux valeurs, c'est comme si je te disais: met a et b à respectivement à 2 et 3 en parallèle (au même moment):
if (condition)
{
  a = 2;
  b = 3;
}


Donc changer la valeur des tableaux se fait tout aussi simplement:
if (_nbVoixDesCandidats[j] > _nbVoixDesCandidats[j + 1])
{
  // peudo-code
  echange(_nbVoixDesCandidats[j], _nbVoixDesCandidats[j + 1]);
  echange(_nomDesCandidats[j], _nomDesCandidats[j + 1]);
}


Soit:
if (_nbVoixDesCandidats[j] > _nbVoixDesCandidats[j + 1])
{
  int tmpVoix = _nbVoixDesCandidats[j];
  _nbVoixDesCandidats[j] = _nbVoixDesCandidats[j + 1];
  _nbVoixDesCandidats[j + 1] = tmpvoix;

  std::string tmpNom = _nomDesCandidats[j];
  _nomDesCandidats[j] = _nomDesCandidats[j + 1];
  _nomDesCandidats[j + 1] = tmpNom;
}


________________________________________________________________________
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
0
Je m'attends toujours à quelque chose de très compliqué, je vais chercher trop loin parfois alors que ça tombe sous le sens. Mais desfois je ne comprends vraiment pas la logique de la progra, ça va vite se voir dans les prochaines méthodes, c'est pas pour moi ça, mais j'ai pas le choix.

"tauxDeParticipation sans paramètre renvoyant un réel. Cette méthode renvoie le rapport du nombre de votant avec le nombre d'électeurs, si le nombre d'électeurs est nul, elle renvoie 0"

double Election::tauxDeParticipation()
{
if (_nbElecteurs==0)
return 0;
else return (_nbVotants/_nbElecteurs);
} // ça doit pas être bien plus compliqué que ça 


"suffragesExprimes sans paramètre renvoyant un entier. Cette méthode renvoie la somme du nombre d'électeurs ayant voté pour un candidat"
Alors la on nous parle d'electeurs ayant votés, donc ce sont les votants au final ?

int Election::suffragesExprimes()
{
int s=0;
for (int i=0; i<nCand; i++)
_nbVoixDesCandidats[i]=_nbVotants;
s+=_nbVotants;
return s;
}


"tauxDeBlanc sans paramètre renvoyant un double. Renvoie le rapport entre le nombre d'électeurs ayant votés blanc et le nombre de votants. Au cas ou le nombre de votants serait nul, renvoie zéro"
Encore un truc qui ne me plait pas, la politique.

double Election::tauxDeBlancs()
{
int r =0;
// il faut trouver le nombre d'électeurs ayant votés blanc, soit zéro, mais je sèche un peu
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 janv. 2013 à 22:47
"tauxDeParticipation sans paramètre renvoyant un réel. Cette méthode renvoie le rapport du nombre de votant avec le nombre d'électeurs, si le nombre d'électeurs est nul, elle renvoie 0"

Ok. Mais le "else" n'est pas nécessaire, vu que "return" est débranchant (c-à-d, fait sortir de la fonction).

double Election::tauxDeParticipation()
{
  if (_nbElecteurs == 0)
    return 0;
  return _nbVotants / _nbElecteurs;
}


"suffragesExprimes sans paramètre renvoyant un entier. Cette méthode renvoie la somme du nombre d'électeurs ayant voté pour un candidat"

Je ne comprends pas ta logique. "_nbVoixDesCandidats[i]=_nbVotants;" Pourquoi mets-tu le nombre de votants à la place du nombre de voix obtenu par chaque candidat ? Ici, tu dis que chaque candidat aura donc tous les votants qui auront voté pour lui. (?)

On te demande ici de parcourir chacune des cases et de regarder le nombre de vote que possède chaque candidat. La somme de tous ces votes représente le nombre de vote non blanc.

"tauxDeBlanc sans paramètre renvoyant un double. Renvoie le rapport entre le nombre d'électeurs ayant votés blanc et le nombre de votants. Au cas ou le nombre de votants serait nul, renvoie zéro"

Le nombre de blanc, c'est le nombre de personne ayant voté pour aucun candidat. Comme tu as déjà le nombre de personnes ayant voté et le nombre de personne ayant voté pour un candidat(tu peux et tu dois réutiliser "suffragesExprimes" dans "tauxDeBlancs"), une simple soustraction suffit.

________________________________________________________________________
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
On parcourt chaque candidat, et on somme le nombre de voix total, comme ça ça me parait mieux.
int Election::suffragesExprimes()
{
int sommeVoixDesCandidats=0;
for (int i=0; i<nCand; i++)
sommeVoixDesCandidats+=_nbVoixDesCandidats[i]
return sommeVoixDesCandidats;
}


double Election::tauxDeBlancs()
{
double suffragesExprimes()
if (_nbVotants==0)
return 0;

return (_nbVotants-sommeVoixDesCandidats); //ça me choque un peu
}


Ensuite le pourcentage des voix par rapport aux suffrages exprimés:

void Election::afficheResultatsExprimes()
{
double suffragesExprimes()
for(int i=0; i<nCand ;i++)
std::cout<<"Le candidat : "<<_nomDesCandidats[i]<<" a obtenu "<<(100*_nbVoixDesCandidats[i] / sommeVoixDesCandiats <<" % des voix"; // ça doit bien être quelque chose dans le genre, 100 fois le nombre de voix pour le candidat divisé par le nombre total de voix. Ah mais faut prendre en compte les votes blancs je suppose. Je ne sais même pas comment se déroule une élection..
}
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
11 janv. 2013 à 00:01

int Election::suffragesExprimes()
{
int sommeVoixDesCandidats = 0;
for (int i=0; i<nCand; i++)
sommeVoixDesCandidats += _nbVoixDesCandidats[i];

return sommeVoixDesCandidats;
}

Beaucoup mieux.


double Election::tauxDeBlancs()
{
double suffragesExprimes()
if (_nbVotants==0)
return 0;

return (_nbVotants-sommeVoixDesCandidats); //ça me choque un peu
}


"sommeVoixDesCandidats" étant une variable locale à une autre fonction, elle n'est pas accessible dans cette fonction.

Tu sembles avoir des difficultés à comprendre l'appel d'une fonction.
Voici un rappel:

int addition(int a, int b)
{
  return a + b;
}

int main()
{
  int b = addition(5, 9);

  std::cout << "b est égale à:" << b << std::endl
            << "8 et 9 font: " << addition(8, 9) << std::endl;

  return 0;
}


De même, si tu fais appel à "suffragesExprimes()", la fonction te renverra quelquechose (le nombre de suffrage exprimés), que tu n'auras qu'à réutiliser.

void Election::afficheResultatsExprimes()

Même problème de syntaxe que la fonction précédente.
La logique est néanmoins correcte.

________________________________________________________________________
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
0
Gros oubli de ma part.

double Election::tauxDeBlancs()
{
int sommeVoixDesCandidats=suffragesExprimes(); 
if (_nbVotants==0)
return 0;

return (_nbVotants-sommeVoixDesCandidats);
}


Même chose.
void Election::afficheResultatsExprimes()
{
int sommeVoixDesCandidats = suffragesExprimes()
for(int i=0; i<nCand ;i++)
std::cout<<"Le candidat : "<<_nomDesCandidats[i]<<" a obtenu "<<(100*_nbVoixDesCandidats[i] / sommeVoixDesCandiats <<" % des voix"; 


Je regarderai ce soir la suite, ça ne m'a pas l'air très compliqué.
0
Bonjour,

Auriez vous le reste de la correction de ce sujet que je puisse la travailler rapidement et vous poser des questions si jamais des doutes subsistent ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
13 janv. 2013 à 17:56
Auriez vous le reste de la correction de ce sujet

Je ne possède pas la correction. Je t'invite à continuer sur ta lancée en faisant ce sujet, et poster tes avancées sur ce forum.

________________________________________________________________________
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
0
Il me reste 3 jours pour finir, je devrais bien m'en sortir..

Est ce que ce que j'ai posté vendredi matin est juste ?

Pour la méthode afficheResultatsExprimes, on affiche le % d'électeurs s'étant abstenus,
on soustrait au nombre d’électeurs total le nombre de votants ?

Ensuite le pourcentage de votes blancs, déjà je pense qu'on s'est trompé pour la méthode tauxDeblanc où on demande un rapport entre le nombre d'électeurs ayant votés et le nombre total de votants,
En revanche c'est ici qu'on utilise _nbVotants-sommeVoixDesCandidats, on multiplie par 100 et on divise par le nombre d'électeurs

Pour chaque candidat le pourcentage d'électeurs ayant votés pour eux, on doit faire une boucle j'iamgine, mais le nombre d'électeurs ayant votés pour un candidat, c'est différents du nombre de votants ayant votés pour le candidat ? Si ce n'est pas différents alors on fait juste le rapport du nombre de votants ayant votés pour le candidat par le nombre d'électeurs total

void Election:: afficheResultatsExprimes()
{std::cout<<"" Le % d'électeurs s'étant abstenus s'élève à :"<<100*(_nbElecteurs - _nbVotants)/ _nbElecteurs;  // Le nombre d'électeurs total moins le nombre de votants donne bien le nombre d'électeurs s'étant abstenus.


int sommeVoixDesCandidats=suffragesExprimes()
std::cout<<"Le % de votes blancs est : "<<100*(_nbVotants- sommeVoixDesCandidats)/_nbElecteurs; // là le pourcentage de vote blancs


for(int i=0; i<nCand ;i++)
std::cout<<"Le % d'électeurs ayant votés pour "<<_nomDesCandidats[i]<<" est de : "<<
100*_nbVoixDesCandidats[i]/_nbElecteurs;



Si je passe à la méthode purement virtuelle afficheSelectionnes, il n'y a rien à faire dans Election.hh, il faut passer à Election.cc ou là on la définira.

Fichier Legislative.hh :

#ifndef LEGISLATIVE_HH_
# define LEGISLATIVE_HH_

class Legislative : public Election
{
Legislative ( int nCand, std::string* noms)
}; // Legislative dérivant publiquement de Election, on ne redéfinit pas afficheSelectiones

#endif /* !LEGISLATIVE_HH_ */



Fichier Legislative.cc:

"Ce constructeur appelle le constructeur correspondant de la classe Election"
Je ne sais absolument pas comment faire, ça commence mal

Après la grosse méthode afficheSelectionnes, y'a trop de tri, d'affichage, de conditions, c'est confus !
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 janv. 2013 à 11:35
double Election::tauxDeBlancs()

C'est ok, à part que tu as fait le nombre de blanc, au lieu du taux de blanc. Comme tu l'as déjà compris toi même, il faut diviser par le nombre d'électeurs.

le nombre d'électeurs ayant votés pour un candidat, c'est différents du nombre de votants ayant votés pour le candidat ?

Je trouve cela confu pour un exercice (l'accent devrait être sur la technique et non des micro-détails). D'après le sujet:

Dans "affichesResultatExprimes" tu affiches pour chaque candidat le taux de voix obtenu par rapport au nombre de personnes ayant voté pour un candidat (on ne prend pas en compte ceux ayant voté blanc).

Dans "afficheResultatElecteurs", on te demande 3 taux, mais ces taux sont tous en fonction du nombre d'électeurs (c-à-d, tout ceux ayant voté ou non). Donc _nbElecteurs.

void Election:: afficheResultatsExprimes()

Ce que tu as fait est juste, mais ça devrait être dans "afficheResultatElecteurs" et non dans "afficheResultatsExprimes".
En revanche, le "void Election::afficheResultatsExprimes()" de vendredi est juste.

// Legislative dérivant publiquement de Election, on ne redéfinit pas afficheSelectiones

Quelques petites lacunes sur l'héritage. On doit au contraire absolument redéfinir "afficheSelectiones" dans la classe fille, puisque la méthode est virtuelle pure dans la classe mère.

"Ce constructeur appelle le constructeur correspondant de la classe Election"
Je ne sais absolument pas comment faire, ça commence mal

On ne peut plus simple:
Legislative::Legislative(int nCand, std::string* noms)
 : Election(nCand, noms)
{
}


Après la grosse méthode afficheSelectionnes, y'a trop de tri, d'affichage, de conditions, c'est confus !

On te demande de faire:
- Afficher la liste des candidats par ordre décroissant (de celui qui à le plus de voix, vers celui qui en a le moins).
- Afficher le candidat élu OU la liste des candidats du second tour. (selon les critères évoqués).

________________________________________________________________________
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
0
Donc si je reprends :

tauxDeBlancs c'est juste mais il faut diviser par le nombre total d'électeurs :

double Election::tauxDeBlancs()
{
int sommeVoixDesCandidats= suffragesExprimes(); 
if (_nbVotants==0)
return 0;

return (_nbVotants-sommeVoixDesCandidats)/_nbElecteurs;
}



Ensuite afficheResultatsExprimes ça devrait être bon, "affiche pour chaque candidat le taux de voix obtenu par rapport au nombre de personnes ayant voté pour un candidat" c'est bien ce que je fais ?

void Election::afficheResultatsExprimes()
{
int sommeVoixDesCandidats  = suffragesExprimes()
for(int i= 0; i<nCand ;i++)
std::cout<<"Le candidat : "<<_nomDesCandidats[i]<<" a obtenu "<<(100*_nbVoixDesCandidats[i] / sommeVoixDesCandiats <<" % des voix"; 
}


Pour afficheResultatElecteurs 3 taux en fonction de _nbElecteurs c'est ce que j'ai fais également :

void Election:: afficheResultatsExprimes()
{
std::cout<<" Le % d'électeurs s'étant abstenus s'élève à :"<<100*(_nbElecteurs - _nbVotants)/ _nbElecteurs;  


int sommeVoixDesCandidats =suffragesExprimes()
std::cout<<"Le % de votes blancs est : "<<100*(_nbVotants- sommeVoixDesCandidats)/_nbElecteurs;

for(int i=0; i<nCand ;i++)
std::cout<<"Le % d'électeurs ayant votés pour "<<_nomDesCandidats[i]<<" est de : " <<100*_nbVoixDesCandidats[i]/_nbElecteurs; /* 3 taux en fonction de _nbElecteurs, ça 
me semble juste mis à part cette dernière*/ 
}



Si je repars sur mon fichier Legislative.hh : je pensais que la classe Legislative dérivait publiquement de la classe Election je croyais qu'on ne devait pas réécrire le prototype dans .hh mais apparemment non, donc je la remets dans Legislative.hh

#ifndef LEGISLATIVE_HH_
# define LEGISLATIVE_HH_

class Legislative : public Election
{
Legislative ( int nCand, std::string* noms);
void afficheSelectionnes();
}; 

#endif /* !LEGISLATIVE_HH_ */



Fichier Legislative.cc

#include 
#include <string>
#include "Legislative.hh"


Legislative::Legislative(int nCand, std::string* noms)
 : Election(nCand, noms)
{
}

void Legislative::afficheSelectionnes()
{// je m'y pencherai dessus dans l'après midi
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 janv. 2013 à 13:25
double Election::tauxDeBlancs()

Ok. Peut être multiplier par 100 par garder la cohérence avec les autres méthodes ? (N'étant pas précisé dans la consigne, tu es libre sur ce point).

void Election::afficheResultatsExprimes()

Ok.
Manque un ";" après "= suffragesExprimes()" et une parenthèse fermante après "(100*_nbVoixDesCandidats[i] / sommeVoixDesCandiats".

void Election:: afficheResultatsExprimes()

Ok.

je croyais qu'on ne devait pas réécrire le prototype

Ne pas confondre héritage et l'héritage par contrainte (virtuelle).

Ex:
class A
{
public:
  A();
  void func();
};

class B : public A
{
public:
  B();
};

Dans cet exemple, "func()" est accessible par la classe A et par la classe B. Il n'est pas nécessaire de réécrire "func()" dans la classe B, car "func()", "tombe" directement dans B.

Autre exemple:
class A
{
public:
  A();
  virtual void func() = 0;
};

class B : public A
{
public:
  B();
  virtual void func(); // Tu noteras l'emploi du mot clé "virtual", indispensable dans ce cas précis.
};

Dans cet exemple, on a une virtuelle pure. C'est une contrainte. C'est-à-dire que la classe B à l'obligation de rédéfinir la méthode "func()". S'il ne le fait pas, il ne sera pas instanciable (impossible de créer un objet de type B).

________________________________________________________________________
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
0
Fichier Legislative.hh: cette fois c'est bon on y touche plus

#ifndef LEGISLATIVE_HH_
# define LEGISLATIVE_HH_

class Legislative : public Election
{
Legislative ( int nCand, std::string* noms);
virtual void afficheSelectionnes();
}; 

#endif /* !LEGISLATIVE_HH_ */


Fichier Legislative.cc : la méthode afficheSelectionnes demande de trier les candidats encore une fois par ordre décroissant de voix obtenues mais on l'a déjà fait ce travai dans la méthode triResultat dans la classe Election ? Du coup je suis un peu perdu, comment trier pour faire une boucle pour imposer les conditions et afficher tout ça en même temps ?


int j = 0;
int tmp =0;
int en_desordre =1;
while(en_desordre)
{
en_desordre = FALSE; 

for(j =0; j < n-1; j++)
void Legislative::afficheSelectionnes()/* dois je mettre " virtual void Legislative::afficheSelectionnes" ou simplement "void Legislative::afficheSelectionnes" ?*/
{
if (_nbVoixDesCandidats[j] > _nbVoixDesCandidats[j + 1])
{
  int tmpVoix = _nbVoixDesCandidats[j];
  _nbVoixDesCandidats[j] = _nbVoixDesCandidats[j + 1];
  _nbVoixDesCandidats[j + 1] = tmpvoix;

  std::string tmpNom = _nomDesCandidats[j];
  _nomDesCandidats[j] = _nomDesCandidats[j + 1];
  _nomDesCandidats[j + 1] = tmpNom;
}// je reprends ce qu'on a déjà fait

int sommeVoixDesCandidats=suffragesExprimes();
for (int i= 0;i<nCand;i++)
{
if((100*_nbVoixDesCandidats[i]/sommeVoixDesCandidats) > (50/100)*sommeVoixDesCandidats && (100*_nbVoixDesCandidats[i]/_nbElecteurs) > 25/100*_nbElecteurs ) 
std::cout<<_nomsDesCandidats[i]<<" a ete elu au premier tout a la majorite absolue";

else 

std::cout<<" Les candidats qui s'affronteront au second tour sont donc : "<<_nomsDesCandidats[i]<<" et "<<_nomsDesCandidats[i-1] /* et la je veux refaire un test pour les candidats ayant 12,5% des electeurs inscrits, mais je sèche

}


Fichier main.cc :

#include 
#include <fstream>
#include <string>
#include "election.hh"
#include "legislative.hh"

string*litResultat(int &n)
{
fstream f;
f.open ("Candidats.txt",ios::in);
f>>n;
string *T  = new std::string[n];
for ( int i=0 ; i<n ; i++ )
f>>T[i];
f.close();
}

void resultats(Election)
saisieResultat();
afficheSelectionnes();
afficheResultatsExrpimes();
afficheResultatsElecteurs( // ? de l'objet passé en paramètre ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 janv. 2013 à 13:14
void Legislative::afficheSelectionnes() // Le virtual ne se met qu'à la définition dans le header
{
  triResultat(); // appel de la fonction de tri.
  int sommeVoixDesCandidats = suffragesExprimes();
  if ((100*_nbVoixDesCandidats[0]/sommeVoixDesCandidats) > (50/100)*sommeVoixDesCandidats &&
       (100*_nbVoixDesCandidats[0]/_nbElecteurs) > 25/100*_nbElecteurs ) 
    std::cout<<_nomsDesCandidats[0]<<" a ete elu au premier tout a la majorite absolue";
  else 
  {
    // Boucle sur les N premiers candidats. On s'arrêt de boucler quand
    // les conditions pour être au second tour ne sont plus remplis
    // On pourrait boucler jusqu'à la fin, mais vu que les candidats sont triés,
    // on sait qu'arrivé à un candidat non conservé pour le 2nd tour, tous ceux d'après
    // ne seront pas au second tour non plus.
    // A la fin du tour de boucle, on a un indice représentant la position du dernier candidat retenu.
    // Il suffit alors d'afficher le candidat "0" à "dernier candidat retenu".
  }


________________________________________________________________________
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
0
void Legislative::afficheSelectionnes() 
{
  triResultat(); 
  int sommeVoixDesCandidats = suffragesExprimes();
  if ((100*_nbVoixDesCandidats[0]/sommeVoixDesCandidats) > (50/100)*sommeVoixDesCandidats &&
       (100*_nbVoixDesCandidats[0]/_nbElecteurs) > 25/100*_nbElecteurs ) 
    std::cout<<_nomsDesCandidats[0]<<" a ete elu au premier tout a la majorite absolue";
  else 
  { for(int i=0;i<nCand;i++)
    {do
      {std::cout<<_nomsDesCandidats[0]<<" et "<<_nomsDesCandidats[1]<<" sont retenus pour le second tour ainsi que les candidats "<<_nomsDesCandidats[i];

while(100*_nbVoixDesCandidats[i]/_nbElecteurs) > 12,5/100*_nbElecteurs);

// ou quelque chose dans le même style je suppose..
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 janv. 2013 à 17:06
La première partie est ok.

La deuxième est très étrange. Faisons au plus simple:
- Tu fais une boucle qui parcourt tous les candidats
- A chaque tour, tu regardes si le candidats peut aller au second tour
- Si oui, tu l'affiches.

Une fois que tu as réussi ceci, tu peux, facultativement, ajouter un "break" pour ne pas parcourir tous les candidats. Je te laisse le soin de trouver comment poser le break.

________________________________________________________________________
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
0
Alors on fait :

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 ?

0
Donc j'inverse juste le sens de la condition ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 janv. 2013 à 18:11
Donc j'inverse juste le sens de la condition ?

... ce qui fera que tu récupéreras juste le premier candidat non qualifié au deuxième tour :p (Et toujours un seul candidat)

Le code est bon, sans le break. Il te faut juste trouver une manière intelligente de l'ajouter, afin de sortir de la boucle au bon moment.

________________________________________________________________________
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
0
Rejoignez-nous