Java : test partie A

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 ?

"Réponse"

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 ?

"Réponse"

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) ?

"Réponse"

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 ?

"Réponse"

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 ?

"Réponse"

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.

image-20210920115817844

Et juste après l’exécution de la ligne B.

image-20210920115931325

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.

"Réponse"

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.

"Réponse"

image-20210920123626822

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.

"Réponse"

image-20210920124007347


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.