EXAMEN LANGAGE C ( PROGRAMMATION C ) TEST  08 /XX 2023

EXAMEN + CORRIGE EN LANGAGE C

Examinateur : Mr Joël Yk

Exercice 01 : Question de Cours (4pts)

  1. Qu'est-ce qu'un pointeur en C et comment l'utilise-t-on pour accéder à une variable en mémoire?
  2. Comment utiliser des pointeurs pour passer des paramètres à une fonction en C?
  3. Comment utiliser des pointeurs pour parcourir un tableau ou une chaîne de caractères en C?
  4. Quelle est la différence entre un pointeur et une référence en C?
  5. Comment utiliser des pointeurs pour allouer et libérer de la mémoire dynamiquement en C?

Exercice 02 : Programme en C (3pts)

Rappelez le Principe de la recherche dichotomique. Considérons un tableau U de I nombres entiers deux à deux distincts, rangés par ordre croissant, et un nombre Y. Écrivez un Programme C qui détermine l’indice exprimant soit le rang de Y dans U soit, si Y ne figure pas dans U, le rang de l’emplacement dans lequel il faudrait ranger Y pour l’insérer dans le tableau, en conservant trié ce dernier.

Principe : considérer deux indices v et w tels que le sous-tableau [ ? … ? ] soit seul susceptible de contenir Y (initialement, v = 0 et w = I-1). En comparant Y et l’élément du milieu, déterminer celle des deux moitiés du sous-tableau qui est susceptible de contenir Y. Recommencer cette opération jusqu’à déterminer une unique position du tableau.

Problème :  13pts(1+2+2+2+1,5+1,5+1+1+1)

Des etudiants en informatique (Genius) toujours très curieux désirent pour un expose en algorithmique et Langage C , manipuler en mémoire centrale d’un ordinateur en ensemble de Livre . Les informations concernant un Livre sont : le code (6 caractères), nom(31 caractères), l’auteur(31 caractères), description(101 caractères), prix, quantité et la notation du livre ( de 0 à 5 ) . (Le Prototype de chaque fonction est donne)

  1. Proposer des structures de donnée adéquate permettant de manipuler ces données en mémoire.(Utiliser la définition de synonyme Typedef)
  2. Proposer une fonction permettant de rechercher un Livre par son code dans l’ensemble. Livre *rechercherLivreParCode(char *code, Livre *ensembleLivres, int tailleEnsemble)
  3. Proposer une fonction permettant d’insérez un Livre dans l’ensemble des Livres. void insererLivre(Livre livre, Livre *ensembleLivres, int *tailleEnsemble)
  4. Proposer une fonction permettant compter tous les Livres dont le nom est : GENIUS dans l’ensemble des Livres. int compterLivresParNom(Livre *ensembleLivres, int tailleEnsemble)
  5. Proposer une fonction permettant classer tous les Livres par ordre croissant dans l’ensemble des produits (utiliser le trie insertion) ceci par la notation. void trierLivresParNotation(Livre *ensembleLivres, int tailleEnsemble)
  6. Proposer une fonction permettant de supprimer tous les Livres dont le code est pris en paramètre de la Fonction dans l’ensemble des Livres. void supprimerLivreParCode(char *code, Livre *ensembleLivres, int *tailleEnsemble) {
  7. Proposer une fonction permettant de modifier le prix d’un Livre dans l’ensemble des Livres. void modifierPrixLivre(char *code, float nouveauPrix, Livre *ensembleLivres, int tailleEnsemble)
  8. Proposer une fonction permettant d’afficher tous les produits les plus vendues dans l’ensemble des Livres. (Nb : un Livre qui a eu du succès auprès des étudiants est un Livre qui a reçu une notation supérieure à 2.5, on s’attarderas pas sur la gestion de la notation mais plutôt sur sa valeur brute.) void afficherLivresVendus(Livre *ensembleLivres, int tailleEnsemble)
  9. Proposer une fonction permettant de sauvegarder de façon permanente les données relatives à l’ensemble des Livres. void sauvegarderEnsembleLivres(Livre *ensembleLivres, int tailleEnsemble, char *nomFichier)
  10. Donnez la différence entre un Tableau et un Fichier en C.

 

Correction :

Exercice 01 :

  1. Un pointeur en C est une variable qui contient l'adresse mémoire d'une autre variable. Pour accéder à une variable en mémoire en utilisant un pointeur, on utilise l'opérateur de déréférencement (*). Par exemple, si "ptr" est un pointeur vers une variable "x", on accède à la valeur de "x" en utilisant "*ptr".
  2. Pour passer des paramètres à une fonction en C en utilisant des pointeurs, on peut passer l'adresse de la variable en utilisant l'opérateur d'adressage (&). Par exemple, pour passer une variable "x" à une fonction "func", on appelle "func(&x)".
  3. Pour parcourir un tableau ou une chaîne de caractères en C en utilisant des pointeurs, on peut utiliser un pointeur de déplacement pour parcourir les éléments de l'élément. Par exemple, pour parcourir un tableau "arr" de taille "n", on peut utiliser une boucle for qui déclare un pointeur "ptr" qui pointe vers le début du tableau, et incrémente ptr à chaque itération pour accéder à chaque élément du tableau.
  4. La différence entre un pointeur et une référence en C est que les pointeurs sont des variables qui contiennent l'adresse d'une autre variable alors que les références sont un alias pour une variable existante.
  5. Pour allouer et libérer de la mémoire dynamiquement en C en utilisant des pointeurs, on peut utiliser les fonctions malloc et free. La fonction malloc alloue un bloc de mémoire de la taille spécifiée et renvoie un pointeur vers le début de ce bloc. La fonction free libère un bloc de mémoire précédemment alloué en utilisant malloc. Il est important de noter qu'il faut toujours libérer la mémoire allouée dynamiquement pour éviter les fuites de mémoire.

Exercice 2 :

Version recursive ----

#include <stdio.h>

int rechercheDicho(int y, int *u, int v, int w) {
    if (v > w) {
        return v;
    }
    int milieu = (v + w) / 2;
    if (u[milieu] == y) {
        return milieu;
    }
    if (u[milieu] > y) {
        return rechercheDicho(y, u, v, milieu - 1);
    }
    else {
        return rechercheDicho(y, u, milieu + 1, w);
    }
}

int main() {
    int u[] = {1, 3, 5, 7, 9, 11, 13, 15};
    int i = sizeof(u) / sizeof(u[0]);
    int y = 8;
    int index = rechercheDicho(y, u, 0, i - 1);
    if (u[index] == y) {
        printf("L'élément %d se trouve à l'indice %d dans le tableau u\n", y, index);
    }
    else {
        printf("L'élément %d devrait être inséré à l'indice %d dans le tableau u pour conserver l'ordre croissant\n", y, index);
    }
    return 0;
}

 

 

Probleme : 

1) 

typedef struct {
    char code[6];
    char nom[31];
    char auteur[31];
    char description[101];
    float prix;
    int quantite;
    float notation;
} Livre;

Livre ensembleLivres[MAX_LIVRES];

 

2)

Livre *rechercherLivreParCode(char *code, Livre *ensembleLivres, int tailleEnsemble) {
    for (int i = 0; i < tailleEnsemble; i++) {
        if (strcmp(ensembleLivres[i].code, code) == 0) {
            return &ensembleLivres[i];
        }
    }
    return NULL;
}

 

3)

void insererLivre(Livre l, Livre *ensembleLivres, int *tailleEnsemble) {
    ensembleLivres[*tailleEnsemble] = l;
    (*tailleEnsemble)++;
}

4)#

 

int compterLivresParNom(Livre *ensembleLivres, int tailleEnsemble) {
    int compteur = 0;
    for (int i = 0; i < tailleEnsemble; i++) {
        if (strcmp(ensembleLivres[i].nom, '' Genius'') == 0) {
            compteur++;
        }
    }
    return compteur;
}

 

5)

void trierLivresParNotation(Livre *ensembleLivres, int tailleEnsemble) {
    for (int i = 1; i < tailleEnsemble; i++) {
        Livre livreActuel = ensembleLivres[i];
        int j = i - 1;
        while (j >= 0 && ensembleLivres[j].notation > livreActuel.notation) {
            ensembleLivres[j + 1] = ensembleLivres[j];
            j--;
        }
        ensembleLivres[j + 1] = livreActuel;
    }
}

6)

void modifierPrixLivre(char *code, float nouveauPrix, Livre *ensembleLivres, int tailleEnsemble) {
    Livre *livre = rechercherLivreParCode(code, ensembleLivres, tailleEnsemble);
    if (livre != NULL) {
        livre->prix = nouveauPrix;
    }
}

 

7)

void afficherLivresVendus(Livre *ensembleLivres, int tailleEnsemble) {
    for (int i = 0; i < tailleEnsemble; i++) {
        if (ensembleLivres[i].notation > 2.5) {
            printf("Nom : %s, Auteur : %s, Description : %s, Prix : %f, Quantité : %d, Notation : %f\n", ensembleLivres[i].nom, ensembleLivres[i].auteur, ensembleLivres[i].description, ensembleLivres[i].prix, ensembleLivres[i].quantite, ensembleLivres[i].notation);
        }
    }
}

 

8)

void afficherLivresVendus(Livre *ensembleLivres, int tailleEnsemble) {
    for (int i = 0; i < tailleEnsemble; i++) {
        if (ensembleLivres[i].notation > 2.5) {
            printf("Nom : %s, Auteur : %s, Description : %s, Prix : %f, Quantité : %d, Notation : %f\n", ensembleLivres[i].nom, ensembleLivres[i].auteur, ensembleLivres[i].description, ensembleLivres[i].prix, ensembleLivres[i].quantite, ensembleLivres[i].notation);
        }
    }
}

 

9)

void sauvegarderEnsembleLivres(Livre *ensembleLivres, int tailleEnsemble, char *nomFichier) {
    FILE *fichier = fopen(nomFichier, "w");
    for (int i = 0; i < tailleEnsemble; i++) {
        fprintf(fichier, "%s,%s,%s,%s,%f,%d,%f\n", ensembleLivres[i].code, ensembleLivres[i].nom, ensembleLivres[i].auteur, ensembleLivres[i].description, ensembleLivres[i].prix, ensembleLivres[i].quantite, ensembleLivres[i].notation);
    }
    fclose(fichier);
}

10)

  • Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam