Partie A
Programmation procédurale en Java
Q1
public class Main
{
public static void test()
{
System.out.println("Bonjour");
}
public static void main(String[] args)
{
System.out.println(test());
}
}
Ce programme compile-t-il ? Si oui qu’est ce qui est affiché à son exécution ? Si non pourquoi ?
Il ne compile pas car la méthode test
ne retourne rien (void
) et sa valeur de retour ne peut donc être affichée, dans main
, par la méthode d’affichage printf
.
Puisque l’affichage est réalisé par la méthode test
, la méthode main doit juste appeler cette méthode test
.
public static void main(String[] args)
{
test();
}
Q2
public class Main
{
public static String test()
{
return System.out.println("Bonjour");
}
public static void main(String[] args)
{
System.out.println(test());
}
}
Ce programme compile-t-il ? Si oui qu’est ce qui est affiché à son exécution ? Si non pourquoi ?
Il ne compile pas car la méthode println
ne retourne rien (void
) alors que la méthode test
est censée retourner une chaine. Une version correcte de cette méthode est :
public static String test()
{
return "Bonjour";
}
Q3
Soit la méthode suivante :
public static int m1(int k)
{
int sum = 0;
for(int i=1; i<=k; i=i+2)
{
sum = sum + i;
}
return sum;
}
Quelle est la valeur retournée par m1(3)
et par m1(5)
?
4 et 9
Q4
Soit la classe suivante.
public class Main
{
public static int[] tab = new int[5];
public static void printTabInt(int[] t)
{
for(int i=0; i<t.length; i++)
{
System.out.print(t[i] + " ");
}
System.out.println();
}
public static void test1()
{
int[] t = new int[5];
t = tab; t[2] = 12;
printTabInt(tab);
}
public static void test2()
{
int[] t = tab;
t[2] = 12;
printTabInt(tab);
}
public static void main(String[] args)
{
test1(); test2();
}
}
Ce programme compile-t-il ou comporte-t-il une erreur ?
Il compile mais il comporte néanmoins une maladresse, quelque chose d’inutile. Essayez de trouver quoi avant de répondre à la questions suivante.
Les deux appels à test1
et test2
produisent-ils exactement le même affichage à l’écran ?
Oui. Mais dans test1
, l’initialisation de la variable de méthode t
est inutile car elle crée un tableau de 5 entiers qui ne sera jamais utilisé.
public static void test1()
{
int[] t = new int[5]; // ligne A
t = tab; // ligne B
t[2] = 12;
printTabInt(tab);
}
Voici les données en mémoire juste après l’exécution de la ligne A.
Et juste après l’exécution de la ligne B.
Q5
Soit la classe suivante.
public class Main
{
public static int[] tab = new int[5];
public static void printTabInt(int[] t)
{
for(int i=0; i< t.length; i++)
{
System.out.print(t[i] + " ");
}
System.out.println();
}
public static void test1()
{
int[] t = new int[5];
t[3] = 5;
t = tab;
t[2] = 12;
printTabInt(t);
printTabInt(tab);
}
public static void main(String[] args)
{
test1();
}
}
Donnez les affichages réalisés par l’exécution du programme.
0 0 12 0 0
0 0 12 0 0
Q6
Soit les lignes de code suivantes :
String[] t = new String[2];
String s = "Tim";
t[0] = s; t[1] = s;
Dessinez les données en mémoire à l’issue de l’exécution de ces lignes.
Q7
Soit les lignes de code suivantes :
String[] t = new String[2];
String s = "Tim";
t[0] = s;
t[1] = t[0] + "Tom";
Dessinez les données en mémoire à l’issue de l’exécution de ces lignes.
Vous avez commis des erreurs ? N’ayez aucune inquiétude. Le but de ce test était de vous faire commettre quelques erreurs pour attirer votre attention sur certaines subtilités. Vous devez vous expliquer à vous-même (vous auto-expliquer) ces erreurs et comment il fallait raisonner pour les éviter.
Au besoin, reprenez les ressources pédagogiques de la partie A pour revoir les points problématiques. N’hésitez pas à poser des questions à votre enseignant. Après avoir bien compris vos erreurs, retaites le test, mais pas tout de suite ! Attendez au moins une semaine, voire deux.