TD Java L2 MASS - Correction des exercices

Telechargé par arnaud olivier
Universit´e Paris Diderot JAVA
MASS L2 Ann´ee 2007-2008
TD n4 - Correction
Partiel 1b
Attention `a bien rendre l’´enonc´e avec votre copie, et `a bien indiquer votre nom sur toutes
les pages. Vous pourrez traiter les exercices dans l’ordre de votre choix. Les questions ((bonus))
´etant plus difficiles, il est conseill´e de les garder pour la fin.
Exercice 1
1. On consid`ere la classe suivante :
class Carre {
private double cote; // champs/attribut
public Carre() // constructeur (sans argument)
{
cote=10;
}
public double getCote() // accesseur
{
return cote;
}
public Carre(double c) // constructeur
{
if (c >= 0)
cote=c;
else
cote=0;
}
public String toString() // m´ethode
{
return ¨Carr´e de cot´e ¨+cote;
}
public void setCote(double c) // modifieur
{
if (c >= 0)
cote = c;
}
}
1
Indiquez `a cˆot´e de chaque // `a quoi correspond la ligne (accesseur. . .).
2. On consid`ere le code suivant :
public static void main(String[] argd)
{
Carre c1 = new Carre();
Deug.println(c1.getCote()); // 10 : lors de l’appel
// `a new, le constructeur sans argument est appel´e.
Deug.println(c1); // carr´e de cot´e 10 : il y a un appel
// automatique `a toString() pour convertir c1 en chaine de caract`ere
Carre c2 = c1; //c2 et c1 d´esignent maintenant le m^eme objet
Deug.println(c2.getCote()); // 10
c1.setCote(3); //modifie l’objet r´ef´erenc´e par c1 et c2
c2.setCote(4); //idem
Deug.println(c2.getCote()); // 4 : le r´esultat de la
//derni`ere modification
Deug.println(c1.getCote()); // 4 : idem
c2.setCote(-3);
Deug.println(c2.getCote()); // 4 : le modifieur ne fait rien
// si on lui passe un entier n´egatif : la valeur de cote
// reste inchang´ee
c2 = new Carre(5); //on cr´e un nouvel objet de type Carre,
//et c2 r´ef´erence cet objet.
//On n’a pas touch´e `a c1, qui r´ef´erence encore
//l’ancien objet.
Deug.println(c1.getCote()); // 4
Deug.println(c2.getCote()); // 5
int i = 0;
int j = i; // int est un type primitif : i et j ne sont
// pas des r´ef´erences, mais des valeurs. Apr`es cette ligne
// j vaut 0, i vaut 0, mais i et j ne sont plus reli´es
// d’aucune fa¸con.
j++; // c’est-`a-dire j=j+1
Deug.println(i); // 0
2
Deug.println(j); // 1
}
Indiquez (sans justifier) `a cˆot´e de chaque ligne commen¸cant par Deug.println() le
r´esultat affich´e.
3
Exercice 2
1. ´
Ecrire une m´ethode int nbPos(int[] tab) renvoyant le nombre d’entiers positifs dans
le tableau pass´e en argument.
Correction :
static int nbPos(int[] tab)
{
int res=0;
for (int i=0; i<tab.length; i++)
if (tab[i]>=0) res=res+1;
return res;
}
2. ´
Ecrire une m´ethode int[] nPremier(int n) renvoyant un tableau constitu´e des n+ 1
premiers naturels. Par exemple, nPremier(5) devra renvoyer {0, 1, 2, 3, 4, 5}.
Correction :
Dans toutes les m´ethodes, il faut commencer par cr´eer un tableau de la bonne taille, puis trouver
comment le (( remplir )).
int[] nbPos(int n)
{
int[] res=new int[n+1];
for (int i=0; i<res.length; i++)
res[i]=i;
return res;
}
3. ´
Ecrire une m´ethode int[] sansPremier(int[] tab) renvoyant le tableau pass´e en ar-
gument auquel on a enlev´e le premier ´el´ement.
Correction :
int[] sansPremier(int[] tab)
{
int[] res=new int[tab.length-1];
for (int i=0; i<res.length; i++)
res[i]=tab[i+1]; //attention au d´ecallage d’indice.
return res;
}
4. (bonus) ´
Ecrire une m´ethode int[] intercalle(int[] tab) renvoyant le tableau pass´e
en argument, auquel on a intercall´e des z´eros. Par exemple, intercalle({2, 3, 5})
devra renvoyer {2, 0, 3, 0, 5}.
Correction :
Il faut voir tout d’abord que la taille du tableau renvoy´ee doit ˆetre 2tab.length 1.
Ensuite, il faut faire assez attention au remplissage, et ne pas s’emmeler les pinceaux dans les
indices. Une bonne question `a se poser, qui permet de trouver ses erreurs, est de se demander si
pour les valeurs extr`emes des boucles, on n’est pas en train de sortir des bornes du tableau.
Il faut aussi v´erifier qu’on a bien r´ecup´er´e tous les ´el´ements du tableau de d´epart.
4
int[] intercalle(int[] tab)
{
int[] res=new int[2*tab.length-1];
for (int i=0; i<res.length; i++)
if (i%2==0) res[i]=tab[i/2];
else res[i]=0;
return res;
}
pour i=res.length 1, les appels res[i] et tab[i/2] sont encore corrects.
ou bien
int[] intercalle(int[] tab)
{
int[] res=new int[2*tab.length-1];
for (int i=0; i<res.length; i++)
res[i]=0;
for (int i=0; i<tab.length; i++)
res[2*i]=tab[i];
return res;
}
ici, pour i=tab.length 1, 2i= 2tab.length 2 = res.length 1, et res[] d´esigne donc bien le
dernier ´el´ement de res.
Exercice 3
Que fait la m´ethode suivante ?
public static String maMethode(String s)
{
String res=¨¨;
for (int i=0; i<s.length(); i++)
{
char c = s.charAt(i);
if (c == ’a’)
return res;
res+=c;
}
return ¨¨;
}
Correction :
Cette m´ethode retourne la chaine vide si la chaine pass´ee en argument ne contient pas de ’a’. Sinon,
elle renvoie la partie de la chaine situ´ee avant le premier ’a’. Quelques exemples
¨bonjour¨ ¨¨
¨ola¨ ¨ol¨
¨good da¨good d¨
5
1 / 9 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!