Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <io.h>
- typedef struct
- {char apellido[20] , nombre[40];
- float par1,par2,par3;
- }tAlum;
- FILE *entra ;
- void agregar (char *nom , tAlum reg );
- void listatodo (char *nom);
- void borraultimo (char *nom);
- void moverdesde (char *nom , long pisado );
- void copiareg (tAlum *r1 , tAlum *r2);
- void cambiatop5 (tAlum *r1 , tAlum *r2);
- float Promedio(tAlum *r1);
- void listaNota1 (char *nom);
- void listaNota2 (char *nom);
- void listaNota3 (char *nom);
- void listaTop5 (char *nom);
- int main(int argc, char *argv[])
- {
- char linea[200]="" ,nomarch[20]="", *temp, separa[2]=",";
- tAlum reg1;
- float not1,not2,not3,prom ;
- long numreg , borrareg;
- int i ,hacer[10]={0} , errparam=0, contopc=0 ;
- /* hacer
- 1 = --agregar nombre,apellido,parcial1,parcial2,parcial3 : agrega los datos indicados al archivo de datos.
- 2 = --listAll: lista los nombres y apellidos, número de orden (número de carga) y notas de los parciales de todos los alumnos ordenados según el orden de carga.
- 3 = --prom : imprime la lista de los nombres de alumnos promocionados. Para esto considere que se promociona con promedio mayor o igual a 85 y ningún parcial menor a 70.
- 4 = --reg : imprime la lista de los nombres de alumnos regulares. Para esto considere que se regulariza con todos los parciales mayores a 50
- 5 = --libres : imprime la lista de los nombres de alumnos. Para esto considere que se regulariza con todos los parciales mayores a 50 y se promociona con promedio mayor o igual a 85 y ningún parcial menor a 70.
- 6 = --top5: muestra los nombres de los alumnos que obtuvieron los 5 mejores promedios.
- 7 = --listp1
- 8 = --listp2
- 9 = --listp3: los nombres y apellidos de los alumnos así como las calificaciones obtenidas ordenadas por las calificaciones obtenidas en el primer, segundo o tercer parcial.\n");
- 10 = --drop
- */
- if (argc > 1 )
- {
- for (i=1 ; i < argc ;i++)
- {
- if ( strcmp(argv[i],"--file") == 0)
- {
- i++;
- if (argc > i)
- {
- strcpy(nomarch,argv[i]);
- //printf("Archivo %s \n",nomarch);
- }
- else errparam++;
- }
- if ( strcmp(argv[i],"--agregar") == 0)
- {
- hacer[contopc] =1;
- contopc++;
- i++;
- if (argc > i)
- {
- strcpy(linea,argv[i]);
- //printf(" Agrega : %s \n", linea );
- temp=strtok(linea,separa);
- strcpy(reg1.nombre,temp);
- temp=strtok(0,separa);
- strcpy(reg1.apellido,temp);
- temp=strtok(0,separa);
- sscanf(temp,"%f",®1.par1);
- temp=strtok(0,"\,");
- sscanf(temp,"%f",®1.par2);
- temp=strtok(0,separa);
- sscanf(temp,"%f",®1.par3);
- //printf("%s %s %f %f %f \n", reg1.nombre,reg1.apellido,reg1.par1,reg1.par2,reg1.par3);
- }
- else errparam++;
- }
- if ( strcmp(argv[i],"--listAll") == 0)
- {
- hacer[contopc] = 2;
- contopc++;
- }
- if ( strcmp(argv[i],"--drop") == 0)
- {
- i++;
- if (argc > i)
- {
- hacer[contopc] =10;
- contopc++;
- sscanf(argv[i],"%d",&borrareg);
- }
- else errparam++;
- }
- if ( strcmp(argv[i],"--top5") == 0)
- {
- hacer[contopc] = 6;
- contopc++;
- }
- }
- }
- else
- {
- errparam++;
- }
- if (errparam)
- {
- printf ("\n Debe especificar parametros : \n");
- printf (" --file nombreArchivo: indica el nombre del archivo sobre el que se realizaran las operaciones, siempre debe especificar un nombre de archivo \n");
- printf (" --agregar nombre,apellido,parcial1,parcial2,parcial3 : agrega los datos indicados al archivo de datos.\n");
- printf (" --prom, --reg, --libres : imprime la lista de los nombres de alumnos promocionados, o regulares, o libres. Para esto considere que se regulariza con todos los parciales mayores a 50 y se promociona con promedio mayor o igual a 85 y ningún parcial menor a 70.\n");
- printf (" --top5: muestra los nombres de los alumnos que obtuvieron los 5 mejores promedios.\n");
- printf (" --listp1, --listp2, --listp3: los nombres y apellidos de los alumnos así como las calificaciones obtenidas ordenadas por las calificaciones obtenidas en el primer, segundo o tercer parcial.\n");
- printf (" --listAll: lista los nombres y apellidos, número de orden (número de carga) y notas de los parciales de todos los alumnos ordenados según el orden de carga.\n");
- printf (" --drop nroAlumno: elimina un alumno de la lista, identificándolo a partir del número de orden de carga.\n");
- }
- /* entra=fopen("entrada.txt", "rt");
- rewind (entra);
- while (! feof(entra))
- {
- if ( fscanf(entra,"%d%f%f%f",&dni,¬1,¬2,¬3) == 4)
- {
- printf("%d %f %f %f \n", dni, not1,not2,not3);
- prom = (not1 + not2 + not3 )/3;
- }
- }
- fclose (entra);
- */
- for (i=0 ; i < 10 ; i++ )
- {
- switch (hacer[i] )
- {
- case 1:
- {
- // agregar
- agregar(nomarch,reg1);
- break;
- }
- case 2:
- { //listar todo
- printf("Listado del archivo :\n");
- printf("Nro Nombre Apellido Notas Parc.1 2 3 \n");
- listatodo(nomarch);
- printf("FIN \n");
- break;
- }
- case 3:
- {
- // Promocionados
- break;
- }
- case 4:
- {
- // Regulares
- break;
- }
- case 5:
- {
- // Libres
- break;
- }
- case 6:
- {
- // Top5
- listaTop5(nomarch);
- break;
- }
- case 7:
- {
- // Nota1
- break;
- }
- case 8:
- {
- // Nota2
- break;
- }
- case 9:
- {
- // Nota3
- break;
- }
- case 10: //drop
- {
- moverdesde(nomarch,borrareg-1);
- break ;
- }
- }
- }
- system("PAUSE");
- return 0;
- }
- void agregar (char *nom , tAlum reg )
- {
- entra = fopen (nom, "ab");
- fwrite(®, sizeof(reg),1,entra);
- fclose(entra);
- }
- void listatodo (char *nom)
- {
- int i=0;
- tAlum reg;
- entra = fopen (nom, "rb");
- while (! feof(entra) )
- {
- if ( fread(®, sizeof(reg),1,entra) != 0)
- {i++;
- printf("%2d %35s %20s %2.2f %2.2f %2.2f \n",i, reg.nombre,reg.apellido,reg.par1,reg.par2,reg.par3);
- }
- }
- fclose(entra);
- }
- void listaNota1 (char *nom)
- {
- tAlum reg;
- entra = fopen (nom, "rb");
- while (! feof(entra) )
- {
- if ( fread(®, sizeof(reg),1,entra) != 0)
- {
- printf("%35s %20s %2.2f \n", reg.nombre,reg.apellido,reg.par2);
- }
- }
- fclose(entra);
- }
- void listaNota2 (char *nom)
- {
- tAlum reg;
- entra = fopen (nom, "rb");
- while (! feof(entra) )
- {
- if ( fread(®, sizeof(reg),1,entra) != 0)
- {
- printf("%35s %20s %2.2f \n", reg.nombre,reg.apellido,reg.par2);
- }
- }
- fclose(entra);
- }
- void listaNota3 (char *nom)
- {
- tAlum reg;
- entra = fopen (nom, "rb");
- while (! feof(entra) )
- {
- if ( fread(®, sizeof(reg),1,entra) != 0)
- {
- printf("%35s %20s %2.2f \n", reg.nombre,reg.apellido,reg.par3);
- }
- }
- fclose(entra);
- }
- float Promedio(tAlum *r1)
- {
- return (r1->par1 + r1->par2 + r1->par3) / 3.0 ;
- }
- void cambiatop5 (tAlum *r1 , tAlum *r2)
- {tAlum Aux ;
- copiareg(&Aux,r1);
- copiareg(r1,r2);
- copiareg(r2,&Aux);
- }
- void copiareg (tAlum *r1 , tAlum *r2)
- {
- strcpy(r1->apellido,r2->apellido);
- strcpy(r1->nombre, r2->nombre);
- r1->par1=r2->par1;
- r1->par2=r2->par2;
- r1->par3=r2->par3;
- }
- void listaTop5 (char *nom)
- {
- int i=0 , primera=0;
- tAlum reg , aux , top[5];
- entra = fopen (nom, "rb");
- while (! feof(entra) )
- {
- if ( fread(®, sizeof(reg),1,entra) != 0)
- {
- if (primera == 0)
- {
- primera++;
- for (i=0; i<5 ;i++ )
- {
- copiareg (&top[i],®);
- }
- }
- else
- {
- //arreglar los 5 promedios
- }
- }
- }
- fclose(entra);
- for (i=0; i<5 ;i++ )
- {
- printf("%d %35s %20s %2.2f \n",i,top[i].nombre,top[i].apellido,Promedio(&top[i]));
- }
- }
- void borraultimo (char *nom)
- {
- int i=0 , idfile;
- long tamarch, cantreg;
- tAlum reg;
- entra = fopen (nom, "rb");
- fseek(entra,0L,SEEK_END);
- tamarch = ftell( entra );
- cantreg = tamarch / sizeof (reg) ;
- tamarch =( cantreg - 1)* sizeof(reg);
- fclose (entra);
- idfile = open(nom ,0x2);
- /*
- Para open
- Modo Efecto
- 0x01 Sólo Lectura O_RDONLY
- 0x02 Sólo Escritura O_WRONLY
- 0x04 Lectura/Escritura O_RDWR
- */
- ftruncate(idfile,tamarch );
- close(idfile);
- }
- void moverdesde (char *nom , long pisado )
- {
- int i=0 ;
- long tamarch, cantreg , regpisado;
- tAlum reg;
- regpisado = pisado;
- entra = fopen (nom, "r+b");
- fseek(entra,0L,SEEK_END);
- tamarch = ftell( entra ); //tamaño total del archivo
- cantreg = tamarch / sizeof (reg) ; //cantidad total de registros
- if ((cantreg )> regpisado )
- {
- while (! feof(entra) )
- {
- fseek(entra, ( (pisado+1)*sizeof (reg) ), SEEK_SET);
- if ( fread(®, sizeof(reg),1,entra) != 0)
- {
- fseek(entra, ( (pisado)*sizeof (reg) ), SEEK_SET);
- fwrite(®, sizeof(reg),1,entra);
- }
- pisado++;
- }
- fclose (entra);
- borraultimo(nom);
- }
- else
- fclose (entra);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement