Types composés et recherche

publicité
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
Téléchargement