1) Système et architecture. (1/4 heure, 2 points) a) Codez les nombres suivants en binaire, sur 8 bits. Pour les nombres négatifs, utilisez le complément à 2. 12 128-5 b) Complétez la table de vérité suivante : a 0 0 1 1 b 0 1 0 1 a AND b a OR b a XOR b NOT a a NAND b c) Sur combien d octets sont codés les caractères dans le code ASCII? Dans le standard Unicode? d) Qu est ce qu un assembleur? 2) Programmation fonctionnelle. (1 heure, 9 points) 2.1) La fonction de Mc Carthy est définie par : a) Calculez : let rec f n = if n > 100 then n - 10 else f ( f (n + 11) ) ;; f(110);; f(100);; f(90);; f(80);; b) La fonction f termine-t-elle sur Z et dans ce cas, que vaut-elle? 2.2) La multiplication dans N est définie de la manière suivante : n Ν, n * 0 = 0 ( n, p) Ν * Ν, n * p = n + n * ( p 1) En suivant cette définition, écrivez, en Caml, la fonction Mult n p qui calcule n * p.
2.3) D après vous, quels sont les avantages comparés de la programmation «récursive» et «itérative»? De la programmation «fonctionnelle» et «orientée objet»? 3) Algorithmique. (3/4 heure, 4 points) Triez, en utilisant l algorithme du tri bulle, la suite de chiffres suivante : 3 1 4 1 5 9 2 6 5 3 a) Détaillez les premières étapes de ce tri. b) Quelle est la complexité dans le pire des cas de ce tri? c) Quelles variantes du tri bulle connaissez-vous? 4) Programmation Objet. (1 heure, 5 points) a) Quels sont les résultats produits par le programma Java suivant : 1 class Pain { 2 double prix; 3 String provenance = "Boulangerie"; 4 Pain() {prix = 0; provenance = provenance + " CNAM";}; 5 Pain(String s) {provenance = provenance + " "+ s;} 6 public String tostring() {return "Pain "+provenance+" Prix = "+prix;} 7 } 8 class Baguette extends Pain { 9 Baguette() { 10 super(); 11 prix = 4.50; 12 } 13 public String tostring() {return "Baguette "+provenance+" Prix = "+prix;} 14 } 15 class Epi extends Pain { 16 Epi() { 17 super(" CAMOS"); 18 prix = 5.20; 19 } 20 } 21 class Complet extends Pain { 22 Complet() { prix = 7.25;provenance = "Supermarché";} 23 public String tostring() {return "Complet "+provenance+" Prix = "+prix;} 24 } 25 public class Exercice { 26 public static void main(string[] args) { 27 Pain[] la_fournee = new Pain[5]; 28 la_fournee[0] = new Pain(); 29 la_fournee[1] = new Baguette(); 30 la_fournee[2] = new Epi(); 31 la_fournee[3] = new Complet(); 32 la_fournee[4] = la_fournee[0]; 33 la_fournee[0].prix = 5; 34 for (int i = 0;i<5;i++) System.out.println("Nr "+i+" : "+la_fournee[i]); 35 } 36 }
b) De quelle(s) classe(s) hérite (directement et indirectement) la classe Epi? c) Que signifie le mot-clé «extends»? Le mot-clé «static»? Le mot-clé «void»? d) Quelle est la portée (visibilité) de la variable i, définie ligne 34? e) Qu est ce que le polymorphisme? f) Java est-il un langage compilé? Interprété?
PROPOSITION DE CORRIGE. 1) Système et architecture. (1/4 heure, 2 points) a) Codage en binaire :. b) Table de vérité : 12 0 0 0 0 1 1 0 0 127 0 1 1 1 1 1 1 1-5 1 1 1 1 1 0 1 1 a 0 0 1 1 b 0 1 0 1 a AND b 0 0 0 1 a OR b 0 1 1 1 a XOR b 0 1 1 0 NOT a 1 1 0 0 a NAND b 1 1 1 0 c) Dans le code ASCII, les caractères sont codés sur 1 octet. Avec le standard unicode, les caractères sont codés sur 2 octets. 2) Programmation fonctionnelle. (1 heure, 9 points) 2.1) a) Fonction de Mc Carthy : f(110) -> 100 f(100) -> f(f(111)) -> f(101) -> 91 f(90) -> f(f(101)) -> f(91) -> f(f(102)) -> f(92) -> f(f(103)) -> f(93) -> f(f(104)) -> f(94) -> f(f(105)) -> f(95) -> f(f(106)) -> f(96) -> f(f(107)) -> f(97) -> f(f(108)) -> f(98) -> f(f(109)) -> f(99) -> f(f(110) -> f(101)->91 f(80) - f(f(80+11)) -> f(91) -> 91 b) On procède aux observations suivantes : Si x>100, f (x) termine bien et vaut x-10. C est un cas de base. Si 90 x 100 alors f(x) vaut f(f(x+11)). Comme 101 x + 11, on a f(x+11) = x+11-10 =x+1. Donc, dans cet intervalle, f(x) = f(x+1). Dans l intervalle [90,100], on a donc f(x) = f(101) = 91. Dans l intervalle [90,100], f(x) vaut donc 91.
Si x<90, alors f(x) conduit au calcul de f(f(x+11)). Comme 101 > x+11, par hypothèse d induction, f(x+11) termine et vaut 91. Donc f(x) termine et vaut f(f(x+11)) c est à dire f(91), soit 91. 2.2) On écrira simplement : let rec Mult n p if p = 0 then 0 else n + Mult n (p-1) ;; 3) Algorithmique. a) Le principe du tri bulle est de comparer deux à deux les éléments e 1 et e 2 consécutifs d'un tableau et d'effecteur une permutation si e 1 > e 2. On continue de trier jusqu'à ce qu'il n'y ait plus de permutation. Détail des premières étapes : Je compare 3 et 1. Puisque 3>1, je permute 3 et 1 1 3 4 1 5 9 2 6 5 3 Je compare 3 et 4. Puisque 3<4, je ne fais rien 1 3 4 1 5 9 2 6 5 3 Je compare 4 et 1. Puisque 4>1, je permute 4 et 1 1 3 1 4 5 9 2 6 5 3 Je compare 4 et 5. Puisque 4<5, je ne fais rien 1 3 1 4 5 9 2 6 5 3 Je continue à parcourir ainsi le tableau jusqu à la fin. Ensuite je recommence au début jusqu à ce que je puisse faire un parcours complet du tableau sans effectuer aucune permutation. b) Le tri bulle a une complexité dans le pire des cas en O(n 2 ). c) On peut citer le tri bulle «Boustrophedon» qui parcours le tableau de droite à gauche puis de gauche à droite, alternativement ; On peut également citer le tri "Shuttle" (navette en anglais) qui effectue un retour arrière dès qu'une permutation est détectée 4) Programmation Objet. a) Ce programme affiche : Nr 0 : Pain Boulangerie CNAM Prix = 5.0 Nr 1 : Baguette Boulangerie CNAM Prix = 4.5
Nr 2 : Pain Boulangerie CAMOS Prix = 5.2 Nr 3 : Complet Supermarché Prix = 7.25 Nr 4 : Pain Boulangerie CNAM Prix = 5.0 a) La classe «Epi» hérite de la classe «Pain» qui hérite elle-même de la classe «Object». b) Le mot-clé «extends» permet d étendre une classe (c est à dire hériter d une classe). Le mot-clé static permet de définir des classes, des attributs ou des méthodes qui n ont pas besoin d une instance de classe pour être utilisés. Ici, la classe Exercice, n a pas besoin d être instanciée avant l appel à «main». Le mot-clé «void» permet de définir des méthodes qui ne renvoie aucune valeur. c) La variable «i» est visible à l intérieur du bloc dans lequel elle a été définie. Ici, elle n est visible qu à l intérieur de la boucle «for». d) Le polymorphisme est un mécanisme qui permet d'adresser le même message à des objets de types différents qui l'interpréteront à leur manière. Le polymorphisme signifie que l'émetteur d'un stimulus n'a pas besoin de connaître la classe de l'instance réceptrice. Cette dernière peut appartenir à n'importe quelle classe. e) Le langage Java est un langage compilé mais son compilateur ne génère pas des instructions machine spécifiques mais un programme en byte-code, qui peut être décrit comme un langage machine pour un processeur virtuel qui n a pas d existence physique. Ce code objet compilé peut alors être exécuté par un interpréteur Java qui n est ni plus ni moins qu un émulateur de processeur virtuel : la Machine Virtuelle Java