Test1 PROG 2016-17 File
Transcription
Test1 PROG 2016-17 File
Programmation MT & EL Test écrit N°1 Vendredi 11 Novembre 2016 Ne PAS retourner ces feuilles avant d’en être autorisé! Merci de poser votre carte CAMIPRO en évidence sur la table. Vous pouvez déjà compléter ci-dessous Nom __________________________________________________________________ Prénom ________________________________________________________________ Numéro SCIPER _________________________________________________________ Signature _______________________________________________________________ BROUILLON : Ecrivez aussi votre NOM-Prénom sur la feuille de brouillon fournie. Toutes vos réponses doivent être sur cette copie d’examen. Les feuilles de brouillon sont ramassées pour être immédiatement détruites. 8h15 Le contrôle écrit commence à: A 9h30 retourner les feuilles avec la page 1 face à vous et faire glisser les copies vers les allées pour être ramassées. Attendre en silence le signal pour sortir. les contrôles écrits de PROGRAMMATION sont SANS appareil électronique. Vous avez le droit d'avoir tous vos documents personnels sous forme papier: dictionnaire, livres, cours, exercices, grilles, code, projet, etc... Ce contrôle écrit permet d’obtenir 30 points sur un total de 100 points pour le cours complet. Vous pouvez utiliser un crayon à papier et une gomme 1 1) (12 pts) Anagrammes 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include #include #define #define <stdio.h> <stdlib.h> MAX 1000 MAX_OCTET 256 int main(void){ char mot1[MAX], mot2[MAX], c; int code_count[MAX_OCTET], k1 = 0, k2 = 0, i; for(i=0 ; i< MAX_OCTET ; i++) code_count[i]=0; while(k1 < MAX mot1[k1++] while(k2 < MAX mot2[k2++] && ((c = getchar()) != '\n')) = c; && ((c = getchar()) != '\n')) = c; if (k1 != k2) { printf("The two words are not anagrams\n"); return EXIT_SUCCESS; } int num_unique_chars = 0; int num_completed_t = 0; for (i = 0; i < k1; i++) { c = mot1[i]; if (code_count[(int) c] == 0) ++num_unique_chars; code_count[(int) c]++; } for (i = 0; i < k2; i++) { c = mot2[i]; if (code_count[(int) c] == 0) { printf("The two words are not anagrams\n"); return EXIT_SUCCESS; } code_count[(int) c]--; if (code_count[(int) c] == 0) { num_completed_t++; if (num_completed_t == num_unique_chars) { printf("The two words are anagrams\n"); return EXIT_SUCCESS; } } } printf("The two words are anagrams\n"); return EXIT_SUCCESS; } Le premier but de ce programme est d’indiquer si un mot est l‘anagramme d’un autre mot (Un anagramme est un mot qui utilise exactement les mêmes lettres qu’un autre mot mais dans un ordre différent). 2 Exemples de mots qui doivent être détectés comme anagramme avec ce programme: le mot « sujet » est l’anagramme du mot « juste », le mot « aube » est l’anagramme du mot « beau ». Le second but de ce programme est d’effectuer une vérification très stricte comme suit : a) il fait la différence entre une lettre majuscule et la même lettre en minuscule b) il fait la différence entre un caractère du code de base (codes sur 7 bits fourni en cours dont la valeur décimale est comprise entre 0 et 127) et les caractères accentués supplémentaires disponibles pour écrire en français ou en allemand (nous supposons que ces caractères sont codés avec un seul octet dont la valeur de code est comprise entre les valeurs décimales 128 et 255 comme avec le code ISO 8859-1 Latin). Exemples de mots qui ne doivent PAS être détectés comme anagrammes avec ce programme: « crane » n’est pas l’anagramme de « écran » car le caractère « é » est différent du caractère « e ». « Marion » n’est pas l’anagramme de « Romain » à cause des lettres « M » et « m », et des lettres « r » et « R ». Contexte de l’exercice : cet exercice cherche à établir progressivement si le programme réalise bien sa tâche pour deux mots isolés (il pourrait être utilisé pour deux « suites de mots » mais nous n’examinons pas ce cas ici). Remarque : le symbole EXIT_SUCCESS qui suit l’instruction return n’a pas d’importance pour cet exercice. Vous devez l’ignorer. 1.1) Choisir une réponse parmi les propositions suivantes : A) Ce programme ne compile pas B) Ce programme compile mais l’exécutable peut produire un crash (arrêt prématuré du programme) quand on fourni un mot contenant un caractère avec un accent (français ou allemand) dont le code est compris entre 128 et 255 en décimal. C) Ce programme compile et l’exécutable produit un résultat (= un message est affiché) aussi quand on fourni un mot contenant un caractère avec un accent (français ou allemand) dont le code ASCII est compris entre 128 et 255 en décimal. Pour ce choix, on ne fait aucune supposition sur le fait que le message est correct ou incorrect. Réponse (justifier en donnant des précisions ici pour le choix A). Pour le choix B) indiquer pourquoi un caractère accentué peut poser un problème, puis passer à la question 1.2. Pour le choix ‘C’, indiquer seulement ‘C’ puis passer à la question 1.2): …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. 3 1.2) Nous supposons ici que le programme compile et qu’on peut l’exécuter en obtenant un résultat affiché (choix C). 1.2.1) Quel message est affiché et à quelle ligne du code source l’exécution atteint-elle l’instruction « return EXIT SUCCESS » pour ce contenu du buffer d’entrée : d u \n d e u x \n …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. Justifier en précisant le rôle des variables k1 et k2 et leur valeur pour cet exemple …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. 1.2.2) Quel message est affiché et à quelle ligne du code source l’exécution atteint-elle l’instruction « return EXIT SUCCESS » pour ce contenu du buffer d’entrée : l i s t e n \n s i l e n t \n …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. Pour cet exemple, justifier en précisant a) combien d’éléments du tableau code_count ont été modifés entre les lignes 12 et 44 du programme, b) combien de fois chaque élément a été modifié entre les lignes 12 et 44 du programme : …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. 4 1.2.3) Quel message est affiché et à quelle ligne du code source l’exécution atteint-elle l’instruction « return EXIT SUCCESS » pour ce contenu du buffer d’entrée : A l i n e \n l a i n e \n …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. Justifier la valeur finale de la variable i (au moment où l’instruction « return EXIT SUCCESS » est exécutée) …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. 2) (6 pts) type float IEEE 754 Donner le motif binaire sur 32 bits de ce nombre octal avec onze chiffres : 07720000000 En déduire la valeur des trois champs de la représentation en virgule flottante avec le type float IEEE 754 : Signe : Exposant : Mantisse : Donner ensuite ce nombre sous la forme normalisée et en déduire sa valeur en base dix: …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. 5 3) (6 pts) évaluation d’expression Donner la valeur et le type de l’expression suivante. Montrer les priorités mises en œuvre par le langage C en soulignant les sous-expressions et en indiquant leur type et la valeur des calculs intermédiaires. (char)( 'A' + 1 == 'B' && 'C' / 'D' ? 'X' - 1 : 'T' + 1 ) 4) (6 pts) programme mystère 1 2 3 4 5 6 7 8 9 10 11 12 #include <stdio.h> #include <stdlib.h> int main(void) { int a = 1; float x = a << 25 ; printf("réponse = %d\n", x == x + 2 ); return EXIT_SUCCESS; } Justifiez la réponse affichée par ce programme : …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. …………………………………………………………………………………………………………………………………………………. 6