Election

jumpy18 Messages postés 9 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 26 août 2019 - Modifié le 26 août 2019 à 14:49
tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022 - 9 oct. 2019 à 17:17
bonjour,
je suis en plein apprentissage du langage java et je souhaite avoir de l'aide sur cet algoritme que j'ai essayé de traduire en java car je n'ai pas le resultat attendue si quelqu'un peut m'aider à y voir un peu plus claire cela m'aiderai à avancer dans mon apprentissage de java
/**

 
  */
package jumpy.elections;

/** * @author Poudjoum Rodrigue * */
import java.util.Scanner;

public class Elections {
	/** * @param args */
	public static void main(String[] args) { // TODO Auto-generated method stub
		int nbSiegeAPouvoir = 0;
		int nbListe = 0;
		boolean saisieOk;
		String[] nomListe;
		int[] voixListe;
		boolean[] elemineListe;
		int[] siegeListe;
		int i;
		double[] moyenneListe;
		int nbVoixUtile;
		double quotientElectoral;
		int nbSiegePourvus;
		double moyenneMax;
		int max = 0;
		int iSiege; // no,bre de siège à pourvoir
		saisieOk = false;
		while (!saisieOk) {
			System.out.println("Nombre de siège à Pourvoir");
			Scanner sc = new Scanner(System.in);
			nbSiegeAPouvoir = sc.nextInt();
			if (!(nbSiegeAPouvoir > 0)) {
				System.out.println("Erreur : tapez un nombre entier ");
			} else {
				saisieOk = true;
			}
		}
		// nombre de liste en competition
		saisieOk = false;
		while (!saisieOk) {
			System.out.println("Nombre de Liste en compétition");
			Scanner sc = new Scanner(System.in);
			nbListe = sc.nextInt();
			if (!(nbListe > 0)) {
				System.out.println("Erreur : tapez un nombre entier ");
			} else {
				saisieOk = true;
			}
		}
		// initialisation des tableau
		nomListe = new String[nbListe];
		voixListe = new int[nbListe];
		elemineListe = new boolean[nbListe];
		siegeListe = new int[nbListe];
		moyenneListe = new double[nbListe];
		// saisie des noms et voix des listes
		int totalVoix = 0;
		for (i = 0; i < nbListe - 1; i++) {
			saisieOk = false;
			while (!saisieOk) {
				System.out.printf("nom de la liste n°", i, ":");
				Scanner sc = new Scanner(System.in);
				nomListe[i] = sc.next();
				if (nomListe[i] == null) {
					System.out.println("Erreur: tapé un nom non vide");
				} else {
					saisieOk = true;
				}
			}
			// saisie du nombre de voix de la liste i
			saisieOk = false;
			while (!saisieOk) {
				System.out.printf("Nombre de voix de la liste ", nomListe[i], ":");
				Scanner sc = new Scanner(System.in);
				voixListe[i] = sc.nextInt();
				if (!(voixListe[i] > 0)) {
					System.out.println("Erreur: Entre un nombre entier supérieur à 0");
				} else {
					saisieOk = true;
				}
			}
			// on incremente le total de voix de la liste
			totalVoix = totalVoix + voixListe[i];
		}
		// cas pas de voix du tout
		if (totalVoix == 0) {
			System.out.println("Erreur: aucune liste n'a de voix ");
			System.exit(0);
		}
		// calcul des voix
		nbVoixUtile = 0;
		for (i = 0; i < nbListe - 1; i++) {
			float q = (float) (voixListe[i] / totalVoix);
			if (q < 0.05) {
				elemineListe[i] = true;
			} else {
				elemineListe[i] = false;
				nbVoixUtile = nbVoixUtile + voixListe[i];
			}
		}
		// y-a-t-il des listes non eliminées
		if (nbVoixUtile == 0) {
			System.out.println("toutes les listes ont été eliminées");
			System.exit(0);
		}
		// repartition des sièges au quotient
		quotientElectoral = nbVoixUtile / nbSiegeAPouvoir;
		nbSiegePourvus = 0;
		for (i = 0; i < nbListe - 1; i++) {
			if (!(elemineListe[i])) {
				siegeListe[i] = (int) (voixListe[i] / quotientElectoral);
				moyenneListe[i] = voixListe[i] / (siegeListe[i] + 1);
				nbSiegePourvus = nbSiegePourvus + siegeListe[i];
			} else {
				siegeListe[i] = 0;
			}
		}
		/*
		 * repartition des sièges restants à la plus forte moyenne 1 siège est
		 * attribué à chaque tour de boucle
		 */
		for (iSiege = 0; iSiege < (nbSiegePourvus - nbSiegePourvus - 1);) {
			// recherche de ma plus forte moyenne
			moyenneMax = (-1);
			for (i = 0; i < nbListe - 1; i++) {
				if (!(elemineListe[i])) {
					if (moyenneListe[i] > moyenneMax) {
						moyenneMax = moyenneListe[i];
						max = i;
					}
				}
			}
			// on attribue 1 siège à la liste de +forte moyenne
			siegeListe[max] = siegeListe[max] + 1;
			// on change sa moyenne
			moyenneListe[max] = voixListe[max] / (siegeListe[max] + 1);
		}
		// affichage des resultats sans tri
		for (i = 0; i < nbListe - 1; i++) {
			if ((elemineListe[i])) {
				System.out.printf("la Liste", nomListe[i], "a été éliminée");
			} else {
				System.out.printf("la Liste", nomListe[i], "a obtenu", siegeListe[i], "sièges");
			}
		}
	}

}
A voir également:

1 réponse

tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022
9 oct. 2019 à 17:17
Bonjour,

A première vue, vous faites de la division entre deux entiers, cela donne un entier même si vous précisez que l'affectation se fait à un double, vous perdez la précision. Ainsi, faites la conversion de l'un des deux entiers en double. Par exemple pour la ligne 108 :

quotientElectoral = ((double) nbVoixUtile) / nbSiegeAPouvoir;


Faites la conversion de l'un des deux et non pas du résultat après le calcul, par exemple, sur la ligne 94, le plus correcte est :

float q = ((float) voixListe[i]) / totalVoix;


Bon Courage,
0