Licence Informatique 1e année Algorithmique et Programmation Travaux Pratiques - Types composés 1 Fidélisation Une compagnie aérienne veut informatiser son système de délisation des clients. Les données à représenter dans le programme sont : Les voyages réalisés par les clients, avec un lieu de départ et d'arrivée, une distance en miles et une classe (économique, aaire ou première) Les clients avec un nom, un prénom, un statut dans le système de délisation (ivoire, argent, or ou platine), un nombre de miles parcourus et le fait de posséder ou non la carte club de la compagnie. a. Créer des types énumérés pour représenter les classes des voyages et les statuts des clients. b. Créer des types enregistrements pour représenter les voyages et les clients. c. Écrire un programme qui déclare et initialise deux vols et un client. Par exemple : vol Paris - New-York de 3620 miles en classe économique, vol Moscou - Pékin de 3600 miles en classe aaire, client Toto Duchmol de statut argent ayant parcouru déjà 35078 miles et ne possédant pas la carte club. d. On veut pouvoir manipuler facilement les données en les regroupant dans des tableaux et en les liants. Ajouter dans le type enregistrement des clients un tableau des vols réalisés par le client 1 . e. Écrire une fonction qui prend en paramètre un client et un vol et ajoute ce vol dans le tableau des vols réalisés par ce client. La fonction doit aussi mettre à jour le nombre de miles parcourus en respectant les règles suivantes : si n est le nombre de miles du voyage, on ajoute aux miles du client n miles si le voyage est en classe économique, 1.5×n miles si le voyage est en classe aaire et 2×n miles si le voyage est en première classe. f. Écrire une fonction qui prend en paramètres un tableau de clients et met à jour les statuts avec les règles suivantes : un client ayant plus de 30000 miles et moins de 60000 a le statut argent, un client ayant plus de 60000 miles et moins de 90000 a le statut or et un client ayant plus de 90000 miles a le statut platine. g. Écrire une fonction qui prend en paramètre un tableau de clients, les nom et prénom d'un client, et le prix de base d'un vol et retourne le prix payé par le client avec les règles suivantes : le statut ivoire donne droit à 1% de réduction, le statut argent à 2%, le statut or à 5% et le statut platine à 10%. Posséder la carte club double la réduction. Si le client n'est pas abonné et donc n'est pas enregistré dans le tableau, la fonction retourne le prix de base. 1. Attention : un tableau non dimensionné a pour valeur null et utiliser l'opérateur length sur un tableau non dimensionné produit une erreur. Mais on peut dimensionner un tableau avec une taille égale à 0. 1 2 Généalogie On veut écrire un programme qui gère des arbres généalogiques. Dans ces arbres, les personnes sont décrites par un nom, un prénom, une date de naissance, une date de mort (s'ils sont morts), leur sexe, leurs père et mère et leurs enfants. a. Proposer une structure de données adaptée au stockage de toutes ces informations, en combinant autant que nécessaire des tableaux, des enregistrements, et des types énumérés. b. Écrire un programme (fonction main) qui initialise un arbre généalogique sur 3 générations représentant votre famille ou une partie d'une dynastie connue ou une généalogie imaginaire. c. Écrire une fonction prenant en entrée une personne et retournant le nombre de petits-enfants de cette personne. d. Écrire une fonction prenant en entrée une personne et retournant le tableau de ses frères uniquement (pas ses s÷urs). Question bonus (pour ceux qui ont le temps d'y rééchir) : écrire une fonction prenant en entrée une personne et un nom et renvoyant vrai si la personne a un ancêtre de ce nom et faux sinon. 3 Exercice bonus pour les plus rapides Le but de l'exercice est d'étudier expérimentalement l'ecacité des algorithmes de recherche vus en cours. Pour cela, on va générer des tableaux d'entiers de tailles diérentes, et lancer des recherches d'éléments selon trois méthodes : recherche séquentielle, recherche dichotomique, recherche par interpolation. Les tableaux doivent donc être triés et avoir une répartition connue, qu'on va prendre linéaire. a. Écrire une fonction qui prend un entier n en paramètre et renvoie un tableau d'entiers de taille n, trié par ordre croissant et présentant une répartition à peu près linéaire. b. Écrire une fonction prenant en entrée un tableau d'entiers et un entier n et retournant vrai si n est dans le tableau et faux sinon. La fonction fera une recherche séquentielle. c. Écrire une fonction prenant en entrée un tableau d'entiers et un entier n et retournant vrai si n est dans le tableau et faux sinon. La fonction fera une recherche dichotomique. d. Écrire une fonction prenant en entrée un tableau d'entiers et un entier n et retournant vrai si n est dans le tableau et faux sinon. La fonction fera une recherche par interpolation linéaire. e. Écrire une fonction principale qui génère des tableaux d'entiers de tailles variées, lance la recherche d'élément à l'aide des trois fonctions de recherche, récupère le temps d'exécution de chacune des trois fonctions, et ache les courbes taille du tableau/temps de recherche grâce à la classe AffTab fournie. Pour ne pas fausser la comparaison, on peut rechercher un élément qui n'est pas dans le tableau (par exemple -1 si les tableaux générés ne contiennent que des entiers positifs). 2 Exemple de code pour la fonction principale : Hashtable<Long,Long> hSequ = new Hashtable<Long,Long>(); Hashtable<Long,Long> hDicho = new Hashtable<Long,Long>(); Hashtable<Long,Long> hInter = new Hashtable<Long,Long>(); for(long i = 10;i<10000;i=i+500) { int[] t = genereTab(i); long duree = System.nanoTime(); rechercheSequentielle(t,-1); duree = System.nanoTime() - duree; hSequ.put(i,duree); duree = System.nanoTime(); rechercheDichotomique(t,-1); duree = System.nanoTime() - duree; hDicho.put(i,duree); duree = System.nanoTime(); rechercheInterpole(t,-1); duree = System.nanoTime() - duree; hInter.put(i,duree); } AffTab at = new AffTab("Recherche d'élément","taille du tableau","temps d'exécution"); at.addTab(hSequ,"Recherche séquentielle",Color.GREEN); at.addTab(hDicho,"Recherche dichotomique",Color.RED); at.addTab(hInter,"Recherche par interpolation",Color.BLUE); 3