Traitement de données et gestion de fichiers en C

Analyse statistique d'un fichier texte

L'objectif de cette section est de lire un fichier texte et d'en extraire des métriques de base, notamment le nombre total de lignes et le nombre de caractères significatifs (en excluant les espaces blancs et les tabulations). L'utilisation de la bibliothèque standard permet une lecture caractère par caractère optimisée.

#include <stdio.h>
#include <ctype.h>

int main() {
    FILE *file_ptr = fopen("data4.txt", "r");
    if (file_ptr == NULL) {
        perror("Erreur lors de l'ouverture du fichier");
        return 1;
    }

    int total_lines = 0;
    int valid_chars = 0;
    char current_char;

    while ((current_char = fgetc(file_ptr)) != EOF) {
        if (current_char == '\n') {
            total_lines++;
        } else if (!isspace((unsigned char)current_char)) {
            valid_chars++;
        }
    }

    fclose(file_ptr);

    printf("Rapport d'analyse pour data4.txt:\n");
    printf("Nombre total de lignes : %d\n", total_lines);
    printf("Nombre de caractères (hors espaces) : %d\n", valid_chars);

    return 0;
}

Gestion de données sturcturées pour un système d'examen

Cette partie démontre l'utilisation des structures en C pour gérer des enregistrements compelxes. Le programme charge les notes des candidats depuis un fichier source, calcule les scores totaux, détermine le statut d'admission basé sur un seuil, et exporte les résultats des candidats reçus dans un fichier dédié.

#include <stdio.h>
#include <string.h>

#define MAX_CANDIDATES 10
#define PASS_THRESHOLD 60.0

typedef struct {
    int reg_number;
    char full_name[25];
    float theory_score;
    float practice_score;
    float total_score;
    char status[15];
} Candidate;

void load_data(Candidate list[], int size);
void evaluate_results(Candidate list[], int size);
void print_results(const Candidate list[], int size);
void save_passed(const Candidate list[], int size);

int main() {
    Candidate candidates[MAX_CANDIDATES];

    printf("Chargement des données de %d candidats...\n", MAX_CANDIDATES);
    load_data(candidates, MAX_CANDIDATES);

    printf("Évaluation des résultats...\n");
    evaluate_results(candidates, MAX_CANDIDATES);

    printf("\nListe complète des résultats:\n");
    print_results(candidates, MAX_CANDIDATES);

    save_passed(candidates, MAX_CANDIDATES);

    int passed_count = 0;
    for(int i = 0; i < MAX_CANDIDATES; i++) {
        if(strcmp(candidates[i].status, "Admis") == 0) passed_count++;
    }

    float success_rate = (float)passed_count / MAX_CANDIDATES * 100.0;
    printf("\nTaux de réussite global : %.2f%%\n", success_rate);

    return 0;
}

void load_data(Candidate list[], int size) {
    FILE *input_file = fopen("examinee.txt", "r");
    if (!input_file) {
        perror("Impossible de lire examinee.txt");
        return;
    }
    for (int i = 0; i < size; i++) {
        fscanf(input_file, "%d %s %f %f", 
               &list[i].reg_number, list[i].full_name, 
               &list[i].theory_score, &list[i].practice_score);
    }
    fclose(input_file);
}

void evaluate_results(Candidate list[], int size) {
    for (int i = 0; i < size; i++) {
        list[i].total_score = list[i].theory_score + list[i].practice_score;
        strcpy(list[i].status, (list[i].total_score >= PASS_THRESHOLD) ? "Admis" : "Échoué");
    }
}

void print_results(const Candidate list[], int size) {
    printf("%-10s %-15s %-10s %-10s %-10s %-10s\n", 
           "ID", "Nom", "Théorie", "Pratique", "Total", "Statut");
    for (int i = 0; i < size; i++) {
        printf("%-10d %-15s %-10.2f %-10.2f %-10.2f %-10s\n", 
               list[i].reg_number, list[i].full_name, 
               list[i].theory_score, list[i].practice_score, 
               list[i].total_score, list[i].status);
    }
}

void save_passed(const Candidate list[], int size) {
    FILE *output_file = fopen("list_pass.txt", "w");
    if (!output_file) {
        perror("Impossible de créer list_pass.txt");
        return;
    }

    fprintf(output_file, "%-10s %-15s %-10s %-10s %-10s %-10s\n", 
            "ID", "Nom", "Théorie", "Pratique", "Total", "Statut");

    for (int i = 0; i < size; i++) {
        if (strcmp(list[i].status, "Admis") == 0) {
            fprintf(output_file, "%-10d %-15s %-10.2f %-10.2f %-10.2f %-10s\n", 
                    list[i].reg_number, list[i].full_name, 
                    list[i].theory_score, list[i].practice_score, 
                    list[i].total_score, list[i].status);
        }
    }
    fclose(output_file);
    printf("Les candidats admis ont été enregistrés dans list_pass.txt\n");
}

Tirage au sort et exportation de résultats

Cette dernière section aborde la sélection aléatoire d'éléments à partir d'une liste chargée en mémoire. Le script extrrait un nombre défini de gagnants uniques en évitant les doublons, affiche leurs informations et sauvegarde le résultat final dans un fichier cible spécifié dynamiquement par l'utilisateur.

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

#define MAX_ENTRIES 100
#define WINNERS_COUNT 5

int is_already_selected(int selected[], int count, int index) {
    for (int i = 0; i < count; i++) {
        if (selected[i] == index) return 1;
    }
    return 0;
}

int main() {
    char entries[MAX_ENTRIES][MAX_ENTRIES];
    char output_filename[50];
    int total_entries = 0;

    FILE *input_file = fopen("list.txt", "r");
    if (!input_file) {
        perror("Erreur d'ouverture de list.txt");
        return 1;
    }

    while (fgets(entries[total_entries], MAX_ENTRIES, input_file) != NULL) {
        entries[total_entries][strcspn(entries[total_entries], "\n")] = 0;
        total_entries++;
    }
    fclose(input_file);

    if (total_entries < WINNERS_COUNT) {
        printf("Pas assez de participants pour le tirage.\n");
        return 1;
    }

    srand((unsigned int)time(NULL));

    int winners[WINNERS_COUNT];
    int drawn_count = 0;

    while (drawn_count < WINNERS_COUNT) {
        int random_index = rand() % total_entries;
        if (!is_already_selected(winners, drawn_count, random_index)) {
            winners[drawn_count] = random_index;
            drawn_count++;
        }
    }

    printf("--------- Liste des gagnants ---------\n");
    for (int i = 0; i < drawn_count; i++) {
        printf("%s\n", entries[winners[i]]);
    }

    printf("Entrez le nom du fichier de sortie : ");
    scanf("%s", output_filename);

    FILE *output_file = fopen(output_filename, "w");
    if (!output_file) {
        perror("Erreur de création du fichier de sortie");
        return 1;
    }

    for (int i = 0; i < drawn_count; i++) {
        fprintf(output_file, "%s\n", entries[winners[i]]);
    }

    fclose(output_file);
    printf("Sauvegarde des gagnants réussie.\n");

    return 0;
}

Étiquettes: C-Language file-io struct randomization

Publié le 9 juillet à 07h53