Ver Mensaje Individual
  #5 (permalink)  
Antiguo 01/02/2010, 12:40
jares88
 
Fecha de Ingreso: enero-2010
Mensajes: 3
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: ayuda para ver errores

ya consegui corregirlo gracias.


Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <time.h>
  6.  
  7. #define MAXPER 100
  8. #define IMPED 1200
  9. #define LIMING 30000.0
  10. #define DIVING 120000.0
  11. #define FIN "XXXX"
  12.  
  13. /* se define la estructura del registro que mas adelante se utilizara*/
  14. typedef struct
  15.  {
  16.   char nom[10],ape[10];
  17.   float ing;
  18.  }tPersona;
  19.  
  20. /*se definen los modulos que se van a ulilizar en el modulo principal*/
  21. void recuperarPers(char[],tPersona[],int*);
  22. int leerEntero(int,int);
  23. void aniadirPers(tPersona[],int*,int);
  24. void mostrarPers(tPersona[],int);
  25. void eliminarPers(tPersona[],int*);
  26. void calcImpuestos(tPersona[],int);
  27. void grabarPers(char[],tPersona[],int);
  28.  
  29.  
  30.  
  31. void main()
  32.  {
  33.   tPersona pers[MAXPER];
  34.   int np,opc,maxp;
  35.   clrscr();
  36.   /*llamada al modulo recuperarPers*/
  37.   recuperarPers("PERSONA.DAT",pers,&np);
  38.  
  39.   do
  40.     {
  41.      clrscr();
  42.      printf("1. A¤adir personas\n2. Mostrar personas\n3. Eliminar una persona\n4. Impuestos\n5. Salir\n");
  43.      /*llamada al modulo leerEntero que devuelve un numero del 1 al 5 que se le asocia a la variable opc*/
  44.      opc=leerEntero(1,5);
  45.      switch(opc)
  46.       {
  47.     case 1:
  48.       {
  49.        /*llamada al modulo aniadirPers*/
  50.        aniadirPers(pers,&np,MAXPER);
  51.        /*llamada al modulo grabarPers*/
  52.        grabarPers("PERSONA.DAT",pers,np);
  53.       }
  54.       break;
  55.     case 2:
  56.       {
  57.        /*llamada al modulo mostrarPers*/
  58.        mostrarPers(pers,np);
  59.       }
  60.       break;
  61.     case 3:
  62.       {
  63.       /*llamada al modulo eliminarPers*/
  64.        eliminarPers(pers,&np);
  65.        /*llamada al modulo grabarPers*/
  66.        grabarPers("PERSONA.DAT",pers,np);
  67.       }
  68.       break;
  69.     case 4:
  70.       {
  71.        /*llamada al modulo calcImpuestos*/
  72.        calcImpuestos(pers,np);
  73.       }
  74.       break;
  75.       }
  76.     }
  77.   while(opc!=5);
  78.  }
  79. /* cuerpo del modulo recuperarPers(lee el numero de personas y la lista de personas)*/
  80. void recuperarPers(char nomArch[],tPersona pers[],int *pnp)
  81.  {
  82.   FILE *fpers;
  83.   /*se abre el archivo para saber si ya hay algo escrito en el*/
  84.   fpers=fopen(nomArch,"r");
  85.   if (fpers==NULL)
  86.     {
  87.      *pnp=0;
  88.     }
  89.   else
  90.     {
  91.      /*si no esta vacio el archivo lee el numero de personas y la lista de personas y las lleva al modulo principal*/
  92.      fread(pnp,sizeof(int),1,fpers);
  93.      fread(pers,sizeof(tPersona),*pnp,fpers);
  94.      fclose(fpers);
  95.     }
  96.  }
  97.  
  98.  
  99. /* cuerpo del modulo leerEntero(limita el intervalo de numero que el usuario puede escoger*/
  100. int leerEntero(int MINIMO,int MAXIMO)
  101.  {
  102.   int n;
  103.   printf("\nIntroduce una opci¢n: ");
  104.   scanf("%d",&n);
  105.   while(n<MINIMO||n>MAXIMO)
  106.     {
  107.      printf("\nError, debe estar en el intervalo [%d,%d]: ",MINIMO,MAXIMO);
  108.      scanf("%d",&n);
  109.     }
  110.   /*devuelve "n" al modulo principal*/
  111.   return(n);
  112.  }
  113.  
  114. #define MAXPER 100
  115. #define FIN "XXXX"
  116. /* se define el modulo que va a ser ulilizado dentro del modulo aniadirPers*/
  117.  
  118. float leerNoNegativo(float);
  119. /*cuerpo del modulo aniadirPers(a¤ade personas a la lista)*/
  120. void aniadirPers(tPersona pers[],int *pnp,int maxp)
  121.  {
  122.   char apellido[10];
  123.   float n;
  124.   /*solo se podra a¤adir una persona mas si la lista no esta llena*/
  125.   if(*pnp<maxp)
  126.     {
  127.      printf("PERSONA %d:",*pnp+1);
  128.      printf("\nApellido: ");
  129.      /* introducir el apellido a la lista*/
  130.      flushall();
  131.      gets(apellido);
  132.      strupr(apellido);
  133.      /* si el apellido es = a FIN no se a¤ade a la lista y se sale de ella*/
  134.      while(strcmp(apellido,FIN)!=0 && *pnp<=maxp)
  135.        {
  136.     /*se le asocia el apellido introducido por el usuario al registro definido anteriormente*/
  137.     strcpy (pers[*pnp].ape,apellido);
  138.     printf("\nNombre:");
  139.     /*se introduce el nombre*/
  140.     flushall();
  141.     gets(pers[*pnp].nom);
  142.     strupr(pers[*pnp].nom);
  143.     printf("\nIngresos:");
  144.  
  145.     /*se llama al modulo leerNoNegativo y se asocia a la parte de ingresos del registro*/
  146.     pers[*pnp].ing=leerNoNegativo(n);
  147.     *pnp=*pnp+1;
  148.     /* te vuelve a pedir otro apellido y empezar el ciclo solo si no se supera el maximo de personas*/
  149.     if(*pnp<maxp)
  150.       {
  151.        printf("\nPERSONA %d:",*pnp+1);
  152.        printf("\nApellido: ");
  153.        flushall();
  154.        gets(apellido);
  155.        strupr(apellido);
  156.       }
  157.     else
  158.       {
  159.        printf("\nSe ha alcanzado el n£mero m*ximo de personas.");
  160.       }
  161.        }
  162.     }
  163.   else
  164.     {
  165.      printf("\nSe ha alcanzado el n£mero m*ximo de personas.");
  166.     }
  167.  }
  168. /* cuerpo del modulo leerNoNegativo( lee el numero si es negativo te pide otro asta que sea positivo)*/
  169. float leerNoNegativo(float n)
  170.  {
  171.   scanf("%f",&n);
  172.   while(n<0)
  173.     {
  174.      printf("\nError: el n£mero ha de ser mayor o igual que cero.");
  175.      scanf("%f",& n);
  176.     }
  177.   return (n);
  178.  }
  179. /* cuerpo del modulo mostrarPers(muestra por pantalla la lista de personas)*/
  180. void mostrarPers(tPersona pers[],int np)
  181.  {
  182.   int iP;
  183.   clrscr();
  184.   printf("Id.  APELLIDO   NOMBRE     INGRESOS\n===================================");
  185.   for(iP=0;iP<=np-1;iP=iP+1)
  186.     {
  187.      /*muestra por pantalla lo que esta almacenado en el registro*/
  188.      printf("\n%2d.%7s%12s%10.2f",iP+1,pers[iP].ape,pers[iP].nom,pers[iP].ing);
  189.      if(((iP+1)%20)==0)
  190.        {
  191.     getch();
  192.     clrscr();
  193.        }
  194.     }
  195.   getch();
  196.  }
  197. /* se define el modulo leerEntero que sera utilizado dentro del modulo eliminarPers*/
  198. int leerEntero(int,int);
  199.  
  200. /*cuerpo del modulo eliminarPers(sirve para eliminar nombres de la lista y sus datos asociados en el registro)*/
  201. void eliminarPers(tPersona pers[],int *pnp)
  202.  {
  203.   int nOrd,iP;
  204.   printf("\nIntroduce el n£mero de orden de la persona a eliminar (0-cancelar): ");
  205.   nOrd=leerEntero(0,*pnp);
  206.   /* si el nOrd(numero de orden en la lista) es distinto de 0 se elimina el nombre que este en ese numero de orden*/
  207.   if(nOrd!=0)
  208.     {
  209.      for(iP=nOrd;iP<=*pnp;iP=iP+1)
  210.        {
  211.     /*la persona de esa posicion toma el nombre del siguiente y se borra el seleccionado*/
  212.     pers[iP-1]=pers[iP];
  213.        }
  214.      *pnp=*pnp-1;
  215.     }
  216.  }
  217. #define IMPED 1200
  218. #define LIMING 30000.0
  219. #define DIVING 120000.0
  220.  
  221. /*cuerpo del modulo calcImpuestos(calcula los impuestos que se utilizaran para cada familia)*/
  222. void calcImpuestos(tPersona pers[],int np)
  223.  {
  224.   int iP,fin,nDed;
  225.   float ingFam,ingAj,impFam,porc;
  226.   if(np>0)
  227.     {
  228.      clrscr();
  229.      printf("FAMILIA     IMPUESTOS\n=====================");
  230.      iP=0;
  231.      do
  232.        {
  233.     /*se igualan las variables a 0*/
  234.     fin=0;
  235.     nDed=0;
  236.     ingFam=0;
  237.     do
  238.       {
  239.        /*si los ingresos de una persona son nulos se a¤ade una deduccion a la familia*/
  240.        if(pers[iP].ing==0)
  241.          {
  242.           nDed=nDed+1;
  243.          }
  244.        /* si tiene algun ingreso se le suma al ingreso familiar*/
  245.        else
  246.          {
  247.           ingFam=ingFam+pers[iP].ing;
  248.          }
  249.        if(iP==np-1)
  250.          {
  251.           /* se iguala a 1 la variable fin si ya no hay mas personas sobre las que calcular los impuestos para salir del bucle*/
  252.           fin=1;
  253.          }
  254.        /* si no es la ultima persnoa se compara el siguiente apellido para ver si es de la misma familia*/
  255.        else
  256.          {
  257.           if(strcmp(pers[iP].ape,pers[iP+1].ape)!=0)
  258.         {
  259.          fin=1;
  260.         }
  261.          }
  262.        /* se pasa al siguiente nombre de la lista*/
  263.        iP=iP+1;
  264.       }
  265.     /*cuando se termina con una familia (fin=1) se procede a hacer los calculos */
  266.     while(fin!=1);
  267.     /*ingreso ajustado teniendo en cuenta el numero de deducciones de la familia*/
  268.     ingAj=ingFam-IMPED*nDed;
  269.     if(ingAj>0)
  270.       {
  271.        /*se comparan los ingresos ajustados con el limite de ingresos para hacer los calculos dependiendo de ello*/
  272.        if(ingAj>LIMING)
  273.          {
  274.           porc=(LIMING/DIVING);
  275.          }
  276.        else
  277.          {
  278.           porc=(ingAj/DIVING);
  279.          }
  280.        impFam=porc*ingAj;
  281.       }
  282.     else
  283.       {
  284.        impFam=0;
  285.       }
  286.     printf("\n%s%15.2f",pers[iP-1].ape,impFam);
  287.  
  288.        }
  289.      while(iP<=np-1);
  290.      getch();
  291.     }
  292.  }
  293. /*cuerpo del modulo grabarPers(graba los cambios que se producen)*/
  294. void grabarPers(char nomArch[],tPersona pers [],int np)
  295.  {
  296.   FILE *fpers;
  297.   /*se abre el archivo en modo escritura*/
  298.   fpers=fopen(nomArch,"w");
  299.   /*se guarda el tama¤o y la lista*/
  300.   fwrite(&np,sizeof(int),1,fpers);
  301.   fwrite(pers,sizeof(tPersona),np,fpers);
  302.   /*se cierra el archivo*/
  303.   fclose(fpers);
  304.  }