Procédures et Paramètres formels [ss] Exercices de cours Karine Zampieri, Stéphane Rivière Unisciel algoprog Version 30 décembre 2016 Table des matières 1 Appréhender le cours 1.1 Compréhension d’algorithmes / qzexercs . . . . . . . . . . . . . . . . . . 1.2 Salutation téléphonique / qzproc . . . . . . . . . . . . . . . . . . . . . . 2 2 5 2 Appliquer le cours 2.1 Autour de la procédure permuter2i / pgpermuter2i . . . . . . . . . . . . 2.2 Procédure quorest / pgquorest . . . . . . . . . . . . . . . . . . . . . . . . 6 6 10 Java - Exercices de cours (Solution) Mots-Clés Algorithmes paramétrés Difficulté • • ◦ (1 h) 1 Unisciel algoprog – Procédures et Paramètres formels [ss], December 30, 2016 1 1.1 Appréhender le cours Compréhension d’algorithmes / qzexercs Utilise Procédure Durée estimée 10 min Objectif Cet exercice demande de comprendre des procédures. Programme 1 public class QZExerc2a { public static void main(String[] args) { int a, b; int[] c = new int[1]; calcul2(3,4,c); System.out.println(c[0]); a = 3; b = c[0] = 5; calcul2(b,a,c); System.out.println(c[0]); } static void calcul2(int a, int b, int[] c) { c[0] = (a+b); } } Que fait la procédure ? Solution simple Elle calcule et restitue l’addition a + b dans c (entier). Qu’affiche le programme ? Solution 7 8 Programme 2 public class QZExerc2b { public static void main(String[] args) { int[] a = new int[1]; int[] b = new int[1]; 2 Unisciel algoprog – Procédures et Paramètres formels [ss], December 30, 2016 int[] c = new int[1]; calcul3(1,2,c); System.out.println(c[0]); a[0] = 1; b[0] = 2; c[0] = 3; calcul3(b[0], c[0], a); System.out.println(a[0] + " " + b[0] + " " + c[0]); } static void calcul3(int a, int b, int[] c) { a = 2*a; b = 3*b; c[0] = (a+b); } } Que fait la procédure ? Solution simple Elle calcule et restitue l’addition 2 ∗ a + 3 ∗ b dans c (entier). Qu’affiche le programme ? Solution 8 13 2 3 Programme 3 public class QZExerc2c { public static void main(String[] args) { int a, b; int[] c = new int[1]; a = 1; b = 2; c[0] = f(b); System.out.println(c[0]); calcul4(a, b, c); System.out.println(a + " " + b + " " + c[0]); } static void calcul4(int a, int b, int[] c) { a = f(a); c[0] = 3*b; c[0] = a+c[0]; } static int f(int a) 3 Unisciel algoprog – Procédures et Paramètres formels [ss], December 30, 2016 { int b = 2*a + 1; return b; } } Que fait la procédure ? Qu’affiche le programme ? Solution 5 // f(2) = 2 * 2 + 1 1 2 9 // 4 Unisciel algoprog – Procédures et Paramètres formels [ss], December 30, 2016 1.2 Salutation téléphonique / qzproc Utilise Procédure Durée estimée 10 min Écrivez une procédure un qui affiche « Allo ». Écrivez une procédure deux qui : 1. Appelle la procédure un. 2. Puis affiche « Bonjour ». Écrivez un programme qui appelle les procédures deux puis un puis deux. Qu’affichera votre programme ? Testez. Résultat d’exécution. Allo Bonjour Allo Allo Bonjour Validez votre programme avec la solution. Solution Java @[qzproc.java] public class QZProc { public static void main(String[] args) { deux(); un(); deux(); } static void un() { System.out.println("Allo"); } static void deux() { un(); System.out.println("Bonjour"); } } 5 Unisciel algoprog – Procédures et Paramètres formels [ss], December 30, 2016 2 2.1 6 Appliquer le cours Autour de la procédure permuter2i / pgpermuter2i Utilise Procédure, Paramètres formels Durée estimée 20 min Écrivez le profil d’une procédure permuter2i(a,b) qui permute le contenu des entiers a et b passés en paramètre. Orientation Paramètres Modifiés : Les entiers a et b Écrivez le corps de la procédure. Rappel de cours Pour permuter deux variables, il faut passer par une variable intermédiaire. Solution simple On a : Validez votre procédure avec la solution. Solution Java @[UtilsSSOpers.java] static void permuter2i(int[] a, int[] b){ int tmp = a[0]; a[0] = b[0]; b[0] = tmp; Unisciel algoprog – Procédures et Paramètres formels [ss], December 30, 2016 7 } Écrivez le profil d’une procédure ordonner2i(a,b) qui remet dans l’ordre croissant les contenus des entiers a et b. Orientation Paramètres Modifiés : Les entiers a et b Écrivez le corps de la procédure de sorte que, si b<a, elle appelle la procédure permuter2i pour les ordonner. Validez votre procédure avec la solution. Solution Java @[UtilsSSOpers.java] static void ordonner2i(int[] a, int[] b){ if (b[0] < a[0]){ permuter2i(a, b); } } Écrivez un programme qui saisit deux entiers dans a et b. Affichez l’invite : Deux entiers? Permutez les deux entiers puis affichez (où [x] désigne le contenu de x) : ==> Après 1ere permutation [a] [b] Permutez-les une deuxième fois puis affichez : ==> Après 2eme permutation [a] [b] Enfin ordonnez-les puis affichez : ==> Après ordonner [a] [b] Unisciel algoprog – Procédures et Paramètres formels [ss], December 30, 2016 8 Testez. Exemple d’exécution. Deux entiers? 6 1 ==> Après 1ere permutation 1 6 ==> Après 2eme permutation 6 1 ==> Après ordonner 1 6 Validez votre programme avec la solution. Solution Java @[pgpermuter2i.java] import java.util.Scanner; public class PGPermuter2i { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int[] a = new int[1]; int[] b = new int[1]; System.out.print("Deux entiers? "); a[0] = cin.nextInt(); b[0] = cin.nextInt(); UtilsSSOpers.permuter2i(a,b); System.out.println("==> Apres 1ere permutation " + a[0] + " " + b[0]); UtilsSSOpers.permuter2i(a,b); System.out.println("==> Apres 2eme permutation " + a[0] + " " + b[0]); UtilsSSOpers.ordonner2i(a,b); System.out.println("==> Apres ordonner " + a[0] + " " + b[0]); } } Écrivez le profil d’une procédure echanger3i(a,b,c) qui permute circulairement, vers la gauche, les contenus des entiers a, b et c. Orientation Paramètres Modifiés : Les entiers a, b et c Écrivez le corps de la procédure de sorte que le contenu de a va dans c, celui de b dans a et celui de c dans b) en utilisant deux fois la procédure permuter2i. (Faites attention à la position des paramètres !) Aide simple Il y a plusieurs solutions. Validez votre procédure avec la solution. Unisciel algoprog – Procédures et Paramètres formels [ss], December 30, 2016 Solution Java @[UtilsSSOpers.java] static void echanger3i(int[] a,int[] b,int[] c){ permuter2i(a,c); permuter2i(a,b); } 9 Unisciel algoprog – Procédures et Paramètres formels [ss], December 30, 2016 2.2 10 Procédure quorest / pgquorest Utilise Procédure, Paramètres formels Durée estimée 10 min Écrivez le profil d’une procédure quorest(a,b,qt,rt) qui calcule le quotient dans qt (entier) et le reste dans rt (entier) de la division entière d’un entier a par un entier b. Orientation Paramètres Entrants : Les entiers a et b Sortants : Les entiers qt et rt Propriété La division euclidienne de a par b est définie par : ∀a, b ∈ N : a = q × b + r et 0 ≤ r < b q est le quotient et r le reste de la division entière. Écrivez le corps de la procédure. Validez votre procédure avec la solution. Solution Java @[UtilsSSOpers.java] static void quorest(int a,int b,int[] qt, int[] rt){ qt[0] = a / b; rt[0] = a % b; } Écrivez un programme qui saisit deux entiers. Affichez l’invite : Deux entiers? Calculez le quotient et le reste des deux entiers. Affichez (où [x] désigne le contenu de x) : [a] = [b] * [quotient] + [reste] Testez. Exemple d’exécution. Deux entiers? 13 3 13 = 3 * 4 + 1 Unisciel algoprog – Procédures et Paramètres formels [ss], December 30, 2016 Validez votre programme avec la solution. Solution Java @[pgquorest.java] import java.util.Scanner; public class PGQuorest { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int a, b; System.out.print("Deux entiers? "); a = cin.nextInt(); b = cin.nextInt(); int[] qt = new int[1]; int[] rt = new int[1]; UtilsSSOpers.quorest(a, b, qt, rt); System.out.println(a + " = " + b + " * " + qt[0] + " + " + rt[0] ); } } 11