EXAMEN LANGAGE C ( PROGRAMMATION C ) TEST 12 /XX annee acDEMIQUE 2023
EXAMEN + CORRIGE EN LANGAGE C
EXERCICE 1 : POINTEURS & TABLEAUX ( 12 PTS)
1. Supposez `int x[5] = {0, 1, 2, 3, 4}`. Quelles sont les valeurs de `x` après l'appel de `swap3(x, 1, 4)`?
void swap3(int a[], int i, int j) {
int t;
t = a[i]; a[i] = a[j]; a[j] = t;
}
2. Supposez `int x[5] = {0, 1, 2, 3, 4}`. Quelles sont les valeurs de `x` après l'appel de `swap2(x+1, x+4)`?
void swap2(int *pa, int *pb) {
int t;
t=*pa; *pa=*pb; *pb=t;
}
3. Supposez `int x[5] = {0, 1, 2, 3, 4}`. Que produit l'appel `print3(&x[0])`? Et `print3(&x[2])`? Et `print3(&x[4])`?
void print3(int x[]) {
int i;
for (i = 0; i < 3; i++)
printf("%d ", x[i]);
}
4. Lorsque nous passons un tableau à une fonction en C, cela passe un pointeur à l'élément 0 du tableau. Pourquoi C ne crée-t-il pas simplement une nouvelle copie locale du tableau, comme il le fait avec les entiers?
5. Quelle est la différence entre les deux fonctions suivantes?
int middle1(int a[], int n) {
return a[n/2];
}
int middle2(int *a, int n) {
return a[n/2];
}
6. Soit P un pointeur qui "pointe" sur un tableau A :
int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;
Quelles valeurs ou adresses fournissent les expressions suivantes : ?
a- *P+2
b- *(P+2)
c- &P+1
d- &A[4]-3
e- A+3
f- &A[7]-P
g- P+(*P-10)
h- *(P+*(P+8)-A[7])
EXERCICE 2 : comprehension & ecriture d'un programme en c 8pts
1) Quelles sont les valeurs des expressions suivantes, pour int i=1,j=4; ?
a) (float)i/j
b) (float)(i/j)
c) (float)i/(float)j
2) Qu'affiche le programme suivant ?
#include
int main()
{
int n=3;
n++;
if (n > 3) {
printf("n=%d\n", --n);
} else {
printf("n-2=%d\n", n-2);
}
return 0;
}
3) Soient les déclarations suivantes :
int n = 5, p = 9 ;
int q ;
float x ;
Quelle est la valeur affectée aux différentes variables concernées par chacune des instructions
suivantes ?
a) q = nn ;
d) x = p / n ;
e) x = (p + 0.5)/n ;
f) x = (int)(p + 0.5)/n ;
g) q = n *(p>n?n:p) ;
4) Chercher dans le programme C suivant les erreurs qui peuvent causer son dysfonctionnement, et proposer une correction :
#include
#define PI 3.14
int main()
{
float rayon, Périm, longueur;
printf("Donner le rayon du cercle:");
do {
scanf("%f", &rayon);
printf("Donner PI:");
} while (PI != 3.14);
scanf("%f", &PI);
// Calcul du diamètre du cercle
longueur = 2 * rayon;
// Calcul du périmètre
Périm = longueur * PI;
printf("Diamètre=%f\nPérimetre=%f\n", longueur, Périm);
switch ((int)Périm) {
case 50: printf("Cercle 50"); break;
case 100: printf("Cercle 100");
default: printf("Autre cercle");
}
return 0;
}
6) Écrire un programme qui lit un entier X et un tableau A de type entier au clavier et élimine toutes les occurrences de X dans A en tassant les éléments restants. Le programme utilisera deux pointeurs P1 et P2 pour parcourir le tableau.