INF111_CCnovembre_2015-2016
Transcription
INF111_CCnovembre_2015-2016
INF111 : devoir surveillé Jeudi 5 Novembre 2015 • Durée 2 heures. • Lisez toutes les questions avant de commencer ! Le sujet fait 4 pages. • Respectez strictement les consignes de l’énoncé (noms de variables, format d’affichage...) • Les questions du problème sont indépendantes, vous pouvez sauter des questions si nécessaire. • Aucun document autorisé. • L’utilisation d’une calculette, d’un téléphone, etc est interdite. • Le barème est indicatif. • La qualité de la rédaction et de la présentation (indentation, commentaires...) sera prise en compte. 1 PARTIE 1 : EXERCICES (8 points) 1.1 Unix (3 points) Répondez aux questions suivantes en utilisant les commandes Unix. Les questions ne sont pas indépendantes, on suppose que les commandes des questions précédentes ont été exécutées. 1. Déplacez-vous dans votre répertoire d’accueil 2. Enregistrez votre arborescence dans un fichier arbre.txt 3. Créez un répertoire Divers dans le répertoire courant 4. Déplacez le fichier arbre.txt dans le répertoire Divers 5. Affichez dans la console le contenu du fichier arbre.txt, sans changer de répertoire 6. Supprimez le répertoire Divers 1.2 Booléens (2 points) On suppose que les variables a,b,c (entières) et x,y (caractères) sont déclarées et initialisées. Ecrire les expressions booléennes représentant les phrases suivantes : 1. x est un caractère numérique 2. a est un multiple de b, et b est un multiple de c 3. y n’est pas une lettre de l’alphabet 4. x est une lettre majuscule de l’alphabet située entre la a-ième et la b-ième position incluses (on supposera que a est plus petit que b). ’A’ est à la 1e position, ’Z’ à la 26e position. 1.3 Vérone antique (3 points) Roméo et Juliette ont rendez-vous entre 13h et 14h. Le protocole est le suivant : le premier arrivé attend 10 minutes et s’en va. Quelle est la probabilité qu’ils se rencontrent ? On ne demande aucun calcul mathématique. Nous allons simuler la situation pour calculer cette probabilité. On dit qu’une heure dure 3600 secondes. On tire équiprobablement la date d’arrivée R entre 1 et 3600 de Roméo au RDV. On fait de même pour Juliette qui arrive à la date J. On calcule si Roméo et Juliette se sont rencontrés (R et J séparées de moins de 10 minutes). On itère NMAX fois ce procédé et on décide que la probabilité d’une rencontre est le nombre de fois ou ils se sont rencontré divisé par le nombre de simulations (NMAX). Faire un programme complet qui calcule cette probabilité et l’affiche. Dans ce programme NMAX est une constante qu’on fixera à 10000. 1 2 PARTIE 2 : PROBLEME (12 points) On s’intéresse au déplacement d’un kangourou dans le bush australien, en un maximum de 1000 sauts. La longueur de chaque saut est un nombre entier de centimètres compris entre 1 et 700 (bornes incluses). On va stocker les longueurs de chacun de ces sauts dans un tableau Sauts de 1000 entiers. Attention : les sauts sont donc numérotés entre 0 et 999. On suppose qu’on dispose d’une fonction int hasard(int inf, int sup) définie dans la librairie hasard.h, qui renvoie un entier généré aléatoirement compris entre les 2 bornes inf et sup (incluses). Par exemple l’instruction ”x = hasard(0,100);” affecte à l’entier x une valeur au hasard entre 0 et 100 inclus. Attention : dans toute la suite, on mettra un commentaire devant la réponse de chaque question, indiquant le numéro de la question traitée. 2.1 Mise en place (2 points) Ecrire un programme principal complet en suivant les étapes ci-dessous : 1. Inclure les librairies nécessaires 2. Définir une constante NMAX de valeur 1000 pour le nombre maximum de sauts 3. Ecrire l’en-tête du programme principal 4. Déclarer les variables nécessaires, en particulier le tableau Sauts. Laisser de la place pour les variables nécessaires aux questions suivantes. 5. Insérer un commentaire ”code du programme” 6. Terminer le programme principal Dans la suite on suppose que le code écrit en réponse aux questions devra s’insérer dans ce squelette de programme, à la place du commentaire ”code du programme”. 2.2 Initialisation et affichage (3 points) 7. Demander à l’utilisateur d’entrer le nombre n de sauts souhaités (afficher un texte pour l’utilisateur avant de lire sa réponse), et s’assurer qu’il donne bien une valeur strictement positive et inférieure ou égale à NMAX (filtrer la valeur lue). Dans la suite on utilisera cette valeur n sans la modifier. 8. Proposer à l’utilisateur 2 options : initialisation aléatoire ou initialisation manuelle. Il doit répondre uniquement par un caractère ’a’ pour aléatoire ou ’m’ pour manuel (filtrer sa réponse). Selon son choix, • Initialiser le tableau Sauts avec les longueurs des n sauts tirées au hasard • Ou initialiser ce tableau avec les longueurs de n sauts lues chacune au clavier 9. Afficher le tableau de sauts sur une seule ligne : message initial, suivi de la liste des valeurs séparées par une virgule, sauf la valeur finale suivie d’un point. Sous cette forme exactement : "Le kangourou a fait 7 sauts : 314 cm, 700 cm, 421 cm, 495 cm, 377 cm, 132 cm, 513 cm." 10. Déclarer et initialiser un tableau Cumul de NMAX+1 entiers de sorte que chaque cellule contienne le cumul de distance parcourue après ce nombre de sauts. Ainsi la cellule 0 contient 0, la cellule 1 contient la longueur du premier saut, et la cellule NMAX contient la distance totale parcourue en NMAX sauts. 11. Chercher et afficher le numéro du plus long saut et sa longueur. 2 2.3 Statistiques et histogrammes (2 points) On veut maintenant répéter le déplacement pour 100 kangourous et faire des statistiques. Pour cela on va construire un tableau Stats[100] de nombre réels stockant la longueur moyenne des sauts de 100 kangourous, chacun ayant fait 1000 sauts. Pour cela on veut répéter le code des questions ci-dessus (inutile de le recopier, vous pouvez indiquer en commentaire dans le programme quelle question vous voulez répéter). 12. Ecrire une boucle permettant de faire sauter 100 kangourous et de stocker dans le tableau Stats la longueur moyenne des sauts de chacun. Ainsi Stats[0] contient la longueur moyenne des (1000) sauts du premier kangourou, etc. Attention : on veut la moyenne réelle (non entière). 13. Afficher ces résultats sur un histogramme : sur chaque ligne on affichera le numéro du kangourou concerné, la longueur moyenne de ses sauts, puis une suite d’étoiles (une étoile par 50 cm de longueur moyenne, donc entre 0 et 14 étoiles par ligne). Il y a donc 100 lignes. On vous demande d’afficher cet histogramme sous le format suivant : 0 (357.2 cm) : ****** 1 (421.5 cm) : ******** 2 (607.7 cm) : ************ 3 (201.4 cm) : **** ... 2.4 Course de kangourous (4 points) On considère maintenant 2 kangourous, et on considère qu’on a déclaré et initialisé comme précédemment les tableaux Sauts1[NMAX], Sauts2[NMAX], Cumul1[NMAX+1], et Cumul2[NMAX+1]. Ces tableaux contiennent donc les longueurs de tous les sauts et les cumuls de distance des deux kangourous. On suppose qu’on a aussi déclaré et calculé un tableau Ecarts[NMAX+1] de sorte que chaque cellule (d’indice i) contienne l’écart de distance cumulée entre les deux kangourous après i sauts. L’écart est positif si le kangourou 1 est devant, et négatif si le kangourou 2 est devant. La cellule 0 contient donc 0 (aucun écart avant le premier saut), la cellule 1 contient l’écart après le saut 1, etc. Dans les questions suivantes on utilisera directement ce tableau Ecarts. 14. Chercher si les deux kangourous sont arrivés exactement au même endroit au même saut (écart nul) : si oui, afficher un message avec le premier numéro de saut où cela se produit, et la distance cumulée, par exemple ”les deux kangourous sont arrivés au même endroit après 7 sauts et 4200 cm” ; sinon, afficher le message ”les deux kangourous ne sont jamais arrivés au même endroit”. 15. Demander à l’utilisateur une distance d (nombre entier de centimètres), et déterminer lequel des deux kangourous était le premier à passer cette distance, et combien de sauts d’avance il avait (combien de sauts supplémentaires il a fallu au 2e pour passer aussi cette distance). Attention à bien envisager tous les cas (l’un ou les 2 n’ont peut-être pas franchi cette distance...). Afficher le résultat avec un texte explicite. 16. Compter combien de sauts chacun des deux a passé en tête de la course (strictement devant l’autre), et combien de fois les deux kangourous ont inversé leurs positions. Afficher les résultats avec un texte explicite. 17. Calculer le plus grand écart entre les deux kangourous, en faveur duquel, et à quel saut il s’est produit. Afficher toutes ces informations sous cette forme exactement : Le plus grand écart est atteint au saut numéro 27, le kangourou 2 a 371 cm d’avance. Attention on veut toujours afficher un écart positif, en faveur de l’un ou l’autre. 3 2.5 Bonus (2 points) On considère un kangourou qui saute de la manière suivante : • Probabilité de 0.3 de faire un petit saut (longueur équiprobable entre 1 et 299 cm) • Probabilité de 0.6 de faire un saut moyen (longueur équiprobable entre 300 et 499 cm) • Probabilité de 0.1 de faire un grand saut (longueur équiprobable entre 500 et 700 cm) 18. Initialiser le tableau Sauts[NMAX] en respectant ces probabilités. 19. Chercher le numéro et la longueur du plus petit des ”grands sauts” (attention : il n’y a peut-être aucun grand saut !). 4