DS2 2022 2023 Sujet (DS5)
Télécharger le DS2 2022 2023 Sujet (DS5) en pdf
Page 1 : Pré-ING1Semestre 2 - 2022/2023DS n° 2 Informatique IICalculatrice et documents non autorisésLes réponses pour la partie code doivent être données en CLe barème est donné à titre indicatif et pourra être modifié si necessaire.Exercice 1 Démineur 15 pts Si vous ne parvenez pas à répondre à une question, vous pouvez passer à la suivante en supposant que la réponseprécédente a été fournie correctement. Les fonctions déjà écrites peuvent être ré-utilisées dans les questions suivantes. Dans cet exercice on ne vous demande de programmer que certaines fonctionnalités et pas l’entièreté du jeu. Votre code doit être robuste ! Concernant la saisie utilisateur, exceptionnellement il n’est pas obligatoire de tester le retour de la fonction scanf : onpart du principe que l’utilisateur va saisir le bon type de données !Le démineur est un jeu-vidéo se déroulant sur un plateau carré. Des bombes cachées sont placées aléatoirement surles cases de ce tableau. Lorsqu’on choisi une case, si cette case contient une bombe, la partie est finie, sinon cette case estrévélée. Une case révélée indique le nombre de bombes dans les 8 cases adjacentes. Si ce nombre est égal à 0 aucune bombedans les 8 cases autour alors ces 8 cases sont révélées. Ce qui peut entrainer une réaction en chaîne dans les zones où lesbombes sont absentes jusqu’à ce qu’une case révélée contienne au moins une bombe dans ses cases voisines.Dans cet exercice, nous allons écrire quelques fonctionnalités pour pouvoir programmer un démineur en C qui s’afficheraitsur un terminal.Figure 1 – Exemple d’interface de démineur1. Une case d’un plateau de démineur possède plusieurs informations : si elle a été révélée ou non, si elle contient unebombe ou non, et le nombre de bombes dans ses cases voisines.Définir une structure Case dont les champs contiendront les informations suivantes :— L’état de la case révélée ou non.— Le nombre de bombes dans les cases voisines.Pour simplifier, on considère que le deuxième champs d’une Case vaudra -1 si elle contient une bombe, et sinon ellecontiendra une valeur entre 0 et 8 correspondant au nombre de bombes sur les cases voisines.Définir la structure Case. 0.50 pts1
Page 2 : 2. Écrire la procédurevoid affichePlateauCase plateau, int dim qui prend en paramètre :— plateau : le tableau 2D de Case du jeu— dim : la taille d’un des côtés du plateauCette fonction va afficher l’état du plateau de jeu. Si une case n’a pas été révélée on affichera ’ ?’, sinon on affichera lenombre de bombes de ses cases voisines. 1.75 pts3. Quelle est la compléxité de la procédure précédente en fonction de dim ? 0.75 pts4. L’utilisateur peut choisir la taille du plateau de jeu en début de partie. Écrire une fonction ... creationplateau...dans laquelle :— l’utilisateur choisi la taille du côté du plateau dont la valeur doit être comprise entre 5 et 20.— le tableau de jeu doit être créé.— ce tableau ainsi que sa dimension doivent pouvoir être communiqués au reste du programme.Attention : on ne demande pas dans cette question d’intitaliser le plateau de placer les bombes, de calculer lenombre de bombes des cases voisines etc, simplement de le déclarer. 3,75 pts5. Écrire une fonction int dsGrille... qui prendra entre autre en paramètre un couple de int représentant descoordonnées du plateau et retournera 1 si ce couple de coordonnée est valide appartient bien au plateau, 0 sinon.0.75 pts6. On suppose que les cases du plateau de jeu ont été correctement initialisées les cases sont de base non révélées, lesbombes sont placées etc..Écrire une fonction/procédure ...choixCase... qui demande à l’utilisateur les indices de la case qu’il souhaiterévéler. Ces indices doivent être récupérés par le reste du programme. Attention : l’utilisateur ne peux pas choisir unecase en dehors du plateau ou une case déjà révélée. 2 pts7. Nous allons maintenant écrire la fonction permettant de révéler la ou les cases du plateau en fonction du choix del’utilisateur :— void decouvrirCase tab, int x, int y, int dim— avec tab le plateau de jeu, x et y les coordonnées de la case à découvrir qu’on peut supposer valide ici et dim ladimension du plateau.— Cette procédure modifie la case choisie pour la révéler— Si cette dernière ne contient pas de bombe et n’a aucune bombe voisine, alors la procédure va effectuer un appelrécursif pour découvrir les cases adjacentes.— Avec la récursivité, si une des cases adjacentes n’a également pas de bombe autour d’elle, alors le procédé est repétéjusqu’à ce que la zone entière soit révélée. 3,75 ptsÉcrire cette procédure.8. Le joueur a gagné s’il a révélé toute les cases sauf celles contenant des bombes. Écrire une fonction qui retourne 1 si lejoueur a gagné, -1 si il a perdu, et 0 sinon. 1.75 pts2
Page 3 : / !\CETTE FEUILLE EST A RENDRE AVEC VOTRE COPIE : indiquez bien vos noms et groupesExercice 2 Correction et analyse de code 5 pts1. Le programme sur cette page comporte des fautes sur 7 lignes. Indiquez-les et proposez une correction adaptée. Parligne trouvée : 0.25 pts pour indiquer quelle faute, 0.25 pts pour la correction proposée.2. Pourquoi init est déclaré comme un tableau de 3 caractères ? 0.5 pts3. Quelle taille en octets prend la structure en mémoire ? 1.0 ptsinclude stdio.hincludestdlib.hincludetime.htypedef structint essais;char init3;float score;Jeu;void tourJeuJeu j1ifj1 == NULLexit10;j1.essais = 5;whilerand10 =! 0j1.essais--;ifj1-essais=0j1.score = j1-score - 0.1;elsej1.score = j1-score + 0.1;int mainJeu j1;Jeu pj1 = NULL;pj1 = &j1;srandtimeNULL;printf"Saisir vos initiales : ";if scanf"s", &j1.init != 1exit20;if strlenj1.init != 2 exit30;printf"Saissisez votre score precedent\n";if scanf"f", &j1.score != 1exit40;tourJeupj1;printf"Le score est de f", pj1-score ;return 0;3