Exercice 1

Quel est l'affichage produit par le programme suivant :

public class Exo11 {

    public static void main(String[] args) {
	int k = 2;
	for (int j = 1; j < 5; j++) {
	    k = k + 1;
	    System.out.printf("%d %d%n", j, k);
	    k = k - j;
	}
	System.out.println(k);
	boolean b = true;
	int x = 20;
	while (x > 1) {
	    b = b && (x > 4);
	    System.out.printf("%b%n", b);
	    x = x/2;
	    if(!b) {
		b = !b;
	    }
	    System.out.printf("%d%n", x);
	}
    }
}

On obtient l'affichage suivant :

1 3
2 3
3 2
4 0
-4
true
10
true
5
true
2
false
1

Exercice 2

Quel est l'affichage produit par le programme suivant :

import java.util.Arrays;

public class Exo21 {

    public static void main(String[] args) {
	int[] toto = { 12, 3, 4, 7, -4 };
	System.out.printf("%s%n", Arrays.toString(toto));
	System.out.printf("%s%n", toto);
	int j = 0;
	for (int x : toto) {
	    System.out.printf("[%d] %d, ", x, j);
	    j = j + x;
	}
	System.out.println(j);
	int[] foo = new int[toto.length - 1];
	System.out.printf("%s%n", Arrays.toString(foo));
	int k = 1;
	while (k - 1 < foo.length) {
	    foo[k - 1] = toto[toto.length - k] + k;
	    k++;
	}
	System.out.printf("%s%n", Arrays.toString(foo));
    }

}

On obtient l'affichage suivant :

[12, 3, 4, 7, -4]
[I@7d4991ad
[12] 0, [3] 12, [4] 15, [7] 19, [-4] 26, 22
[0, 0, 0, 0]
[-3, 9, 7, 7]

Exercice 3

Quel est l'affichage produit par le programme suivant :

import java.util.Arrays;

public class Exo31 {

    public static void main(String[] args) {
	int[] a = { 1, 2, 3 };
	int[] b = a;
	int[] c = new int[a.length];
	for (int i = 0; i < a.length; i++) {
	    c[i] = a[i] + 1;
	    b[i] = a[i] - 1;
	}
	System.out.printf("%s%n", Arrays.toString(a));
	System.out.printf("%s%n", Arrays.toString(b));
	System.out.printf("%s%n", Arrays.toString(c));
    }

}

On obtient l'affichage suivant :

[0, 1, 2]
[0, 1, 2]
[2, 3, 4]

Exercice 4

Écrire un programme complet qui réalise les opérations suivantes :

  1. demande à l'utilisateur une valeur entière \(k\) en s'assurant que \(k>0\) (on redemande la valeur tant qu'elle n'est pas acceptable) ;
  2. demande à l'utilisateur une valeur réelle \(y\) ;
  3. affiche dans l'ordre les valeurs de la suite \((u_j)_{j\geq 1}\) (définie ci-dessous) pour \(j\) allant de 1 à \(k\) inclus, sous la forme (ici avec \(k=3\) et \(y=1.0\)) :
u_1 = 0.0
u_2 = 1.0
u_3 = 2.0

La suite \((u_j)_{j\geq 1}\) est donnée par :

\begin{align*} u_1&=0\\ u_{2m}&=m+u_{2m-1}\times y&\text{pour tout }m\geq 1\\ u_{2m+1}&=u_{2m}-u_{2m-1}+y&\text{pour tout }m\geq 1 \end{align*}

Une solution possible sans tableau est la suivante :

import java.util.Scanner;

public class ExoP11 {

    public static void main(String[] args) {
	Scanner scan = new Scanner(System.in);
	int k = 0;
	while (k <= 0) {
	    System.out.print("Donnez une valeur entière pour k >0 : ");
	    k = scan.nextInt();
	}
	System.out.print("Donnez une valeur réelle pour y : ");
	double y = scan.nextDouble();
	double uminus2 = 0;
	double uminus1 = 0;
	double u = 0;
	System.out.printf("u_1 = %f%n", u);
	for (int j = 2; j <= k; j++) {
	    if (j % 2 == 0) {
		u = j / 2 + y * uminus1;
	    } else {
		u = uminus1 - uminus2 + y;
	    }
	    uminus2 = uminus1;
	    uminus1 = u;
	    System.out.printf("u_%d = %f%n", j, u);
	}
	scan.close();
    }

}

Il est bien sûr possible d'utiliser un tableau pour stocker les valeurs de \(u\), mais il faut être attentif au décalage de numérotation.

Exercice 5

Écrire un programme qui réalise les opérations suivantes :

  1. crée un tableau tab de longueur 3 ;
  2. demande à l'utilisateur trois chiffres (donc entre 0 et 9 inclus) à placer dans le tableau ;
  3. demande à l'utilisateur un entier \(k\) ;
  4. construit un tableau tab2 de longueur \(3k\) contenant \(k\) copies du tableau tab ;
  5. ajoute à chaque case \(i\) du tableau tab2 la valeur \(i\) (donc 0 à la première, 1 à la deuxième, etc.) ;
  6. affiche le tableau tab2 résultat sous la forme indiquée ci-dessous.

Si l'utilisateur entre les chiffres 1, 2, 3, dans cet ordre, puis donne \(k=3\), on doit donc obtenir un tableau à 9 cases, contenant d'abord 1, 2, 3, 1, 2, 3, 1, 2, et 3, après l'étape 4, puis 1, 3, 5, 4, 6, 8, 7, 9, et 11 après l'étape 5. On l'affichera sous la forme

{_1_3_5_}
{_4_6_8_}
{_7_9_11_}

Attention, l'affichage doit se faire impérativement à partir du tableau final, pas en calculant les valeurs à afficher pendant l'affichage lui-même.

Une solution possible est donnée par le programme suivant :

import java.util.Scanner;

public class ExoP21 {

    public static void main(String[] args) {
	Scanner scan = new Scanner(System.in);
	int[] tab = new int[3];
	for (int i = 0; i < tab.length; i++) {
	    int val = -1;
	    while (val < 0 || val > 9) {
		System.out.printf("Donnez un chiffre pour tab[%d] : ", i);
		val = scan.nextInt();
	    }
	    tab[i] = val;
	}
	System.out.print("Donnez un entier k : ");
	int k = scan.nextInt();
	int[] tab2 = new int[k * tab.length];
	for (int i = 0; i < tab2.length; i++) {
	    tab2[i] = tab[i % tab.length];
	}
	for (int i = 0; i < tab2.length; i++) {
	    tab2[i] += i;
	}
	int pos = 0;
	for (int i = 0; i < k; i++) {
	    System.out.print("{_");
	    for(int j=0;j<tab.length;j++) {
		System.out.printf("%d_",tab2[pos]);
		pos++;
	    }
	    System.out.println("}");
	}
	scan.close();
    }

}