IN101 : Sujet du TD5
2h, ESIEE Engineering, Denis BUREAU, avril 2012 v2.
1 Les objectifs
- Être capable d'écrire des programmes manipulant des tableaux
et utilisant des boucles.
- Être capable de trouver les bonnes solutions algorithmiques à
de classiques problèmes sur les tableaux.
2 Fonction moyenne (classe de test disponible ci-dessous)
Écrire une fonction moyenne qui retourne la moyenne de nombres
réels (des notes sur 20 par exemple) passés en paramètre
(pour une promo de 180 étudiants, on ne va pas passer 180 paramètres ...).
Comme toujours dans l'utilisation des tableaux,
il est possible que certaines cases ne soient pas utilisées.
Aussi, on passera en paramètres non seulement le
tableau de réels (supposé rempli), mais aussi le nombre
N de valeurs utiles dans le tableau
(en faisant l'hypothèse classique que toutes les cases non utilisées se
trouvent à la fin du tableau).
On supposera N ³ 1 et tab.length aussi.
3 Fonction iMinimum (classe de test disponible ci-dessous)
Écrire une fonction iMinimum qui prend en paramètre un tableau de réels
et son nombre d'éléments utiles, et qui retourne l'indice de la plus petite valeur
présente dans le tableau.
Si cette valeur est présente dans plusieurs cases, la fonction retournera le plus
grand indice parmi ces cases.
Contrainte : Si la valeur minimale existe de nombreuses fois dans le tableau,
ne pas faire d'affectations inutiles.
public class Test
{
public static void test()
{
double[] vTab1 = { 10.0, 12.0, 9.0, 11.0, 7.0, 13.0, 15.0, 20.0, 20.0, 20.0 };
System.out.println( "la moyenne est " + moyenne( vTab1, 7 ) ); // affiche 11.0
double[] vTab2 = { 3.0, -2.0, 1.5, 4.4, 0.0, -2.0, 1.1, 7.6, -9.1, -9.2 };
System.out.println( "indice du min = " + iMinimum( vTab2, 8 ) ); // affiche 5
} // test()
// inserer ici la definition des fonctions moyenne et iMinimum ...
} // Test
4 Classe Matrice
Le but est de réaliser une classe permettant d'afficher la racine cubique,
la racine carrée, la valeur, le carré, et le cube des nombres entiers de 0 à n.
Les 4 premières lignes :
-
Définir comme attribut l'entier n et
un tableau bi-dimensionnel de réels.
|
0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
1.260 | 1.414 | 2.0 | 4.0 | 8.0 |
1.442 | 1.732 | 3.0 | 9.0 | 27.0 |
|
| ... ... ... ... ...
|
- Définir un constructeur à un paramètre (n) qui initialisera les attributs ;
il se contentera d'allouer le tableau bi-dimensionnel de n+1 lignes et de 5 colonnes,
puisque la procédure suivante le remplira.
- Écrire une procédure initMat sans paramètre qui remplira
le tableau avec les valeurs spécifiées précédemment.
La procédure Arrays.fill()
peut-elle avoir un intérêt dans certains cas ?
Il est souhaitable de définir (non localement) des constantes entières
(par exemple : RCUB=0, RCAR=1, VAL=2, CAR=3, CUB=4)
pour rendre plus clair l'accès à chaque colonne de cette matrice.
- Écrire une procédure afficheMat sans paramètre qui
affiche la matrice sur n+1 lignes en espaçant
les valeurs par une tabulation (\t).
Les valeurs seront arrondies à 3 décimales.
Aide :
La fonction Math.round() retourne l'entier le plus proche
du nombre réel passé en paramètre.
5 Fonction mmm
Écrire une fonction mmm (comme Minimum,Moyenne,Maximum)
qui prend en paramètre un tableau de réels
et son nombre d'éléments utiles, et qui retourne un tableau de 3 réels
contenant le minimum, la moyenne, et le maximum du tableau en entrée.
Cette fonction n'utilisera qu'une seule boucle pour ne parcourir
chaque case du tableau qu'une seule fois.
6 Classe Eratosthene
Le crible d'Ératosthène est une méthode pour découvrir les nombres
premiers (0 et 1 seront considérés comme non premiers).
Il consiste à mettre tous les entiers (inférieurs à une
certaine limite)
dans une grille, puis à rayer méthodiquement tous les multiples des
nombres non encore rayés.
Exemple :
debut: / / | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 <
/td> | 11 | 12 | 13
| 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
raye 2: | 2 | 3 | / | 5 | / | 7 | / | 9 | / |
11 | / | 13
| / | 15 | / | 17 | / | 19 | / | 21 | / | 23 | / | 25 |
raye 3: | 2 | 3 | | 5 | | 7 | | / | | 11 | | 13
| | / | | 17 | | 19 | | / | | 23 | | 25 |
raye 5: | 2 | 3 | | 5 | | 7 | | | | 11 | | 13
| | | | 17 | | 19 | | | | 2
3 | | /
|
raye 7: ...
On constate alors qu'il ne reste plus que des nombres premiers dans la grille.
En informatique, il est toutefois difficile de "rayer" un nombre.
On choisit donc de déclarer (comme attribut)
un tableau de booléens dont chaque case représentera le nombre entier
correspondant à son indice : si la valeur de la case est true, c'est que
l'entier correspondant n'est pas rayé.
Et rayer un nombre signifiera donc passer la case correspondante à false.
- Déclarer un attribut aMax correspondant à la limite
évoquée ci-dessus (on peut vouloir savoir
si le nombre aMax est premier ou non).
- Écrire un constructeur à un paramètre qui initialise aMax,
crée le tableau aTab de la bonne taille,
puis appelle la procédure prepare ci-dessous.
- Écrire une procédure prepare qui
appelle simplement les procédures initV et raye ci-dessous.
- Écrire une procédure initV qui initialise à VRAI les aMax-1
derniers éléments du tableau, pour signifier
qu'a priori, tous les nombres entiers (sauf 0 et 1) sont candidats à être
premiers.
Attention ! La classe Arrays n'est pas dans le paquetage
java.lang ...
- Écrire une procédure raye qui applique la méthode décrite ci-dessus
en mettant FAUX dans chaque case du tableau
correspondant à un nombre qu'elle doit "rayer" (inférieur ou égal
à aMax).
Remarque : il est inutile de parcourir TOUS les nombres jusqu'à aMax.
Question : quand peut-on arrêter la boucle principale ?
Contrainte : aucun test de divisibilité, donc rayer directement les multiples
(à partir duquel ?)
Question : quand doit-on arrêter la boucle interne ?
- Écrire une fonction booléenne estPremier qui prend en paramètre
l'entier à tester et qui détermine si l'entier est premier ou non.
- Écrire une procédure affiche qui affiche l'intégralité des nombres
premiers figurant dans le tableau, à raison de 10 par ligne
(utiliser le caractère de tabulation "}'\t'"
).
Exemple d'affichage :
2 | 3 | 5 | 7 | 11 | 13 | 17 | 19 | 23 | 29 |
31 | 37 | 41 | 43 | 47 | 53 | 59 | 61 | 67 | 71 |
73 | 79 | 83 | 89 | 97 | 101 | 103 | 107 | 109 | 113 |
127 | 131 | 137 | 139 | 149 | 151 | 157 | 163 | 167 | 173 |
179 | 181 | 191 | 193 | 197 | 199 | 211 | 223 | 227 | 229 |
...
|