jares88
Desconectado
Mensajes: 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); }
|