[JAVA] programme de création de listes

Huntil Message lu Posté le 25 Nov 2008 à 21:58 Bulle
Avatar de Huntil
Modérateur

Messages : 1012
GCPoints : 289843
J'ai commencé un petit programme qui permet de créer des listes de définitions que j'ai appelé dicos (bon pour l'instant les "dicos" ne sont pas encore triés par ordre alphabétique mais j'y songe) et de faire quelques exercices à partir de ces dicos.
J'aimerais avoir vos critiques. Le programme n'est pas parfait donc n' hésitez pas à dire tout le mal que vous en pensez.

Voici quelques problèmes que j'ai rencontré:

-Je peux compiler, mais j'ai ce message d'avertissement que je ne comprends pas:

Citation :

Note: Revision2.java uses unchecked or unsafe operations.
Recompilez avec -Xlint pour avoir des infos sur cette erreur.



-Est-ce que c'est une bonne idée de nommer toute les variables membres d'une classe par "m_nomdelavariable" ?

Je n'aime pas beaucoup mon timer. J'ai trouvé un exemple sur internet où on dérive la classe TimerTask, mais dans mon bouquin de java ils utilisent une interface, seulement j'ai pas encore bien pigé le truc. Dans tout les cas quand on perd je ne sais pas comment terminer l'exercice.

Vous n'êtes pas obligé de lire les commentaires, ce sont des notes à usage personnel pour l'instant :wink:

Voici une liste pour ceux qui veulent tester le programme:

humanbody
bladdervessie
bone os
brain cerveau
legg ovule
heart coeur
hormone hormone
kidney rein
large intestinegros intestin
liverfoie
lungpoumon



humanbody.txt a écrit :

humanbody|vocabulaire anglais sur le corps humain (int‚rieur)|bladder|vessie|bone|os|brain|cerveau|egg|ovule|heart|coeur|hormone|hormone|kidney|rein|


Remarquez que cette liste ne ce prête pas bien au deuxième exercice. Il est plus intéressant d'avoir à citer une liste exhaustive, comme les mots clés d'un langage de programmation.

sources: Revision2.java

Spoiler - Cliquez pour afficher
Code :
import java.io.*;
import java.util.*;

//	élément du dico: un mot et sa définition	(définir la relation ? traduction, définition, date,...)
class Item	
{
	public Item() {};
		
	public Item(String m, String d)
	{
		mot = m;
		definition = d;
	}
	
	public void setMot(String m)
	{
		mot = m;
	}
	
	public void setDefinition(String d)
	{
		definition = d;
	}
	
	public String getMot()
	{
		return mot;
	}
	
	public String getDefinition()
	{
		return definition;
	}
	
	private String mot;	
	private String definition;
}

//	dico: groupe d' "item"
class Dico	//trier par ordre alphabétique
{
	public Dico() {}
	
	public Dico(String n, String d)
	{
		nom = n;
		description = d;
	}
	
	public void ajouterItem()
	{
		String mot, definition;
		System.out.print("mot a definir: ");
		mot = Clavier.lireString();
		System.out.print("definition du mot: ");
		definition = Clavier.lireLigne();
		Item i = new Item(mot, definition);
		listeItems.add(i);	//unchecked operation ???
	}
	
	public void supprimerItem(String mot)
	{
		Item item;
		boolean supprime = false;
		suppression:
		for(int i = 0; i < listeItems.size(); i++)
		{
			item = (Item)listeItems.get(i);
			if (item.getMot().equals(mot))
			{
				listeItems.remove(i);
				break suppression;
			}
		}
	}
	
	public void afficher()
	{
		Item item;
		System.out.println();
		System.out.println("Dico: " + nom);	
		System.out.println(description);
		System.out.println();
		
		for(int i = 0; i < listeItems.size(); i++)
		{
			item = (Item)listeItems.get(i);	
			System.out.println(item.getMot() + " = " + item.getDefinition());
		}
		System.out.println();
	}
	
	public void enregistrer(PrintWriter out) throws IOException	//exception à comprendre
	{
		Item item;
		out.print(nom + "|" + description);
		for(int i = 0; i < listeItems.size(); i++)
		{
			item = (Item)listeItems.get(i);
			out.print("|" + item.getMot() + "|");
			out.print(item.getDefinition());
		}
		out.println("|");
	}
	
	public void charger(BufferedReader in) throws IOException
	{	
		String s = in.readLine();
		StringTokenizer t = new StringTokenizer(s, "|");
		nom = t.nextToken();
		description = t.nextToken();
		listeItems.setSize(0); //remettre à zéro un vecteur
		while(t.hasMoreTokens())
		{	
			Item item = new Item();
			item.setMot(t.nextToken());
			item.setDefinition(t.nextToken());
			listeItems.add(item);
		}
	}
	
	//	réviser à partir des définitions
	public void exercice1()	
	{
		if(listeItems.size() == 0)
		{
			System.out.println("Il n'y a aucun mot dans le dico !");
			System.exit(0);// quitter la fonction (euh... pas le programme quand meme...) ; erreur -> argument de exit ???
		}
		int note;	// nom de la variable note ???
		int nbre_bonnes_reponses = 0;
		Item item;
		int random_int = 0;
		int precedant = 0; 
		String reponse;
		if(listeItems.size() < 5) note = listeItems.size();
		else if(listeItems.size() < 10) note = 5;
		else if(listeItems.size() < 20) note = 10;
		else note = 20;
		for(int compteur = 0; compteur < note; compteur++)
		{	
			while(random_int == precedant) random_int = (int)(java.lang.Math.random()*listeItems.size());
			precedant = random_int;
			item = (Item)listeItems.get(random_int);	
			System.out.println(item.getDefinition());
			System.out.println("est la definition de: ");
			reponse = Clavier.lireString();
			if(reponse.equals(item.getMot()))
			{
				System.out.println("Bonne reponse");
				nbre_bonnes_reponses++;
			}
			else
			{
				System.out.println("Mauvaise reponse");
			}
			System.out.println(nbre_bonnes_reponses + "/" + (compteur+1));	//inutile en console
		}
		System.out.println("Votre score final est: " + nbre_bonnes_reponses + "/" + note);
	}

	//	citer la liste
	public void exercice2()	
	{
		if(listeItems.size() == 0)
		{
			System.out.println("Il n'y a aucun mot dans le dico !");
			System.exit(0);// quitter la fonction (euh... pas le programme quand meme...) ; erreur -> argument de exit ???
		}
		int note;	// nom de la variable note ???
		int nbre_bonnes_reponses = 0;
		int nbre_minutes = 3;
		Item item;
		String reponse;
		System.out.println(description);		
		System.out.println("Il y a " + listeItems.size() + " elements a citer.");
		System.out.println("Duree de l'exercice ? (min): ");
		nbre_minutes = Clavier.lireInt();
		Vector itemsRestantes = new Vector();
		Vector itemsTrouvees = new Vector();		
		for(int i = 0; i < listeItems.size(); i++)
		{
			item = (Item)listeItems.get(i);
			itemsRestantes.add(item);
		}
		ExerciceTimer ex_timer = new ExerciceTimer(nbre_minutes);
		while(itemsRestantes.size() > 0)
		{
			System.out.print("-> ");
			reponse = Clavier.lireString();
			for(int i = 0; i < itemsRestantes.size(); i++)
			{
				item = (Item)itemsRestantes.get(i);
				if(reponse.equals(item.getMot()))
				{
					itemsRestantes.remove(i);
					itemsTrouvees.add(item);
					i = itemsRestantes.size(); //correct pour sortir ?
				}
			}
			System.out.println();
			System.out.print("elements trouves: ");
			for(int i = 0; i < itemsTrouvees.size(); i++)
			{
				item = (Item)itemsTrouvees.get(i);
				System.out.print(item.getMot() + " ");
			}
			System.out.println();// "/n"
			if(itemsRestantes.size() > 0)
			{
				System.out.println("Il reste " + itemsRestantes.size() + " elements a trouver:");
			}
		}
		ex_timer.terminer();
		System.out.println("Bravo ! Vous avez trouvez tout les elements !");
	}
	
	public String getNom()
	{
		return nom;
	}
	
	private String nom;
	private String description;
	private Vector listeItems = new Vector();	//initialiser listeItems ici ou dans constructeurs ?
}
	
//	timer pour les exercices(exercice2 uniquement pour l'instant)
class ExerciceTimer
{
	public ExerciceTimer(int min) 
	{
		nbre_minutes = min;
		timer = new Timer();
		timer.schedule(new Action(), 0, 60000);
	}
	
	public void terminer()
	{
		timer.cancel();
	}

	class Action extends TimerTask // autrement que héritage ? implements ?
	{
		public void run()
		{
			if (nbre_minutes > 0) 
			{
				System.out.println("Plus que " + nbre_minutes + " minutes !");
				nbre_minutes--;
			} 
			else 
			{
				System.out.println("Le temps imparti est ecoule.");	 //GAME OVER -> finir l'excercice
				//itemsRestantes.setSize(0); //un peu barbare non ?
				timer.cancel();
			}
		}
	}
	
	private Timer timer;
	private int nbre_minutes;
} 

public class Revision2
{
	public static void main(String[] args)
	{	
		Dico dico = new Dico();
		String fichier;
		boolean continuer = true;	//inutile car Quitter = System.exit(0)
		while(continuer)
		{	
			System.out.println();
			System.out.println("----------------------");
			System.out.println("      DICO LEARN      ");
			System.out.println("----------------------");
			System.out.println("1 Nouveau dico");
			System.out.println("2 Ouvrir dico");	//renommer dico
			System.out.println("3 Reviser un dico");
			System.out.println("4 Quitter");
			System.out.println();
			System.out.print("Option choisie: ");
			int choix;
			choix = Clavier.lireInt();
			System.out.println();
			
			switch(choix)
			{
				case 1:
					System.out.println("Creation d'un dico");
					System.out.println("----------------------");			
					String nom, description;	
					System.out.println("Donnez un nom au dico (pas d'espace): ");
					nom = Clavier.lireString();
					System.out.println("Donnez une description en une ligne de ce dico: ");
					description = Clavier.lireLigne();	// "Autre cas" quand espace dans nom -> ?
					Dico nouveau_dico = new Dico(nom, description);
					
					try 
					{
						PrintWriter out = new PrintWriter(new FileWriter( nom + ".txt")); 
						nouveau_dico.enregistrer(out);
						out.close();
					}
					catch(IOException e)
					{
						System.out.print("Erreur: " + e);
						System.exit(1);
					}
					System.out.println();
					System.out.println("  - Dico enregistre -");	
					break;
					
				case 2:
					System.out.println("Modifier un dico");
					System.out.println("----------------------");	
					System.out.println("Quel dico voulez-vous modifier ?");
					fichier = Clavier.lireString();
				
					try
					{
						BufferedReader in = new BufferedReader(new FileReader(fichier + ".txt"));				
						dico.charger(in); 
						in.close();
					}
					catch(IOException e)
					{
						System.out.println("Erreur : " + e);
						System.exit(1);
					}
					
					dico.afficher();	
					menu2:
					while(true)
					{
						System.out.println("----------------------");
						System.out.println("1 Ajouter un mot au dico");
						System.out.println("2 Enlever un mot du dico");
						System.out.println("3 Reafficher le dico");
						System.out.println("4 Enregistrer et retourner au menu principal");
						System.out.println();
						System.out.print("Option choisie: ");
						int choix2;
						choix2 = Clavier.lireInt();	
						switch(choix2)
						{
							case 1:								
								dico.ajouterItem();
								break;
								
							case 2:		
								String mot;
								System.out.print("Quel mot voulez-vous supprimer du dico ? ");
								mot = Clavier.lireString();
								dico.supprimerItem(mot);	
								break;
							
							case 3:
								dico.afficher();	
								break;
								
							case 4:		
								System.out.println("Enregistrer");
								System.out.println("----------------------");
								try 
								{
									PrintWriter out = new PrintWriter(new FileWriter( dico.getNom() + ".txt")); 
									dico.enregistrer(out);
									out.close();
								}
								catch(IOException e)
								{
									System.out.print("Erreur: " + e);
									System.exit(1);
								}
								System.out.println();
								System.out.println("  - Dico enregistre -");	
								break menu2;
							
							default:
								System.out.println("Entre invalide");
								break;
						}

					}
					break;

				case 3:
					System.out.println("Reviser");
					System.out.println("----------------------");	
					System.out.println("Quel dico voulez-vous reviser ?");
					fichier = Clavier.lireString();
				
					try
					{
						BufferedReader in = new BufferedReader(new FileReader(fichier + ".txt"));				
						dico.charger(in); 
						in.close();
					}
					catch(IOException e)
					{
						System.out.println("Erreur : " + e);
						System.exit(1);
					}
					System.out.println();
					System.out.println("A quel type d'excercice voulez-vous vous entrainez ?");
					menu3:	//ou plutot booleen ?
					while(true)
					{
						System.out.println("----------------------");
						System.out.println("1 Trouver le mot correspondant a la definition");
						System.out.println("2 Citer le maximum d'elements du dico");
						System.out.println();
						System.out.print("Option choisie: ");
						int choix3;
						choix3 = Clavier.lireInt();	
						switch(choix3)
						{
							case 1:
								dico.exercice1();
								break menu3;
								
							case 2:
								dico.exercice2();
								break menu3;
								
							default:
								System.out.println("Entre invalide");
								break;
						}	
					}
					break;
					
				case 4: 
					System.out.println("Quitter");
					System.out.println("----------------------");	
					System.exit(0);					
					break;
					
				default:
					System.out.println("Entree invalide");
					break;
			}	
		}
	}
}



PS: arf ça craint du code dans un spoiler.
Dernière édition le 26 Nov 2008 à 12:41
Copyright © 2007 - 2010 Huntil
"Il faut toujours un drame"
gouessej Message lu Posté le 26 Nov 2008 à 11:30 Bulle
Membre Avancé

Messages : 337
GCPoints : 64624

Citation :

Note: Revision2.java uses unchecked or unsafe operations.
Recompilez avec -Xlint pour avoir des infos sur cette erreur.


C'est juste que tu dois utiliser des méthodes dépréciées et/ou tu dois ne pas préciser le type là où ce serait plus sûr de le faire. Je vais jeter un coup d'oeil à ton code tout de suite.

S'il te plaît, corrige ton lien.
Dernière édition le 26 Nov 2008 à 11:32
gouessej Message lu Posté le 26 Nov 2008 à 11:38 Bulle
Membre Avancé

Messages : 337
GCPoints : 64624

Citation :

private Vector listeItems = new Vector();


Mets plutôt :
private Vector<Item> listeItems = new Vector<Item>();
Cela rend l'utilisation de certains forçages de type (cast) inutile.

C'est curieux, tu mets tous les attributs de la classe à la fin.

Ah, ça fait du bien de voir du Java :proud:
Dernière édition le 26 Nov 2008 à 11:39
Huntil Message lu Posté le 26 Nov 2008 à 12:26 Bulle
Avatar de Huntil
Modérateur

Messages : 1012
GCPoints : 289843

Citation :

S'il te plaît, corrige ton lien.


Celui de la liste pour tester ?

Citation :


C'est juste que tu dois utiliser des méthodes dépréciées et/ou tu dois ne pas préciser le type là où ce serait plus sûr de le faire


Ok, la méthode add de Vector attend un objet en argument alors que j'envois un "Item".


Citation :

C'est curieux, tu mets tous les attributs de la classe à la fin.


C'est comme ça dans mon bouquin Au coeur de Java 2 (qui commence sérieusement à dater), pour conforter l'idée que les variables d'instance doivent être mises à l'écart. Je pense que je vais reprendre l'habitude de les mettre au début. D'ailleurs je vais commencer à coder plus sérieusement et à être plus productif vu que je viens d'installer eclipse, mais je ne regrette pas d'avoir travailler juste avec la console et notepad++.

Par contre pour le nom des attributs tu n'as pas donnés ton avis: tu penses que c'est une bonne idée de mettre systématiquement m_ au début (je crois que c'est M@teo21 qui propose ça dans son tuto C/C++). Au moins on c'est à quoi on a affaire et on peut réutiliser le nom de la variable.
Dernière édition le 26 Nov 2008 à 17:22
Copyright © 2007 - 2010 Huntil
"Il faut toujours un drame"
gouessej Message lu Posté le 27 Nov 2008 à 20:15 Bulle
Membre Avancé

Messages : 337
GCPoints : 64624
Pour les conventions de nommage, c'est une question de goût, l'essentiel est de les respecter jusqu'au bout. Il y a officiellement les "Java Code Conventions", ça peut t'inspirer.

Pour l'instance de Vector, si tu utilises Vector<Item> à la place, la méthode add(...) prend en paramètre une instance d'Item. Prends une documentation Java récente, pas celle de Java 1.4 et tu verras bien boolean add(E e) où E est la classe qui paramètre l'instance de Vector.

http://java.sun.com/javase/6/docs/api/
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0457 secondes