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