TD 6      2425

L'objectif des questions suivantes est de manipuler des listes, et des itérateurs si nécessaire. Laissez quelques lignes vides au début pour pouvoir ajouter les import au fur et à mesure des besoins.

  1. Écrire une classe DesListes n'ayant aucun attribut, donc aucun constructeur, qui contiendra uniquement des méthodes statiques de manipulation de listes de nombres réels. Comme les types primitifs sont interdits dans les collections, on utilisera la classe enveloppe Double. On supposera dans la suite que les listes ne contiendront que des réels positifs (disons les 12 premières dizaines dans les exemples du point 2).

  2. Écrire une procédure affiche qui affiche à l'écran la représentation en String de la liste de réels qu'on lui passe en paramètre ==> une seule instruction et 2 façons de l'écrire : même pas besoin d'une boucle !
    Il existe plusieurs implémentations de List, par exemple ArrayList ou LinkedList. Doit-on choisir laquelle ici ? Affichera par exemple : [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
    En travail personnel ou s'il reste du temps à la fin du TD, écrire une procédure affiche5 qui affiche à l'écran les nombres contenus dans la liste de réels qu'on lui passe en paramètre, séparés par une tabulation ("\t"). Ajoutez ensuite ce qu'il faut pour aller à la ligne tous les 5 nombres. Aucun else n'est nécessaire ! Voir ci-contre un exemple d'affichage souhaité :
     |   10   20   30   40   50
     |   60   70   80   90   100
     |   110   120

  3. Écrire une fonction getAL qui crée une ArrayList de réels, lui ajoute tous les nombres contenus dans le tableau de réels qu'on lui passe en paramètre, puis retourne l'ArrayList.
    Nouveauté !  On peut utiliser la boucle for each sur les tableaux : c'est encore plus simple !

  4. Écrire une procédure essai qui crée un tableau avec 1.2, 3.0000004, 5.6, 7.9999996, 9.1, 11.12 , puis déclare une liste vL et la remplit avec getAL, puis l'affiche des 2 manières vues au point 2.

  5. Écrire une fonction moyenne qui calcule et retourne la moyenne des nombres de la liste de réels (supposée non vide) qu'on lui passe en paramètre. Pourquoi n'a-t-on pas besoin de compter les éléments ? Parcours simple ou non simple ?
    Afficher sa moyenne après les affichages de chaque liste dans la procédure essai.

  6. Écrire une procédure remNuls qui supprime tous les nombres "presque" nuls de la liste de réels qu'on lui passe en paramètre. Parcours simple ou non simple ?
    Pour cela, écrire une fonction presqueNul(x) qui retourne vrai si |x|<10-6, et faux sinon.
    Puis appeler remNuls dans essai entre les 2 affichages de chaque liste.
    En travail personnel ou s'il reste du temps à la fin du TD, et en supposant que la fonction boolean presquEntier( final double pR ) existe déjà pour savoir si un nombre réel est "presqu'un entier" (par exemple à 10-6 près), écrire une procédure remEntiers qui supprime tous les nombres "presque" entiers de la liste de réels qu'on lui passe en paramètre. Puis l'appeler dans essai entre les 2 affichages de chaque liste à la place de remNuls.
    Écrire maintenant la fonction estPresquEntier ; il y a deux cas à traiter pour un réel positif x :
    0 ---- N x --- N+1 ----> +∞  ou  0 ---- N --- x N+1 ----> +∞   où N est la partie entière de x.

  7. Écrire une procédure insere qui insère au bon endroit le nombre passé en second paramètre dans la liste de réels passée en premier paramètre. La liste est supposée triée par ordre croissant, et le bon endroit est défini comme celui permettant de laisser la liste correctement triée.
    Pour cela, nous avons besoin d'un itérateur plus performant que celui très général des collections : un ListIterator<E>, qu'on obtient par la méthode listIterator uniquement sur les List<E>.
    Il nous fournit (entre autres) 2 méthodes supplémentaires :
    - set( E ) qui remplace l'élément qui a été retourné par next par l'élément passé en paramètre
    - add( E ) qui ajoute l'élément passé en paramètre entre l'élément retourné par le next précédent et l'élément qui sera retourné par le next suivant, de telle sorte que le prochain appel de next n'en sera pas affecté.
    Pour comprendre l'utilité de ces deux méthodes et pour ne pas se tromper dans leur utilisation, ce qui était juste utile jusqu'à présent devient indispensable ici : faire un dessin de la situation. Exemple :
    vAL --> [1.2, 5.6, 9.1]     insere( vAL, 2.5 );     vAL --> [1.2, 2.5, 5.6, 9.1]
    Ceci n'est qu'un exemple, mais pensez au cas particulier, voyez-vous lequel ? Essayez d'insérer 9.9

  8. Compléter la procédure essai par un appel à insere et affiche avant l'affichage de chaque moyenne.

  9. Pour expérimenter autre chose qu'une ArrayList :
    - Écrire une fonction getLL qui crée une LinkedList de réels, lui ajoute tous les nombres contenus dans le tableau de réels qu'on lui passe en paramètre, puis retourne la LinkedList.
    - Ajouter à la fin de la procédure essai le remplissage de vL avec getLL et le même tableau, puis lui ajouter le réel 13.14, puis l'afficher des 2 manières vues au point 2.