QUESTION 1 (3 Points) Ces déclarations sont utilisées pour les sous-questions 11 à 13 const int LONGMAX = 51; const int CDMAX = 100; typedef char type_string[longmax]; enum type_classement POURRI,PASSABLE,BON,TRES_BON,EXCELLENT struct type_cd type_string Groupe; type_string Titre; int Nb_Chanson; type_classement Classement; type_cd Un_CD; type_cd Mes_CD[CDMAX]; type_cd *Ptr_CD; int Nb_CD, i; 11 Écrire dans votre cahier la lettre de chaque instruction syntaxiquement correcte Note: Les instructions sont indépendantes les unes des autres a) type_cd Autre_CD = "Iron Maiden","The Number of the Beast",8,BON b) Ptr_CDNb_Chanson = Mes_CD[10]Nb_Chanson; c) Mes_CD[6]Titre = Un_CDTitre; d) Ptr_CD = new type_cd; 12 Supposons que le tableau Mes_CD possède 30 enregistrements contenant de bonnes valeurs Ces 30 enregistrements sont classés en ordre croissant, dans le tableau, selon leur champ Classement Quel(s) bloc(s) d'instructions permet(tent) d'afficher les groupes et les titres des CD dont le champ Classement est BON? Écrire dans votre cahier la ou les lettres correspondantes // bloc a) for (Ptr_CD = &Mes_CD[BON]; Ptr_CD < &Mes_CD[TRES_BON]; Ptr_CD++) cout << Ptr_CD->Groupe << " " << Ptr_CD->Titre << endl; (Suite à la page suivante) Page 1 sur 7
i = 0; // bloc b) while (Mes_CD[i]Classement < BON) i++; while (Mes_CD[i]Classement < TRES_BON) cout << Mes_CD[i]Groupe << " " << Mes_CD[i]Titre << endl; Nb_CD = 30; // bloc c) for (i = 0; i < Nb_CD; i++) switch (Mes_CD[i]Classement) case POURRI : case PASSABLE : case BON : cout << Mes_CD[i]Groupe << " " << Mes_CD[i]Titre << endl; break; case TRES_BON : case EXCELLENT : break; //bloc d) for (i = 0; Mes_CD[i]Classement < TRES_BON; i++) if (Mes_CD[i]Classement == BON) cout << Mes_CD[i]Groupe << " " << Mes_CD[i]Titre << endl; 13 Quelle instruction est équivalente à l'instruction suivante, Mes_CD[3]Nb_Chanson = 14; qui inscrit à la quatrième position de la variable Mes_CD, la valeur 14 dans le champ NbChanson? Écrire dans votre cahier la lettre de votre réponse a) Ptr_CD[4]Nb_Chanson = 14; b) Mes_CD[TRES_BON]Nb_Chanson = 14; c) Mes_CD[3](Titre+1)= 14; d) Ptr_CD->Nb_Chanson = 14; e) Mes_CD[3]->Nb_Chanson = 14; 14 Que se passe-t-il lorsque nous faisons l'instruction delete Tete sur une liste circulaire à liens doubles avec élément factice en mémoire? Tete pointe sur l'élément factice Écrire dans votre cahier la lettre de votre réponse a) Le pointeur Tete ne peut plus être utilisé b) L'espace mémoire de la structure contenant l'élément factice est libéré ou devenu disponible c) L'espace mémoire de la structure factice et de toutes les autres est libéré ou devenu disponible d) L'espace mémoire de la structure factice et de toutes les autres est libéré ou devenu disponible en plus du pointeur Tete e) L'espace mémoire de la structure située après l'élément factice est libéré ou devenu disponible Page 2 sur 7
QUESTION 2 (3 Points) Quel sera l'affichage obtenu lors de l'exécution du programme ci-dessous? #include <iostreamh> #include <fstreamh> struct type_mesure double Distance; double Matiere; void main() type_mesure TabMesure[5] = 5,121, 10,1022,15,763, 20,284, 25, 155 fstream FicBin; type_mesure Mesure; int i; FicBinopen("Mesurebin",ios::out ios::binary); FicBinwrite((char*) TabMesure, 5*sizeof(type_mesure)); FicBinclose(); FicBinopen("Mesurebin",ios::in ios::out ios::binary); FicBinread((char*) TabMesure, 5*sizeof(type_mesure)); Mesure = TabMesure[2]; FicBinseekp(2*sizeof(type_mesure), ios::beg); FicBinwrite((char *)& TabMesure[4], sizeof(type_mesure)); FicBinseekp(4*sizeof(type_mesure), ios::beg); FicBinwrite((char*)& Mesure, sizeof(type_mesure)); FicBinseekg(0, ios::beg); FicBinread((char*) TabMesure, 5*sizeof(type_mesure)); for (i=0;i<5;i++) cout << TabMesure[i]Distance << ' ' << TabMesure[i]Matiere << endl; FicBinclose(); Page 3 sur 7
QUESTION 3 (45 Points) Le cube Rubik est un petit cube 3x3x3 avec des carreaux de couleurs Le but du jeu est, à partir d'un cube où les carreaux de couleurs sont mélangés, d'obtenir sur chaque surface des carreaux de même couleur Un fichier binaire contient la solution du cube Rubik pour une configuration initiale des carreaux mélangés Chacune des données du fichier binaire est une valeur de type type_coup déclaré comme suit: enum type_face Haut, Bas, Gauche, Droite, Devant, Derriere struct type_coup type_face Face; // la face à tourner int Sens; // peut prendre deux valeurs: // -1 rotation dans le sens anti-horaire // 1 rotation dans le sens horaire Pour appliquer cette solution il faut être capable de la lire Ainsi, vous devez prendre l information dans le fichier binaire et inscrire cette information dans un fichier texte pour être en mesure de l imprimer Après la lecture du fichier binaire, le fichier texte aura la forme suivante: Haut anti-horaire Droite horaire Devant anti-horaire Vous n avez pas à écrire un nouveau programme pour cette question mais compléter une portion du programme fourni ci-dessous PROGRAMME À COMPLÉTER : #include <iostreamh> #include <fstreamh> enum type_face Haut, Bas, Gauche, Droite, Devant, Derriere struct type_coup type_face Face; int Sens; (Suite à la page suivante) Page 4 sur 7
/**************************************************************/ /* Description: TraduireFace() */ /* Réalise la conversion d'une valeur de */ /* l'énumération type_face en chaîne de car */ /* Paramètres: Face (IN) une valeur de l'énum de type_face */ /* MotFace (OUT) la chaîne de caractères */ /* correspondante à Face */ /* Valeur de retour : Aucune */ /**************************************************************/ void TraduireFace(type_face Face, char MotFace[]) switch (Face) case Haut : strcpy(motface,"haut"); break; case Bas : strcpy(motface,"bas"); break; case Gauche : strcpy(motface,"gauche"); break; case Droite : strcpy(motface,"droite"); break; case Devant : strcpy(motface,"devant"); break; case Derriere : strcpy(motface,"derriere"); void main (void) char MotFace[10]; //Pour la traduction de l'énumération en //chaîne de caractères avec TraduireFace() ifstream Binaire;// le fichier binaire à lire ofstream Texte; // le fichier texte où sera écrite la solution AJOUTER LES AUTRES DÉCLARATIONS NÉCESSAIRES //ouverture du fichier binaire contenant la réponse Binaireopen("solutionbin",ios::binary); // ouverture du fichier texte dans lequel est inscrit la réponse Texteopen("solutiontxt"); INSCRIRE LES INSTRUCTIONS QUI LISENT LE FICHIER BINAIRE ET ECRIVENT ENSUITE LA SOLUTION DANS LE FICHIER SOLUTIONTXT Binaireclose(); Texteclose(); Page 5 sur 7
QUESTION 4 (45 Points) Une liste linéaire à liens simples contient l'inventaire d'un magasin Chaque élément de la liste représente un article vendu par le magasin L'information conservée sur chaque article est: le nom, le prix et le nombre en stock Cette liste est construite à partir de la déclaration suivante: struct type_article char Nom_Article[20]; float Prix; int Stock; type_article *Suivant; La liste est créée et contient déjà plusieurs éléments Elle se présente comme suit: Tete Telephone Fil Clavier Modem 6499 46 329 162 3497 24 24999 8 NULL Écrire une fonction qui calcule et retourne le montant d'une commande d'articles en parcourant la liste Cette commande ne comprendra que les articles dont la quantité en stock sera inférieure à une quantité seuil La quantité à commander sera la même pour chacun des articles La quantité seuil, la quantité d'articles à commander et la tête de la liste seront reçues en paramètre La fonction ne modifie pas le nombre d'articles en stock Par exemple, si la liste ne contenait que les quatre articles ci-haut, que le seuil est fixé à trente et que la quantité à commander est de cinquante, alors la fonction retournerait comme coût 14 248, soit: 50*3497 (puisque 24 claviers <30) + 50*24999 (puisque 8 modems <30 ) 14 248 Page 6 sur 7
QUESTION 5 (5 Points) Une théorie s'intéresse aux degrés de séparation de toutes les personnes sur la terre Un degré de séparation est un lien quelconque (ami, famille, connaissance, etc) entre deux personnes Par exemple, si André connaît Julie, et que Julie connaît Sophie, alors il y a deux degrés de séparation entre André et Sophie La structure utilisée pour représenter les liens est un tableau d'enregistrements défini selon les instructions suivantes: struct type_personne char Nom[20]; int Lien; type_personne TabLiens[76]; Le champ Lien indique qu'il y a un lien entre la personne dont le nom est inscrit dans le champ Nom et celle située à la position du lien dans le tableau Par exemple pour le tableau ci-contre, il y a un lien entre Josée et la personne située à la position 3, soit Kim Il s'agit d'un lien de degré 1 Kim a un lien avec Salim en position 5 Donc Josée a un lien de degré deux avec Salim (Josée, Kim, Salim) 0 Josée 3 1 Marie 0 2 Éric 22 3 Kim 5 4 Aniss 27 5 Salim 10 75 Anick 15 NOTE: Pour les deux questions suivantes nous considérons que les noms transmis en paramètre sont présents et uniques dans le tableau de 76 noms Vous n'avez pas à utiliser de pointeur pour ces questions A) Écrire la fonction ChercherNom() qui reçoit en paramètre le nom d'une personne et retourne sa position dans le tableau La fonction reçoit également en paramètre le tableau des noms liés Le prototype de la fonction est, int ChercherNom(char Nom[], type_personne TabNoms[76]); B) Écrire la fonction TrouverDegre() qui utilise trois paramètres Les deux premiers sont des chaînes de caractères correspondant au nom de deux personnes dans le tableau Le troisième est le tableau des noms liés La fonction fait appel à la fonction ChercherNom() (question A) pour déterminer la position de la personne reçue comme premier paramètre La fonction recherche l'autre nom reçu en paramètre en empruntant les champs liens Finalement, la fonction retourne le degré du lien entre ces deux personnes Le prototype de la fonction est, int TrouverDegre(char NomDebut[], char NomFin[], type_personne TabNoms[76]); Les professeurs du 3307 Yves Boudreault, coordonnateur Page 7 sur 7