我做了一个合并排序程序,但它让你有机会按名称排序(nombre选项3),id(dni选项1)或出生(fecha de nacimiento选项2)
事情是,通过id或出生它完美地工作但是当选择出生时它并没有显示最初发送的所有配置文件:
获取信息的主要文件是:
martincurzel 38937133 21/11/1996
fernandocardozo 14588898 12/06/1970
agustincastellano 24365211 30/05/1985
juanpardo 35459896 02/10/1994
joaquinazorda 28741536 04/06/1988
martakim 26544153 04/03/1986
juliagonzales 21458763 24/11/1974
pedroquiroga 45668745 22/04/1994
nicolasweinber 34125652 14/07/1988
carlagarcia 40412478 03/04/1964
paulafeiman 38746369 04/04/1983
federicoazurraga 11445696 31/12/1989
horaciofernandez 54769956 21/06/1985
hernancrespo 22045369 22/10/1988
mariagonzales 43568744 15/04/2002
soladmiral 22457869 31/05/1979
oliverutirriaga 40412536 23/07/2000
paulapomez 12445687 14/01/1956
walterdominguez 32877999 17/02/1978
florenciahurni 33415222 22/11/1988
oscardias 14784411 25/12/1977
camilaoraidea 9547698 23/04/1935
gabrielduarte 19963351 12/07/1969
damianbogado 39478555 04/03/1999
ulisesiralon 48745737 14/06/2003
kevinpolman 39789412 02/07/1997
ricardoreinas 14746966 04/05/1964
joselopez 21458700 14/02/1975
gustavocordera 47859634 11/07/1970
代码是这样的:
#include <stdio.h>
#include <string.h>
typedef struct
{
int d;
int m;
int a;
}tfecha;
int TAM = 15;
typedef struct
{
char nombre[20];
unsigned int dni;
tfecha nac;
}tperfil;
void sort(tperfil *a,int b)
{
int i, j,re;
tperfil temp;
if(b == 1)
{
for (i=1; i<15; i++)
for (j=0; j<15 - i; j++)
if (a[j].dni > a[j+1].dni)
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
else if (b == 2)
{
for (i=1; i<TAM; i++)
for (j=0; j<15 - i; j++)
if (a[j].nac.a > a[j+1].nac.a)
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
else if(a[j].nac.a == a[j+1].nac.a)
{
if (a[j].nac.m > a[j+1].nac.m)
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
else if(a[j].nac.m == a[j+1].nac.m)
{
if(a[j].nac.d > a[j+1].nac.d)
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
else if(b == 3)
{
for (i=1; i<15; i++)
for (j=0; j<15 - i; j++){
re=strcmp(a[j].nombre, a[j+1].nombre);
if (re>0)
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}}
}
void mergesort(char archivo[], char archivo1[], FILE *file, const int h)
{
int dia, dia1, mes, mes1, ano, ano1;
unsigned int dni, dni1;
char nombre[20], nombre1[20];
int re=0;
tperfil buffer[2];
FILE *arch;
FILE *arch1;
arch = fopen(archivo, "rt");
arch1 = fopen(archivo1, "rt");
fscanf(arch, "%s %u %i/%i/%i", &nombre, &dni, &dia, &mes, &ano);
strcpy(buffer[0].nombre, nombre);
buffer[0].dni=dni;
buffer[0].nac.d=dia;
buffer[0].nac.m=mes;
buffer[0].nac.a=ano;
fscanf(arch1, "%s %u %i/%i/%i", &nombre1, &dni1, &dia1, &mes1, &ano1);
strcpy(buffer[1].nombre, nombre1);
buffer[1].dni=dni1;
buffer[1].nac.d=dia1;
buffer[1].nac.m=mes1;
buffer[1].nac.a=ano1;
if(h==1)
{
while((dia < 99) && (dia1 <= 99))
{
if(buffer[0].dni < buffer[1].dni)
{
fprintf(file, "%s %u %i/%i/%i\n", buffer[0].nombre, buffer[0].dni, buffer[0].nac.d, buffer[0].nac.m, buffer[0].nac.a);
fscanf(arch, "%s %u %i/%i/%i", &nombre, &dni, &dia, &mes, &ano);
strcpy(buffer[0].nombre, nombre);
buffer[0].dni=dni;
buffer[0].nac.d=dia;
buffer[0].nac.m=mes;
buffer[0].nac.a=ano;
}
else
{
fprintf(file, "%s %u %i/%i/%i\n", buffer[1].nombre, buffer[1].dni, buffer[1].nac.d, buffer[1].nac.m, buffer[1].nac.a);
fscanf(arch1, "%s %u %i/%i/%i", &nombre1, &dni1, &dia1, &mes1, &ano1);
strcpy(buffer[1].nombre, nombre1);
buffer[1].dni=dni1;
buffer[1].nac.d=dia1;
buffer[1].nac.m=mes1;
buffer[1].nac.a=ano1;
}
}
fprintf(file, "zzzzzzzzzz 999999999 99/99/9999");
fclose(arch);
fclose(arch1);
remove(archivo);
remove(archivo1);
}
if (h==2){
while((dia < 99) && (dia1 <= 99))
{
if(buffer[0].nac.a < buffer[1].nac.a)
{
fprintf(file, "%s %u %i/%i/%i\n", buffer[0].nombre, buffer[0].dni, buffer[0].nac.d, buffer[0].nac.m, buffer[0].nac.a);
fscanf(arch, "%s %u %i/%i/%i", &nombre, &dni, &dia, &mes, &ano);
strcpy(buffer[0].nombre, nombre);
buffer[0].dni=dni;
buffer[0].nac.d=dia;
buffer[0].nac.m=mes;
buffer[0].nac.a=ano;
}
else if (buffer[0].nac.a == buffer[1].nac.a){
if(buffer[0].nac.m < buffer[1].nac.m){
fprintf(file, "%s %u %i/%i/%i\n", buffer[0].nombre, buffer[0].dni, buffer[0].nac.d, buffer[0].nac.m, buffer[0].nac.a);
fscanf(arch, "%s %u %i/%i/%i", &nombre, &dni, &dia, &mes, &ano);
strcpy(buffer[0].nombre, nombre);
buffer[0].dni=dni;
buffer[0].nac.d=dia;
buffer[0].nac.m=mes;
buffer[0].nac.a=ano;
}
else if(buffer[0].nac.m == buffer[1].nac.m){
if(buffer[0].nac.d < buffer[1].nac.d){
fprintf(file, "%s %u %i/%i/%i\n", buffer[0].nombre, buffer[0].dni, buffer[0].nac.d, buffer[0].nac.m, buffer[0].nac.a);
fscanf(arch, "%s %u %i/%i/%i", &nombre, &dni, &dia, &mes, &ano);
strcpy(buffer[0].nombre, nombre);
buffer[0].dni=dni;
buffer[0].nac.d=dia;
buffer[0].nac.m=mes;
buffer[0].nac.a=ano;
}
else{
fprintf(file, "%s %u %i/%i/%i\n", buffer[1].nombre, buffer[1].dni, buffer[1].nac.d, buffer[1].nac.m, buffer[1].nac.a);
fscanf(arch1, "%s %u %i/%i/%i", &nombre1, &dni1, &dia1, &mes1, &ano1);
strcpy(buffer[1].nombre, nombre1);
buffer[1].dni=dni1;
buffer[1].nac.d=dia1;
buffer[1].nac.m=mes1;
buffer[1].nac.a=ano1;
}
}
else{
fprintf(file, "%s %u %i/%i/%i\n", buffer[1].nombre, buffer[1].dni, buffer[1].nac.d, buffer[1].nac.m, buffer[1].nac.a);
fscanf(arch1, "%s %u %i/%i/%i", &nombre1, &dni1, &dia1, &mes1, &ano1);
strcpy(buffer[1].nombre, nombre1);
buffer[1].dni=dni1;
buffer[1].nac.d=dia1;
buffer[1].nac.m=mes1;
buffer[1].nac.a=ano1;
}
}
else
{
fprintf(file, "%s %u %i/%i/%i\n", nombre1, dni1, dia1, mes1, ano1);
fscanf(arch1, "%s %u %i/%i/%i", &nombre1, &dni1, &dia1, &mes1, &ano1);
strcpy(buffer[1].nombre, nombre1);
buffer[1].dni=dni1;
buffer[1].nac.d=dia1;
buffer[1].nac.m=mes1;
buffer[1].nac.a=ano1;
}
}
fprintf(file, "zzzzzzzzzz 999999999 99/99/9999");
fclose(arch);
fclose(arch1);
remove(archivo);
remove(archivo1);
}
if(h==3)
{
while((dia < 99) && (dia1 <= 99))
{
re=strcmp(buffer[0].nombre , buffer[1].nombre);
if(re<0)
{
fprintf(file, "%s %u %i/%i/%i\n", buffer[0].nombre, buffer[0].dni, buffer[0].nac.d, buffer[0].nac.m, buffer[0].nac.a);
fscanf(arch, "%s %u %i/%i/%i", &nombre, &dni, &dia, &mes, &ano);
strcpy(buffer[0].nombre, nombre);
buffer[0].dni=dni;
buffer[0].nac.d=dia;
buffer[0].nac.m=mes;
buffer[0].nac.a=ano;
}
else
{
fprintf(file, "%s %u %i/%i/%i\n", nombre1, dni1, dia1, mes1, ano1);
fscanf(arch1, "%s %u %i/%i/%i", &nombre1, &dni1, &dia1, &mes1, &ano1);
strcpy(buffer[1].nombre, nombre1);
buffer[1].dni=dni1;
buffer[1].nac.d=dia1;
buffer[1].nac.m=mes1;
buffer[1].nac.a=ano1;
}
}
fprintf(file, "zzzzzzzzzz 999999999 99/99/9999");
fclose(arch);
fclose(arch1);
remove(archivo);
remove(archivo1);
}
}
void ordenacion(char *a, int *g, int *h)
{
int i, j, dia, mes, ano;
int u = 0;
printf("Sort by DNI(opcion 1) or sort by birth (opcion 2), or by name (opcion 3) \n");
scanf("%i", h);
unsigned int dni;
char nombre[20];
tperfil buffer[16];
FILE *fichero;
fichero = fopen (a, "rt");
while (!feof(fichero))
{
char str[10];
strcpy(str, "Parte");
char *num[] = {"01.txt","02.txt","03.txt","04.txt","05.txt","06.txt","07.txt","08.txt","09.txt","10.txt","11.txt","12.txt","13.txt","14.txt","15.txt"};
strcat(str, num[u]);
FILE *arch;
arch = fopen (str, "a");
for(i=0; i<TAM; i++)
{
if(!feof(fichero))
{fscanf(fichero, "%s %u %i/%i/%i", &nombre, &dni, &dia, &mes, &ano);
strcpy(buffer[i].nombre, nombre);
buffer[i].dni=dni;
buffer[i].nac.d=dia;
buffer[i].nac.m=mes;
buffer[i].nac.a=ano;}
else
{
strcpy(buffer[i].nombre, "zzzzzzzzzz");
buffer[i].dni=999999999;
buffer[i].nac.d=99;
buffer[i].nac.m=99;
buffer[i].nac.a=9999;
}
}
sort(buffer, *h);
strcpy(buffer[15].nombre, "zzzzzzzzzz");
buffer[15].dni=999999999;
buffer[15].nac.d=99;
buffer[15].nac.m=99;
buffer[15].nac.a=9999;
for (i=0; i<=TAM;i++){
printf("%s %u %i/%i/%i\n", buffer[i].nombre, buffer[i].dni, buffer[i].nac.d, buffer[i].nac.m, buffer[i].nac.a);
}
for (i=0; i<=TAM; i++)
fprintf(arch, "%s %u %i/%i/%i\n", buffer[i].nombre, buffer[i].dni, buffer[i].nac.d, buffer[i].nac.m, buffer[i].nac.a);
fclose(arch);
u++;
}
*g = u;
fclose(fichero);
}
void partes(char p[20][20], const int g)
{
int f;
char str[10];
char *num[] = {"999","Parte01.txt","Parte02.txt","Parte03.txt","Parte04.txt","Parte05.txt","Parte06.txt","Parte07.txt","Parte08.txt","Parte09.txt","Parte10.txt","Parte11.txt","Parte12.txt","Parte13.txt","Parte14.txt","Parte15.txt"};
//printf("%i", g);
for(f=1; f <= g; f++)
{
strcpy(p[f],num[f]);
//printf("%s", p[f]);
}
}
void merge(char p[20][20], int g, const int h, const int c)
{
while(g > 1)
{
int i, j, dia, mes, ano;
int div, res, k, l, o;
unsigned int dni;
char nombre[20];
tperfil buffer[1];
div = g / 2;
res = g % 2;
if(div != 0)
{
for(k=0 ; k<div; k++)
{
FILE *fichero;
fichero = fopen("file.txt", "a");
mergesort(p[(k*2)+1], p[(k*2)+2], fichero, h);
fclose(fichero);
rename("file.txt", p[k+1]);
}
if(res == 1)
{
FILE *arch;
FILE *fichero1;
arch = fopen (p[g], "r");
fichero1 = fopen (p[div+1], "at");
fscanf(arch,"%s %u %i/%i/%i", &nombre, &dni, &dia, &mes, &ano);
strcpy(buffer[0].nombre, nombre);
buffer[0].dni=dni;
buffer[0].nac.d=dia;
buffer[0].nac.m=mes;
buffer[0].nac.a=ano;
while(dia < 99)
{
fprintf(fichero1, "%s %u %i/%i/%i\n", buffer[0].nombre, buffer[0].dni, buffer[0].nac.d, buffer[0].nac.m, buffer[0].nac.a);
fscanf(arch,"%s %u %i/%i/%i", &nombre, &dni, &dia, &mes, &ano);
strcpy(buffer[0].nombre, nombre);
buffer[0].dni=dni;
buffer[0].nac.d=dia;
buffer[0].nac.m=mes;
buffer[0].nac.a=ano;
}
fprintf(fichero1, "zzzzzzzzzz 999999999 99/99/9999\n");
fclose(arch);
remove(p[g]);
fclose(fichero1);
g=div+res;
}
g=div+res;
}
else break;
}
}
int main()
{
int cantpart, cont, opcion;
char arch[20];
char part[20][20];
printf("Ingresar el nombre del archivo con los datos:\n");
scanf("%s", arch);
//muestra(arch);
ordenacion(arch, &cantpart, &opcion);
partes(part, cantpart);
merge(part, cantpart, opcion, cont);
rename("Parte01.txt", "Lista.txt");
return 0;
}
所有这些代码行的主要焦点必须在mergesort中,因为初始排序的工作原理如printf所示:在控制台中显示:名为“Lista.txt”的结束文件向我显示以下内容:
agustincastellano 24365211 30/5/1985
camilaoraidea 9547698 23/4/1935
carlagarcia 40412478 3/4/1964
carlosfigueroa 50478731 14/6/2004
damianbogado 39478555 4/3/1999
facundokumis 50478741 14/5/2004
federicoazurraga 11445696 31/12/1989
fernandocardozo 14588898 12/6/1970
florenciahurni 33415222 22/11/1988
francolomero 22417444 24/11/1989
gabrielduarte 19963351 12/7/1969
gustavocordera 47859634 11/7/1970
horaciofernandez 54769956 21/6/1985
joaquinazorda 28741536 4/6/1988
joselopez 21458700 14/2/1975
juanpardo 35459896 2/10/1994
juliagonzales 21458763 24/11/1974
kevinpolman 39789412 2/7/1997
lucianochavez 15478855 25/12/1992
mariagonzales 43568744 15/4/2002
martakim 26544153 4/3/1986
martincurzel 38937133 21/11/1996
nicolasweinber 34125652 14/7/1988
oliverutirriaga 40412536 23/7/2000
oscardias 14784411 25/12/1977
paulafeiman 38746369 4/4/1983
paulapomez 12445687 14/1/1956
pedroquiroga 45668745 22/4/1994
zzzzzzzzzz 999999999 99/99/9999
原始.txt文件中有一些缺少4个配置文件或tperfiles 如果我运行完全相同的程序,而不是选项3(按名称排序)我选择1或2它完美地工作。