Exercice 11.16
#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++;
}
}
Feedback - Copyright © 1993,1996,1997 F.Faber