Huitième semaine

Exercice 1
L'interface Query et la classe abstraite AbstractQuery. Query.java
AbstractQuery.java
Exercice 2
La classe NumericQuery.
NumericQuery.java
Exercice 3
La classe CharQuery.
CharQuery.java
Exercice 4
La classe StringQuery.
StringQuery.java
Exercice 5
La classe YesNoQuery.
YesNoQuery.java
Exercice 6
Et la classe Quiz pour terminer !
Quiz.java
TestQuiz.java

Cette semaine, nous allons créer les classes nécessaires à la mise en place de questionnaires.

Le but du TP est de faire tourner (correctement) le programme suivant :

public class TestQuiz
{
    public static void main(String[] args)
    {
        Quiz q = new Quiz();

        q.addQuery(new NumericQuery("Date de la bataille de Marignan",1515,2));
        q.addQuery(new NumericQuery("Date de la revolution française",1789,1));
        q.addQuery(new NumericQuery("Première election de Mitterand",1981,3));
        q.addQuery(new YesNoQuery("En logique Faux implique Vrai","oui",3));
        q.addQuery(new YesNoQuery("Dos est un systeme multi-taches","non",2));
        q.addQuery(new CharQuery("Quelle lettre precede le m",'l',1));

        q.run();
    }
   
}

Comme vous le voyez, un questionnaire (Quiz) est constitué d'un ensemble de questions qui différent selon la nature de la question. Nous allons d'abord définir l'interface Query, puis nous créerons ensuite les autres types de questions avant de terminer avec la classe questionnaire (Quiz).


Exercice 1 :

Voici l'interface Query, écrivez une classe abstraite AbstractQuery étendant cette interface et fournissant le plus de facilités pour les classes qui auront à l'hériter (par exemple toString() et autres ...).

interface Query {

    public void readUserAnswer(); // Effectue la saisie (classe Clavier) auprès de l'utilisateur

    public String getCorrectAnswer(); // Retourne la réponse de cette question

    public boolean isCorrect(); // Retourne vrai si l'utilisateur a correctement répondu

    public int getPoints(); // Retourne le nombre de points associés à cette réponse

}



Exercice 2 :

Nous allons maintenant étendre la classe abstraite pour pouvoir créer des questions dont la réponse sera numérique. Voici un exemple d'utilisation de cette classe :

public class TestNumericQuery {
    public static void main(String args[]) {
        // créé une question numérique dont l'intitulé est "Combien font 2 + 2", dont la réponse est 4, et valant 1 point
        NumericQuery nquery = new NumericQuery("Combien font 2 + 2", 4, 1);
        System.out.print(nquery); // Affiche l'intitulé
        nquery.readUserAnswer(); // Récupére la réponse de l'utilisateur
        if (nquery.isCorrect()) {
          System.out.println("Votre réponse est bonne ! Vous avez gagné "+nquery.getPoints()+" points.");
        } else {
          System.out.println("Votre réponse est fausse ... la bonne réponse était : "+nquery.getCorrectAnswer());
        }
    }
}


Rappel : Le but est toujours d'en écrire le moins possible (pensez donc bien à ce qui doit aller dans la classe abstraite et ce qui doit rester dans la classe NumericQuery !)


Exercice 3 :

Après les questions de type numérique, les questions  dont la réponse est un caractère (type char), que vous pourrez tester avec le programme suivant :

public class TestCharQuery {
    public static void main(String args[]) {
        // créé une question dont l'intitulé est "Quelle lettre suit le 'm'", dont la réponse est 'n', et valant 2 points
        CharQuery nquery = new CharQuery("Quelle lettre suit le 'm'", 'n', 2);
        System.out.print(nquery); // Affiche l'intitulé
        nquery.readUserAnswer(); // Récupére la réponse de l'utilisateur
        if (nquery.isCorrect()) {
          System.out.println("Votre réponse est bonne ! Vous avez gagné "+nquery.getPoints()+" points.");
        } else {
          System.out.println("Votre réponse est fausse ... la bonne réponse était : "+nquery.getCorrectAnswer());
        }
    }
}



Exercice 4 :

Maintenant, nous allons nous intéresser aux questions dont la réponse est une chaine de caractète (type String). Comme d'habitude, vous pourrez tester votre classe avec l'application suivante :

public class TestStringQuery {
    public static void main(String args[]) {
        // créé une question dont l'intitulé est "Un bateau, des ", dont la réponse est "bateaux", et valant 3 points
        StringQuery nquery = new StringQuery("Un bateau, des ", "bateaux", 3);
        System.out.print(nquery); // Affiche l'intitulé
        nquery.readUserAnswer(); // Récupére la réponse de l'utilisateur
        if (nquery.isCorrect()) {
          System.out.println("Votre réponse est bonne ! Vous avez gagné "+nquery.getPoints()+" points.");
        } else {
          System.out.println("Votre réponse est fausse ... la bonne réponse était : "+nquery.getCorrectAnswer());
        }
    }
}




Exercice 5 :

Finalement, écrire une classe YesNoQuery qui correspond à une réponse de type oui/non (ou OUI/NON, ou YES/NO, ou yes/no .... :). Pas de classe d'exemple cette fois-ci : celle de l'exercice 4 convient aussi !


Exercice 6 :

Maintenant que l'on dispose de tous nos types de questions, nous allons écrire la classe questionnaire qui représentera un ensemble de questions.
pour savoir ce qu'il faut mettre dans cette classe reportez-vous à la classe l'utilisant tout en haut de cette page .

Quelques précisions : il n'y a que deux méthodes à écrire : void addQuery(Query q) qui permet de rajouter une question au questionnaire et void run() qui lance le questionnaire (pose les questions les unes à la suite des autres et comptabilise les points).

Dans la cette classe, il ne faudra manipuler que des objets de type Query (i.e. l'interface) !




Voilà, vous pouvez maintenant faire tourner la classe TestQuiz , et vous devriez obtenir la sortie suivante :

secq@beckett:/tmp/Questionnaire/classes$ java TestQuiz
Question: Date de la bataille de Marignan ?
 Reponse : 1515
Bon

Question: Date de la revolution fran?aise ?
 Reponse : 1789
Bon

Question: Premi?re election de Mitterand ?
 Reponse : 1981
Bon

Question: En logique Faux implique Vrai ?
 Reponse : oui
Bon

Question: Dos est un systeme multi-taches ?
 Reponse : non
Bon

Question: Quelle lettre precede le m ?
 Reponse : l
*l*     *l*
Bon

Vous avez obtenu 12/12