• Aucun résultat trouvé

Examen d’informatique 1A– Langage C

N/A
N/A
Protected

Academic year: 2022

Partager "Examen d’informatique 1A– Langage C"

Copied!
10
0
0

Texte intégral

(1)

1

Examen d’informatique 1A– Langage C Vendredi 21 décembre 2018

Durée : 1h30

Aucun document autorisé. Calculatrice interdite.

L’examen est constitué d’une partie QCM (Questions à Choix Multiples) et d’un exercice à rendre sur feuille à part. Pour répondre au QCM, vous devez remplir la feuille de réponse en p.10 et rendre l’ensemble de l’énoncé non dégrafé. Il y a une ou plusieurs réponses possibles à chaque question. Il y aura des points négatifs lorsqu’une réponse fausse sera cochée. Une absence de réponse vaut 0 point. On supposera que les librairies nécessaires à l’exécution des codes sont incluses dans les morceaux de code fournis.

1. Quel symbole termine toujours une instruction en C ? a) .

b) , c) ; d) }

2. Soit le morceau de code suivant : int i ;

for (i = 0; i <= 10; i++);

{

printf("%d", i);

}

Ces lignes de codes feront : a) 10 appels à printf b) 11 appels à printf c) 1 appel à printf d) 0 appel à printf

3. En langage C, une fonction : Sujet A

NOM : Prénom :

(2)

2 a) peut ne rien retourner.

b) doit toujours avoir des arguments de même type.

c) ne peut jamais modifier les variables passées en argument.

d) doit toujours afficher un message à l’écran.

4. On considère la fonction suivante :

int Compteur (int k, int j) {

int s = 1;

while (s == 1){

k++;

if ( k/j == 3) s=0;

}

return k;

}

Que renvoie l’appel à la fonction Compteur(0,10) ? a) 1

b) 3 c) 30

d) La fonction est bloquée dans une boucle infinie.

5. On définit N de cette manière :

#define N = 100 ;

On propose le code suivant :

for(i = 0 ; i < N ; i++){

if(i%3 == 0) printf("%d \n", i) ; }

a) Ce code affiche les nombres multiples de 3 entre 0 et 100.

b) Ce code affiche tous les nombres entiers entre 0 et 100.

c) Ce code ne compile pas.

d) Ce code ne s’exécute pas.

6. Soit le code suivant :

int fac(int n) ; int main()

{

printf("%d", fac(4));

return 0;

}

int fac(int n){

if (n == 0) return 1;

return n*fac(n-1);

}

(3)

3 Le code affiche :

a) 1 b) 6 c) 24 d) 120

7. Qu'est-ce qu'un tableau dynamique ?

a) Un tableau dont les valeurs changent au cours du temps.

b) Un tableau qui peut avoir une taille qui n’est pas connue à la compilation.

c) Un tableau qui s'agrandit ou se rétrécit automatiquement selon les besoins.

d) Un tableau dont la taille est une constante symbolique.

8. Soit le tableau suivant :

int tab[4]; tab[0] = 10; tab[1] = 23; tab[2] = 55; tab[3] = 8;

Comment peut-on initialiser tab avec ces mêmes valeurs ?

a) int tab[4] = {10 ; 23 ; 55 ; 8};

b) int tab[4] = [10, 23, 55, 8];

c) int tab[4] = (10, 23, 55, 8);

d) int tab4] = {10, 23, 55, 8};

9. On suppose que le tableau de la question précédente a été correctement déclaré.

Choisissez la(les) bonne(s) réponse(s) : a) *(tab+2) est égal à 55

b) le tableau occupe 16 octets en mémoire c) tab[5] est égal à 8

d) &tab est l’adresse de la première case du tableau

10. Soient les déclarations suivantes :

a = 3;

int* p_a = &a;

Quelle(s) instruction(s) permet(tent) d’afficher « 3 » sur la console ? a) printf("%d", a);

b) printf("%d", *&a);

c) printf("%d, *p_a);

d) printf("%d", *(*(&p_a)));

(4)

4

11. Quel code permet d'allouer un tableau dynamique de 7 nombres réels de type double ? a) double tab = malloc(sizeof(double)*7);

b) double* tab = malloc(28);

c) double* tab = malloc(56);

d) aucune réponse n'est correcte

12. On crée un tableau de 5 int. Ce tableau est placé à l'adresse 0x1E02 en mémoire (0x signifie qu’il s’agit d’une adresse en hexadécimal).

Quelle est la première adresse libre après le tableau ?

a) 0x1E12 b) 0x1E07 c) 0x1E16 d) 0x1E06

13. Quelles sont les étapes à suivre dans l'ordre lorsqu'on alloue dynamiquement de la mémoire ? a) malloc, vérification de la validité du pointeur, utilisation de la mémoire, free

b) malloc, utilisation de la mémoire, free, vérification de la validité du pointeur c) free, vérification de la validité du pointeur, malloc, utilisation de la mémoire d) malloc, utilisation de la mémoire, vérification de la validité du pointeur, free 14. Soit la fonction suivante :

double prod(double* a, double* b, int dim){

double r = 0; int i ; for (i=0 ;i<dim; i++){

r = r + a[i]*b[i];

}

return r;

}

Si l’on interprète les éléments des tableaux a et b comme les composantes de vecteurs dans une base orthonormée, alors la fonction prod permet de calculer :

a) La norme d’un vecteur.

b) La norme au carré de la somme de deux vecteurs.

c) Le produit scalaire de deux vecteurs.

d) Aucune de ces réponses.

15. Soit la fonction void remplirTab(int *p_tab, int dim); qui remplit aléatoirement un tableau d’entiers de taille dim. On définit également la constante symbolique N entière.

Parmi les propositions suivantes la ou lesquelles sont correctes ? a) int *T; remplirTab(T, N);

b) int T[N]; remplirTab(T, N);

c) int *T = {2, 4, 3, 6, 0}; remplirTab(T, 5);

d) int *T = malloc(N); remplirTab(T, N);

(5)

5

16. Bob voudrait stocker une image de 100*100 pixels sous la forme d'un tableau en langage C.

Chaque élément du tableau doit indiquer la valeur de niveau gris entre 0 et 255 d'un pixel de l'image. Quelle(s) syntaxe(s) peut-il utiliser ?

a) #define N 100 int tab[N*N] ; b) int tab[10000];

c) int largeur=100;int hauteur=100;

int tab[largeur*hauteur];

e) int* tab; int largeur=100;int hauteur=100;

tab=malloc(largeur*hauteur*sizeof(int));

17. Qu'affiche le code suivant ?

int* tab;

int dim=5;

int i;

tab=malloc(dim*sizeof(int));

for(i=0;i<dim;i++){

tab[i]++;

printf("%d ",tab[i]);

}

a) 0 0 0 0 0 b) 1 1 1 1 1 c) 5 0 0 0 0

d) On ne peut pas savoir.

18. Soit le code suivant :

void Mafonction(int* tab, int* p_dim);

int main(){

int* tab;

int dim;

Mafonction(tab, &dim);

printf("%d\t",dim);

printf("%d",tab[0]);

return 0 ; }

void Mafonction(int* tab, int* p_dim){

int i;

*p_dim = 10;

tab = malloc(*p_dim*sizeof(int));

for (i=0;i<*p_dim;i++) tab[i] = 0;

}

Que vont afficher les deux printf du main ?

(6)

6

a) La console affiche “10 0”, car dim et tab sont correctement récupérés dans le main.

b) La console affiche n’importe quoi puis “0”, car dim n’est pas correctement récupéré dans le main mais tab si.

c) La console affiche “10” puis n’importe quoi, car dim est correctement récupéré mais pas tab.

d) La console affiche n’importe quoi car ni dim ni tab ne sont correctement récupérés dans le main.

19. Qu'affiche le programme suivant ? void calculDouble(int a);

int main(){

int a=2;

calculDouble(a);

printf("%d",a);

}

void calculDouble(int a){

int* p_a;

p_a=&a;

*(p_a)=2 * *(p_a);

}

a) 2 b) 4 c) 0

d) On ne peut pas savoir.

20. Que faut-il toujours faire juste après l'ouverture d'un fichier ASCII dans un programme en C ? a) Le fermer.

b) Tester la validité du pointeur de fichier.

c) Le vider de son contenu.

d) Le lire.

21. Soit le fichier exam.pgm contenant l’image de la correction de ce QCM. Quelle.s est.sont la.les façon.s correcte.s de lire son contenu ?

a) FILE *f = fopen(exam.pgm, "w");

(7)

7 b) FILE *f = fopen(exam.pgm, "r");

c) FILE *f = fopen("exam.pgm", "r");

d) FILE *f = fopen("exam.pgm", "a");

22. Soit le code suivant :

int i;

f = fopen("data.txt","w");

On suppose que le ficher "data.txt" s’est correctement ouvert.

On veut y écrire le texte “0 0 0 0 ”. Quelle(s) est(sont) la(les) bonne(s) réponse(s) :

a) fprintf(f,"0\n"); fprintf(f,"0\n"); fprintf(f,"0\n");

fprintf(f,"0\n");

b) for (i=0;i<4;i++) fprintf(f,"0\t");

c) for (i=0;i<4;i++);

fprintf(f,"0 ");

d) for (i=0;i<4;i++) { fprintf(f,"0\n");

}

23. Soit le fichier texte contenant les lignes suivantes (les _ correspondent à des espaces) : K5B6

243_354_3.34 B

On souhaite récupérer ces informations dans des variables : ch = "K5B6", a = 243, b = 354, x = 3.34 et c = ‘B’.

Quelle.s est.sont la.les déclaration.s correcte.s parmi les suivantes ? a) char ch[5]; int a,b; char c; double x;

b) char ch; int a, b, c; double x;

c) char ch[10]; int a, b; char c, x;

d) char ch[3]; int a, b; char c; double x;

24. Toujours avec le même fichier, on suppose que le pointeur de fichier FILE* fic s’est ouvert en lecture correctement.

Quelle.s est.sont la.les méthode.s correcte.s parmi les suivantes pour récupérer les données (les _ correspondent à des espaces) ?

a) fscanf(fic, "%s", ch); fscanf(fic, "%d_%d_%lf_%c", a, b, x, c);

b) fscanf(fic, "%c", ch); fscanf(fic, "%d_%d_%lf_%c", &a, &b, &x,

&c);

c) fscanf(fic, "%s", ch); fscanf(fic, "%d_%d_%lf_%c", &a, &b, &x,

&c);

d) fscanf(fic, "%s", &ch); fscanf(fic, "%d_%d_%lf_%c", &a, &b, &x,

&c);

25. Bob dispose dans son répertoire de travail d'un fichier texte vide "essai.txt". Qu'y aura-t- il dans ce fichier après exécution du programme suivant ?

int main(){

(8)

8 FILE* fichier;

fichier=fopen("essai.txt","r");

if(fichier != NULL){

fprintf(fichier, "J'adore le C.");

fclose(fichier);

} return 0 ; }

a) Les caractères : "essai.txt"

b) Les caractères : "J'adore le C."

c) Le caractère : "r"

d) Le fichier sera vide.

26. Dans un fichier en-tête ".h", la manière correcte de déclarer une fonction est : a) double Produit(x,y)

b) double Produit(double x, double y)

c) /*La fonction Produit calcule et renvoie le produit de deux double

ENTREES: x,y les deux doubles dont on veut calculer le produit SORTIES: le produit x*y

*/

double Produit(double x, double y)

d) Les réponses 1), 2) et 3) sont fausses.

27. Bob veut écrire une fonction à laquelle il fera appel dans la fonction main. Pour que le programme fonctionne correctement, que peut-il faire ?

a) Ecrire seulement la définition de la fonction dans le fichier main.c avant la fonction main. b) Ecrire la définition de la fonction dans un fichier "fonctions.c" et son prototype dans un

fichier "fonctions.h", puis rajouter "#include "fonctions.h" au début de main.c.

c) Ecrire seulement la définition de la fonction dans le fichier main.c après la fonction main.

d) Ecrire la définition de la fonction dans le fichier main.c après la fonction main et le prototype de cette fonction avant la fonction main.

(9)

9 Exercice à rendre sur feuille à part :

1. Ecrire une fonction qui permet de permuter trois nombres réels. Par exemple, soient les trois variables de type double a=1.5, b=5.8, c=7.9. Après l’appel à la fonction les valeurs des variables a, b et c doivent être modifiées et valoir a=7.9, b=1.5 et c=5.8.

2. Ecrire les lignes de code qui permettent de tester votre fonction. Dans ces lignes de code on demandera à l’utilisateur d’entrer les trois variables au clavier.

3. On considère deux tableaux dynamiques tab_a et tab_b de dimensions dim_a et dim_b. Faire une fonction qui remplit un tableau tab_c dont les dim_a premiers éléments sont les

éléments de tab_a et les dim_b éléments suivants sont les éléments de tab_b.

4. Ecrire les lignes de code qui permettent de tester votre fonction. dim_a et dim_b seront choisies par l’utilisateur.

5. Ecrire une fonction qui permet de sauvegarder un tableau de réels dans un fichier au format ASCII. Le nom du fichier sera un argument de la fonction.

6. Décrivez comment vous utiliseriez la modularité inter-fichiers pour gérer les fonctions que vous venez de réaliser (.h, .c, bibliothèques etc …).

(10)

10 FEUILLE REPONSE A RENDRE AVEC L’ENONCE

Q1 Q6 Q11 Q16 Q21 Q26

a a a a a a

b b b b b b

c c c c c c

d d d d d d

Q2 Q7 Q12 Q17 Q22 Q27

a a a a a a

b b b b b b

c c c c c c

d d d d d d

Q3 Q8 Q13 Q18 Q23

a a a a a

b b b b b

c c c c c

d d d d d

Q4 Q9 Q14 Q19 Q24

a a a a a

b b b b b

c c c c c

d d d d d

Q5 Q10 Q15 Q20 Q25

a a a a a

b b b b b

c c c c c

d d d d d

NOM : PRENOM : Sujet A

Références

Documents relatifs

[r]

Effectuer, ensuite, la simplification de chacune des sorties à l’aide de la table de Karnaugh et représenter le circuit logique correspondant simplifié à l’aide des portes

On consid` ere deux mesures positives finies sur cet espace: µ

D´ eduire des questions pr´ ec´ edentes la valeur de I..

Filmer à la caméra des phénomènes rapides ou lent. Pour cela: faire un montage expérimental avec pinces et statifs. Faites l’analyse en visualisant les films sur la caméra.?.

GtkWidget* gtk_label_new(const gchar* str); crée un objet GtkLabel de libellé str void gtk_label_set_label(GtkLabel* label, const gchar* str); affecte le libellé str au label

Et cette même foi a amené Christ sur terre, car c’était une promesse de Dieu, que Dieu avait faite, comme quoi Il enverrait cela au monde; et la même foi dans la même

Participation au recueil ou transfert de certaines données : Soins externes, DMI, LPP, et maintenant BHN, PHN, … - Dans les hôpitaux universitaires (APHP – APHM,…), le