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 = n

n ; 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.

SOLUTION : CORRECTION POINTEURS

EXERCICE 1 :

1. Après l'appel de `swap3(x, 1, 4)`, les valeurs de `x` deviennent `{0, 4, 2, 3, 1}`.

2. Après l'appel de `swap2(x+1, x+4)`, les valeurs de `x` deviennent `{0, 4, 2, 3, 1}`.

3. L'appel `print3(&x[0])` imprime `0 1 2 `. L'appel `print3(&x[2])` imprime `2 3 1 `. L'appel `print3(&x[4])` imprime `1 2 3 `.

4. Lorsqu'un tableau est passé à une fonction en C, un pointeur vers l'élément 0 du tableau est passé, plutôt qu'une copie locale du tableau. Cela est dû à des raisons d'efficacité et de gestion de la mémoire.

5. Les deux fonctions `middle1` et `middle2` effectuent la même tâche : elles retournent l'élément au milieu du tableau. La seule différence est la syntaxe de la déclaration des paramètres : `middle1` utilise un tableau comme paramètre (`int a[]`), tandis que `middle2` utilise un pointeur (`int *a`). Les deux fonctions sont équivalentes.

6. a) *P+2 => la valeur 14
b) *(P+2) => la valeur 34
c) &P+1 => l'adresse du pointeur derrière le pointeur P
(rarement utilisée)
d) &A[4]-3 => l'adresse de la composante A[1]
e) A+3 => l'adresse de la composante A[3]
f) &A[7]-P => la valeur (indice) 7
g) P+(*P-10) => l'adresse de la composante A[2]
h) *(P+*(P+8)-A[7]) => la valeur 23 

 

EXERCICE 2 :

1) Quelles sont les valeurs des expressions suivantes, pour int i=1, j=4; ?
a) (float)i/j     // 0.25
b) (float)(i/j)   // 0.0 (division entière, puis cast en float)
c) (float)i/(float)j   // 0.25

2) Qu'affiche le programme suivant ?
#include
int main()
{
    int n = 3;
    n++;
    if (n > 3) {
        printf("n=%d\n", --n);  // Affiche "n=3"
    } else {
        printf("n-2=%d\n", n-2);
    }
    return 0;
}
reponse : n=3
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 = n

1 b) q = n == p ; // q = 0 c) q = p % n + p > n ; // q = 1 d) x = p / n ; // x = 1.8 e) x = (p + 0.5) / n ; // x = 2.1 f) x = (int)(p + 0.5) / n ; // x = 2.0 g) q = n * (p > n ? n : p) ; // q = 5 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); // Correction : Remove "=" from the macro definition // Corrected code: // #define PI 3.14 // Also, replace "Float" with "float", and fix the scanf calls. // 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"); break; // Add break to the case default: printf("Autre cercle"); } return 0; }

5) cODE :

#include<stdio.h> #include<conio.h> main() { int *p1,*p2,j; int x,t[10],n; p1=t; printf("donner la dimension du tableau"); scanf("%d",&n); for(p1=t;p1<t+n;p1++) { printf("donner la valeur de t[%d]",p1-t); scanf("%d",p1); } printf("dooner la valeur"); scanf("%d",&x); j=0; p1=t; for(p1=t;p1<t+n;p1++) { if(*p1==x)  { for(p2=p1;p2<t+n;p2++)  { if(*p2!=x)  { *p1=*p2;  *p2=x;  p2=t+n-1;  j=j+1;  }  }  } } p1=t; for(p1=t;p1<t+j;p1++) printf(" %d \t",*p1); getch(); } // fin main

Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam