Académique Documents
Professionnel Documents
Culture Documents
Correction Examen 2011 2012
Correction Examen 2011 2012
Correction Examen 2011 2012
I3 - Algorithmique
Dur e : 3h e Documents autoris s : AUCUN (calculatrice comprise) 1 e Remarques : Veuillez lire attentivement les questions avant de r pondre. e Le bar` me donn est un bar` me indicatif qui pourra evoluer lors de la correction. e e e Rendez une copie propre. ` Nutilisez pas de crayon a papier.
R cursivit (4 points) e e
220 200 180 160 140 120 100 80 60 400 50 100 150 200
Questions
Supposons que la proc dure suivante permette de dessiner un segment sur un graphique (variable de type e Graphique) :
1. Sauf les dictionnaires pour les etudiants non francophones
proc dure ligne (E/S g : Graphique,E x1,y1,x2,y2 : Reel) e Lobjectif est de concevoir une proc dure dessinerCroix qui permet de dessiner sur un graphique des e dessins r cursifs tels que pr sent s par la gure 1. La signature de cette proc dure est : e e e e proc dure dessinerCroix (E/S g : Graphique,E xCentre,yCentre,base : Reel, niveauRecursion : Naturel) e 1. Lors du premier appel de cette proc dure, donnez la valeur des quatre derniers param` tres effectifs an e e dobtenir le graphique de la gure 1. 2. Donnez le corps de cette proc dure. e Solution propos e : e 1. dessinerCroix(g,100,100,100,5) 2. Algo proc dure dessinerCroix (E/S g : Graphique,E xCentre,yCentre,base : Reel, niveauRecursion : Natue rel) D claration x1,y1,x2,y2,x3,y3,h : Reel e debut h racineCarree(b*b-(b/2)*(b/2)) x1 xc y1 yc+2*h/3 x2 xc-b/2 y2 yc-h/3 x3 xc+b/2 y3 yc-h/3 ligne(g,xc,yc,x1,y1) ligne(g,xc,yc,x2,y2) ligne(g,xc,yc,x3,y3) si n>0 alors dessinerCroix(g,x1,y1,b/2,n-1) dessinerCroix(g,x2,y2,b/2,n-1) dessinerCroix(g,x3,y3,b/2,n-1) nsi n
Tris (3 points)
On a vu en cours que lalgorithme du tri rapide est : proc dure triRapide (E/S t :Tableau[1..MAX] dEntier,E nb :Naturel) e debut triRapideRecursif(t,1,nb) n proc dure triRapideRecursif (E/S t :Tableau[1..MAX] dEntier,E d,f :Naturel) e D claration indicePivot : Naturel e debut si d<f alors partionner(t,d,f,indicePivot) triRapideRecursif(t,d,indicePivot-1) triRapideRecursif(t,indicePivot+1,f) nsi n
Donnez lalgorithme de la proc dure partitionner. e Solution propos e : e proc dure partitionner (E/S t : Tableau[1..MAX] dEntier ; E debut,n : Naturel ; S indicePivot : Naturel) e D claration i,j,pivot : Naturel e debut pivot t[debut] i debut j n tant que ij faire si t[i]pivot alors i i+1 sinon si t[j]>pivot alors j j-1 sinon echanger(t[i],t[j]) nsi nsi ntantque indicePivot j echanger(t[debut],t[j]) n
Lobjectif global de cet exercice est de concevoir une partie du jeu du serpent : jeu des ann es 80, que lon e ` retrouve sur tous les vieux t l phones, qui consiste a guider un serpent de facon a ce quil mange des proies ee ` sans quil se mange lui m me. e Le serpent avance constamment dans une direction. On peut le faire changer de direction. Lorsquil arrive au bord de lair de jeu, il r apparatre de lautre c t . Enn lorsquil mange une proie, il grandit pendant un e oe certain temps (seule sa t te avance). La partie se termine lorsque le serpent mange une partie de son corps. e Les gures 2 pr sentent plusieurs etats du jeu. e
3.1
Lair de jeu
e e Lensemble des el ments du jeu, les el ments du serpent et les proies, ont une position. Le serpent se dirige dans une direction. Soit les types Direction et Position d nis de la facon suivante : e Type Direction = {nord,est,ouest,sud} Type Position = Structure x : NaturelNonNul y : NaturelNonNul nstructure Lair de jeu est caract ris par quatre constantes XMIN, XMAX, YMIN, YMAX (pour toute position p on a : e e XM IN p.x XM AX et Y M IN p.y Y M AX). On suppose que la position de coordonn es e ` (XM IN, Y M IN ) se trouve en haut a gauche de lair de jeu, et celle de coordonn es (XM AX, Y M AX) en e ` bas a droite. ` Proposez le corps de la fonction suivante qui permet de calculer une nouvelle position a partir dune position donn e et dune direction donn e (attention si la position donn e se trouve en bordure de lair de jeu, la position e e e ` calcul e peut etre a loppos de lair de jeu). e e fonction nouvellePosition (p : Position, d : Direction) : Position 3
(a) Serpent qui se dirige vers le nord, il na encore mang aucune e proie. La position de la t te a pour coordonn es e e (7,5).
(b) Serpent ayant mang une proie et qui e est pass du c t droit e oe de lair de jeu, au c t oe gauche (il se dirige vers lest). La position de la t te a pour coordonn es e e (4,5).
Solution propos e : e fonction nouvellePosition (p : Position, d : Direction) : Position D claration resultat : Position e debut resultat p ` cas ou d vaut est: p.x p.x - 1 si p.x < XMIN alors p.x XMAX nsi ouest: p.x p.x + 1 si p.x > XMAX alors p.x XMIN nsi nord: p.y p.y - 1 si p.y < YMIN alors p.y YMAX nsi sud: p.y p.y + 1 si p.y > YMAX alors p.y YMIN nsi ncas retourner resultat n 4
3.2
Le serpent
Soit le type ListeChaineePosition (d ni comme nous lavons vu en cours pour la liste chan e e e dentiers) qui poss` de les fonctions et proc dures suivantes : e e fonction listeVide () : ListeChaineePosition fonction estVide (uneListe : ListeChaineePosition) : Booleen proc dure ajouter (E/S uneListe : ListeChaineePosition,E p : Position) e fonction obtenirPosition (uneListe : ListeChaineePosition) : Position pr condition(s) non estVide(uneListe) e fonction obtenirListeSuivante (uneListe : ListeChaineePosition) : ListeChaineePosition pr condition(s) non estVide(uneListe) e proc dure xerListeSuivante (E/S uneListe : ListeChaineePosition,E nelleSuite : ListeChaineePosie tion) pr condition(s) non estVide(uneListe) e proc dure supprimerTete (E/S l :ListeChaineePosition) e pr condition(s) non estVide(l) e proc dure supprimer (E/S uneListe : ListeChaineePosition) e ` On se propose de repr senter le serpent a laide dune liste chan e de positions, tel que la t te de la liste e e e e repr sentera la position de la queue du serpent et le dernier el ment de la liste repr sentera la position de la t te e e e du serpent. Ainsi on repr sente le type Serpent de la facon suivante : e Type Serpent = Structure tete : ListeChaineePosition queue : ListeChaineePosition nstructure La gure 3 pr sente une repr sentation graphique du serpent de la gure 2(a). e e
tete : queue :
position :
x:7 y:7
position :
x:7 y:6
position :
x:7 y:5
listeSuivante :
listeSuivante :
listeSuivante :
F IGURE 3 Repr sentation graphique de linstance de serpent de la gure 2(a) e 1. Donnez le type ListeChaineePosition. Solution propos e : e Type ListeChaineeDEntiers = NoeudDEntier Type NoeudDEntier = Structure entier : Entier listeSuivante : ListeChaineeDEntiers nstructure
` e 2. Repr sentez graphiquement (` limage de la gure 3) linstance du type serpent correspondant a l tat du e a jeu repr sent par la gure 2(b). e e Solution propos e : e
tete : queue :
position :
x : 14 y:5
position :
x : 15 y:5
position :
x:1 y:5
listeSuivante :
listeSuivante :
listeSuivante :
position :
x:2 y:5
position :
x:3 y:5
position :
x:4 y:5
listeSuivante :
listeSuivante :
listeSuivante :
3. Donnez le corps des deux fonctions suivantes : fonction obtenirPositionTete (s : Serpent) : Position fonction obtenirPositionQueue (s : Serpent) : Position Solution propos e : e fonction obtenirPositionTete (s : Serpent) : Position debut retourner obtenirPosition(s.tete) n fonction obtenirPositionQueue (s : Serpent) : Position debut retourner obtenirPosition(s.queue) n 4. Donnez le corps de la proc dure suivante qui permet de faire avancer un serpent en le faisant grandir dun e e el ment : proc dure avancerEnGrandissant (E/S s : Serpent, E d : Direction) e Solution propos e : e proc dure avancerEnGrandissant (E/S s : Serpent, E d : Direction) e D claration temp : ListeChaineePosition e debut temp listeVide() ajouter(temp,nouvellePosition(obtenirPositionTete(s),d)) xerListeSuivante(s.tete,temp) s.tete temp n 5. Donnez le corps de la proc dure suivante qui permet de faire avancer un serpent sans le faire grandir : e proc dure avancerSansGrandir (E/S s : Serpent, E d : Direction) e Solution propos e : e proc dure avancerSansGrandir (E/S s : Serpent, E d : Direction) e 6
debut avancerEnGrandissant(s,d) supprimerTete(s.queue) n 6. Donnez le corps de la proc dure suivante qui initialise un serpent ( tat du serpent en d but de partie) tel e e e que la position de sa queue soit au centre de laire de jeu et que sa direction initiale soit au nord : proc dure initSerpent (E/S s : Serpent, E tailleInitiale : NaturelNonNul) e pr condition(s) tailleInitiale>1 et tailleInitiale(YMAX-YMIN) div 2 e Solution propos e : e proc dure initSerpent (E/S s : Serpent, E tailleInitiale : NaturelNonNul) e pr condition(s) tailleInitiale>1 et tailleInitiale(YMAX-YMIN) div 2 e D claration p : Position e resultat : Serpent i : Naturel debut p.x (XMAX-XMIN) div 2 p.y (YMAX-YMIN) div 2 resultat.tete listeVide() ajouter(resultat.tete,p) resultat.queue resultat.tete ` pour i 1 a tailleInitiale-1 faire avancerEnGrandissant(s,nord) npour retourner resultat n 7. Donnez le corps de la fonction suivante qui permet de savoir si une position donn e est une position dun e e el ment du serpent : fonction estUnePositionDuSerpent (s : Serpent, p : Position) : Booleen Solution propos e : e fonction estUnePositionDuSerpent (s : Serpent, p : Position) : Booleen D claration temp : ListeChaineePosition e trouve : Booleen debut temp s.queue trouve FAUX tant que non estVide(temp) et non trouve faire si obtenirPosition(temp)=p alors trouve VRAI sinon temp obtenirListeSuivante(temp) nsi ntantque retourner trouve n
3.3
Jeu du serpent
Soit les types suivants : 7
Type T1 = fonction(d : Direction) : Direction Type T2 = proc dure(E s : Serpent ; positionProie : Position ; score : Naturel) e Soit la proc dure jouer suivante qui permet de jouer au jeu du serpent : e proc dure jouer (f1 : T1, p2 : T2, tailleInitiale,tailleAgrandissementSiProieMange : NaturelNonNul) e pr condition(s) tailleInitiale>1 et tailleInitiale(YMAX-YMIN) div 2 e D claration s : Serpent e pProie, p : Position tailleAgrandissementRestant,score : Naturel dir : Direction jeuFini : Booleen debut initSerpent(s) tailleAgrandissementRestant 0 score 0 dir nord pProie positionAleatoireProie(s) jeuFini FAUX tant que non jeuFini faire dir f1(dir) p calculerNellePosition(obtenirPositionTete(s),dir) si estUnePositionDuSerpent(s,p) alors jeuFini VRAI sinon si p = pProie alors pProie positionAleatoireProie(s) tailleAgrandissementRestant tailleAgrandissementRestant + tailleAgrandissementSiProieMange score score + 1 nsi si tailleAgrandissementRestant > 0 alors avancerEnGrandissant(s,dir) tailleAgrandissementRestant tailleAgrandissementRestant - 1 sinon avancerSansGrandir(s,dir) nsi nsi p2(s,pProie,score) ntantque supprimerSerpent(s) n 1. Quels sont les r les des fonction f1 et proc dure p2 ? Pourquoi sont-elles pass es en param` tre de la o e e e proc dure jouer ? e Solution propos e : e Le but de la fonction f1 est de connatre la prochaine direction du serpent. Le but de la proc dure p2 est e dafcher le serpent, la proie et le score. Les deux sont pass es en param` tre de la proc dure jouer car e e e cela permet de s parer le logique m tier de lIHM. e e 2. La fonction positionAleatoireProie permet dobtenir la position dune nouvelle proie (ses coordonn es sont tir es au hasard). Lors de lappel, pourquoi doit-on passer le serpent comme param` tre e e e effectif ? Solution propos e : e e An que la position de la proie ne soit pas une position dun des el ments du serpent. 8
3. En supposant que lon poss` de la fonction suivante qui permet dobtenir un naturel al atoire compris e e entre deux bornes, donnez lalgorithme de la fonction positionAleatoireProie. fonction naturelAleatoire (borneInf, borneSup : Naturel) : Naturel pr condition(s) borneInf < borneSup e Solution propos e : e fonction positionAleatoireProie (s : Serpent) : Position D claration resultat : Position e debut repeter resultat.x naturelAleatoire(XMIN,XMAX) resultat.y naturelAleatoire(YMIN,YMAX) jusqua ce que non estUnePositionDuSerpent(s,resultat) retourner resultat n