Algorithme "boucle for" et "appels de méthodes"

Fermé
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017 - Modifié par crapoulou le 9/10/2016 à 00:04
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 11 oct. 2016 à 18:10
Bonjours , voilà j'viens de réalisé un mini programme qui consiste a afficher les moyennes des concurrents (la moyenne est égal à l'addition de toute les cotes - la cote max et la cote min diviser par le nombre de cotes restant) , et le nombre de concurrents qui vont en final cependant je trouves mon code assez lourds , conséquent , surchargé et pénible à lire est - il possible de l'aérer et de le clarifié de façon à avoir un code plus lisible et plus digeste :
public class ChampionnatGym {
 
  public static java.util.Scanner scanner = new java.util.Scanner(System.in);
   static int candidat = 0;
   public static void main(String[] args) {
   
   System.out.println("Veuillez entrer le nombres de participants en course pour la final");
   int concurant = scanner.nextInt(); double resultatConcurant = 0; double nbrFinnaliste = 0;
   for(int i = 1; i <= concurant; i++){
   candidat++;
   System.out.println("Concurant: " + candidat);
   nbrFinnaliste = nbrFinnaliste + resultatUnConcurrent();
   }
   System.out.println("Voici le nombre de Finnaliste" + nbrFinnaliste + "/" + candidat ); 
  }
   public static double resultatUnConcurrent(){
   int cote; double sommeCote =0; double resultat =0; int coteMax =0; int coteMin = 10; 
   for(int i =1 ; i <=8 ;i++){
   do{
   System.out.print("Veuillez la cote " + i + ":");
   cote = scanner.nextInt(); 
   if(cote > 10 || cote <0){
    System.out.println("Veuillez entrer une cote compris entre 0 et 10");
    cote = scanner.nextInt();    
   }}while(cote > 10 || cote < 0);
   
   sommeCote = sommeCote + cote;
   if(cote > coteMax){
   coteMax = cote;
   }if(cote <= coteMin){
   coteMin = cote;   
   } resultat = ((sommeCote-coteMax -coteMin)/6);
   }
   if(resultat >=8){
   System.out.println("Voici le résultat du concurant : " + resultat + "/10");
   System.out.println("Le Candidat " + candidat + ":" + " est finnaliste");
   return 1;
   }
   else{
   System.out.println("Voici le résultat du concurant" + resultat);
   System.out.println("Le candidat :" + candidat + " est disqualifié, il n'a pas obtenue la           moyenne désiré"); 
   }
    return 0;
   }
 }
A voir également:

2 réponses

Utilisateur anonyme
9 oct. 2016 à 09:27
Plus court n'est pas forcément plus lisible, les déclarations de variables de types différents sur la même ligne c'est souillon

int cote; double sommeCote =0; double resultat =0; int coteMax =0; int coteMin = 10; 


Range les :

int cote, coteMax = 0, coteMin = 10;
double sommeCote =0, resultat =0;


À la place d'avoir un if sur 3 lignes :

if(cote > coteMax){
   coteMax = cote;
   }

Tu peux le faire sur une seule (si il n'y a qu'une instruction à l'interieur) :

if(cote > coteMax) coteMax = cote;


Tu peux écrire ça :
 nbrFinnaliste = nbrFinnaliste + resultatUnConcurrent();

Comme ça :
nbrFinnaliste += resultatUnConcurrent();
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
10 oct. 2016 à 00:39
Merci pour votre intervention , Mais le fait d'initialisé les variables sur la même ligne ne rend pas pour autant le code plus lisible et moins conséquent. Toute fois j'tacherais de m'en rappeler a l'avenir
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
9 oct. 2016 à 11:35
De plus, tu peux, comme indiqué dans les discussions précédentes, découper certaines fonctionnalités dans des méthodes dédiées.

Par exemple la saisie d'un entier devrait se faire dans une méthode dédié, ce qui évites d'une part de la réécrire plusieurs fois (au risque de te tromper à chaque fois), d'autre part d'alourdir par une mécanique de saisie clavier une méthode qui n'a rien à voir.

D'ailleurs, plutôt que de faire la saisie au clavier dans la méthode resultatUnConcurent, il serait plus pertinent de passer ces valeurs en paramètres de la méthode, de même elle ne devrait pas faire d'affichage, il faut déléguer la partie interactivité avec le clavier et affichage du résultat, à des méthodes tierces afin qu'elle ne s'occupe que du calcul de son résultat.

Quant aux déclarations de variables, je rajouterais qu'il n'est en aucun utile de les déclarer au début de la méthode, il est plus pertinent de les déclarer au moment où tu en as vraiment besoin (si tu en as besoin).
Et de proscrire des variables globales comme tu l'as fait avec static int candidat = 0; alors qu'il devrait ici être question d'un argument passé à une méthode.

En déplaçant ton code dans des méthodes moyennant quelques modifications mineures pour le passage des arguments, on peut par exemple obtenir le code ci-dessous.
Le gain en lisibilité vient du fait que chaque méthode ne dépasse pas une dizaine de ligne, elles sont donc plus facilement compréhensibles individuellement, ce qui rend l'ensemble plus facile à digérer.

import java.util.Scanner;

public class ChampionnatGym {

    public static final int COTE_MIN = 0, COTE_MAX = 10;

    public static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        int nbConcurant = saisirEntier("Veuillez entrer le nombres de participants en course pour la final: ", 1, 100, null);
        int nbCotes = saisirEntier("Veuillez entrer le nombres de cotes par participants: ", 1, 100, null);
        int nbrFinnaliste = championnat(nbConcurant, nbCotes);
        System.out.println("Voici le nombre de Finnaliste" + nbrFinnaliste + "/" + nbConcurant);
    }

    public static int championnat(int nbConcurant, int nbCotes) {
        int nbrFinnaliste = 0;
        for (int candidat = 1; candidat <= nbConcurant; candidat++) {
            System.out.println("Concurant: " + candidat);
            int[] cotes = saisirCotes(nbCotes);
            double resultatConcurant = resultatUnConcurrent(cotes);
            boolean succes = analyse(candidat, resultatConcurant, nbCotes);
            if (succes)
                nbrFinnaliste++;
        }
        return nbrFinnaliste;
    }

    private static int[] saisirCotes(int nbCotes) {
        int[] cotes = new int[nbCotes];
        for (int i = 0; i < nbCotes; i++)
            cotes[i] = saisirEntier("Veuillez entrer la cote " + (i + 1) + ":", COTE_MIN, COTE_MAX, "Veuillez entrer une cote compris entre " + COTE_MIN + " et " + COTE_MAX + ": ");
        return cotes;
    }

    public static double resultatUnConcurrent(int[] cotes) {
        int coteMax = COTE_MIN, coteMin = COTE_MAX;
        double sommeCote = 0;
        for (int cote : cotes) {
            sommeCote += cote;
            if (cote > coteMax)
                coteMax = cote;
            if (cote <= coteMin)
                coteMin = cote;
        }
        return (sommeCote - coteMax - coteMin) / 6; // 6 = 8 - 2 ? dans ce cas diviser par cotes.length - 2
    }

    public static boolean analyse(int candidat, double resultat, int nbCotes) {
        if (resultat >= nbCotes) {
            System.out.println("Voici le résultat du concurant : " + resultat + "/" + COTE_MAX);
            System.out.println("Le Candidat " + candidat + ":" + " est finnaliste");
            return true;
        } else {
            System.out.println("Voici le résultat du concurant" + resultat);
            System.out.println("Le candidat :" + candidat + " est disqualifié, il n'a pas obtenue la moyenne désiré");
            return false;
        }
    }

    public static int saisirEntier(String message, int min, int max, String erreur) {
        System.out.print(message);
        while (true) {
            int n = scanner.nextInt();
            if (n >= min && n <= max)
                return n;
            System.out.print(erreur == null ? message : erreur);
        }
    }
}
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
10 oct. 2016 à 00:37
Merci pour votre intervention , C'est vrai qu'en créant plusieurs sous méthodes sa nous permet d'avoir une meilleur clarté quant au code , bien que je ne comprends pas tout je vois que l'objectif est de faire en sortent que les méthodes interagissent entres eux grâce à ce qui passer en paramètre. Pardonnez mon importunité , Cependant je soupçonne que votre méthode présente quelques fails:
 public static double resultatUnConcurrent(int[] cotes) {
    int coteMax = COTE_MIN, coteMin = COTE_MAX;
    double sommeCote = 0;
     for (int cote : cotes) {
     sommeCote += cote;
      if (cote > coteMax)
          coteMax = cote;
      if (cote <= coteMin)
          coteMin = cote;
        }
     return (sommeCote - coteMax - coteMin) / 6; // 6 = 8 - 2 ? dans ce cas diviser par         cotes.length - 2
    }


Puisque le programme nous permet d'entré d’emblée le nombres de cotes , cette instruction return (sommeCote - coteMax - coteMin) / 6 devient fausse puisque la moyenne est égal à la somme des cotes /nbrCotes Du coup la méthode devient :
 public static double resultatUnConcurrent(int[] cotes , int nbCotes) {
        int coteMax = COTE_MIN, coteMin = COTE_MAX;
        double sommeCote = 0;
        for (int cote : cotes) {
            sommeCote += cote;
            if (cote > coteMax)
                coteMax = cote;
            if (cote <= coteMin)
                coteMin = cote;
        }
        return ((sommeCote - coteMax - coteMin) / nbCotes); // 6 = 8 - 2 ?
    }


Merci en tout cas , je tacherais de comprendre l'objectif de chaque méthode d'un peut près
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
10 oct. 2016 à 04:05
Après murs réflexion ma méthodes aussi n'est pas tout à fait correct puisque en vrai la formules serait return ((sommeCote - coteMax - coteMin) / (nbCotes.length) - 2 ); .Mais dans se cas il faudrait initialisé des tableaux partout afin qu'il sache le mot clé "length" et de plus rajouter des conditions dans le cas où le nombre entré est == ou supérieur à length soit la taille du tableau Mais sa risque d’être une tache assez périlleuse.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 oct. 2016 à 06:58
"je vois que l'objectif est de faire en sortent que les méthodes interagissent entres eux grâce à ce qui passer en paramètre"
Rappelons que le titre de ta discussion est Algorithme "boucle for" et "appels de méthodes" donc c'est que le but est de faire des méthodes et les appeler...

Remarque : tu parlais de l'orienté objet dans une autre discussion, ici tu ne t'en sers pas du tout, et pourtant tu pourrais modéliser ton problème avec deux ou trois classes ce qui permettrait notamment de s'éviter certains paramètres dans les méthodes puisque ces valeurs seraient liées aux objets...

"en vrai la formules serait return ((sommeCote - coteMax - coteMin) / (nbCotes.length) - 2 );"
Il me semble bien que c'est ce que j'ai mis en commentaire ;-)
return (sommeCote - coteMax - coteMin) / 6; // 6 = 8 - 2 ? dans ce cas diviser par cotes.length - 2

Mais dans se cas il faudrait initialisé des tableaux partout afin qu'il sache le mot clé "length"
Non, ton tableau tu le créés une seule fois, et tu le passes en paramètres des méthodes, comme dans mon code d'exemple.
int[] cotes = saisirCotes(nbCotes);
double resultatConcurant = resultatUnConcurrent(cotes);

"et de plus rajouter des conditions dans le cas où le nombre entré est == ou supérieur à length soit la taille du tableau"
Non, on ne limites pas le nombre entré à la taille du tableau car c'est le nombre entré qui définis la taille du tableau, donc il est forcément de la bonne taille, regardes mon code :
int nbCotes = saisirEntier("Veuillez entrer le nombres de cotes par participants: ", 1, 100, null);
// ...
int[] cotes = new int[nbCotes];
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
11 oct. 2016 à 17:22
Oui merci quant au classe vous voulez dires par exemple crée une classe à part comme candidat ? Mais sa m'étonne parce que lorsque j'affiche return ((sommeCote - coteMax - coteMin) / cotes.length - 2); le moyenne retourner ne reflète pas cette dernière or que cotes étant initialisé dans un tableau devrai me renvoyé le nombre de cote entré - 2
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
11 oct. 2016 à 18:10
Les parenthèses sont mal placées...
((sommeCote - coteMax - coteMin) / cotes.length - 2);

Il faudrait plutôt écrire :
(sommeCote - coteMax - coteMin) / (cotes.length - 2);

"quant au classe vous voulez dires par exemple crée une classe à part comme candidat"
Oui, vu ton code il apparaît explicitement des classes Concurrent et Cote, implicitement on peut aussi voir une classe Performance... perso j'irais jusqu'à 6 classes pour ce programme.
0