Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1683 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Débutant, moyenne, avis

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Débutant, moyenne, avis

n°2252338
hazop117
J'accepte les cookies
Posté le 05-03-2015 à 12:41:05  profilanswer
 

Salut,
 
Je commence en java et pour m'initier j'ai voulu faire un calcul de moyenne pondérée, je voudrais connaitre vos avis concernant la lisibilité, les défauts, l'efficacité etc. de ce bout de code (qui fonctionne) :
 
 

Code :
  1. import java.util.Scanner;
  2. public class moyenne {
  3. /*Pour calculer une moyenne il faut :
  4.  * 1- connaître le nombre de notes, leur valeur et leur coefficients;
  5.  * 4- faire la somme des (notes*coefficients) et faire la somme des coefficients;
  6.  * 6- diviser la somme des notes par la somme des coefficients;
  7.  */
  8. Scanner saisie = new Scanner(System.in); //permet la saisie de données par l'utilisateur
  9. private final int NOMBRE_NOTE_MAX=20; //nombre maximum de notes
  10. private float [] tabNotes = new float[NOMBRE_NOTE_MAX]; //tableau de notes
  11. private float [] tabCoefficients = new float[NOMBRE_NOTE_MAX]; //tableau de coefficients
  12. private float sommeDesNotes = new Float(0.0f);
  13. private float sommeDesCoefficients = new Float(0.0f);
  14. private float moyenne = new Float(0.0f);
  15. private int nbnotes = new Integer(0); //nombre de notes que l'utilisateur veut saisir
  16. public static void main(String[] args) {
  17.  moyenne moy = new moyenne();
  18.  moy.notes();
  19.  moy.calculerSommes();
  20.  moy.calculMoyenne();
  21.  System.out.println("Somme des notes = "+moy.sommeDesNotes);
  22.  System.out.println("Somme des coefficients = "+moy.sommeDesCoefficients);
  23.  System.out.println("La moyenne est de : "+moy.moyenne);
  24. }
  25. public void notes(){ //demande la saisie des notes
  26.  int i = 0;
  27.  while (nbnotes <= 0 || nbnotes > 20) { //demande le nombre de notes à saisir 0<nbnotes<=20
  28.  System.out.println("Combien de notes voulez vous entrer ? (20 maximum)" );
  29.  nbnotes = saisie.nextInt();
  30.  }
  31.  for(i = 0;i < nbnotes;i++) {
  32.   System.out.println("Entrez une note (0<note<20)" );
  33.   tabNotes[i] = saisie.nextFloat();
  34.   System.out.println("Entrez le coefficient correpondant (coefficient > 0)" );
  35.   tabCoefficients[i] = saisie.nextFloat();
  36.  }
  37. }
  38. public void calculerSommes() { //calcule la somme des notes et la somme des coefficients
  39.  int i = 0;
  40.  for(i = 0;i < nbnotes;i++) {
  41.   sommeDesNotes = sommeDesNotes + (tabNotes[i] * tabCoefficients[i]);
  42.   sommeDesCoefficients = sommeDesCoefficients + tabCoefficients[i];
  43.  }
  44. }
  45. public void calculMoyenne() {
  46.  moyenne = sommeDesNotes/sommeDesCoefficients;
  47. }
  48. }


 
Tout les commentaires sont bienvenus.
Merci.  :jap:

mood
Publicité
Posté le 05-03-2015 à 12:41:05  profilanswer
 

n°2252387
lasnoufle
La seule et unique!
Posté le 05-03-2015 à 20:06:55  profilanswer
 

Salut

 

Je suppose que ton truc marche (a vue de nez ca devrait) donc je vais seulement parler de la forme.
Ca m'a l'air tout a fait correct et mon job serait beaucoup plus simple si tout le monde mettait au minimum ce niveau de commentaire.
Maintenant ca fait un bail que je dois plus etre a jour sur le Java donc peut-etre que des ayatollahs du Java vont trouver a redire.

 

Quelques points vite fait:
- public class moyenne { -> traditionnellement, les noms de classes commencent toujours par une majuscule.

 

- private float sommeDesNotes = new Float(0.0f); -> tu peux mettre directement private float sommeDesNotes = 0;. Pareil pour les autres declarations de variables de types primitifs. Absolument aucun impact sur le resultat mais ca simplifie un peu le code.

 

- int i = 0;
 for(i = 0;i < nbnotes;i++) {
-> tu peux mettre directement for(int i = 0;i < nbnotes;i++) {

 

- System.out.println("Somme des notes = "+moy.sommeDesNotes); -> regarder ou modifier directement une variable a l'interieur d'un objet, c'est mal.

 

- apres le decoupage en methodes/objets est un peu bizarre. Typiquement, il y a habituellement deux grandes "approches" en programmation:
1 - la programmation "procedurale" (me souviens meme plus si c'est le bon nom) qui ne s'encombre pas d'objet. Bon en Java tout est objet mais ca s'accomode en declarant des methodes et variables statiques.
2 - la programmation orientee objet: encapsulation, heritage et d'autres trucs dont je me souviens plus parce que ca remonte a longtemps et 99% du temps t'en as rien a branler tant que tu te rappelles de pourquoi c'est la.
La, je trouve ton decoupage "bizarre" parce que tu commences a coder une classe "non statique" et pars donc vers de la POO, sauf qu'au final tu t'en sers comme si tu faisais du procedural, et ca donne un melange des genres un peu batard, sans compter les access aux variables pas du tout POO-compliants. Bon comme je disais au debut, "si ca marche on s'en fout", mais ca pourrait amener des surprises pour des trucs plus complexe.

 

Si tu pars sur de l'objet, tu "devrais":
- creer des methodes get/set pour chaque variable de ton objet qui doit etre modifiee/lue depuis l'exterieur, et ne jamais referencer directement ces variables
- bouger la collecte des donnees en dehors de la classe. L'objet de type Moyenne devrait se foutre d'ou viennent les donnees; tu peux les collecter au clavier ou les lire depuis un ficher, c'est pas son probleme. La classe devrait avoir une methode par laquelle passer les donnees deja collectees et au bon format (ou les passer directement dans le constructeur).
- revoir la portee et/ou le decoupage de tes methodes. Mettons que je veuille utiliser ta classe pour calculer une moyenne. Je vais en creer une instance, lui passer mes donnees (notes et coeffs) et m'attendre a n'avoir qu'a appeler une methode qui me donnera la moyenne. Or la, je dois appeler calculerSommes, puis encore calculMoyenne, et encore il faut que j'appelle le getter pour avoir mon resultat. Pas top; calculerSommes devrait typiquement etre invisible (i.e. la passer private ou protected) puisque c'est du rouage interne, personne ne devrait pouvoir l'appeler de l'"exterieur". En revanche, ca devrait etre appele automatiquement depuis calculMoyenne a la place.

 

Un truc "simple" pour "ameliorer" ca (enfin, si ca t'interesse et que tu trouves pas que je radote) c'est de creer une autre classe de test dans un autre package qui se sert de ta classe pour calculer une moyenne. La tu vas tout de suite voir que "System.out.println("Somme des notes = "+moy.sommeDesNotes);" par exemple ne passe plus.

 

Sinon, si tu pars sur du procedural, tu peux passer toutes tes variables et methodes en static et la c'est OK pour appeler ce que tu veux directement de n'importe ou (vu qu'on peut estimer que les questions de portee entre classes etc on s'en tape en procedural).


Message édité par lasnoufle le 05-03-2015 à 20:08:27

---------------
C'était vraiment très intéressant.
n°2252500
hazop117
J'accepte les cookies
Posté le 07-03-2015 à 12:36:37  profilanswer
 

Salut,
 
Merci, ça va prendre un peu de temps mais je répondrai encore.

n°2253074
Fraisouill​e
Grouik Grouik
Posté le 12-03-2015 à 14:42:14  profilanswer
 

Je remplacerais les float[] par des ArrayList<Float>
Avantage : pas besoin de savoir à l'avance combien de notes il va y avoir vu que la liste est dynamique et tu peux boucler sur la saisie tant que l'utilisateur n'entre pas une valeur spécifique pour dire qu'il a terminé.
 
Au final, le nombre de notes prises en compte ne dépend plus de limitations techniques mais uniquement de la patience de l'utilisateur qui pourra en saisir 10 000 si ça lui chante :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Débutant, moyenne, avis

 

Sujets relatifs
Débutant BDD en général / liens entre tablesDébutant python dictionnaire sérialisé
Aide lettre k plus complexeAvis sur mon site internet MonPireRencard.com
Débutant AS3 recherche une correction pour un premier scriptDébutant codage.
Débutant à besoin d'aide[PHP]Aide Débutant Ajouter Captcha formulaire de contact existant
exercice C ( debutant) demande d explicationsDébutant erreur ptit batch
Plus de sujets relatifs à : Débutant, moyenne, avis


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR