Exercice
Deux fichiers FA et FB dont les noms sont � entrer au clavier contiennent des nombres entiers tri�s dans l'ordre croissant. Ecrire un programme qui copie le contenu de FA et FB respectivement dans les tableaux TABA et TABB dans la m�moire centrale. Les tableaux TABA et TABB sont fusionn�s dans un troisi�me tableau tri� en ordre croissant TABC. Apr�s la fusion, la tableau TABC est sauv� dans un fichier FC dont le nom est � entrer au clavier.
La m�moire pour TABA, TABB et TFUS dont les nombres d'�l�ments sont inconnus, est r�serv�e dynamiquement apr�s que les longueurs des fichiers FA et FB ont �t� d�tect�es.
#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++;
}
}
La m�moire pour TABA, TABB et TFUS dont les nombres d'�l�ments sont inconnus, est r�serv�e dynamiquement apr�s que les longueurs des fichiers FA et FB ont �t� d�tect�es.
#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++;
}
}
No comments:
Post a Comment