04.01.2014 Views

Correction

Correction

Correction

SHOW MORE
SHOW LESS

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 –

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!