Module :
Semestre 1
Programmation en
Année : 2024/2025
langage C
TD/TP Nº8 : Les pointeurs
Les objectifs : Manipuler les pointeurs en langage C.
Exercice 1 :
Écrire une fonction swap qui a comme paramètres deux pointeurs vers des entiers et qui
échange le contenu des deux entiers pointés. Tester cette fonction en écrivant un programme
qui échange le contenu de deux entiers a et b en appelant cette fonction.
#include <stdio.h>
int swap(int *pa, int *pb)
{
int tmp;
tmp = *pa;
*pa = *pb;
*pb = tmp;
return 0;
}
int main()
{
int a, b;
printf("Saisissez un entier : ");
scanf("%d", &a);
printf("Saisissez un autre entier : ");
scanf("%d", &b);
printf("Vous avez saisi : %d %d\n", a, b);
swap(&a, &b);
printf("Après swap : %d %d\n", a, b);
return 0;
}
Exercice 2 :
Écrire une fonction qui a comme paramètres un tableau d'entiers de taille quelconque, la taille
du tableau, et 2 pointeurs vers des entiers min et max. La fonction doit renvoyer dans les entiers
pointés par min et max respectivement les plus petits et les plus grands entiers du tableau.
#include <stdio.h>
int minmax(int *p, int n, int *pmin, int *pmax)
{
int *i;
*pmin = *p;
*pmax = *p;
for (i = p; i < p + n; i++)
{
[Link] 1
if (*i < *pmin) *pmin = *i;
if (*i > *pmax) *pmax = *i;
}
return 0;
}
int main()
{
int tn[] = { 12, 23, 36, 5, 46, 9, 25 };
int min, max, r;
r = minmax(tn, sizeof(tn) / sizeof(int), &min, &max);
printf("Min, Max : %d %d\n", min, max);
return 0;
}
Exercice 3 :
Écrire une fonction qui a en paramètre une chaîne de caractères et qui renvoie par un return le
nombre d'occurrences de la lettre 'A'. Cette fonction devra parcourir la chaîne en utilisant un
pointeur. Tester cette fonction.
#include <stdio.h>
int countA(const char *p)
{
int count = 0;
while (*p != '\0' && *p != '\n') // Ajout de *p != '\n' pour ignorer
le saut de ligne
{
if (*p == 'A') count++;
p++;
}
return count;
}
int main()
{
char str[100];
printf("Saisissez une chaîne de caractères : ");
fgets(str, sizeof(str), stdin);
int result = countA(str);
printf("La chaîne comporte %d occurrences de la lettre 'A'.\n",
result);
return 0;
}
Exercice 4 :
Écrire un programme en langage C qui permet de gérer les informations des étudiants d'une
institution universitaire. Le programme doit être structuré en trois parties :
Partie 1 : Déclaration et utilisation des structures
1. Déclarer une structure DateNaisRepere qui contient les champs suivants :
[Link] 2
o jour : un entier représentant le jour de naissance.
o mois : un entier représentant le mois de naissance.
o annee : un entier représentant l'année de naissance.
2. Déclarer une structure EtudiantRepere qui contient les champs suivants :
o nom : un tableau de 50 caractères pour le nom de l'étudiant.
o age : un entier représentant l'âge de l'étudiant.
o note : un entier représentant la note de l'étudiant.
o dateNaissance : un champ de type DateNaisRepere représentant la date de
naissance de l'étudiant.
3. Écrire une fonction lireEtudiant qui lit les informations d'un étudiant à partir de
l'entrée standard.
4. Écrire une fonction afficherEtudiant qui affiche les informations d'un étudiant.
Partie 2 : Utilisation des tableaux
1. Écrire une fonction lireTableauEtudiants qui lit les informations d'un tableau
d'étudiants de taille spécifiée (exemple tableau de 2 étudiants).
2. Écrire une fonction afficherTableauEtudiants qui affiche les informations d'un
tableau d'étudiants.
Partie 3 : Calcul de la somme des notes avec une fonction récursive
1. Écrire une fonction récursive sommeNotesRecursif pour calculer la somme des notes
des étudiants dans un tableau.
2. Écrire une fonction calculerMoyenne qui utilise la fonction précédente pour calculer
la moyenne des notes des étudiants.
3. Dans le programme principal (main), après avoir lu et affiché les informations des
étudiants, afficher la moyenne des notes.
4. Résultat attendu
Combien d'étudiants voulez-vous entrer ? 2
Lecture des informations pour l'étudiant 1 :
Entrez le nom de l'étudiant : Alami
Entrez l'âge de l'étudiant : 20
Entrez la note de l'étudiant : 12
Entrez la date de naissance (jour mois année) : 15 9 2002
Lecture des informations pour l'étudiant 2 :
Entrez le nom de l'étudiant : Hassan
Entrez l'âge de l'étudiant : 22
Entrez la note de l'étudiant : 16
Entrez la date de naissance (jour mois année) : 10 3 2001
Informations pour l'étudiant 1 :
Alami, 20 ans, 12/20, né le 15/09/2002
Informations pour l'étudiant 2 :
Hassan, 22 ans, 16/20, né le 10/03/2001
La moyenne des notes est : 14.00
[Link] 3
#include <stdio.h>
// Déclaration de la structure DateNaisRepere
typedef struct {
int jour;
int mois;
int annee;
} DateNaisRepere;
// Déclaration de la structure EtudiantRepere
typedef struct {
char nom[50];
int age;
int note;
DateNaisRepere dateNaissance;
} EtudiantRepere;
// Fonction pour lire les informations d'un étudiant
void lireEtudiant(EtudiantRepere *etudiant) {
printf("Entrez le nom de l'étudiant : ");
scanf("%s", etudiant->nom);
printf("Entrez l'âge de l'étudiant : ");
scanf("%d", &etudiant->age);
printf("Entrez la note de l'étudiant : ");
scanf("%d", &etudiant->note);
printf("Entrez la date de naissance (jour mois année) : ");
scanf("%d %d %d", &etudiant->[Link], &etudiant-
>[Link], &etudiant->[Link]);
}
// Fonction pour afficher les informations d'un étudiant
void afficherEtudiant(const EtudiantRepere *etudiant) {
printf("\nInformations de l'étudiant :\n");
printf("Nom : %s\n", etudiant->nom);
printf("Âge : %d\n", etudiant->age);
printf("Note : %d\n", etudiant->note);
printf("Date de naissance : %02d/%02d/%04d\n", etudiant-
>[Link], etudiant->[Link], etudiant-
>[Link]);
}
#define MAX_ETUDIANTS 100
// Fonction pour lire un tableau d'étudiants
void lireTableauEtudiants(EtudiantRepere etudiants[], int taille) {
for (int i = 0; i < taille; i++) {
printf("\nLecture des informations de l'étudiant %d :\n", i + 1);
lireEtudiant(&etudiants[i]);
}
}
// Fonction pour afficher un tableau d'étudiants
void afficherTableauEtudiants(const EtudiantRepere etudiants[], int
taille) {
for (int i = 0; i < taille; i++) {
printf("\nInformations de l'étudiant %d :\n", i + 1);
afficherEtudiant(&etudiants[i]);
[Link] 4
}
}
// Fonction récursive pour calculer la somme des notes des étudiants
int sommeNotesRecursif(const EtudiantRepere etudiants[], int taille) {
if (taille == 0) {
return 0;
}
return etudiants[taille - 1].note + sommeNotesRecursif(etudiants,
taille - 1);
}
// Fonction pour calculer la moyenne des notes
float calculerMoyenne(const EtudiantRepere etudiants[], int taille) {
if (taille == 0) {
return 0.0;
}
int somme = sommeNotesRecursif(etudiants, taille);
return (float)somme / taille;
}
int main() {
EtudiantRepere etudiants[MAX_ETUDIANTS];
int taille;
printf("Entrez le nombre d'étudiants (max %d) : ", MAX_ETUDIANTS);
scanf("%d", &taille);
if (taille > 0 && taille <= MAX_ETUDIANTS) {
lireTableauEtudiants(etudiants, taille);
afficherTableauEtudiants(etudiants, taille);
float moyenne = calculerMoyenne(etudiants, taille);
printf("\nMoyenne des notes des étudiants : %.2f\n", moyenne);
} else {
printf("Nombre d'étudiants invalide.\n");
}
return 0;
}
[Link] 5