gonzalob

Untitled

Jun 11th, 2020
1,225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 15.04 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "pila.h"
  4.  
  5. typedef struct
  6. {
  7.     int legajo;
  8.     char nombreYapellido [30];
  9.     int edad;
  10.     int anio;
  11. //año que cursa, recordar que no podemos utilizar la ñ para definir variables
  12. } stAlumno;
  13.  
  14. void cargarArchivo(char nombreArchivo[20]);
  15. stAlumno cargarUnAlumno();
  16. void leerArchivo(char nombreArchivo[20]);
  17. void mostrarUnAlumno(stAlumno aux);
  18. void cargarAlFinal(char nombreArchivo[20]);
  19. int pasarApila(Pila * pilinMayores, char nombreArchivo[20],int edad );
  20. void mostrarAlumnoPorRango(char nombreArchivo[20],int minEdad, int maxEdad);
  21. void mayorEdad(char nombreArchivo[20]);
  22. int cantidadAnioDeterminado(int anio,char nombreArchivo[20]);
  23. int copiarArregloToArchivo(stAlumno alumnos[100], int validos, char nombreArchivo[20]);
  24. int copiarArchivoToArreglo(stAlumno alumnos[100], int tam, char nombreArchivo[20]);
  25. int cantidadRegistroArchivoX(char nombreArchivoX[20]);
  26. void mostrarUnAlumnoDesdeArchivo(char nombreArchivo[20], int pos);
  27. void sobreescribirRegistro(char nombreArchivo[20]);
  28. void invertir(char nombreArchivo[20]);
  29.  
  30. int main()
  31. {
  32.     char nombreArchivo[] = "alumnos.dat";
  33.     Pila pila;
  34.     inicpila(&pila);
  35.     Pila pila2;
  36.     inicpila(&pila2);
  37.  
  38.     //cargarArchivo(nombreArchivo);
  39.     //cargarAlFinal(nombreArchivo);
  40.     leerArchivo(nombreArchivo);
  41.  
  42.     int cantidadApilados18 = pasarApila(&pila,nombreArchivo,18); //mayores
  43.     //printf("la cantidad de mayores es de ... %d\n",cantidadApilados18);
  44.     //mostrar(&pila);
  45.  
  46.     int nuevaEdad = 32;
  47.     int cantidadApiladosEdad = pasarApila(&pila2,nombreArchivo,nuevaEdad); //otra edad
  48.     //printf("la cantidad de mayores es %d es de ... %d\n",nuevaEdad,cantidadApiladosEdad);
  49.     //mostrar(&pila2);
  50.  
  51.     //mostrarAlumnoPorRango(nombreArchivo,30,50);
  52.  
  53.     // mayorEdad(nombreArchivo);
  54.  
  55.     int cantidadAnio = cantidadAnioDeterminado(1988,nombreArchivo);
  56.     // printf("la cantidad de alumnos en el anio %d es de ... %d\n",1988,cantidadAnio);
  57.  
  58.     /*
  59.  
  60.     stAlumno alumnos[100];
  61.     int tam = 100;
  62.     int validosArreglo = copiarArchivoToArreglo(alumnos,tam,nombreArchivo);
  63.     printf("la cantidad de alumnos pasados al ARREGLO es de ... %d\n",validosArreglo);
  64.     int cantidadArchivo = copiarArregloToArchivo(alumnos,validosArreglo,"otroArchivo.dat");
  65.     printf("otro archivo...\n");
  66.     leerArchivo("otroArchivo.dat");
  67.     */
  68.  
  69.     int cantidadElementos = cantidadRegistroArchivoX(nombreArchivo);
  70.    // printf("la cantidad de alumnos es de ... %d\n",cantidadElementos);
  71.  
  72.   // printf("el alumno en la pos %d es ...\n",2);
  73.    //mostrarUnAlumnoDesdeArchivo(nombreArchivo,2);
  74.  
  75.    //sobreescribirRegistro(nombreArchivo);
  76.  
  77.    invertir(nombreArchivo);
  78.  
  79.     printf("upsidedown? archivo...\n");
  80.  
  81.    leerArchivo(nombreArchivo);
  82.  
  83.     return 0;
  84. }
  85.  
  86. /*
  87. Crear una función que cargue un archivo de alumnos.
  88. Abrirlo de manera tal de verificar si el archivo ya está creado previamente.
  89.  Cargar el archivo con 5 datos. Cerrarlo dentro de la función
  90. */
  91.  
  92. void cargarArchivo(char nombreArchivo[20])
  93. {
  94.     FILE * archi = fopen(nombreArchivo,"rb");
  95.     if (archi == NULL) //el archi no esta!
  96.     {
  97.         archi = fopen(nombreArchivo,"wb");
  98.         if (archi != NULL) //no hay error de escritura
  99.         {
  100.             int cantidadDeDatos = 2;
  101.             int datosCargados = 0;
  102.             for (datosCargados = 0; datosCargados<cantidadDeDatos; datosCargados++)
  103.             {
  104.                 stAlumno aux = cargarUnAlumno();
  105.                 fwrite(&aux,sizeof(stAlumno),1,archi);
  106.             }
  107.         }
  108.     }
  109.     else
  110.     {
  111.         printf("el archi esta con datos\n");
  112.         leerArchivo(nombreArchivo);
  113.     }
  114.  
  115.     fclose(archi);
  116. }
  117.  
  118. stAlumno cargarUnAlumno()
  119. {
  120.     stAlumno aux;
  121.  
  122.     printf("ingrese legajo\n");
  123.     fflush(stdin);
  124.     scanf("%d",&aux.legajo);
  125.  
  126.     printf("ingrese nombre Y apellido \n");
  127.     fflush(stdin);
  128.     gets(aux.nombreYapellido);
  129.  
  130.     printf("ingrese edad \n");
  131.     fflush(stdin);
  132.     scanf("%d",&aux.edad);
  133.  
  134.     printf("ingrese anio \n");
  135.     fflush(stdin);
  136.     scanf("%d",&aux.anio);
  137.  
  138.     return aux;
  139. }
  140.  
  141. /*
  142. Crear una función que muestre por pantalla
  143. los registros de un archivo de alumnos. Modularizar.
  144. */
  145.  
  146. void leerArchivo(char nombreArchivo[20])
  147. {
  148.     FILE * archi = fopen(nombreArchivo,"rb");
  149.     if (archi != NULL) //el archi  esta!
  150.     {
  151.         stAlumno alumnoLector;
  152.         while (fread(&alumnoLector,sizeof(stAlumno),1,archi)>0)
  153.         {
  154.             mostrarUnAlumno(alumnoLector);
  155.         }
  156.     }
  157.     else
  158.     {
  159.         printf("el archivo no existeee\n");
  160.     }
  161.  
  162. }
  163.  
  164. void mostrarUnAlumno(stAlumno aux)
  165. {
  166.     printf("***************\n");
  167.     printf("legajo -> %d\n",aux.legajo);
  168.     printf("nombre Y apellido -> %s\n",aux.nombreYapellido);
  169.     printf("edad -> %d\n",aux.edad);
  170.     printf("anio -> %d\n",aux.anio);
  171.     printf("***************\n");
  172. }
  173.  
  174. /*
  175. Crear una función que permita agregar de a un elemento al final del archivo.
  176.  O sea, se debe abrir el archivo, se piden los datos
  177.  (se llena una variable de tipo struct alumno),
  178.  se escribe en el archivo y se cierra.
  179. */
  180. void cargarAlFinal(char nombreArchivo[20])
  181. {
  182.     FILE * archi = fopen(nombreArchivo,"rb");
  183.     if (archi != NULL) //el archi  esta!
  184.     {
  185.         archi = fopen(nombreArchivo,"ab");//agrego al final
  186.         if (archi != NULL)
  187.         {
  188.             char mander = 's';
  189.             while (mander == 's')
  190.             {
  191.                 stAlumno aux = cargarUnAlumno();
  192.                 fwrite(&aux,sizeof(stAlumno),1,archi);
  193.  
  194.                 printf("desea seguir??? \n");
  195.                 fflush(stdin);
  196.                 scanf("%c",&mander);
  197.             }
  198.         }
  199.         else
  200.         {
  201.             printf("no se puede escribir\n");
  202.         }
  203.     }
  204.     else
  205.     {
  206.         printf("no se puede abrir, existe???\n");
  207.     }
  208.     fclose(archi);
  209. }
  210. /*
  211. Crear una función que pase a una pila los números de legajo de los alumnos mayores de edad.
  212. */
  213. /*
  214. Dado un archivo de alumnos, hacer una función que cuente la cantidad de alumnos mayores a edad específica que se envía por parámetro.
  215. */
  216. int pasarApila(Pila * pilinMayores, char nombreArchivo[20], int edadDeterminada )
  217. {
  218.     FILE * archi = fopen(nombreArchivo,"rb");
  219.     int cantidadApilados = 0;
  220.     if (archi != NULL) //el archi  esta!
  221.     {
  222.         stAlumno alumnoLector;
  223.         while (fread(&alumnoLector,sizeof(stAlumno),1,archi)>0)
  224.         {
  225.             if (alumnoLector.edad >= edadDeterminada)
  226.             {
  227.                 apilar(pilinMayores,alumnoLector.legajo);
  228.                 cantidadApilados++;
  229.             }
  230.         }
  231.     }
  232.     else
  233.     {
  234.         printf("el archivo no existeee\n");
  235.     }
  236.     fclose(archi);
  237.     return cantidadApilados;
  238. }
  239.  
  240. /*
  241. Dado un archivo de alumnos, mostrar por pantalla el nombre de todos los alumnos entre un rango de edades específico (por ejemplo, entre 17 y 25 años).
  242. Dicho rango debe recibirse por parámetro. Modularizar
  243. */
  244.  
  245. void mostrarAlumnoPorRango(char nombreArchivo[20],int minEdad, int maxEdad)
  246. {
  247.     FILE * archi = fopen(nombreArchivo,"rb");
  248.     if (archi != NULL) //el archi  esta!
  249.     {
  250.         stAlumno alumnoLector;
  251.         while (fread(&alumnoLector,sizeof(stAlumno),1,archi)>0)
  252.         {
  253.             if ((alumnoLector.edad > minEdad) && (alumnoLector.edad < maxEdad))
  254.             {
  255.                 mostrarUnAlumno(alumnoLector);
  256.             }
  257.         }
  258.     }
  259.     else
  260.     {
  261.         printf("el archivo no existeee\n");
  262.     }
  263.     fclose(archi);
  264. }
  265. /*
  266. Dado un archivo de alumnos, mostrar el los datos del alumno de mayor edad. Modularizar.
  267. */
  268. void mayorEdad(char nombreArchivo[20])
  269. {
  270.     FILE * archi = fopen(nombreArchivo,"rb");
  271.     if (archi != NULL) //el archi  esta!
  272.     {
  273.         stAlumno alumnoLector;
  274.         stAlumno alumnoMayor;
  275.         fread(&alumnoMayor,sizeof(stAlumno),1,archi);//el primero
  276.         while (fread(&alumnoLector,sizeof(stAlumno),1,archi)>0)//leo desde el segundo
  277.         {
  278.             if (alumnoLector.edad > alumnoMayor.edad)
  279.             {
  280.                 alumnoMayor = alumnoLector;
  281.             }
  282.         }
  283.         printf("el alumno mayor es ...\n");
  284.         mostrarUnAlumno(alumnoMayor);
  285.     }
  286.     else
  287.     {
  288.         printf("el archivo no existeee\n");
  289.     }
  290.     fclose(archi);
  291. }
  292.  
  293. /*
  294. Crear una función que retorne la cantidad de alumnos que cursan un determinado año.
  295. El año buscado se pasa por parámetro.
  296. */
  297.  
  298. int cantidadAnioDeterminado(int anio,char nombreArchivo[20])
  299. {
  300.     FILE * archi = fopen(nombreArchivo,"rb");
  301.     stAlumno alumnoLector;
  302.     int cantidad = 0;
  303.     if (archi != NULL) //el archi  esta!
  304.     {
  305.         while (fread(&alumnoLector,sizeof(stAlumno),1,archi)>0)//leo desde el segundo
  306.         {
  307.             if (alumnoLector.anio == anio)
  308.             {
  309.                 cantidad++;
  310.             }
  311.         }
  312.     }
  313.     fclose(archi);
  314.     return cantidad;
  315. }
  316.  
  317. /*
  318. Crear una función que reciba como parámetro un arreglo de tipo alumno
  319. y lo copie en el archivo.
  320.  
  321. */
  322.  
  323. int copiarArchivoToArreglo(stAlumno alumnos[100], int tam, char nombreArchivo[20])
  324. {
  325.     int validos = 0;
  326.     FILE * archi = fopen(nombreArchivo,"rb");
  327.     stAlumno alumnoLector;
  328.     if (archi != NULL) //el archi  esta!
  329.     {
  330.         while (fread(&alumnoLector,sizeof(stAlumno),1,archi)>0)//leo desde el segundo
  331.         {
  332.             alumnos[validos] = alumnoLector;
  333.             validos++;
  334.         }
  335.     }
  336.     fclose(archi);
  337.     return validos;
  338. }
  339.  
  340. int copiarArregloToArchivo(stAlumno alumnos[100], int validos, char nombreArchivo[20])
  341. {
  342.     int indice = 0;
  343.     FILE * archi = fopen(nombreArchivo,"ab");
  344.     stAlumno alumnoLector;
  345.     if (archi != NULL) //el archi  esta!
  346.     {
  347.         while (indice<validos)// un for tambie
  348.         {
  349.             alumnoLector = alumnos[indice];//aux para guardar
  350.             fwrite(&alumnoLector,sizeof(stAlumno),1,archi);
  351.             indice++;
  352.         }
  353.     }
  354.     fclose(archi);
  355.     return validos;
  356. }
  357.  
  358.  
  359. /*
  360. Crear una función que retorne la cantidad de registros que tiene el archivo.
  361. Usar fseek y ftell.
  362. Puede pensar la función para uso genérico, que sirva para averiguar la cantidad de registros de cualquier archivo.
  363. */
  364. int cantidadRegistroArchivoX(char nombreArchivoX[20])
  365. {
  366.     int cantidadElementos = 0;
  367.      FILE * archi = fopen(nombreArchivoX,"rb");
  368.      if (archi != NULL)
  369.      {
  370.         fseek(archi,0,SEEK_END); //nos vamos al final y nos desplazamos 0
  371.         long tam = ftell(archi); //pedimos bytes hasta el CURSOR
  372.         cantidadElementos = tam / sizeof(stAlumno);
  373.      }
  374.      fclose(archi);
  375.      return cantidadElementos;
  376.  
  377. }
  378. /*
  379. 14. Dado un archivo de alumnos, que tenga al menos 10 registros, hacer una función que muestre
  380. el contenido de un registro, cuyo número (entre 0 y 9) se pase por parámetro.
  381. Controlar no sobrepasar los límites del archivo.
  382. */
  383.  
  384. void mostrarUnAlumnoDesdeArchivo(char nombreArchivo[20], int pos)
  385. {
  386.  
  387.     int cantidad = cantidadRegistroArchivoX(nombreArchivo);
  388.     FILE * archi = fopen(nombreArchivo,"rb");
  389.     stAlumno alumnoLector;
  390.     if (pos <= cantidad)//si me paso una pos que es valida dentro de la cantidad
  391.     {
  392.         if (archi!=NULL)
  393.         {
  394.             fseek(archi,sizeof(stAlumno)*(pos-1),SEEK_SET);
  395.             if (fread(&alumnoLector,1,sizeof(stAlumno),archi)>0)
  396.             {
  397.                 mostrarUnAlumno(alumnoLector);
  398.             }
  399.         }
  400.     }
  401.     else
  402.     {
  403.         printf("pos invalida\n");
  404.     }
  405.     fclose(archi);
  406. }
  407.  
  408. /*
  409. Realice una (o varias) funciones que permitan modificar un registro existente
  410. en el archivo de alumnos. La misma debe permitir modificar uno o
  411. todos los campos de la estructura y sobreescribir el registro existente en el archivo.
  412. */
  413.  
  414. void sobreescribirRegistro(char nombreArchivo[20])
  415. {
  416.     int pos = 0;
  417.     int op = 0;
  418.  
  419.     int cantidadRegistros = cantidadRegistroArchivoX(nombreArchivo);
  420.  
  421.     do
  422.     {
  423.         printf("ingrese un pos valida para modificar\n");
  424.         scanf("%d",&pos);
  425.     }while(pos>cantidadRegistros);
  426.  
  427.     mostrarUnAlumnoDesdeArchivo(nombreArchivo,pos);
  428.  
  429.     printf("desea cambiar todos (0) o algunos (1) ?\n");
  430.     scanf("%d",&op);
  431.  
  432.     FILE * archi = fopen(nombreArchivo,"r+b");
  433.     fseek(archi,sizeof(stAlumno)*(pos-1),SEEK_SET);
  434.  
  435.     if (op == 0)
  436.     {
  437.         stAlumno alumnoNuevo = cargarUnAlumno();
  438.  
  439.         if (archi!=NULL)
  440.         {
  441.             fwrite(&alumnoNuevo,sizeof(stAlumno),1,archi);
  442.         }
  443.         fclose(archi);
  444.     }
  445.     else
  446.     {
  447.         stAlumno alumnoViejo;
  448.         fread(&alumnoViejo,sizeof(stAlumno),1,archi);//leo los datos
  449.         fseek(archi,sizeof(stAlumno)*(pos-1),SEEK_SET); //me vuelvo a la pos original
  450.  
  451.         printf("cual desea modificar?\n");
  452.         printf("1-nombre\n");
  453.         printf("2-anio\n");
  454.         printf("3-legajo\n");
  455.         printf("4-edad\n");
  456.         scanf("%d",&op);
  457.  
  458.         switch (op)
  459.         {
  460.             case 1:
  461.                      printf("ingrese nombre Y apellido \n");
  462.                     fflush(stdin);
  463.                     gets(alumnoViejo.nombreYapellido);
  464.                     break;
  465.             case 2:
  466.                     printf("ingrese anio \n");
  467.                     fflush(stdin);
  468.                     scanf("%d",&alumnoViejo.anio);
  469.                     break;
  470.             case 3:
  471.                     printf("ingrese legajo\n");
  472.                     fflush(stdin);
  473.                     scanf("%d",&alumnoViejo.legajo);
  474.                     break;
  475.             case 4:
  476.                     printf("ingrese edad \n");
  477.                     fflush(stdin);
  478.                     scanf("%d",&alumnoViejo.edad);
  479.                     break;
  480.  
  481.         }
  482.         fwrite(&alumnoViejo,sizeof(stAlumno),1,archi);
  483.         fclose(archi);
  484.     }
  485.  
  486. }
  487.  
  488.  
  489.  
  490. /*
  491. Dado un archivo de alumnos, hacer una función que invierta los elementos del mismo.
  492. No se puede usar otro archivo auxiliar ni un arreglo auxiliar. Debe trabajar sobre el archivo.
  493. Puede utilizar variables de tipo alumno auxiliares.
  494.  
  495. */
  496.  
  497.  
  498. void invertir(char nombreArchivo[20])
  499. {
  500.     stAlumno alumnoIndice;
  501.     stAlumno alumnoLimite;
  502.      int limite = cantidadRegistroArchivoX(nombreArchivo);
  503.      limite = limite - 1;
  504.      FILE * archi = fopen(nombreArchivo,"r+b");
  505.      int indice = 0;
  506.      while (indice < limite)
  507.      {
  508.           printf("indice -> %d limite -> %d\n",indice,limite);
  509.  
  510.           fseek(archi,sizeof(stAlumno)* indice,SEEK_SET);//0
  511.           fread(&alumnoIndice,sizeof(stAlumno),1,archi);
  512.  
  513.           printf("alumnoIndice\n");
  514.  
  515.           mostrarUnAlumno(alumnoIndice);
  516.  
  517.           fseek(archi,sizeof(stAlumno)* (limite),SEEK_SET);//-1 un registro
  518.           fread(&alumnoLimite,sizeof(stAlumno),1,archi);
  519.  
  520.           printf("alumnoLimite\n");
  521.  
  522.           mostrarUnAlumno(alumnoLimite);
  523.  
  524.           fseek(archi,sizeof(stAlumno)* indice,SEEK_SET); //volvemos al principio
  525.           fwrite(&alumnoLimite,sizeof(stAlumno),1,archi); //escribimos el ultimo
  526.  
  527.           fseek(archi,sizeof(stAlumno)* (limite),SEEK_SET);//4-1 = 3 ´pero apuntando al 4
  528.           fwrite(&alumnoIndice,sizeof(stAlumno),1,archi); //escribimos el ultimo
  529.  
  530.  
  531.  
  532.          indice++;
  533.          limite--;
  534.      }
  535.      fclose(archi);
  536. }
Advertisement
Add Comment
Please, Sign In to add comment