CORRECTIONS DES EXERCICES DU CONCOURS D’ENTREE EPITA 2010 Pour toutes les fonctions demandées, plutôt que de fournir des solutions en C, Caml ou Pascal, nous avons préféré fournir une solution algorithmique en pseudo-langage facilement implémentable dans un de ces langages. A) Comme une file… 1) Nous utiliserons une pile lorsque des données doivent être mémorisées et traitées en ordre inverse de leur arrivée (structure lifo). 2) Nous utiliserons une file lorsque des données doivent être mémorisées et traitées dans l'ordre de leur arrivée (structure fifo). 3) a) La séquence de sortie des véhicules en s2 est : v5,v4,v10 b) Est-ce que les séquences suivantes sont valides ? (1) Oui : la séquence de sortie des véhicules en s1 est : v1, v5 (2) Non : la quatrième sortie intervient sur une route (file) vide, en effet v1, v2 et v3 sont déjà sorties. 4) La règle : Une séquence formée de E1, de E2, de E3, de D1 et de D2 est dite admissible si elle contient autant de D* que de E* cumulés et si toutes les actions qui lui correspondent peuvent être accomplies dans l'ordre indiqué par la séquence : on ne peut défiler que s'il reste au moins un élément dans la file. A la fin de la séquence, la file (route) doit être vide. B) Incontestablement… 1) Les deux arbres possibles sont ceux de la figure 1. Suffixe : "INSILICOVERITAS" Suffixe : "INSLIICOVERITAS" Figure 1. 2) Le parcours suffixe de l'arbre B donne deux possibilités : INSILICOVERITAS et INSLIICOVERITAS. Nous préférerons évidemment la première qui peut se traduire (si l'on place correctement les espaces : IN SILICO VERITAS) par « La vérité est dans la silice (l'ordinateur) » 12/04/2010 Préparé par Christophe « Krisboul » Boullay 5:26 C) La puissance… Spécifications : La fonction puiss(entier a,b) retourne un booléen indiquant si a est une puissance de b, à condition que a et b soient tous deux strictement positifs. Dans le cas contraire, une erreur est déclenchée. Première version : en utilisant les restes des divisions entières. . . Principe : Si b ≠ 1 : tant que le reste de la division entière de a par b est nul, on divise a par b. Si a arrive à 1, alors la valeur initiale était une puissance de b. Si b=1, alors seule la valeur 1 est une puissance de b. algorithme fonction puiss : booleen parametres locaux entier a, b variables entier i debut si (a < 1) ou (b < 1) alors /* erreur */ sinon si b <> 1 alors tant que (a > 1) et (a mod b = 0) faire a <- a div b fin tant que fin si retourne (a = 1) fin si fin algorithme fonction puiss Deuxième version : en calculant les puissances de b, moins bien, car on ne peut pas s'arrêter avant d'avoir atteint ou dépassé a. Principe : On calcule les puissances successives de b jusqu'à atteindre ou dépasser a : pour cela, un entier p, initialement à 1, est multiplié à chaque itération par b. Si la valeur de a est dépassée, alors a n'est pas une puissance de b. algorithme fonction puiss : booleen parametres locaux entier a, b variables entier p debut si (a < 1) ou (b < 1) alors /* erreur */ sinon p <- 1 tant que p < a faire p <- p * b fin tant que retourne (p = a) fin si fin algorithme fonction puiss 12/04/2010 Préparé par Christophe « Krisboul » Boullay 5:26 D) Est une colline… Spécifications : La fonction colline(liste l) retourne un booléen indiquant si la liste l est une colline. Principe : A partir du premier élément, au plus jusqu'au dernier, on parcourt la liste tant qu'elle est croissante : l'élément courant est inférieur à l'élément suivant. Puis on continue le parcours tant qu'elle est décroissante. Si ce deuxième parcours nous amène à la fin de la liste (au dernier élément), ou si la liste était vide, c'est une colline. algorithme fonction colline : booleen parametres locaux t_liste l variables entier i debut /* parcours de la suite croissante */ i <- 1 tant que (i<L.longueur) et (L.elts[i] <= L.elts[i+1]) faire i <- i+1 fin tant que /* parcours de la suite décroissante */ tant que (i<L.longueur) et (L.elts[i] >= L.elts[i+1]) faire i <- i+1 fin tant que retourne ((L.longueur = 0) ou (i = L.longueur)) fin algorithme fonction colline Pour cet algorithme on utilise le type t_liste (représentation statique) définit ci-dessous : constantes LMax = … types /* déclaration du type des éléments */ t_element = … /* déclaration du type vecteur d’éléments */ t_vectLMaxElts = LMax t_element /* déclaration du type t_liste */ t_liste = enregistrement t_vectLMaxElts elts entier longueur fin enregistrement t_liste 12/04/2010 Préparé par Christophe « Krisboul » Boullay 5:26