#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAXPER 100
#define IMPED 1200
#define LIMING 30000
#define DIVIN 120000
#define FIN "XXXX"
/* se define la estructura del registro que mas adelante se utilizara*/
typedef struct
{
char nom[10],ape[10];
float ing;
}tPersona;
/*se definen los modulos que se van a ulilizar en el modulo principal*/
void recuperarPers(char[],tPersona[],int*);
int leerEntero(int,int);
void aniadirPers(tPersona[],int*,int);
void mostrarPers(tPersona[],int);
void eliminarPers(tPersona[],int*);
void calcImpuestos(tPersona[],int);
void grabarPers(char[],tPersona[],int);
void main()
{
tPersona pers[MAXPER];
int np,opc,maxp;
clrscr();
/*llamada al modulo recuperarPers*/
recuperarPers("PERSONAS.DAT",pers,&np);
do
{
printf("1. A¤adir personas\n2. Mostrar personas\n3. Eliminar una persona\n4. Impuestos\n5. Salir\nIntroduce una opci¢n: "); /*llamada al modulo leerEntero que devuelve un numero del 1 al 5 que se le asocia a la variable opc*/
opc=leerEntero(1,5);
switch(opc)
{
case 1:
{
/*llamada al modulo aniadirPers*/
aniadirPers(pers,&np,maxp);
/*llamada al modulo grabarPers*/
grabarPers("PERSONAS.DAT",pers,np);
}
break;
case 2:
{
/*llamada al modulo mostrarPers*/
mostrarPers(pers,np);
}
break;
case 3:
{
/*llamada al modulo eliminarPers*/
eliminarPers(pers,&np);
/*llamada al modulo grabarPers*/
grabarPers("PERSONAS.DAT",pers,np);
}
break;
case 4:
{
/*llamada al modulo calcImpuestos*/
calcImpuestos(pers,np);
}
break;
}
}
while(opc!=5);
}
/* cuerpo del modulo recuperarPers(lee el numero de personas y la lista de personas)*/
void recuperarPers(char nomArch[],tPersona pers[],int *pnp)
{
FILE *fpers;
/*se abre el archivo para saber si ya hay algo escrito en el*/
fpers
=fopen(nomArch
,"r"); if (fpers==NULL)
{
*pnp=0;
}
else
{
/*si no esta vacio el archivo lee el numero de personas y la lista de personas y las lleva al modulo principal*/
fread(pnp
,sizeof(int),1,fpers
); fread(pers
,sizeof(tPersona
),*pnp
,fpers
); }
}
/* cuerpo del modulo leerEntero(limita el intervalo de numero que el usuario puede escoger*/
int leerEntero(int MINIMO,int MAXIMO)
{
int n;
printf("\nIntroduce una opci¢n: "); while(n<MINIMO||n>MAXIMO)
{
printf("\nError, debe estar en el intervalo [%d,%d]: ",MINIMO
,MAXIMO
); }
/*devuelve "n" al modulo principal*/
return(n);
}
#define MAXPER 100
#define FIN "XXXX"
/* se define el modulo que va a ser ulilizado dentro del modulo aniadirPers*/
float leerNoNegativo(float);
/*cuerpo del modulo aniadirPers(a¤ade personas a la lista)*/
void aniadirPers(tPersona pers[],int *pnp,int maxp)
{
char apellido[10];
/*solo se podra a¤adir una persona mas si la lista no esta llena*/
if(*pnp<maxp)
{
/* introducir el apellido a la lista*/
flushall();
strupr(apellido);
/* si el apellido es = a FIN no se a¤ade a la lista y se sale de ella*/
while(strcmp(apellido
,FIN
)!=0 && *pnp
<=maxp
) {
/*se le asocia el apellido introducido por el usuario al registro definido anteriormente*/
pers[*pnp].ape=apellido;
/*se introduce el nombre*/
flushall();
strupr(pers[*pnp].nom);
leerNoNegativo(n);
/*se llama al modulo leerNoNegativo y se asocia a la parte de ingresos del registro*/
pers[*pnp].ing=leerNoNegativo(n);
*pnp=*pnp+1;
/* te vuelve a pedir otro apellido y empezar el ciclo solo si no se supera el maximo de personas*/
if(*pnp<maxp)
{
flushall();
strupr(apellido);
}
else
{
printf("\nSe ha alcanzado el n£mero m*ximo de personas."); }
}
}
else
{
printf("\nSe ha alcanzado el n£mero m*ximo de personas."); }
}
/* cuerpo del modulo leerNoNegativo( lee el numero si es negativo te pide otro asta que sea positivo)*/
float leerNoNegativo(float n)
{
float n;
while(n<0)
{
printf("\nError: el n£mero ha de ser mayor o igual que cero."); }
return (n);
}
/* cuerpo del modulo mostrarPers(muestra por pantalla la lista de personas)*/
void mostrarPers(tPersona pers[],int np)
{
int iP;
clrscr();
printf("Id. APELLIDO NOMBRE INGRESOS\n==================================="); for(iP=0;iP<=np-1;iP=iP+1)
{
/*muestra por pantalla lo que esta almacenado en el registro*/
printf("\n %2d. %11s%11s%f.2",iP
+1,pers
[iP
].
ape,pers
[iP
].
nom,pers
[iP
].
ing); if((iP+1%20)=0)
{
clrscr();
}
}
}
/* se define el modulo leerEntero que sera utilizado dentro del modulo eliminarPers*/
int leerEntero(int,int);
/*cuerpo del modulo eliminarPers(sirve para eliminar nombres de la lista y sus datos asociados en el registro)*/
void eliminarPers(tPersona pers[],int *pnp)
{
int nOrd,iP;
printf("\nIntroduce el n£mero de orden de la persona a eliminar (0-cancelar): "); nOrd=leerEntero(0,*pnp);
/* si el nOrd(numero de orden en la lista) es distinto de 0 se elimina el nombre que este en ese numero de orden*/
if(nOrd!=0)
{
for(iP=nOrd;iP<=*pnp,iP=iP+1)
{
/*la persona de esa posicion toma el nombre del siguiente y se borra el seleccionado*/
pers[iP-1]=pers[iP];
}
*pnp=*pnp-1;
}
}
#define IMPED 1200
#define LIMING 30000
#define DIVIN 120000
/*cuerpo del modulo calcImpuestos(calcula los impuestos que se utilizaran para cada familia)*/
void calcImpuestos(tPersona pers[],int np)
{
int iP,fin,nDed;
float ingFam,ingAj,impFam,porc;
if(np>0)
{
clrscr();
printf("FAMILIA IMPUESTOS\n=====================)"); iP=0;
do
{
/*se igualan las variables a 0*/
fin=0;
nDed=0;
ingFam=0;
do
{
/*si los ingresos de una persona son nulos se a¤ade una deduccion a la familia*/
if(pers[iP].ing=0)
{
nDed=nDed+1;
}
/* si tiene algun ingreso se le suma al ingreso familiar*/
else
{
ingFam=ingFam+pers[iP].ing;
}
if(iP=np-1)
{
/* se iguala a 1 la variable fin si ya no hay mas personas sobre las que calcular los impuestos para salir del bucle*/
fin=1;
}
/* si no es la ultima persnoa se compara el siguiente apellido para ver si es de la misma familia*/
else
{
if(pers[iP].ape!=pers[iP+1].ape
{
fin=1;
}
/* se pasa al siguiente nombre de la lista*/
iP=iP+1;
}
/*cuando se termina con una familia (fin=1) se procede a hacer los calculos */
while(fin==1);
/*ingreso ajustado teniendo en cuenta el numero de deducciones de la familia*/
ingAj=ingFam-IMPDED*nDed;
if(ingAj>0)
{
/*se comparan los ingresos ajustados con el limite de ingresos para hacer los calculos dependiendo de ello*/
if(ingAj>LIMING)
{
porc=(LIMING/DIVING);
}
else
{
porc=(ingAj/DIVING);
}
impFam=porc*ingAj;
}
else
{
impFam=0;
}
}
while(iP<=np-1);
}
}
/*cuerpo del modulo grabarPers(graba los cambios que se producen)*/
void grabarPers(char nomArch[],tPersona pers [],int np)
{
FILE *fpers;
/*se abre el archivo en modo escritura*/
/*se guarda el tama¤o y la lista*/
fwrite(&np
,sizeof(int),1,fpers
); fwrite(pers
,sizeof(tPersonas
),np
,fpers
); /*se cierra el archivo*/
}