Ce programme en langage C permet d'analyser des graphes orientés pondérés à partir de fichiers texte.
Il automatise les étapes suivantes :
- Recherche de tous les fichiers texte (
.txt) présents dans le répertoire courant. - Choix interactif d'un fichier par l'utilisateur.
- Lecture de plusieurs graphes contenus dans ce fichier (un fichier peut en contenir plusieurs à la suite).
- Stockage de chaque graphe en mémoire sous forme de matrice d'adjacence.
- Affichage de tous les graphes disponibles et choix d'un graphe particulier.
- Application de l'algorithme de Floyd-Warshall au graphe choisi :
- calcul des plus courts chemins entre tous les couples de sommets,
- affichage des matrices intermédiaires à chaque étape de l'algorithme (matrices L et P),
- détection d'éventuels circuits absorbants (cycles de poids total négatif).
- Si aucun circuit absorbant n'est présent :
- interface interactive permettant de demander un plus court chemin entre deux sommets choisis,
- affichage de la longueur du chemin minimal,
- reconstruction du chemin lui-même (séquence des sommets traversés).
- Possibilité de traiter plusieurs graphes successivement sans quitter le programme.
Le programme est conçu pour une équipe débutante en C : il illustre à la fois :
- l'utilisation des bibliothèques standards du langage C,
- la manipulation de fichiers texte,
- les allocations dynamiques de mémoire,
- la gestion de tableaux à deux dimensions (matrices),
- l'implémentation d'un algorithme classique de théorie des graphes (Floyd-Warshall).
Le programme utilise plusieurs bibliothèques standards du C :
Bibliothèque standard d'entrée-sortie. Elle fournit :
| Fonction | Description |
|---|---|
printf |
Affichage formaté vers la sortie standard (le terminal) |
scanf |
Lecture formatée depuis l'entrée standard (le clavier) |
FILE |
Type représentant un fichier ouvert |
fopen |
Ouverture d'un fichier |
fclose |
Fermeture d'un fichier ouvert |
fscanf |
Lecture formatée depuis un fichier |
Bibliothèque standard utilitaire. Elle fournit notamment :
| Fonction | Description |
|---|---|
malloc |
Allocation dynamique de mémoire (sur le tas / heap) |
free |
Libération de la mémoire précédemment allouée par malloc |
Dans ce programme, malloc et free sont utilisés pour :
- allouer les matrices d'adjacence des graphes,
- allouer les matrices L et P de l'algorithme de Floyd-Warshall,
- allouer les structures de type
Graphe, - allouer les chaînes de caractères pour les noms de fichiers.
Cette bibliothèque introduit :
| Élément | Description |
|---|---|
bool |
Type booléen |
true |
Équivalent à 1 |
false |
Équivalent à 0 |
Dans le programme, ce type est utilisé pour les variables logiques, par exemple erreurLecture dans la fonction choixGraphe.
Bibliothèque de gestion des chaînes de caractères. Elle fournit :
| Fonction | Description |
|---|---|
strlen |
Longueur d'une chaîne de caractères |
strcmp |
Comparaison de deux chaînes (retourne 0 si identiques) |
strcpy |
Copie d'une chaîne dans une autre |
Ces fonctions sont utilisées dans estTxt et choixTxt.
Bibliothèque permettant la manipulation des répertoires. Elle fournit :
| Élément | Description |
|---|---|
DIR |
Type représentant un répertoire ouvert |
struct dirent |
Structure représentant une entrée de répertoire |
opendir |
Ouverture d'un répertoire |
readdir |
Lecture successive des entrées du répertoire |
closedir |
Fermeture du répertoire |
Bibliothèque qui fournit des constantes sur les limites des types entiers (INT_MAX, INT_MIN, etc.).
Utilisée pour définir une valeur de "pseudo-infini" :
#define INFINITY (INT_MAX / 4)Note : On prend
INT_MAX / 4au lieu deINT_MAXpour pouvoir encore additionner deux distances sans risque d'overflow.
#define MAX_FILES 100
#define MAX_LENGTH 256
#define MAX_GRAPHES 100
#define INFINITY (INT_MAX / 4)| Macro | Description |
|---|---|
MAX_FILES |
Nombre maximal de fichiers .txt à lister |
MAX_LENGTH |
Taille maximale d'un buffer pour lire des lignes |
MAX_GRAPHES |
Nombre maximal de graphes traités en mémoire |
INFINITY |
Valeur représentant "pas de chemin" ou "distance infinie" |
typedef struct {
int nbSommets;
int **adjMat;
} Graphe;| Champ | Description |
|---|---|
nbSommets |
Nombre de sommets du graphe (numérotés de 0 à n-1) |
adjMat |
Matrice d'adjacence de taille n × n |
La matrice d'adjacence adjMat est représentée comme un tableau de pointeurs (int**) :
adjMat[i][j]contient le poids de l'arête allant deiversj- Si aucune arête directe n'existe, la case vaut 0 puis
INFINITYdans les matrices de travail
Rôle : Déterminer si une chaîne de caractères nom se termine par l'extension .txt.
Algorithme :
- Calcul de la longueur par
strlen(nom) - Si longueur < 4, retourne 0
- Compare les 4 derniers caractères à
.txtavecstrcmp - Retourne 1 si correspondance, 0 sinon
Rôle :
- Lister tous les fichiers
.txtdans le répertoire courant - Permettre à l'utilisateur de choisir l'un d'eux
- Retourner le nom du fichier choisi (alloué dynamiquement)
Algorithme :
- Ouverture du répertoire courant avec
opendir(".") - Parcours des entrées avec
readdir(dir) - Filtrage avec
estTxt() - Affichage de la liste et choix utilisateur
- Retour du fichier choisi (à libérer avec
free)
Rôle : Allouer et libérer des matrices carrées n × n d'entiers.
allouerMatrice :
int** allouerMatrice(int n) {
int** m = malloc(n * sizeof(int*));
for (int i = 0; i < n; i++) {
m[i] = malloc(n * sizeof(int));
for (int j = 0; j < n; j++) {
m[i][j] = 0;
}
}
return m;
}libererMatrice :
void libererMatrice(int **m, int n) {
for (int i = 0; i < n; i++) {
free(m[i]);
}
free(m);
}Rôle : Afficher proprement une matrice d'entiers n × n.
Format d'affichage :
- Ligne d'en-tête avec les indices de colonnes
- Pour chaque case : valeur entière ou
.siINFINITY
Rôle :
- Lire plusieurs graphes dans un fichier
- Les stocker et les afficher
- Laisser l'utilisateur choisir celui à analyser
- Retourner ce graphe
Algorithme détaillé :
- Ouvrir le fichier avec
fopen(nomFichier, "r") - Pour chaque graphe :
- Lire
n(nombre de sommets) etm(nombre d'arêtes) - Allouer le graphe et sa matrice d'adjacence
- Lire les
marêtes (tripletsu v w)
- Lire
- Afficher tous les graphes disponibles
- Demander le choix utilisateur
- Libérer les graphes non sélectionnés
- Retourner le graphe choisi
Rôle : Afficher le chemin minimal de u à v en utilisant la matrice P.
Algorithme :
- Si
P[u][v] == -1: pas de chemin - Sinon : suivre les successeurs jusqu'à
v
Rôle : Appliquer l'algorithme de Floyd-Warshall au graphe, puis interagir avec l'utilisateur pour afficher des chemins minimaux.
Algorithme :
-
Initialisation des matrices L et P :
L[i][j] = 0sii == jL[i][j] = poidssi arête directe existeL[i][j] = INFINITYsinonP[i][j] = jsi arête directe,-1sinon
-
Boucle principale :
Pour chaque sommet intermédiaire k de 0 à n-1 : Pour chaque couple (i, j) : Si L[i][k] + L[k][j] < L[i][j] : L[i][j] = L[i][k] + L[k][j] P[i][j] = P[i][k] -
Détection de circuits absorbants :
- Si
L[i][i] < 0pour un sommeti, il y a un circuit absorbant
- Si
-
Interface utilisateur :
- Si pas de circuit absorbant, proposer d'afficher des chemins minimaux
Rôle : Coordonner l'exécution du programme.
Boucle principale :
- Appeler
choixTxt()pour obtenir un fichier - Appeler
choixGraphe(fichier)pour choisir un graphe - Appeler
floydWarshall(g)pour l'analyser - Libérer les ressources
- Proposer de traiter un autre graphe
Pour chaque graphe :
n
m
u1 v1 w1
u2 v2 w2
...
um vm wm
| Élément | Description |
|---|---|
n |
Nombre de sommets (numérotés de 0 à n-1) |
m |
Nombre d'arêtes |
ui vi wi |
Arête orientée de ui vers vi de poids wi |
Exemple :
3
3
0 1 4
1 2 5
0 2 10
4
4
0 1 1
1 2 2
2 3 3
0 3 10
Ce fichier contient deux graphes : le premier avec 3 sommets, le second avec 4 sommets.
Le programme montre comment :
- ✅ Manipuler des fichiers et répertoires en C
- ✅ Structurer des données (
struct Graphe, matrices) - ✅ Implémenter un algorithme non trivial (Floyd-Warshall)
- ✅ Gérer des allocations dynamiques et les libérer correctement
- ✅ Interagir avec un utilisateur via la console
| Fonction | Rôle |
|---|---|
estTxt |
Filtrer les noms de fichiers |
choixTxt |
Choisir un fichier de graphes |
allouerMatrice / libererMatrice |
Gérer les matrices |
afficherMatrice |
Représenter des matrices à l'écran |
choixGraphe |
Lire, stocker, afficher et choisir un graphe |
floydWarshall |
Cœur algorithmique (plus courts chemins + détection de cycles) |
afficherChemin |
Reconstruire un chemin minimal |
main |
Coordonner l'ensemble |