#include <stdio.h> #include <stdlib.h> main() { /* Prototype de la fonction FUSION */ void FUSION(int *A, int *B, int *FUS, int N, int M); /* Déclarations : */ /* Noms des fichiers et pointeurs de référence */ char FICH_A[30], FICH_B[30], FICH_FUS[30]; FILE *FA, *FB, *FFUS; /* Autres variables */ int *TABA, *TABB, *TFUS; /* pointeurs pour les tableaux */ int LA, LB; /* Longueurs de FA et FB */ int N; /* Nombre lu ou écrit dans un fichier */ int I; /* Indice d'aide */ /* Ouverture du fichier FA en lecture */ do { printf("Nom du fichier FA : "); scanf("%s", FICH_A); FA = fopen(FICH_A, "r"); if (!FA) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", FICH_A); } while (!FA); /* Détection de la longueur de FA */ for (LA=0; !feof(FA); LA++) fscanf(FA,"%d\n", &N); /* Fermeture du fichier FA */ fclose(FA); /* Allocation de la mémoire pour TABA */ TABA = malloc (LA*sizeof(int)); if (!TABA) { printf("\a Pas assez de mémoire pour TABA\n"); exit(-1); } /* Réouverture du fichier FA en lecture */ FA = fopen(FICH_A, "r"); /* Copie du contenu de FA dans TABA */ for (I=0; I<LA; I++) fscanf(FA,"%d\n", TABA+I); /* Fermeture du fichier FA */ fclose(FA); /* Mêmes opérations pour FB : */ /* Ouverture du fichier FB en lecture */ do { printf("Nom du fichier FB : "); scanf("%s", FICH_B); FB = fopen(FICH_B, "r"); if (!FB) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", FICH_B); } while (!FB); /* Détection de la longueur de FB */ for (LB=0; !feof(FB); LB++) fscanf(FB,"%d\n", &N); /* Fermeture du fichier FB */ fclose(FB); /* Allocation de la mémoire pour TABB */ TABB = malloc (LB*sizeof(int)); if (!TABB) { printf("\a Pas assez de mémoire pour TABB\n"); exit(-1); } /* Réouverture du fichier FB en lecture */ FB = fopen(FICH_B, "r"); /* Copie du contenu de FB dans TABB */ for (I=0; I<LB; I++) fscanf(FB,"%d\n", TABB+I); /* Fermeture du fichier FB */ fclose(FB); /* Allocation de la mémoire pour TFUS */ TFUS = malloc ((LA+LB)*sizeof(int)); if (!TFUS) { printf("\a Pas assez de mémoire pour TFUS\n"); exit(-1); } /* Fusion des tableaux TA et TB dans TFUS */ FUSION (TABA, TABB, TFUS, LA, LB); /* Ouverture du fichier FFUS en écriture */ do { printf("Nom du fichier FFUS : "); scanf("%s", FICH_FUS); FFUS = fopen(FICH_FUS, "w"); if (!FFUS) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", FICH_FUS); } while (!FFUS); /* Copier le contenu de TFUS dans FFUS */ for (I=0; I<(LA+LB); I++) fprintf(FFUS,"%d\n", *(TFUS+I)); /* Fermeture du fichier FFUS */ fclose(FFUS); return 0; } void FUSION(int *A, int *B, int *FUS, int N, int M) { /* Variables locales */ /* Indices courants dans A, B et FUS */ int IA,IB,IFUS; /* Fusion de A et B dans FUS */ IA=0, IB=0; IFUS=0; while ((IA<N) && (IB<M)) if (*(A+IA)<*(B+IB)) { *(FUS+IFUS)=*(A+IA); IFUS++; IA++; } else { FUS[IFUS]=B[IB]; IFUS++; IB++; } /* Si A ou B sont arrivés à la fin, alors */ /* copier le reste de l'autre tableau. */ while (IA<N) { *(FUS+IFUS)=*(A+IA); IFUS++; IA++; } while (IB<M) { *(FUS+IFUS)=*(B+IB); IFUS++; IB++; } }