Correction Examen 2011 2012

Vous aimerez peut-être aussi

Vous êtes sur la page 1sur 9

D partement STPI e

Lundi 18 juin 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

F IGURE 1 Dessin r cursif e

Rappels math matiques e


Les trois sommets dun triangle equilat ral, dont lun des c t est parall` le a laxe des abscisses, de centre e oe e ` xc , yc de base b ont les coordonn es suivantes : e xc , yc + 2 h/3 xc b/2, yc h/3 xc + b/2, yc h/3 avec h = b2 (b/2)2

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

Le jeu du serpent (13 points)

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).

(c) Serpent ayant mang deux proies. Il e se dirige vers le sud.

F IGURE 2 Quelques exemples d tat du jeu serpent e

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

Vous aimerez peut-être aussi