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 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 11 oct. 2016 à 18:10
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 11 oct. 2016 à 18:10
A voir également:
- Algorithme "boucle for" et "appels de méthodes"
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Appels masqués - Guide
- Idm for mac - Télécharger - Téléchargement & Transfert
- Download instagram for pc - Télécharger - Divers Communication
- Whatsapp for pc - Télécharger - Messagerie
2 réponses
Utilisateur anonyme
9 oct. 2016 à 09:27
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
Range les :
À la place d'avoir un if sur 3 lignes :
Tu peux le faire sur une seule (si il n'y a qu'une instruction à l'interieur) :
Tu peux écrire ça :
Comme ça :
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();
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
9 oct. 2016 à 11:35
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.
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); } } }
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
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:
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 :
Merci en tout cas , je tacherais de comprendre l'objectif de chaque méthode d'un peut près
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
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
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.
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
10 oct. 2016 à 06:58
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 ;-)
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.
"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 :
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];
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
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
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
>
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
11 oct. 2016 à 18:10
Les parenthèses sont mal placées...
Il faudrait plutôt écrire :
"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.
((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.
10 oct. 2016 à 00:39