Advertisement
Juan_Blanc

[C] Ejemplitos con Argc

Mar 17th, 2015
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.14 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <io.h>
  5.  
  6. typedef struct
  7. {char apellido[20] , nombre[40];
  8.  float par1,par2,par3;
  9.         }tAlum;
  10.  
  11. FILE *entra ;
  12.  
  13.  
  14. void agregar (char *nom , tAlum reg );
  15. void listatodo (char *nom);
  16. void borraultimo (char *nom);
  17. void moverdesde (char *nom , long pisado );
  18. void copiareg (tAlum *r1 , tAlum *r2);
  19. void cambiatop5 (tAlum *r1 , tAlum *r2);
  20. float Promedio(tAlum *r1);
  21. void listaNota1 (char *nom);
  22. void listaNota2 (char *nom);
  23. void listaNota3 (char *nom);
  24. void listaTop5 (char *nom);
  25.  
  26. int main(int argc, char *argv[])
  27. {
  28.     char linea[200]="" ,nomarch[20]="",  *temp, separa[2]=",";
  29.  
  30.   tAlum reg1;
  31.   float not1,not2,not3,prom ;
  32.   long numreg , borrareg;
  33.  
  34.  
  35.   int i ,hacer[10]={0} , errparam=0, contopc=0 ;
  36.    
  37.     /*  hacer
  38.     1  =  --agregar nombre,apellido,parcial1,parcial2,parcial3 : agrega los datos indicados al archivo de datos.
  39.     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.
  40.     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.
  41.     4  =  --reg  : imprime la lista de los nombres de alumnos regulares. Para esto considere que se regulariza con todos los parciales mayores a 50
  42.     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.
  43.     6  =  --top5: muestra los nombres de los alumnos que obtuvieron los 5 mejores promedios.
  44.     7  =  --listp1
  45.     8  =  --listp2
  46.     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");
  47.    10  =  --drop
  48.    
  49.    
  50.    
  51.     */
  52.    
  53.    if (argc > 1 )
  54.    {
  55.    for (i=1 ; i < argc ;i++)
  56.         {
  57.         if ( strcmp(argv[i],"--file") == 0)
  58.         {
  59.         i++;
  60.         if (argc > i)
  61.             {
  62.             strcpy(nomarch,argv[i]);
  63.             //printf("Archivo %s \n",nomarch);
  64.             }
  65.             else errparam++;
  66.         }
  67.         if ( strcmp(argv[i],"--agregar") == 0)
  68.         {
  69.         hacer[contopc] =1;
  70.         contopc++;
  71.         i++;
  72.         if (argc > i)
  73.             {
  74.             strcpy(linea,argv[i]);
  75.             //printf(" Agrega : %s \n", linea );
  76.             temp=strtok(linea,separa);
  77.             strcpy(reg1.nombre,temp);
  78.             temp=strtok(0,separa);
  79.             strcpy(reg1.apellido,temp);
  80.             temp=strtok(0,separa);
  81.             sscanf(temp,"%f",&reg1.par1);
  82.             temp=strtok(0,"\,");
  83.             sscanf(temp,"%f",&reg1.par2);
  84.             temp=strtok(0,separa);
  85.             sscanf(temp,"%f",&reg1.par3);
  86.             //printf("%s %s  %f %f %f \n", reg1.nombre,reg1.apellido,reg1.par1,reg1.par2,reg1.par3);
  87.             }
  88.             else errparam++;
  89.         }
  90.         if ( strcmp(argv[i],"--listAll") == 0)
  91.         {
  92.         hacer[contopc]  = 2;
  93.         contopc++;
  94.         }
  95.         if ( strcmp(argv[i],"--drop") == 0)
  96.         {
  97.         i++;
  98.         if (argc > i)
  99.             {
  100.                  hacer[contopc]  =10;
  101.                  contopc++;
  102.             sscanf(argv[i],"%d",&borrareg);
  103.            
  104.             }
  105.        else errparam++;
  106.         }
  107.          if ( strcmp(argv[i],"--top5") == 0)
  108.         {
  109.            hacer[contopc]  = 6;
  110.            contopc++;
  111.         }
  112.    
  113. }
  114.    }  
  115.    else
  116.    {
  117.    errparam++;
  118.    }    
  119.    if (errparam)
  120.    {
  121.    printf ("\n Debe especificar parametros : \n");
  122.      
  123. printf ("     --file nombreArchivo: indica el nombre del archivo sobre el que se realizaran las operaciones, siempre debe especificar un nombre de archivo \n");  
  124. printf ("     --agregar nombre,apellido,parcial1,parcial2,parcial3 : agrega los datos indicados al archivo de datos.\n");
  125. 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");
  126. printf ("     --top5: muestra los nombres de los alumnos que obtuvieron los 5 mejores promedios.\n");
  127. 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");
  128. 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");
  129. printf ("     --drop nroAlumno: elimina un alumno de la lista, identificándolo a partir del número de orden de carga.\n");      
  130.      
  131. }    
  132.  /* entra=fopen("entrada.txt", "rt");
  133.  
  134.  
  135.  rewind (entra);
  136.  
  137.  while (! feof(entra))
  138.      {
  139.        if ( fscanf(entra,"%d%f%f%f",&dni,&not1,&not2,&not3) == 4)
  140.        {
  141.         printf("%d %f %f %f \n", dni, not1,not2,not3);                          
  142.            
  143.            prom = (not1 + not2 + not3 )/3;
  144.        
  145.        }
  146.       }
  147.  
  148.  fclose (entra);
  149. */
  150.  
  151.   for (i=0 ; i < 10 ; i++ )
  152.   {
  153.                 switch (hacer[i] )
  154.                 {
  155.                  case 1:
  156.                       {
  157.                             // agregar
  158.                             agregar(nomarch,reg1);
  159.                            
  160.                              
  161.                       break;
  162.                       }      
  163.                      
  164.                        
  165.                  case 2:
  166.                       {  //listar todo
  167.                       printf("Listado del archivo :\n");
  168.                       printf("Nro            Nombre                   Apellido              Notas Parc.1 2 3 \n");
  169.                       listatodo(nomarch);
  170.                      
  171.                       printf("FIN  \n");
  172.                       break;
  173.                       }
  174.                  case 3:
  175.                       {
  176.                             // Promocionados
  177.                       break;
  178.                       }
  179.                   case 4:
  180.                       {
  181.                             // Regulares
  182.                       break;
  183.                       }
  184.                   case 5:
  185.                       {
  186.                             // Libres
  187.                       break;
  188.                       }                      
  189.                   case 6:
  190.                       {
  191.                             // Top5
  192.                       listaTop5(nomarch);
  193.                            
  194.                       break;
  195.                       }          
  196.                   case 7:
  197.                       {
  198.                             // Nota1
  199.                       break;
  200.                       }  
  201.                   case 8:
  202.                       {
  203.                             // Nota2
  204.                       break;
  205.                       }  
  206.                   case 9:
  207.                       {
  208.                             // Nota3
  209.                       break;
  210.                       }
  211.                   case 10:  //drop
  212.                       {
  213.                       moverdesde(nomarch,borrareg-1);
  214.                       break ;
  215.                       }
  216.                  
  217.                  
  218.                  
  219.                  }
  220. }
  221.  
  222.  
  223.  
  224.   system("PAUSE"); 
  225.   return 0;
  226. }
  227. void agregar (char *nom , tAlum reg )
  228. {
  229. entra = fopen (nom, "ab");
  230. fwrite(&reg, sizeof(reg),1,entra);
  231. fclose(entra);
  232.  
  233.  
  234. }
  235. void listatodo (char *nom)
  236. {
  237.     int i=0;
  238.      tAlum reg;
  239. entra = fopen (nom, "rb");
  240. while (! feof(entra) )
  241. {
  242. if ( fread(&reg, sizeof(reg),1,entra) != 0)
  243.      {i++;
  244.       printf("%2d %35s %20s  %2.2f %2.2f %2.2f \n",i, reg.nombre,reg.apellido,reg.par1,reg.par2,reg.par3);
  245.      }
  246. }
  247. fclose(entra);    
  248.      
  249.      
  250. }
  251.  
  252.  
  253. void listaNota1 (char *nom)
  254. {
  255.      tAlum reg;
  256. entra = fopen (nom, "rb");
  257. while (! feof(entra) )
  258. {
  259. if ( fread(&reg, sizeof(reg),1,entra) != 0)
  260.      {
  261.       printf("%35s %20s  %2.2f  \n", reg.nombre,reg.apellido,reg.par2);
  262.      }
  263. }
  264. fclose(entra);    
  265.      
  266.      
  267. }
  268. void listaNota2 (char *nom)
  269. {
  270.      tAlum reg;
  271. entra = fopen (nom, "rb");
  272. while (! feof(entra) )
  273. {
  274. if ( fread(&reg, sizeof(reg),1,entra) != 0)
  275.      {
  276.       printf("%35s %20s  %2.2f  \n", reg.nombre,reg.apellido,reg.par2);
  277.      }
  278. }
  279. fclose(entra);    
  280.      
  281.      
  282. }
  283.  
  284.  
  285. void listaNota3 (char *nom)
  286. {
  287.      tAlum reg;
  288. entra = fopen (nom, "rb");
  289. while (! feof(entra) )
  290. {
  291. if ( fread(&reg, sizeof(reg),1,entra) != 0)
  292.      {
  293.       printf("%35s %20s  %2.2f  \n", reg.nombre,reg.apellido,reg.par3);
  294.      }
  295. }
  296. fclose(entra);    
  297.      
  298.      
  299. }
  300.  
  301. float Promedio(tAlum *r1)
  302. {
  303.       return (r1->par1 + r1->par2 + r1->par3) / 3.0 ;
  304. }
  305. void cambiatop5 (tAlum *r1 , tAlum *r2)
  306.   {tAlum  Aux ;
  307.  
  308. copiareg(&Aux,r1);
  309. copiareg(r1,r2);  
  310. copiareg(r2,&Aux);
  311.   }
  312.  
  313. void copiareg (tAlum *r1 , tAlum *r2)
  314.   {
  315.     strcpy(r1->apellido,r2->apellido);
  316.     strcpy(r1->nombre, r2->nombre);
  317.     r1->par1=r2->par1;
  318.     r1->par2=r2->par2;
  319.     r1->par3=r2->par3;
  320.  
  321.   }
  322.  
  323.  
  324. void listaTop5 (char *nom)
  325. {
  326.     int i=0 , primera=0;
  327.      tAlum reg , aux , top[5];
  328. entra = fopen (nom, "rb");
  329.  
  330. while (! feof(entra) )
  331. {
  332. if ( fread(&reg, sizeof(reg),1,entra) != 0)
  333.      {
  334.              if (primera == 0)
  335.                 {
  336.                      primera++;
  337.                      for (i=0; i<5 ;i++ )
  338.                        {
  339.                        copiareg (&top[i],&reg);        
  340.                        }
  341.                  }
  342.              else
  343.                 {      
  344.                 //arreglar los 5 promedios
  345.                
  346.                
  347.                 }
  348.      }
  349.  
  350. }
  351. fclose(entra);    
  352.      
  353.      for (i=0; i<5 ;i++ )
  354.        {
  355.       printf("%d %35s %20s  %2.2f  \n",i,top[i].nombre,top[i].apellido,Promedio(&top[i]));
  356.       }
  357.      
  358. }
  359.  
  360.  
  361.  
  362.  
  363. void borraultimo (char *nom)
  364. {
  365.     int i=0 , idfile;
  366.     long tamarch, cantreg;
  367.     tAlum reg;
  368. entra = fopen (nom, "rb");
  369. fseek(entra,0L,SEEK_END);
  370. tamarch = ftell( entra );
  371. cantreg = tamarch / sizeof (reg) ;
  372. tamarch =( cantreg - 1)* sizeof(reg);
  373. fclose (entra);
  374.  
  375. idfile = open(nom ,0x2);
  376. /*  
  377.  
  378. Para open
  379. Modo    Efecto
  380. 0x01 Sólo Lectura O_RDONLY
  381. 0x02 Sólo Escritura O_WRONLY
  382. 0x04 Lectura/Escritura O_RDWR
  383.  
  384. */
  385.  
  386. ftruncate(idfile,tamarch );
  387. close(idfile);
  388. }
  389.  
  390.  
  391. void moverdesde (char *nom , long pisado )
  392. {
  393. int i=0 ;
  394. long tamarch, cantreg , regpisado;
  395. tAlum reg;
  396. regpisado = pisado;
  397.  
  398. entra = fopen (nom, "r+b");
  399. fseek(entra,0L,SEEK_END);
  400. tamarch = ftell( entra );  //tamaño total del archivo
  401. cantreg = tamarch / sizeof (reg) ; //cantidad total de registros
  402. if ((cantreg )> regpisado )
  403.     {
  404.     while (! feof(entra) )
  405.     {
  406.     fseek(entra, ( (pisado+1)*sizeof (reg) ), SEEK_SET);
  407.     if ( fread(&reg, sizeof(reg),1,entra) != 0)
  408.             {
  409.                  fseek(entra, ( (pisado)*sizeof (reg) ), SEEK_SET);
  410.                  fwrite(&reg, sizeof(reg),1,entra);
  411.             }
  412.      pisado++;      
  413.     }
  414.     fclose (entra);  
  415.    
  416. borraultimo(nom);
  417. }
  418.   else
  419.   fclose (entra);    
  420. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement