IFT1166 A-B-L-M
POO avec C++ Énoncé du TP #3
40 points Session d'été 2005
Chargés de cours : Le Van Nguyen Modalités :
À remettre, au plus tard, 12 juillet 2005 à 22h30, avant la fermeture des laboratoires.
(Les laboratoires seront fermés pour la session à compter de cette date, il n'y aura donc pas de retard possible.)
Le travail est corrigé sur
40 points
(40 % des travaux pratiques).Les travaux se font seul ou en équipe de deux, au maximum.
(Vous ne remettez alors qu'un seul travail.) Remise des travaux :
Vous devez remettre vos travaux sur papier, ainsi que de façon électronique.
(Cette procédure vous sera expliquée par vos démonstrateurs.)
Pour la remise papier, imprimez vos codes sources, ainsi que les résultats de l'exécution de vos programmes (placés en commentaire à la suite de vos programmes), et attachez-les à une page de remise de travaux (disponible sur le site du cours).
Pour recevoir votre travail après la correction, remettez-le dans une enveloppe pré-affranchie et pré-adressée.
Remettez ensuite vos travaux à vos démonstrateurs, à la réceptionniste du campus Longueuil, ou dans une des boîtes de remise à l'Université de Montréal (au S-118, sur le mur entre X-115 et X-117, près de la porte 2196 du pavillon André-Aisenstadt).
N'oubliez pas de bien identifier vos travaux, tant sur papier que dans votre programme.
Indiquez votre nom et nom d'usager dans l'entête dans chacun de vos programmes.
Si vous travaillez en équipe, pensez à indiquer les coordonnées des deux coéquipiers ! Dépannage :
Consultez le site du cours régulièrement, il contient de nombreuses informations, mises à jour régulièrement, concernant les travaux et la matière du cours :
http://www.iro.umontreal.ca/~dift1166
Profitez des périodes de travaux pratiques (démonstration), des périodes de pratique libre (P. L.) et des séances de révision (solution des devoirs, solution de quelques anciennes questions d’examens). Des auxiliaires pourront vous venir en aide dans la réalisation de vos travaux. Pour l’horaire, veuillez consulter le site Web de la DESI :
http://www.desi.umontreal.ca/
Faites appel à vos démonstrateurs, en écrivant à leur adresse de courriel :
dift1166@iro.umontreal.ca
(Indiquez le sigle et la section cours, ainsi que le numéro du travail dans le sujet de votre message.) Consultez la FAQ (questions fréquemment posées) sur le site du cours.
Numéro 1 (10 points)
Récursivité, tri rapide, recherche dichotomiqueVous disposez du fichier pays.cpp, contenant entre autres l'ébauche d'une classe contenant les informations d'un pays et une fonction pour lire et remplir un tableau d'objets Pays. Très similaire à la casse Nation que vous avez utilisé antérieurement, vous utiliserez d'ailleurs le même fichier de données qu'au travail pratique #2.
Consignes
Réalisez tout d'abord la surcharge des opérateurs nécessaires pour effectuer des
comparaisons entres objets Pays (plus petit, plus grand ou égal, ...). (Vous verrez, selon les besoins des tâches suivantes, quels opérateurs vous devrez vraiment surcharger.)
Note: les pays sont comparés selon leur nom.
Réalisez un patron de fonction utilisant la récursivité pour trier les pays en utilisant l'algorithme de tri rapide (QuickSort).
Triez les pays en utilisant ce patron de fonction.
Réalisez un patron de fonction utilisant la récursivité pour effectuer la recherche d'un pays à partir de son nom en utilisant l'algorithme de recherche dichotomique.
Recherchez et affichez les informations des pays suivants:
o CANADA
o COREE DE L'EST o ETHIOPIE
Critères de correction
Surcharge des opérateurs nécessaires 1 point
Patron de tri rapide récursif 3 points
Patron de recherche dichotomique récursif 4 points
Fonctionnement, qualité, présentation, etc. 2 points
Numéro 2 (15 points)
Patron de classe list de la STLVous disposez du fichier texte "lorem_ipsum.txt" contenant quelques paragraphes de texte générique. En vous aidant du code contenu dans le fichier "mots.cpp", suivez les directives
Complétez la fonction analyserTexte :
La fonction doit extraire tous les mots du texte et les ajouter dans la liste reçue en paramètre. Les mots se retrouvant plus d'une fois ne seront pas ajoutés plus d'une fois dans la liste, mais se verront augmenter leur occurrence (appel à la méthode inc() sur l'objet). Vous ignorez évidemment les différences de capitalisation (majuscules) des mots.
Ainsi, à la fin de la lecture du fichier, la liste contiendra un certain nombre d'objets Mot, pour des mots tous différents, avec le nombre de fois que chacun d'entre eux se
retrouvaient dans le texte (ex.: RISUS se retrouve 5 fois dans le texte).
Pour se faire, vous devez:
o Identifier les mots.
Dans la boucle de lecture, chaque nouvelle lettre s'ajoute à la précédente pour former un mot dans une chaîne de caractères temporaire. Lorsqu'on lit un caractère qui n'est pas une lettre, c'est la fin d'un mot, on peut donc travailler avec ce mot, puis vider la chaîne temporaire pour commencer un nouveau mot.
o Les rechercher dans la liste pour savoir s'ils s'y trouvent déjà.
o Incrémenter leur occurrence s'ils s'y trouvent.
o Les ajouter à la liste s'ils ne s'y trouvent pas.
Triez la liste en ordre alphabétique. (Voir la méthode sort() de la classe list.)
Enfin, effectuez les tâches suivantes:
o Supprimez de la liste tous les mots se retrouvant moins de 5 fois dans le texte.
o Incrémentez de 1 l'occurrence de tous les mots débutant par la lettre N.
o Décrémentez de 2 l'occurrence de tous les mots débutant par la lettre E.
o Affichez ensuite tous les mots dont le nombre de lettres correspond au nombre d'occurrences.
Critères de correction
Construction de la liste (mots distincts, bon nombre d'occurrences) 6 points
Suppression de mots 3 points
Modification de mots 2 points
Autres tâches 2 points
Fonctionnement, qualité, présentation, etc. 2 points
Numéro 3 (10 points)
Héritage simpleVoici la hiérarchie simple des classes pour des vendeurs que vous allez réaliser:
Vendeur
Réalisez la classe Vendeur, abstraite, contenant:
Le numéro d'assurance sociale (NAS), une chaîne de 11 caractères (ex.: 123 456 789).
Le sexe du vendeur (F ou M).
Un constructeur approprié.
Une méthode publique abstraite (virtuelle pure) calculant et retournant le salaire hebdomadaire. Cette méthode sera concrétisée dans les sous classes.
La surcharge de l'opérateur d'affichage que voici:
friend ostream & operator << (ostream & out, const Vendeur & v) {
v.afficher(out);
return out;
}
Une méthode d'affichage virtuelle protégée (protected) dont voici la signature:
virtual void afficher(ostream &) const;
Cette méthode doit afficher le NAS, le sexe, ainsi que le salaire hebdomadaire.
Réalisez la sous classe VendeurJunior, dérivant de la classe Vendeur, contenant:
Un champ privé pour le montant des ventes.
Un constructeur approprié.
La redéfinition de la méthode protégée afficher pour afficher également le montant des ventes.
La concrétisation de la méthode de calcul du salaire hebdomadaire héritée de la classe
Vendeur, sachant que le salaire d'un vendeur junior est calculé comme suit:
Salaire de base de 400$ + 20% des ventes (en commission)
VendeurJunior VendeurSenior
La concrétisation de la méthode de calcul du salaire hebdomadaire héritée de la classe
Vendeur, sachant que le salaire d'un vendeur senior est calculé comme suit:
Salaire de base de 800$ + 35$ par année d'ancienneté
Vous disposez du fichier de données "vendeurs.txt" contenant les informations de vendeurs:
J 123 433 234 M 1560 S 534 234 125 M 12 ...
C'est à dire, un homme vendeur junior (J) dont le NAS est "123 433 234" qui a vendu pour 1560$, et un homme vendeur senior (S) dont le NAS est "534 234 125" qui a 12 années d'ancienneté.
Lisez le fichier et remplissez un tableau (maximum 20 vendeurs) de pointeurs sur des objets
Vendeur (c'est à dire un Vendeur*[], dont les éléments pointent sur des VendeurJunior ou
VendeurSenior).
1. Affichez les éléments du tableau à l'aide d'un petit patron de fonction une fois qu'il est rempli. Réalisez si vous voulez la fonction suivante:
ostream & operator << (ostream & out, const Vendeur * v);
2. Triez les vendeurs du tableau en ordre croissant de leur salaire hebdomadaire.
3. Affichez le vendeur le moins bien payé et le vendeur le mieux payé du tableau (qui devraient ici correspondre au premier et au dernier élément du tableau).
Critères de correction
Classe abstraite Vendeur 2 points
Sous classes VendeurJunior et VendeurSenior 2 points
Lecture du fichier, remplissage du tableau de Vendeur*, autres tâches 3 points
Fonctionnement, qualité, présentation, etc. 1 point
Numéro 4 (5 points)
Fichiers binaires, arguments de mainVous disposez d’un petit programme incomplet nommé argument.cpp. Complétez ce
programme afin que l’exécution de argument.exe (le programme construit) donne ce qui suit:
R:\> argument
Il faut executer avec un argument representant le nom du fichier binaire a creer
R:\> argument 85 Bonjour
Il faut executer avec un argument representant le nom du fichier binaire a creer
R:\> argument R:\personne.bin
Fin de la creation du fichier binaire R:\personne.bin On relit le fichier binaire R:\personne.bin:
23 76.8 17 52.1 36 68.4 28 72.9
Critères de correction
Bon fonctionnement, utilisant fonctions et leurs appels 5 points
Remise électronique du TP3, comme les deux derniers travaux:
Faites bien attention de respecter les majuscules et les minuscules ! remise ift1166 tp3 remise-tp3/*
À tout moment, vous pouvez vérifier quels fichiers vous avez remis en tapant la commande:
remise -v ift1166 tp3
La correction des travaux :
Suite à une recommandation de la direction de la DESI et du DIRO, la qualité de l'algorithme et de la programmation occupent une place importante dans l'évaluation d'un travail. Un programme qui fonctionne est bien mais insuffisant pour mériter une meilleure note!
Veuillez consulter les critères de correction de chacun des numéros d'un travail.