Mes objets ne veulent pas se « ré-enfiler »

Mes objets ne veulent pas se « ré-enfiler » - Java - Programmation

Marsh Posté le 05-08-2010 à 01:22:44    

Bonjour,
Je débute en Java et j'ai besoin d'aide pour un exercice. Il est assez long et je bloque sur un truc de la fin, donc je ne mets ici que les consignes et codes utiles :) . L'exercice consiste à créer plusieurs classes qui a la fin permettront de « faire passer des oraux » à des étudiants, devant des enseignants. Chaque enseignant a un groupe étudiant, composé d'étudiants rangés en file et qui ont comme première matière à passer celle de l'enseignant en question.
Mon problème se trouve au niveau du triage des étudiants. Pour vérifier si la première matière d'un étudiant correspond à la matière de l'enseignant, je défile l'étudiant avec la méthode defiler: e.defiler a pour effet de retourner e et de supprimer e de la file. Ensuite je vérifie si les matières correspondent (pour ça, pas de problème). Le truc c'est que, lorsque j'ai défilé tous les étudiants, il faut les ré-enfiler, pour pouvoir refaire la comparaison des matières avec les autres enseignants. C'est ça qui ne marche pas, le « ré-enfilement », et j'aimerais qu'on m'aide à trouver pourquoi ; j'ai essayé de deux manières : en utilisant une file temporaire (c'est-à-dire en enfilant au fur et à mesure e dans temp mais au moment de défiler  temp pour enfiler les étudiants dans ma file principale , marche pas ; en ré-enfilant directement dans ma file principale, vu que  e reviendrait à la fin de la file. Mais les deux méthodes n'ont pas marché.
 
 
=> Créer une classe File (First In First Out) permettant d'enfiler et de défiler des
objects. Dans une file, le premier élément entré (enfilé) est le premier à sortir
(défiler):
 

Code :
  1. public class File{
  2. protected int tailleOccupee;
  3. private Object[] file;
  4. public File(int taille){
  5.  this.file = new Object[taille];
  6.  tailleOccupee = 0;
  7. }
  8. public Object getDebut(){
  9.  return file[0];
  10. }
  11. public Object defiler(){
  12.  if(tailleOccupee > 0){
  13.   Object res = file[0];
  14.   tailleOccupee--;
  15.   Object[] temp = new Object[tailleOccupee];
  16.   for(int i = 0; i < tailleOccupee ; i++)
  17.    temp[i] = file[i+1];
  18.   file = temp;
  19.   return res;
  20.  }
  21.  return null;
  22. }
  23. public boolean enfiler(Object o){
  24.  if(tailleOccupee >= file.length)
  25.   return false;
  26.  else{
  27.   tailleOccupee++;
  28.   file[tailleOccupee-1] = o;
  29.   }
  30.  return true;
  31. }
  32. public boolean estVide(){
  33.  if(tailleOccupee == 0)
  34.   return true;
  35.  return false;
  36. }
  37. public String toString(){
  38.  String str = "";
  39.  for(int i = 0; i < tailleOccupee ; i++){
  40.   str += file[i] + "\n";
  41.  }
  42.  return str;
  43. }
  44. }


 
 
En gros, c'est à voir comme une queue, premier arrivé premier servi (donc premier hors de la file ).
 
Ensuite :
=> Créer la classe Enseignant héritant de Personne (Personne est une classe contenant les attributs nom/prénom) :
 
(Ici la méthode à regarder est affecterEtudiant)
 

Code :
  1. public class Enseignant extends Personne {
  2. private int nbMax;
  3. private String domaine;
  4. private File groupeEtudiants;;
  5. public Enseignant(String domaine, int nbMax){
  6.  super();
  7.  this.domaine = domaine;
  8.  this.nbMax = nbMax;
  9.  groupeEtudiants = new File(nbMax);
  10. }
  11. public String getDomaine(){
  12.  return this.domaine;
  13. }
  14. public int getNbMax(){
  15.  return this.nbMax;
  16. }
  17. public File getGroupeEtudiant(){
  18.  return this.groupeEtudiants;
  19. }
  20. public void affecterEtudiants(File etudiants){
  21.  int j = etudiants.tailleOccupee;
  22.  for(int i = 0; i < j ; i++){
  23.   Etudiant et = (Etudiant)etudiants.defiler();
  24.   if((et.domaines.getSommet()).equals(this.domaine)){
  25.    groupeEtudiants.enfiler(et);
  26.   }
  27.                   // Que faire?
  28.  }
  29. }
  30. public String toString(){
  31.  String str;
  32.  str = "Nom : " + this.nom + "\nPrénom : " + this.prenom + "\nDomaine : " + this.domaine + "\nGroupe étudiant :\n"
  33.  + this.groupeEtudiants;
  34.  return str;
  35. }
  36. public void EtudiantFairePasser(){
  37.  Etudiant et = (Etudiant)groupeEtudiants.defiler();
  38.  et.domaines.depiler();
  39. }
  40. }


 
 
J'espère ne pas avoir été trop floue, et ne pas avoir oublié de code important (si c'est le cas n'hésitez pas à me faire signe ). Merci d'avance !


Message édité par Alcooline le 05-08-2010 à 02:00:57

---------------
Quand un génie véritable apparaît en ce bas monde, on peut le reconnaître à ce signe que les imbéciles sont tous ligués contre lui.
Reply

Marsh Posté le 05-08-2010 à 01:22:44   

Reply

Marsh Posté le 05-08-2010 à 09:43:46    

Détaille le "ça marche pas". Ca plante ? Tu as quoi dans ta liste après ?

Reply

Marsh Posté le 05-08-2010 à 10:26:21    

http://forum.hardware.fr/hfr/Progr [...] 0284_1.htm
 
http://www.siteduzero.com/forum-83 [...] filer.html
 
http://www.developpez.net/forums/d [...] e-enfiler/
 
 
3 personnes ont le même problème, vois avec les deux autres si elles ont trouvé une solution.
 
 
 
edit pour Daemon : non t'en fais pas. J'étais déjà inscrit sur deux des 3 forums et le dernier a reconnu mon compte Google.

Message cité 1 fois
Message édité par aze555666 le 05-08-2010 à 10:36:55
Reply

Marsh Posté le 05-08-2010 à 10:31:05    


Et tu t'es inscrit sur les autres sites juste pour indiquer ça.  [:implosion du tibia]

Reply

Marsh Posté le 05-08-2010 à 13:12:34    

La classe File est mal foutue, il vient de là ton problème. J'vais expliquer pourquoi, mais avant je tiens à signaler que les commentaires ca sert, d'une parce que ca évite pour les gens qui vont t'aider d'avoir à tout décrypter, et de deux parce que p'tetre qu'en te forcant à commenter tu aurais touvé toute seule!

 

Bref, le problème vient de la conjonction de deux trucs:
- la méthode defiler() ajuste automatiquement la taille de la file au nombre d'objets qu'elle contient.
- la méthode enfiler() refuse d'enfiler quoi que ce soit si la file est pleine.

 

Donc lorsque tu appelles defiler() tu te retrouves avec une file "pleine", et donc tu ne pourras plus jamais rien y enfiler.

 

C'est clair ou pas?
Solutions proposées, vite fait:
- soit tu n'ajustes pas la taille de la file quand tu défiles, et tu gardes toujours la taille initiale,
- soit quand tu veux enfiler dans une file pleine, tu augmentes la taille de la file pour le permettre.
Et faire les deux serait le mieux!

 

Edit: une autre remarque, après avoir regardé l'autre classe: tu déclares des retours pour tes méthodes defiler(), enfiler(), mais lorsque tu t'en sers, tu ne testes pas ce qu'elles renvoient. Ce qui ici t'aurais permis de voir que enfiler() te retournait false, et donc de "remonter" au problème. Dans l'idéal, il faudrait que tu aies:
- soit des méthodes qui peuvent échouer, dans ce cas il faut qu'elles retournent le booléen, et toi dans ton code appelant tu dois vérifier le retour et éventuellement gérer le problème,
- soit des méthodes qui ne peuvent pas (ou ne sont pas censées) échouer (comme dans mes solutions proposées), et là tu n'as pas besoin retourner quoi que ce soit.


Message édité par lasnoufle le 05-08-2010 à 13:19:13

---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 05-08-2010 à 14:19:37    

Bon tout d'abord je vous remercie pour vos réponses surtout lasnoufle. Le problème venait effectivement de la tailleOccupee. Merci ! Juste pour information, le code que j'ai posté était « vide » de mes tests, mais j'ai quand même testé les retours des méthodes enfilé et défilé, j'affichais la file principale et la temporaire, etc etc. Ah et désolée je n'ai pas encore le réflex de commenter ce que je fais. Hier j'ai lu le topic sur « L'art de poser une question », et non je ne fais pas partie de ceux qui posent la question sans avoir cherché au préalable.
 
Pour ce qui est de aze555666 , à qui j'ai déjà eu l'honneur de répondre (réponse que vous pourrez trouver sur le gentil lien que aze555666 a mis plutôt du site du zéro), et de Deamon, je me cite :  
 
Je vais te répondre ici et aussi ici vu que, toi aussi, tu t'es inscris sur plusieurs forums (Quel crime :pt1cable:  ). Je ne vois pas le problème à poster sur plusieurs endroits, non seulement par souci d'efficacité par rapport au temps, mais aussi par rapport à la plus grande diversité de réponses que l'on peut obtenir (il n'y a qu'à comparer avec les réponses de l'autre forum, les seules réponses traitant de la même chose sont... tes reproches). Je ne savais pas que si l'on postait sur un forum on était interdit de le faire sur d'autres. On dirait que tu considères m'avoir prise en « flagrant délit », ce qui est drôle car je le répète encore une fois, je ne vois pas le problème à ça, d'ailleurs je n'ai pas essayé de le cacher (j'aurai bien pu changer de pseudo, modifier le message :ouch:   ...) À bon entendeur. :hello:  
 
Aucune faute d'orthographe ( il me semble  :ange: ), français bien parlé, question posée poliment , je ne sais pas ce qu'il vous faut pour répondre à une question sans envoyer de pics à l'auteur....  
 
Si quelqu'un compte me contredire, je vous demanderais , s'il vous plaît, de donner de vrais arguments, et non pas des vieux trucs du genre « C'est un manque de respect »... sans expliquer en quoi . Je ne sais pas pourquoi j'ai l'impression qu'on m'accuse de « tromper » le forum  :lol: .


---------------
Quand un génie véritable apparaît en ce bas monde, on peut le reconnaître à ce signe que les imbéciles sont tous ligués contre lui.
Reply

Marsh Posté le 05-08-2010 à 14:53:10    

Mouarf  :D  
 
Te prends pas la tete, personne a rien dit de bien méchant, c'est plus des boutades qu'autre chose. Et puis c'est bien connu que en général les jeunes démarrent au quart de tour donc ca aide pas à se retenir, par plaisir du jeu dirons-nous.
 
Sinon pour les commentaires, si tu comptes coder dans ton futur métier, commences déjà à en mettre un peu partout meme si ca a l'air débile, tu me remercieras plus tard...
 
A+


---------------
C'était vraiment très intéressant.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed