Important...Ne faites que les validations d’entrées demandées. L’utilisation de fclose( ʻall...

13
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. Important 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.

Transcript of Important...Ne faites que les validations d’entrées demandées. L’utilisation de fclose( ʻall...

  • 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