Correction
Correction
Correction
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
ESTIA - Unité d’enseignement en Informatique 1 re Année · 2011/2012<br />
Programmation Impérative en Langage C – Examen (durée 2 heures)<br />
CORRECTION de la Première Session du 11 Janvier 2012<br />
Remarque : Ce document ne présente que des éléments de correction. Les variantes possibles sont nombreuses.<br />
Exercice 1 : Questions de cours<br />
1) À quoi sert un compilateur ?<br />
À traduire un langage de programmation (par exemple C) en langage machine (fichier binaire décrivant une<br />
suite d’instructions compréhensibles par le processeur)<br />
2) Comment est-il possible de récupérer les arguments de la ligne de commande ?<br />
En spécifiant et en utilisant les paramètres argc et argv de la fonction principale :<br />
int main (int argc, char *argv[])<br />
3) Dans l’usage de la fonction printf(), que signifient les formatages %s et %c ?<br />
Il signifient qu’une chaîne de caractères et un caractère doivent être respectivement affichés en remplacement<br />
du %s et du %c.<br />
4) Combien de fonctions main() faut-il dans un programme ? Pourquoi ?<br />
Il faut une et une seule fonction main() dans un programme. En effet, c’est le point de départ de l’exécution du<br />
programme, et il ne peut y en avoir qu’un seul, pas plus ! Mais il en faut impérativement un.<br />
5) Pour accéder à une case d’un tableau, quel opérateur utilise-t-on ?<br />
On utilise deux crochets []<br />
6) Dîtes ce que fait l’instruction suivante i += 3 ;<br />
Elle ajoute 3 à la variable i<br />
7) À quoi sert la fonction fprintf() ?<br />
À écrire dans un fichier<br />
8) À quoi sert la fonction feof() ?<br />
À tester si la fin de fichier à été atteinte<br />
9) Lorsqu’on a utilisé la fonction malloc() quelque part, que faut-il faire avant la fin du programme ?<br />
La fonction malloc() permet de réservez dynamiquement de la mémoire. Il faut donc libérer cette mémoire<br />
lorsqu’elle n’est plus utile. Pour ce faire, il faut appeler la fonction free() avant la fin du programme.<br />
10) Qu’est-il possible d’observer lors de l’exécution d’un programme avec un debugger ?<br />
Il est possible d’observer l’évolution du contenu des variables (à chaque instruction en mode pas à pas, où<br />
seulement à certains moments en posant des points d’arrêt)<br />
11) On utilise le logiciel Glade et la bibliothèque GTK pour construire quoi ?<br />
Pour construire des interfaces graphiques (GUI)<br />
12) À quoi servent les logiciels Visual Studio et Eclipse ?<br />
Ce sont des environnement de développement. Il intègrent plusieurs outils en un seul logiciel : éditeur de texte,<br />
compilateur, debugger, etc. Il servent donc à écrire, compiler et exécuter des programmes. (Comme avec une<br />
console, notepad++ et GCC)<br />
E<br />
Les connaissances générales du domaine sont validées<br />
– 1 –
ESTIA - Unité d’enseignement en Informatique 1 re Année · 2011/2012<br />
Exercice 2 : Compteur d’occurrences (au clavier)<br />
Écrire un programme dans lequel l’utilisateur entre 20 nombres entiers au clavier, et qui affiche ensuite le<br />
nombre total de nombres strictement positifs lus, strictement négatifs et nuls.<br />
1 # include <br />
2<br />
3 int main () {<br />
4 int i, n, pos =0 , neg =0 , nul =0 ;<br />
5<br />
6 for (i=0 ; i 0)<br />
10 pos ++ ;<br />
11 else if (n < 0)<br />
12 neg ++ ;<br />
13 else<br />
14 nul ++ ;<br />
15 }<br />
16<br />
17 printf (" Positifs ␣:␣%d\n", pos ) ;<br />
18 printf (" Negatigs ␣:␣%d\n", neg ) ;<br />
19 printf (" Nuls ␣␣␣␣␣:␣%d\n", nul ) ;<br />
20<br />
21 return 0 ;<br />
22 }<br />
Exercice 3 : Moyenne d’un tableau<br />
Écrire une fonction qui calcule la moyenne des valeurs du tableau d’entiers, de taille N, donné en paramètre.<br />
La fonction retournera le résultat du calcul. Le prototype de la fonction sera le suivant :<br />
double moyenne (int *a, int N) ;<br />
3 double moyenne ( int *a, int N) {<br />
4 int i, sum =0 ;<br />
5 for (i=0 ; i
ESTIA - Unité d’enseignement en Informatique 1 re Année · 2011/2012<br />
L’appel de la fonction le plus proche(1,2,tab x,tab y,5) devra alors retourner 3, c.à.d. l’indice du point de<br />
coordonnées (1,3). Pour réaliser cet exercice, vous utiliserez et écrirez aussi une fonction qui calcule la distance<br />
euclidienne entre deux points. Son prototype sera le suivant :<br />
double distance (int xA, int yA, int xB, int yB) ;<br />
8 int le_plus_proche ( int xP , int yP , int *x, int *y, int N) {<br />
9 int i, pos = -1 ;<br />
10 double d, dmin ;<br />
11<br />
12 if (N > 0) {<br />
13 /* Premier point */<br />
14 dmin = distance (xP , yP , x[0] , y [0]) ;<br />
15 pos = 0 ;<br />
16<br />
17 /* Les autres points */<br />
18 for (i=1 ; i
ESTIA - Unité d’enseignement en Informatique 1 re Année · 2011/2012<br />
VERSION NAÏVE :<br />
4 char est_symetrique ( int **A, int N) {<br />
5 int i, j ;<br />
6 char res = 1 ; /* VRAI */<br />
7<br />
8 for (i=0 ; i
ESTIA - Unité d’enseignement en Informatique 1 re Année · 2011/2012<br />
5 void compter ( const char *s, int * cpt_chiffre , int * cpt_lettre , int * cpt_ponctuation ) {<br />
6 int i ;<br />
7 * cpt_chiffre = * cpt_lettre = * cpt_ponctuation = 0 ;<br />
8 for (i=0 ; i< strlen (s) ; i ++)<br />
9 if ( isdigit (s[i]))<br />
10 (* cpt_chiffre ) ++;<br />
11 else if ( isalpha (s[i]))<br />
12 (* cpt_lettre )++ ;<br />
13 else if ( ispunct (s[i]))<br />
14 (* cpt_ponctuation )++ ;<br />
15 }<br />
VARIANTE :<br />
17 void compter_v2 ( const char *s, int * cpt_chiffre , int * cpt_lettre , int * cpt_ponctuation ) {<br />
18 const char *c = s ;<br />
19 * cpt_chiffre = * cpt_lettre = * cpt_ponctuation = 0 ;<br />
20 while (*c != ’\0 ’) {<br />
21 if ( isdigit (*c))<br />
22 (* cpt_chiffre ) ++;<br />
23 else if ( isalpha (*c))<br />
24 (* cpt_lettre )++ ;<br />
25 else if ( ispunct (*c))<br />
26 (* cpt_ponctuation )++ ;<br />
27 c++ ;<br />
28 }<br />
29 }<br />
2) Écrire une fonction main() qui appelle la fonction compter() de la question précédente sur la chaîne de<br />
caractère suivante : “Vive la programmation ! ! ! Et 1, et 2, et 3... zero !”. Ensuite le programme affichera le<br />
nombre de chiffres, de lettres et de caractères de ponctuation de la chaîne.<br />
32 int main () {<br />
33 int c, l, p ;<br />
34<br />
35 compter (" Vive ␣la␣ programmation ␣ !!! ␣Et␣1,␣et␣2,␣et␣ 3... ␣ zero ␣!", &c, &l, &p) ;<br />
36<br />
37 printf (" Chiffres ␣␣␣␣=␣%d\n", c) ;<br />
38 printf (" Lettres ␣␣␣␣␣=␣%d\n", l) ;<br />
39 printf (" Ponctuation ␣=␣%d\n", p) ;<br />
40<br />
41 return 0 ;<br />
42 }<br />
A<br />
La notion de fonction est réellement acquise et l’utilisation des pointeurs est maîtrisée<br />
– 5 –