PLP

Travaux pratiques 2

Année: 2025-2026

Objectifs

  1. Débogage : Apprendre à utiliser les outils de débogage (gdb) pour identifier et corriger les erreurs dans les programmes en C.

  2. Chaîne de compilation : Comprendre le processus complet de compilation en C avec gcc, y compris les étapes de prétraitement, compilation, assemblage et édition des liens.

  3. Manipulation de chaînes de caractères : Maîtriser les techniques de manipulation de chaînes de caractères en C, incluant les opérations de recherche, découpage, et concaténation.

  4. Gestion des données et recherche de phrases : Utiliser les structures en C pour gérer des informations (comme les données d’étudiant.e.s) et implémenter des techniques pour rechercher des phrases spécifiques dans des fichiers.


Exercice 2.1 [★] – Débogage avec GDB

Cet exercice présente une brève introduction à gdb et explique comment déboguer votre programme C à l’aide de gdb.

Le code suivant (erreurs.c) présente une erreur majeure : il tente d’accéder à des indices de tableau supérieurs à la taille maximale du tableau (100).

Exemple (erreurs.c)

#include <stdio.h>

int main() {
   int tableau[100];

   for (int compteur = 0; compteur < sizeof(tableau); compteur++) { //Erreur
       tableau[compteur] = tableau[compteur] * 2;
   }
   
   return 0;
}

Compilation et exécution

  1. Compilation simple :
$ gcc erreurs.c
  1. Exécution :
./a.out 
*** stack smashing detected ***: terminated

Le programme se plante comme prévu.

Débogage avec GDB

  1. Compiler avec informations de débogage :
$ gcc -ggdb3 erreurs.c -o erreurs
  1. Lancer GDB :
$ gdb erreurs

Vous verrez l’invite (gdb).

  1. Exécuter le programme :
(gdb) r

Le programme s’arrête en cas d’erreur. Pour voir la pile d’appels :

(gdb) bt
  1. Placer un point d’arrêt à la ligne 10 :
(gdb) break erreurs.c:10
  1. Exécuter jusqu’au point d’arrêt :
(gdb) r
  1. Inspecter les variables :
(gdb) p tableau
(gdb) p tableau[0]@5
  1. Avancer instruction par instruction :
(gdb) n
  1. Continuer l’exécution jusqu’au prochain point d’arrêt ou fin :
(gdb) continue
  1. Quitter GDB :
(gdb) quit

Exercice 2.2 [★] – Chaîne de compilation en C

Étapes de la chaîne de compilation

  1. Préprocesseur : Gère les directives #include et les macros.
  2. Compilation : Transforme le code en assembleur.
  3. Assemblage : Produit des fichiers objets .o.
  4. Édition de liens : Combine les objets et bibliothèques pour créer l’exécutable.
  5. Exécution : Lancer le programme binaire.

Exemple 1 (aire.c)

#include <math.h>
#include <stdio.h>

float calculer_aire(float rayon) {
    return M_PI * rayon * rayon;
}

int main() {
    float rayon = 5.0;
    float aire = calculer_aire(rayon);
    printf("L'aire du cercle de rayon %.2f est %.2f\n", rayon, aire);
    return 0;
}

Compilation avec étapes détaillées

# Préprocesseur
gcc -E aire.c -o aire.i

# Compilation
gcc -O2 -S aire.i -o aire.s

# Assemblage
gcc -c aire.s -o aire.o

# Edition de liens
gcc aire.o -lm -o aire

# Exécution
./aire

Exemple 2 – Programme multi-fichiers (sphere)

Compilation multi-fichiers

# Préprocesseur
gcc -E main.c -o main.i
gcc -E volume.c -o volume.i
gcc -E surface.c -o surface.i

# Compilation avec optimisation
gcc -O3 -c main.i -o main.o
gcc -O3 -c volume.i -o volume.o
gcc -O3 -c surface.i -o surface.o

# Edition de liens
gcc main.o volume.o surface.o -lm -o sphere

# Exécution
./sphere

Exercice 2.4 [★★] – Manipulation de chaînes de caractères en C

Objectifs :

  1. Calculer la longueur d’une chaîne.
  2. Copier une chaîne dans une autre.
  3. Concaténer deux chaînes.

Instructions : Écrire un programme chaine.c qui demande à l’utilisateur deux chaînes et applique les trois opérations. Les résultats doivent être affichés.


Exercice 2.5 [★★] – Gestion des données d’étudiant.e.s en C

Objectif : Écrire un programme bd_école.c pour gérer les données de 5 étudiant.e.s.

  1. Définir une structure struct pour l’étudiant (nom, prénom, adresse, notes).
  2. Initialiser et manipuler les données (strcpy).
  3. Demander à l’utilisateur de saisir les informations pour chaque étudiant.
  4. Afficher les informations après saisie.

Exercice 2.6 [★★] – Recherche de phrases dans un fichier en C

Objectif : Écrire un programme phrases.c pour rechercher une phrase dans un fichier.

  1. Demander le nom du fichier et la phrase à rechercher.
  2. Lire le fichier ligne par ligne (fopen, fgets, fclose).
  3. Pour chaque ligne, compter le nombre d’occurrences de la phrase.
  4. Afficher les résultats formatés.

Exercice 2.7 [★★★] – Gestion des couleurs et comptage

Objectif : Écrire un programme couleurs.c qui stocke 100 couleurs (R, G, B, A) et affiche les couleurs distinctes avec leur nombre d’occurrences.

  1. Définir une structure Couleur.
  2. Créer un tableau de 100 couleurs.
  3. Compter les occurrences de chaque couleur distincte.
  4. Afficher les résultats.

Exercice 2.8 [★★★]

Rechercher une phrase dans un tableau de phrases

Écrivez un programme en C nommé chercher.c* qui contient un tableau de 10 phrases (tableau de tableaux de caractères) et qui recherche si une phrase donnée est présente dans le tableau. L’objectif est de réaliser cette recherche sans utiliser les fonctions de bibliothèques standards ou externes.

Exemple: Supposons que le tableau contienne les phrases suivantes :

 "Bonjour, comment ça va ?"
 "Le temps est magnifique aujourd'hui."
 "C'est une belle journée."
 "La programmation en C est amusante."
 "Les tableaux en C sont puissants."
 "Les pointeurs en C peuvent être déroutants."
 "Il fait beau dehors."
 "La recherche dans un tableau est intéressante."
 "Les structures de données sont importantes."
 "Programmer en C, c'est génial."

Si on recherche la phrase “La programmation en C est amusante.”, le programme doit afficher Phrase trouvée. Si on recherche Je préfère le Python., le programme doit afficher hrase non trouvée.


Exercice 2.9 [★★★] – Synthèse des approches en C

Objectif : Créer un rapport (programmation_C.md) qui synthétise :


Fichiers à rendre

Instructions générales :