#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <string.h>

struct persona
{
  char dni[12],nom[20],cog1[20],cog2[20],adre[20],pob[20];
  int cprov;
};

struct prov
{
  int codi;
  char nom[20];
};

void llegirnum(int min,int max, int *n)
{
 do
 {
  scanf("%d", n);fflush(stdin);
  if (*n < min || *n > max)
	printf("NO ES VALID ");
 }
 while(*n < min || *n > max);

}

int compdni(char dni[12])
{
 FILE *f;
 struct persona r;
 int trobat;

  f=fopen("PERSONES.DAT","rb");
  if(f==NULL)
	 f=fopen("PERSONES.DAT","wb");

  fread(&r,sizeof(struct persona),1,f);
  trobat=0;
  while(!feof(f) && strcmp(dni,r.dni)!=0)
	 fread(&r,sizeof(struct prov),1,f);
  if (feof(f)) trobat=0;
  else trobat=1;
  fclose(f);
  return trobat;

}


int compprov(int codiprov)
{
 FILE *f;
 struct prov r;
 int trobat=0;
 f=fopen("PROVS.DAT","rb");
 fread(&r,sizeof(struct prov),1,f);
 while(!feof(f) && r.codi!=codiprov)
	fread(&r,sizeof(struct prov),1,f);
 if (feof(f)) trobat=0;
 else trobat=1;
 fclose(f);
 return trobat;

}

int entradades(struct persona *r)
{
  clrscr();
  printf("\nNom................");scanf("%[^\n]",r->nom);fflush(stdin);
  printf("\nPrimer cognom......");scanf("%[^\n]",r->cog1);fflush(stdin);
  printf("\nSegon cognom.......");scanf("%[^\n]",r->cog2);fflush(stdin);
  printf("\nAdreça.............");scanf("%[^\n]",r->adre);fflush(stdin);
  printf("\nPoblacio...........");scanf("%[^\n]",r->pob);fflush(stdin);
  printf("\nCodi provincia.....");scanf("%d",&r->cprov);fflush(stdin);

  if (compprov(r->cprov)==0)
  {
	 printf("\n\nNo existeix la provincia\n\n");
	 return 1;
  }
  else
	 return 0;
}


void insord(struct persona r,FILE *f2,FILE *f3)
{
 struct persona r2;
 int x2,x3;
 x2=fread(&r2,sizeof(struct persona),1,f2);
 while (!feof(f2) && r2.cprov < r.cprov)
 {
  x3=fwrite(&r2,sizeof(struct persona),1,f3);
  x2=fread(&r2,sizeof(struct persona),1,f2);
 }
 if (feof(f2))x3=fwrite(&r,sizeof(struct persona),1,f3);
 else
 {
	while (!feof(f2) && r2.cprov == r.cprov && strcmp(r2.dni,r.dni) < 0)
	{
	 x3=fwrite(&r2,sizeof(struct persona),1,f3);
	 x2=fread(&r2,sizeof(struct persona),1,f2);
	}
	x3=fwrite(&r,sizeof(struct persona),1,f3);
	while (!feof(f2))
	{
	 x3=fwrite(&r2,sizeof(struct persona),1,f3);
	 x2=fread(&r2,sizeof(struct persona),1,f2);
	}
 }
}


void main()
{
FILE *f,*f1, *f2;
struct persona r,raux;
struct prov r1;
char wdni[12];
int opcio, x, primer;

do
{
  clrscr();
  printf("** PROGRAMA PRINCIPAL **\n");
  printf("1 - Nova persona\n");
  printf("2 - Modificar persona\n");
  printf("3 - Llistar persones\n");
  printf("4 - Sortir\n");
  printf("Escolliu opcio ");
  llegirnum(1,4,&opcio);

  switch(opcio)
  {
	 case 1: clrscr();
				printf("Introdueixi el DNI:  ");
				scanf("%12[^\n]",wdni);fflush(stdin);
				if(compdni(wdni)!=0)
					  printf("Ja existeix el DNI.\n");
				else
				{
				  f=fopen("PERSONES.DAT","ab");
				  strcpy(r.dni,wdni);
				  if(entradades(&r)==0)
					 fwrite(&r,sizeof(struct persona),1,f);
				  fclose(f);
				}
				printf("Premi una tecla");
				getch();
				break;
	 case 2: clrscr();
				printf("Introdueixi el DNI:  ");
				scanf("%12[^\n]",wdni);fflush(stdin);
				if(compdni(wdni)==0)
				{
					printf("No existeix el DNI.\n");
				}
				else
				{
					strcpy(r.dni,wdni);
					if(entradades(&r)==0)
					{
					  f=fopen("PERSONES.DAT","r+b");
					  fread(&raux,sizeof(struct persona),1,f);
					  while(!feof(f) && (strcmp(raux.dni,r.dni)!=0))
					  {
						 fread(&raux,sizeof(struct persona),1,f);
					  }
					  fseek(f,-(long)sizeof(struct persona),SEEK_CUR);
					  fwrite(&r,sizeof(struct persona),1,f);
					  fclose(f);
					}
				}
				printf("Premi una tecla\n");
				getch();
				break;
	 case 3: clrscr();
				f=fopen("PERSONES.DAT","rb");
				x=fread(&r,sizeof(struct persona),1,f);
				while (!feof(f))
				{
				  f1=fopen("PERSONES.ORD","rb");
				  if (f1==NULL) f1=fopen("PERSONES.ORD","wb");
				  f2=fopen("PERSONES.TEM","wb");
				  insord(r,f1,f2);
				  fclose(f1);fclose(f2);
				  unlink("PERSONES.ORD");
				  rename("PERSONES.TEM","PERSONES.ORD");
				  x=fread(&r,sizeof(struct persona),1,f);
				 }
				fclose(f);
				f1=fopen("PROVS.DAT","rb");
				fread(&r1,sizeof(struct prov),1,f1);
				primer=1;
				while(!feof(f1))
				{
					f=fopen("PERSONES.ORD","rb");
					fread(&r,sizeof(struct persona),1,f);
					while(!feof(f))
					{
					  if(r.cprov==r1.codi)
						{
						 if (primer==1)
							{
								printf("\n\nProvincia: %d %s\n\n",r1.codi,r1.nom);
								primer=0;
							}
						 printf("%s\t%s\t%s\t%s\t%s\n",r.dni,r.nom,r.cog1,r.cog2,r.pob);
						}
					  fread(&r,sizeof(struct persona),1,f);
					}
					fclose(f);
					fread(&r1,sizeof(struct prov),1,f1);
				}
				unlink("PERSONES.ORD");
				printf("\n\nPremi una tecla...");
				getch();
				break;
  }
}
while(opcio!=4);
}