Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - jares88

#1
Hola alguien puede mirar este programa para ver los errores de codificacion que tiene que no soy capaz de solucionar, el error tiene que estar por donde esta señalado.gracias


#include <stdio.h>
#include <conio.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;
  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,MAXPER);
      /*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);
  getch();
}
/* cuerpo del modulo recuperarPers(lee el numero de personas y la lista de personas)*/
void recuperarPers(char PERSONA.DAT[],tPersona pers[],int *pnp)
{
  FILE *fpers;
  /*se abre el archivo para saber si ya hay algo escrito en el*/
  fpers=fopen("PERSONAS.DAT","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);
     fclose(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: ");
  scanf("%d",&n);
  while(n<MINIMO||n>MAXIMO)
    {
     printf("\nError, debe estar en el intervalo [%d,%d]: ",MINIMO,MAXIMO);
     scanf("%d",&n);
    }
  /*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()
/*cuerpo del modulo aniadirPers(a¤ade personas a la lista)*/
void aniadirPers(tPersona pers[],int *pnp,int MAXPER)
{
  char apellido[];
  /*solo se podra a¤adir una persona mas si la lista no esta llena*/
  if(*pnp<MAXPER)
    {
     printf("PERSONA %d:",*pnp);
     printf("\nApellido: ");
     /* introducir el apellido a la lista*/
     flushall();
     gets(apellido);
     strupr(apellido);
     /* si el apellido es = a FIN no se a¤ade a la lista y se sale de ella*/
     while(apellido!=FIN && *pnp<=MAXPER)
       {
   /*se le asocia el apellido introducido por el usuario al registro definido anteriormente*/
   pers[*pnp].ape=apellido;
   printf("\nNombre:");
   /*se introduce el nombre*/
   flushall();
   gets(pers[*pnp].nom);
   strupr(pers[*pnp].nom);
   printf("\nIngresos:");
   /*se llama al modulo leerNoNegativo y se asocia a la parte de ingresos del registro*/
   pers[*pnp].ing=leerNoNegativo();
   *pnp=*pnp+1;
   /* te vuelve a pedir otro apellido y empezar el ciclo solo si no se supera el maximo de personas*/
   if(*pnp<MAXPER)
     {
      printf("\nPersona %d:",*pnp);
      printf("\nApellido: ");
      flushall();
      gets(apellido);
      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;
  scanf("%f",&n);
  while(n<0)
    {
     printf("\nError: el n£mero ha de ser mayor o igual que cero.");
     scanf("%f",&n);
    }
  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)
       {
   getch();
   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*/
  fPers=fopen(nomArch"w");
  /*se guarda el tama¤o y la lista*/
  fwrite(&np,sizeof(int),1,fPers);
  fwrite(pers,sizeof(tPersonas),np,fPers);
  /*se cierra el archivo*/
  fclose(fPers);
}