Examen Final - Automne 98 - 3.307 Page 1 sur 7 QUESTION 1 (3

Transcription

Examen Final - Automne 98 - 3.307 Page 1 sur 7 QUESTION 1 (3
Examen Final - Automne 98 - 3.307
QUESTION 1 (3 Points)
Ces déclarations sont utilisées pour les sous-questions 1.1 à 1.3.
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;
1.1 É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_CD.Nb_Chanson = Mes_CD[10].Nb_Chanson;
c) Mes_CD[6].Titre = Un_CD.Titre;
d) Ptr_CD = new type_CD;
1.2 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
Examen Final - Automne 98 - 3.307
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;
1.3 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)
b)
c)
d)
e)
Ptr_CD[4].Nb_Chanson = 14;
Mes_CD[TRES_BON].Nb_Chanson = 14;
Mes_CD[3].(Titre+1)= 14;
Ptr_CD->Nb_Chanson = 14;
Mes_CD[3]->Nb_Chanson = 14;
1.4 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
disponible.
c) L'espace mémoire de la structure factice et de toutes les autres est libéré ou
disponible.
d) L'espace mémoire de la structure factice et de toutes les autres est libéré ou
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
disponible.
Page 2 sur 7
devenu
devenu
devenu
devenu
Examen Final - Automne 98 - 3.307
QUESTION 2 (3 Points)
Quel sera l'affichage obtenu lors de l'exécution du programme ci-dessous ?
#include <iostream.h>
#include <fstream.h>
struct type_mesure
{
double Distance;
double Matiere;
};
void main()
{
type_mesure TabMesure[5] = {{5,12.1}, {10,102.2},{15,76.3},
{20,28.4}, {25, 15.5}};
fstream FicBin;
type_mesure Mesure;
int i;
FicBin.open("Mesure.bin",ios::out|ios::binary);
FicBin.write((char*) TabMesure, 5*sizeof(type_mesure));
FicBin.close();
FicBin.open("Mesure.bin",ios::in|ios::out|ios::binary);
FicBin.read((char*) TabMesure, 5*sizeof(type_mesure));
Mesure = TabMesure[2];
FicBin.seekp(2*sizeof(type_mesure), ios::beg);
FicBin.write((char *)& TabMesure[4], sizeof(type_mesure));
FicBin.seekp(4*sizeof(type_mesure), ios::beg);
FicBin.write((char*)& Mesure, sizeof(type_mesure));
FicBin.seekg(0, ios::beg);
FicBin.read((char*) TabMesure, 5*sizeof(type_mesure));
for (i=0;i<5;i++)
cout << TabMesure[i].Distance << ' ' << TabMesure[i].Matiere
<< endl;
FicBin.close();
}
Page 3 sur 7
Examen Final - Automne 98 - 3.307
QUESTION 3 (4.5 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;
int
Sens;
// la face à tourner
// 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 <iostream.h>
#include <fstream.h>
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
Examen Final - Automne 98 - 3.307
/**************************************************************/
/* 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
Binaire.open("solution.bin",ios::binary);
// ouverture du fichier texte dans lequel est inscrit la réponse
Texte.open("solution.txt");
… INSCRIRE LES INSTRUCTIONS QUI LISENT LE FICHIER BINAIRE
… ET ECRIVENT ENSUITE LA SOLUTION DANS LE FICHIER
… SOLUTION.TXT
Binaire.close();
Texte.close();
}
Page 5 sur 7
Examen Final - Automne 98 - 3.307
QUESTION 4 (4.5 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
64.99
3.29
34.97
249.99
46
162
24
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*34.97 (puisque 24 claviers <30)
+ 50*249.99 (puisque 8 modems <30 )
14 248
Page 6 sur 7
Examen Final - Automne 98 - 3.307
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
1
2
3
4
5
.
.
75
Josée
Marie
Éric
Kim
Aniss
Salim
.
.
Anick
3
0
22
5
27
10
.
.
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 3.307
Yves Boudreault, coordonnateur
Page 7 sur 7