Modèles et formulaires

Guide : Implémenter get_iemedans des fichiers avec tableaux circulaires en C

×

Recommandés

La fonction get_iemepermet de récupérer le i-ème élément d’un fichier implémenté en tableau circulaire. Ce guide vous expliquera comment intégrer cette fonctionnalité dans un programme C qui gère des fichiers en tableaux circulaires.


1. Objectif deget_ieme

La fonction get_iemedoit permettre de récupérer l’élément situé à une position spécifique dans un fichier circulaire sans le retirer. Le fichier est géré sous forme de tableau circulaire.


2. Prérequis

Pour intégrer get_ieme, nous devons disposer les éléments suivants dans la structure de la fiche circulaire :

  • Un tableau : Pour stocker les données.
  • Un indexhead : Pointant vers le début de la file.
  • Un indextail : Pointant vers la position suivante pour l’insertion.
  • La capacité : Taille maximale du fichier.
  • La taille actuelle : Nombre d’éléments dans le fichier.

3. Structure et Fonctions de Base

Structure du fichier

 typedef struct {
int *data; // Tableau pour stocker les éléments
int capacity; // Capacité maximale du tableau
int head; // Indice du premier élément
int tail; // Indice du prochain emplacement d'insertion
int size; // Nombre d'éléments actuels
} CircularQueue;

Initialisation du fichier

 void initializeQueue(CircularQueue *queue, int capacity) {
queue->data = (int *)malloc(capacity * sizeof(int));
if (queue->data == NULL) {
printf("Erreur d'allocation mémoire.\n");
exit(1);
}
queue->capacity = capacity;
queue->head = 0;
queue->tail = 0;
queue->size = 0;
}

4. Mise en œuvre deget_ieme

Description deget_ieme

  • Mais : Récupérer l’élément situé à la position i(i-ème élément) sans modifier le fichier.
  • Conditions préalables :
    • La position idoit être valide (0 ≤ i < taille actuelle du fichier).
    • Le fichier ne doit pas être vide.
  • Approche :
    • L’index circulaire de l’élément peut être calculé avec :cCopier le codeindex = (head + i) % capacity;

Code deget_ieme

 int get_ieme(CircularQueue *queue, int i, int *value) {
if (i < 0 || i >= queue->size) {
return -1; // Indice invalide
}

int index = (queue->head + i) % queue->capacity; // Calcul de l'indice circulaire
*value = queue->data[index];
return 0; // Succès
}

5. Code complet avec exemple

Voici un programme complet intégrant get_ieme:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
int *data; // Tableau pour stocker les éléments
int capacity; // Capacité maximale
int head; // Indice du premier élément
int tail; // Indice du prochain emplacement d'insertion
int size; // Nombre d'éléments actuels
} CircularQueue;

// Initialisation de la file
void initializeQueue(CircularQueue *queue, int capacity) {
queue->data = (int *)malloc(capacity * sizeof(int));
if (queue->data == NULL) {
printf("Erreur d'allocation mémoire.\n");
exit(1);
}
queue->capacity = capacity;
queue->head = 0;
queue->tail = 0;
queue->size = 0;
}

// Ajouter un élément à la file
int enqueue(CircularQueue *queue, int value) {
if (queue->size == queue->capacity) {
return -1; // La file est pleine
}
queue->data[queue->tail] = value;
queue->tail = (queue->tail + 1) % queue->capacity; // Gestion circulaire


queue->size++;
return 0;
}

// Retirer un élément de la file
int dequeue(CircularQueue *queue, int *value) {
if (queue->size == 0) {
return -1; // La file est vide
}
*value = queue->data[queue->head];
queue->head = (queue->head + 1) % queue->capacity; // Gestion circulaire
queue->size--;
return 0;
}

// Récupérer le i-ème élément de la file
int get_ieme(CircularQueue *queue, int i, int *value) {
if (i < 0 || i >= queue->size) {
return -1; // Indice invalide
}

int index = (queue->head + i) % queue->capacity; // Calcul de l'indice circulaire
*value = queue->data[index];
return 0; // Succès
}

// Libérer la mémoire de la file
void freeQueue(CircularQueue *queue) {
free(queue->data);
queue->data = NULL;
queue->capacity = queue->head = queue->tail = queue->size = 0;
}

// Programme principal
int main() {
CircularQueue queue;
initializeQueue(&queue, 5); // Capacité de la file : 5

// Ajout d'éléments dans la file
enqueue(&queue, 10);
enqueue(&queue, 20);
enqueue(&queue, 30);
enqueue(&queue, 40);
enqueue(&queue, 50);

// Récupérer le i-ème élément sans le retirer
int value;
for (int i = 0; i < queue.size; i++) {
if (get_ieme(&queue, i, &value) == 0) {
printf("Élément %d : %d\n", i, value);
} else {
printf("Impossible de récupérer l'élément %d\n", i);
}
}

// Libérer la mémoire
freeQueue(&queue);
return 0;
}

6. Fonctionnement du programme

  1. Initialisation :
    • Un fichier circulaire de capacité 5 est créé.
  2. Insertion ( enqueue) :
    • Cinq éléments (10, 20, 30, 40, 50) sont insérés dans le fichier.
  3. Accès avecget_ieme :
    • La fonction get_iemepermet de récupérer chaque élément sans modifier le fichier.
  4. Libération :
    • La mémoire développée dynamiquement est libérée à la fin.

7. Résultats

Si vous exécutez le programme, vous obtiendrez la sortie suivante :

 Élément 0 : 10
Élément 1 : 20
Élément 2 : 30
Élément 3 : 40
Élément 4 : 50

8. Points Clés

  1. Validité de l’indice :
    • La position idoit être comprise entre 0et queue->size - 1.
  2. Gestion circulaire :
    • L’index circulaire est calculé avec (head + i) % capacity.
  3. Indépendance :
    • get_iemene modifiez pas le fichier, contrairement à dequeue.

9. Extensions

  • Rendre get_iemethread-safe : Utilisez des verrous ou des fonctions atomiques pour sécuriser l’accès dans un environnement multithread.
  • Support pour types génériques : Remplacez le type intpar void *pour gérer différents types de données.
  • Gestion dynamique : Ajoutez une fonctionnalité pour augmenter la taille du fichier lorsque nécessaire.

Recommandés

AZ

Recent Posts

Outils interactifs : Cartographie des processus et grille d’audit interne ISO 9001

Deux outils concrets pour piloter la qualité sans alourdir vos équipes Un système qualité n’avance…

7 heures ago

Exemple de fiche de préparation de chantier

Un chantier se gagne souvent avant même l’arrivée des équipes. Quand tout est clair dès…

1 jour ago

Texte argumentatif sur le mariage forcé

Le mariage a du sens quand il repose sur une décision libre, mûrie et partagée.…

1 jour ago

Étude de cas en droit : Modèle Word à suivre

Une étude de cas réussie commence par une structure sûre. Ce modèle Word vous guide…

4 jours ago

Soft skills : la liste A à Z interactive pour trier, comparer et choisir vos compétences clés

Les soft skills se repèrent vite sur une fiche, mais elles ne pèsent vraiment que…

4 jours ago

Comparateur de verres progressifs

Outil de comparaison et repérage des offres étudiantes Choisir des verres progressifs ressemble rarement à…

5 jours ago

This website uses cookies.