Post on 19-Feb-2021
Questionnaire examen final
INF1005A
Sigle du cours
Identification de l’étudiant(e)
Nom : Prénom :
Signature : Matricule : Groupe :
Sigle et titre du cours Groupe Trimestre
INF1005A – Programmation procédurale Tous 20131
Professeur Local Téléphone
Martine Bellaïche – responsable + Luiza Gheorghe, Jean-Charles Bernard, Christopher Pal, Rana Farah
M-3414 4758 / 4679
Jour Date Durée Heures
Vendredi 3 mai 2013 2 h 30 9 h 30 – 12 h 00
Documentation Calculatrice
Aucune Aucune Les cellulaires, agendas électroniques ou téléavertisseurs sont interdits.
Toute Toutes
Voir directives particulières Non programmable
Directives particulières
� Ne recopiez pas les déclarations ni les instructions déjà fournies dans le questionnaire.
� Vous n’avez pas à écrire de commentaires ni d’en-têtes.
� Le code écrit doit être complet, c’est-à-dire qu’il est interdit d’utiliser les points de suspension (…) ou une phrase comme « Cette portion de code est répétée x fois ».
� Ne faites que les validations d’entrées demandées.
� L’utilisation de fclose(ʻallʼ) est interdite.
Impo
rtan
t Cet examen contient x5 questions sur un total de x12 pages (excluant cette page)
La pondération de cet examen est de 40 %
Vous devez répondre sur : le questionnaire le cahier les deux
Vous devez remettre le questionnaire : oui non
L’étudiant doit honorer l’engagement pris lors de la signature du code de conduite.
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 1 sur 12 Département de génie informatique et génie logiciel
Question 1. (5 points)
1.1 Associez les éléments ci-dessous de la colonne de droite à ceux de la colonne de gauche.
1. (00101101)2 a. graphique 2. cputime() b. points d’interruption 3. (1F)16 c. (45)10 4. 52 bits d. identificateur fichier 5. (10101101)2 e. double précision 6. text() f. (31)10
7. débogage g. négatif 8. fclose() h. processeur
1.2 Donnez la représentation (signe, mantisse, exposant) en format IEEE754 simple précision
de (-11.5)10 .
1.3 Soient les nombres a = (2D)16 et b= (175)8 . Donnez le résultat en binaire, complément à deux sur 8 bits de a + b et a – b. Y a-t-il débordement et/ou retenue? Dites si la réponse est correcte. Vérifiez le résultat en décimal.
Solution 1.1 (2 points - 0.25 points/bonne reponse) 1-c, 2-h, 3-f, 4-e, 5-g, 6-a, 7-b, 8-d 1.2 (0.75 – 0.25 signe, 0.25 mantisse, 0.25 exposant) -11 -> 1011 -> 1.011*2^3
Signe – 1 Exposant - 3 +127=130 -> (10000010)2 0.5*2=1 0*2=0 Mantisse – 01110000000000000000000
1.3 (0.5 conversions binaire) (2D)16 -> (00101101)2 -> 45 (175)8 -> (01111101)2 -> 125 (0.75 somme et debordement) (00101101)2 + (01111101)2 = (10101010)2 donc débordement sans retenue, la réponse n’est pas correcte. (0.5 verification en decimal) En décimal 45 + 125 = 170 > 127 (0.5 difference) (00101101)2 - (01111101)2 = (00101101)2 + (10000011)2 = (10110000)2 donc sans débordement sans retenue, la réponse est correcte. En décimal 45 - 125 = -80 < 127 et > -128
Question 2. (4 points)
Le registraire de l’école vous demande d’écrire un programme qui permet la génération de statistiques trimestrielles. L’école vous fournit le fichier binaire ‘Hiver2013.bin’ qui a la structure suivante :
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 2 sur 12 Département de génie informatique et génie logiciel
- Le prénom de l’étudiant (chaîne de caractères). Si un étudiant a plus d’un prénom, les prénoms sont liés par ‘–‘ sans espace, i.e. Jean François est écrit Jean-François.
- Le nom de l’étudiant (chaîne de caractères). Si un étudiant a plus d’un nom, les noms sont liés par ‘–‘ sans espace comme pour le prénom.
- Le matricule (un entier uint32). - Les notes obtenues pendant le trimestre (un vecteur ayant 5 colonnes de nombres réels
float32). On suppose que tout étudiant prend exactement 5 cours pendant le trimestre.
Vous devez écrire la fonction Moyenne() qui a le prototype suivant : function [existe, nom_prenom, moyenne] = Moyenne(matricule)
La fonction reçoit comme paramètre d’entrée le matricule d’un étudiant, cherche l’étudiant dans le fichier binaire ‘Hiver2013.bin’. La fonction retourne :
- existe : 1 (numérique) si l’étudiant a été trouvé, sinon 0 (numérique). - nom_prenom : le nom complet de l’étudiant (c.-à-d. prénom nom), si l’étudiant a été
trouvé, sinon la chaîne de caractères vide. - moyenne : la moyenne de notes obtenues pendant le trimestre si toutes les notes sont
>=10, sinon le message « à venir » si l’étudiant a été trouvé sinon 0. Notes :
• Les chaînes de caractères sont toujours précédées par leur taille (uint8). • Vous ne devez pas valider le nombre de paramètres d’entrée de la fonction (on
suppose que l’appel est toujours fait avec 1 argument). • Vous ne devez pas vérifier la taille du vecteur qui contient les notes et vous n’avez pas
à valider les notes.
Solution (4.75 apres bareme detaille ) function [existe, nom, moyenne] = moye(matr)%n'est pas evaluee existe=0; %initialisation valeurs de retour 0.25 point nom=' '; moyenne=0; id=fopen('etudiants.bin', 'r'); %ouverture en lecture 0.25 point if id~=-1 %validation ouverture 0.25 point taille=fread(id, 1, 'int8'); %lecture preliminaire 0.5 point while ~isempty(taille) %condition arret et lecture suivante 0.5 point pre=fread(id, [1, taille], '*char'); % premon lecture correcte toute information 0.75 (0.25 / type) point taille=fread(id, 1, 'int8'); nome=fread(id, [1, taille], '*char'); %nom mat=fread(id, 1, 'int32'); %matricule
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 3 sur 12 Département de génie informatique et génie logiciel
note=fread(id, [1 5], 'double'); %vecteur notes if isequal(mat, matr) % matricule trouve %0.5 point trouver matricule existe=1; %valeur de retour a 1 nom=[pre ' ' nome]; % nom complet %0.25 point nom if all(note>=10) %condition notes %decision affichage note 0.5 point moyenne = mean(note); %retour moyenne else moyenne='a venir'; end taille=[]; %fonctionne aussi avec break - arreter la boucle else taille=fread(id, 1, 'int8'); %lecture suivante end end fclose(id); %fermeture lecture %0.25 point fermeture correcte end
Question 3. (4 points)
Soit un enregistrement qui contient les champs suivants : - modele : le modèle d’un produit (chaîne de caractères), par exemple 'MacBook Pro
15, 2005'; - prix : le prix du produit (nombre réel), par exemple 1489.99; - disponibilites : la disponibilité du produit en différents magasins (ensemble de
cellules contenant le nombre de produits disponibles et l’endroit) par exemple, si on a disponible 15 'MacBook Pro 15, 2005' au Marché Central et 2 au Centre-ville, le champ disponibilites est {15, 'Marché Central', 2, 'Centre-ville'}.
Exemple où A est l’enregistrement A.modele = 'MacBook Pro 15, 2005';
A.prix = 1489.99;
A.disponibilites = {15, 'Marché Central', 2, 'Centre-ville'};
3.1 Écrivez la fonction SauveStock() qui a le prototype suivant :
function [ Succes ] = SauveStock(NomFichier, unEnregistrement)
La fonction SauveStock() sauvegarde dans un fichier texte (.txt) l’information du paramètre unEnregistrement.
La fonction reçoit comme paramètres d’entrée :
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 4 sur 12 Département de génie informatique et génie logiciel
- NomFichier : le nom du fichier dans lequel on sauvegarde l’information d’un modèle spécifique (chaîne de caractères)
- unEnregistrement : l’enregistrement contenant l’information à écrire selon les champs définis ci-dessus.
La fonction retourne Succes : une valeur booléenne indiquant si l’ouverture du fichier texte est réussie ou non réussie (1 pour un succès et 0 pour un échec).
Le prix doit être sauvegardé avec deux chiffres après la virgule.
Après l’appel de la fonction : SauveStock('TestStock.txt', A); le fichier 'TestStock.txt' doit contenir l’information dans le format suivant :
Modèle : MacBook Pro 15, 2005 Prix : 1489.99 Disponibilités : 15 Marché Central 2 Centre-ville
3.2 Écrire la fonction LireStock()
function [B] = LireStock( NomFichier )
La fonction LireStock() lit un fichier texte généré par la fonction SauveStock(). Elle reçoit comme paramètre d’entrée le nom du fichier à lire NomFichier (chaîne de caractères) et retourne un enregistrement qui a le même format que l’enregistrement qui l’enregistrement original.
Solution, partie a)
function [ Succes ] = SauveStock(NomFichier, E) idfic=fopen(NomFichier,'wt'); %ouverture en écriture wt 0.5 point pour les deux fonctions if idfic~=-1 %validation 0.5 point pour les deux fonctions % …criture de la description fprintf(idfic,'Modèle : %s\n', E.modele); 0. 5 point ecriture sauf disponibilites % Noter : important d'avoir %.2f et pas %.2g etc. fprintf(idfic,'Prix : %.2f\n', E.prix); % Noter : pas de ':' pour simplifier la lecture plus tard fprintf(idfic,'Disponibilités\n'); for i=1:2:size(E.disponibilites,2) %0.5 point ecriture disponibilites % L'information de ligne i fprintf(idfic,'%g %s\n',E.disponibilites{i},E.disponibilites{i+1}); end fclose(idfic); %0.5 points fermeture pour les deux fonctions
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 5 sur 12 Département de génie informatique et génie logiciel
Succes=1; % On informe du succËs. %0.25 points valeurs de retour else Succes=0; % On informe de l'Èchec. end Solution, partie b) function [D] = LireStock( NomFichier ) fid=fopen(NomFichier,'rt'); if fid~=-1 % Lecture du modËle % Notez : utilization de fgetl L1 =fgetl(fid); %0.5 sauvegarde sauf disponibilites % Aussi possible d'utiliser : nc = length('Model :'), etc. nc = find(L1 == ':') D.modele= L1(nc+2:end); % Lecture du prix % Notez : utilization de fscanf D.prix = fscanf(fid,'Prix : %f\n') tmp = fgetl(fid); % Lecture de la 'Disponibilités :' %0.25 lecture preliminaire i=1; while ~feof(fid) % 0.5 lecture et sauvegarde disponibilites Ln =fgetl(fid); % Noter : utilisation de isstrprop et 'wspace' ns = find(isstrprop(Ln,'wspace')) D.disponibilites{i} = str2num(Ln(1:ns(1))); D.disponibilites{i+1} = Ln(ns(1)+1:end); i=i+2; end fclose(fid); end Question 4. (4 points)
Soit une base de données formée de trois tableaux : Personnes, Images, Etiquettes. Vous devez écrire trois fonctions pour accomplir quelques fonctionnalités de la base de données.
Le tableau Personnes est un ensemble de cellules de trois colonnes qui contient des informations sur des personnes :
- La première colonne : les identificateurs de personnes (entier). - La seconde colonne : les noms de personnes (chaîne de caractères).
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 6 sur 12 Département de génie informatique et génie logiciel
- La troisième colonne : l’âge de chaque personne (entier).
Le tableau Images est un ensemble de cellules de trois colonnes qui contient des informations sur des images :
- La première colonne : l’identificateur de chaque image (entier). - La seconde colonne : la place où chaque photo a été prise (chaîne de caractères). - La troisième colonne : la date de la prise de photo (chaîne de caractères).
Le tableau Etiquettes est une matrice à deux colonnes :
- La première colonne : les identificateurs des images (entier). - La seconde colonne : les identificateurs des personnes (entier).
Le tableau Etiquettes associe les images aux personnes. Une personne est prise dans une image si l’identificateur de l’image et l’identificateur de la personne sont sur la même ligne dans Etiquettes. Une personne peut être dans plusieurs images et une image peut contenir plusieurs personnes. On suppose que dans une place, pour une date donnée, il y une seule image pour une personne.
Un identificateur est unique dans Personnes et Images.
4.1 Écrivez la fonction Attribuer() qui prend en paramètres :
Exemple de Personnes :Personnes = { 1, 'Mickey', 32
2, 'Minney', 24
3, 'Donnald', 19
4, 'Daisy', 11
.
.
. };
Exemple de Images :Images = {1,'Neverland', '23_4_1994'
2, 'Hogwarts', '8_10_2008'
3, 'Narnia', '15_7_1997'
4, 'Area51', '21_7_2002'
5, 'Atlatis', '27_11_1994'
6, 'Wonderland', '29_3_2004'
7, 'Camelot', '23_4_1994'
.
.
. };
Exemple d’ Etiquettes :etiquettes = [1 1
1 8
2 2
2 3
3 2
4 3
.
.
. ];
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 7 sur 12 Département de génie informatique et génie logiciel
- Etiquettes, - un chiffre IDimage qui représente l’identificateur d’une image, et - un chiffre IDpersonne qui représente l’identificateur d’une personne. La fonction ajoute IDimage et IDpersonne sur une ligne à la fin de Etiquettes et retourne l’ensemble de cellules Etiquettes modifié. La fonction retourne une erreur si un des identificateurs n’est pas scalaire (le paramètre n’est pas numérique et sa longueur est différente de 1). Vous ne devez pas vérifier si l’identificateur existe dans Personne ou Images. Exemple : Étant donné Etiquettes =[1 2
3 5]
IDimage = 2 et IDpersonne = 4
Après un appel à Attribuer() on aura
Etiquettes = [1 2
3 5
2 4]
4.2 Écrivez la fonction TrouverPersonnes() qui prend en paramètres : - une chaîne de caractères ladate qui représente une date, - l’ensemble de cellule Images, - la matrice Etiquettes, - un nombre indéterminé de chiffres qui représentent l’identificateur de plusieurs
personnes.
Pour chaque identificateur, TrouverPersonnes() retourne un ensemble de cellules qui contient les places que la personne a visitées durant la date indiquée par ladate selon l’information sauvegardée dans Images et Etiquettes.
La fonction retourne une erreur si : - le nombre de paramètres est inférieur à quatre, - un des identificateurs n’est pas un scalaire, - ladate n’est pas une chaîne de caractère.
Solution
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 8 sur 12 Département de génie informatique et génie logiciel
%%fonction Attribuer (1 point) function [etiquettes] = Attribuer(etiquettes, IDimage, IDpersonne) %0.5 points % 0.5 validations et error if nargin < 3 error('La fonction prends 3 paramètres') end if ~isnumeric(IDimage) || (length(IDimage)~=1) || ~isnumeric(IDpersonne) || (length(IDpersonne)~=1) error('Les identificateurs doivent êtres des nombres scalaires') end etiquettes = [etiquettes; IDimage, IDpersonne];
%%fonction TrouverPersonnes () (3 points)
function varargout = TrouverPersonnes(ladate, images, etiquettes, varargin) %0.5 varargout = {}; %initialisation 0.25 if nargin < 4 error('Le nombres de paramètre d''entrée n''est pas suffisant') end for vs = 1:1:length(varargin) %0.5 parcours varargin tempid = varargin{vs} %0.25 varargin et {} if ~isnumeric(tempid)|| length(tempid)~=1 %0.5 validation parametres error('Les identificateur des personnes doivent êtres des scalaires') end imageIDs = etiquettes(etiquettes(:,2) == tempid,1) tempPlaces = {} for ds = 1:1:length(imageIDs) %0.5 trouver places indim = 1 while indim
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 9 sur 12 Département de génie informatique et génie logiciel
end
Question 5. (3 points)
Le programme Matlab suivant produit la Figure 1. présentée ci-après
x=-4:0.05:2;
y=-2:0.05:4;
z=exp(-x).*cos(pi*x+y)+cos(x+pi*y)+1;
figure;
plot(x,(z+1),x,-(z+1));
legend('courbe 1','courbe 2');
Figure 1
On vous demande d’écrire le code complet qui produira la Figure 2. suivante :
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 10 sur 12 Département de génie informatique et génie logiciel
Figure 2 où les tracés sont caractérisés comme suit :
Tracé A : situé à gauche, contient les deux courbes de la Figure 1, Axe horizontal : ‘Les valeurs de X’,
Axe vertical : ‘Les valeurs de Z’,
Légende : coin droit supérieur avec les identifications
‘Z+1’ pour la première courbe et
‘- (Z+1)’ pour la seconde courbe
Échelles des axes : horizontal de -4.2 à 2.1,
vertical de -38 à 43.
Titre : ‘Tracé A : (Z+1) et - (Z+1) en fonction de X’
Grillage actif
Tracé B : situé à droite contient les deux courbes de la Figure 1 avec les modifications suivantes : La première courbe : - ligne pointillée rouge, avec des cercles de contour vert et d’intérieur noir et de
taille 3 comme marqueurs,
- grillage actif,
- aux coordonnées (-2.8, 13.7), le texte ‘� Deuxieme maximum’, aligné horizontal et pointant vers la gauche,
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 11 sur 12 Département de génie informatique et génie logiciel
La deuxième courbe : - ligne en trait tireté bleu, avec des carrés de contour rouge et d’intérieur noir, de
taille 3 comme marqueurs,
- grillage actif,
- aux coordonnées (-2.8, 13.7), le texte ‘� Deuxieme minimum’, aligné horizontal et pointant vers la gauche.
Axe horizontal : ‘Les valeurs de X’
Axe vertical : ‘Les valeurs de Z’
Légende : comme celle du tracé A, mais placée par Matlab
Échelles des axes : comme au tracé A
Solution clc; x=-4:0.05:2; y=-2:0.05:4; z=exp(-x).*cos(pi*x+y)+cos(x+pi*y)+1; figure(1); subplot(1,2,1); % 0.25 subplot plot(x,(z+1),x,-(z+1)); axis([-4.2 2.1 -38 43]); %0.25 axes grid on; %0.25 grid on legend(' Z + 1',' -(Z + 1)',1); %0.5 legend pour les deux traces xlabel('Les valeurs de X'); %0.5 xlabel, ylabel, title ylabel('Les valeurs de Z'); title('Tracé A: (Z+1) et -(Z+1) en fonction de X'); % subplot(1,2,2); plot(x,(z+1),':ro','LineWidth',1,... %0.5 pour les deux plot 'MarkerEdgeColor','g',... 'MarkerFaceColor','k',... 'MarkerSize',3); grid on; axis([-4.2 2.1 -38 42]); text(-2.8,13.7,'\leftarrow Deuxieme maximum','HorizontalAlignment','left'); %0.25 text hold on plot(x,-(z+1),'--bs','LineWidth',1,... 'MarkerEdgeColor','r',...
Cours INF1005A – Programmation procédurale Examen final – Hiver 2013
Polytechnique Montréal Page 12 sur 12 Département de génie informatique et génie logiciel
'MarkerFaceColor','k',... 'MarkerSize',3); legend(' Z + 1',' -(Z + 1)',0); xlabel('Les valeurs de X'); ylabel('Les valeurs de Z'); title('Tracé D: (Z+1) et de -(Z+1) en fonction de X'); %0.25 modification titre text(-2.8,-13.7,'\leftarrow Deuxieme minimum','HorizontalAlignment','left'); hold off; %0.25 si sans hold off