marcoshuck

Lista y ordenamiento

Apr 1st, 2014
400
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.96 KB | None | 0 0
  1. /*******************************************************************************
  2.  
  3. CONSIGNA:
  4.  
  5. Genere una aplicación que permita ingresar una lista alumnos, cuya cantidad de alumnos debe ser ingresada por el usuario.
  6.  
  7. La aplicación debe permitir mediante un menú de opciones, mostrar la estructura según su fecha de inscripción,
  8. o según su orden de carga o alfabéticamente de acuerdo al nombre del alumno.  
  9.  
  10. Es de interés registrar la siguiente información de cada alumno: su dni, su nombre y su fecha de inscripción.
  11.  
  12. La fecha de inscripción como es de amplio conocimiento esta formada por sus 3 componentes enteres día, mes y año.
  13.  
  14. Nota: Utilice vectores dinámicos de estructuras para gestionar las inscripciones, y una estructura para modelar la fecha.
  15. Utilice qsort para ordenar los datos.
  16.  
  17. *******************************************************************************/
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20.  
  21. // Maximos caracteres para el nombre
  22. #define MAX_NAME_SIZE 70
  23.  
  24. // Constantes del menú
  25. #define MENU_ORDEN_FECHA 1
  26. #define MENU_ORDEN_CARGA 2
  27. #define MENU_ORDEN_ALFAB 3
  28. #define MENU_ORDEN_DNI 4
  29. #define MENU_CARGAR_DATOS 5
  30. #define MENU_SALIR 6
  31.  
  32. // Constantes generales
  33. #define TRUE 1
  34. #define FALSE 0
  35.  
  36. // Definición de estructuras
  37. typedef struct
  38. {
  39.     unsigned int day,
  40.     month,
  41.     year;
  42. } fecha; // Día/mes/año de inscripción del alumno.
  43.  
  44. typedef struct
  45. {
  46.     unsigned short key; // Key de ordenamiento
  47.     unsigned long int dni; // DNI del alumno
  48.     char name[MAX_NAME_SIZE]; // Nombre del alumno
  49.     fecha fecha_ins;
  50. } person;
  51.  
  52. // Funciones
  53. int cmp_key(const void *e1, const void *e2); // Orden de carga
  54. int cmp_dni(const void *e1, const void *e2); // Orden DNI
  55. int cmp_fecha(const void *e1, const void *e2); // Orden fecha
  56. int cmp_alfab(const void *e1, const void *e2); // Orden alfab
  57. void mostrar_alumnos(person *v, unsigned int size); // Mostrar vector
  58.  
  59. int main(int argc, char *argv[])
  60. {
  61.     // Variables
  62.     unsigned int cant_alumnos, aux_cant_alumnos;
  63.     unsigned int i;
  64.     unsigned int opc;
  65.     unsigned short flag_salir;
  66.    
  67.     // Estructura
  68.     person *alumnos;
  69.    
  70.     // Inicio del programa
  71.     printf("Lista de Alumnos:\n-----------------\n");
  72.     printf("Cantidad de alumnos que desea ingresar: ");
  73.    
  74.     // Cantidad de alumnos a ingresar
  75.     scanf("%u", &cant_alumnos);
  76.    
  77.     // Warning (1) - Cantidad de alumnos no válida
  78.     while(cant_alumnos < 1)
  79.     {
  80.         printf("\nWARNING: La cantidad de alumnos no es valida!\n--------\nIngrese la cantidad de alumnos (mayor a 0): ");
  81.         scanf("%u", &cant_alumnos);
  82.     }
  83.    
  84.     // Vector dinámico
  85.     alumnos = (person *)calloc(cant_alumnos, sizeof(person));
  86.     if(alumnos == NULL)
  87.     {
  88.         // Warning (2) - No hay espacio en la memoria
  89.         printf("\nWARNING: No hay suficiente espacio en la memoria.\n");
  90.         system("PAUSE");
  91.         return -1;
  92.     }
  93.     // Proceso de carga
  94.     for(i = 0; i < cant_alumnos; i++)
  95.     {
  96.         system("CLS");
  97.         alumnos[i].key = i;
  98.         printf("Alumno %u:\n-----------------\n", i);
  99.         printf("DNI: ");
  100.         scanf("%u", &alumnos[i].dni);
  101.         printf("Nombre: ");
  102.         fflush(stdin);
  103.         fgets(alumnos[i].name, MAX_NAME_SIZE, stdin);
  104.         printf("Fecha de inscripcion:\n");
  105.         printf("DD: ");
  106.         scanf("%u", &alumnos[i].fecha_ins.day);
  107.         printf("MM: ");
  108.         scanf("%u", &alumnos[i].fecha_ins.month);
  109.         printf("AAAA: ");
  110.         scanf("%u", &alumnos[i].fecha_ins.year);
  111.        
  112.     }
  113.     system("CLS");
  114.    
  115.     // Mostrar datos cargados
  116.     printf("Datos cargados:\n---------------\n");
  117.     mostrar_alumnos(alumnos, cant_alumnos);
  118.     system("PAUSE");
  119.    
  120.     // Mostrar menu inicial y ordenamiento
  121.     system("CLS");
  122.     do
  123.     {
  124.         system("CLS");
  125.         printf("MENU:\n-----\n\n");
  126.         printf("\t%u- Mostrar datos ordenados segun fecha de inscripcion.\n", MENU_ORDEN_FECHA);
  127.         printf("\t%u- Mostrar datos ordenados segun orden de carga.\n", MENU_ORDEN_CARGA);
  128.         printf("\t%u- Mostrar datos ordenados alfabeticamente.\n", MENU_ORDEN_ALFAB);
  129.         printf("\t%u- Mostrar datos ordenados segun DNI.\n", MENU_ORDEN_DNI);
  130.         printf("\t%u- Cargar mas datos.\n", MENU_CARGAR_DATOS);
  131.         printf("\t%u- Salir.\n\n", MENU_SALIR);
  132.         flag_salir = FALSE;
  133.         printf("Opcion elegida: ");
  134.         scanf("%u", &opc);
  135.         switch(opc)
  136.         {
  137.             case MENU_ORDEN_FECHA: // Ordenamiento por fecha
  138.             {
  139.                 system("CLS");
  140.                 printf("Ordenamiento de datos por fecha:\n--------------------------------\n");
  141.                 qsort(alumnos, cant_alumnos, sizeof(person), cmp_fecha);
  142.                 mostrar_alumnos(alumnos, cant_alumnos);
  143.                 system("PAUSE");
  144.                 break;
  145.             }
  146.             case MENU_ORDEN_CARGA:  // Ordenamiento original
  147.             {
  148.                 system("CLS");
  149.                 printf("Ordenamiento dado por la carga original de datos:\n-------------------------------------------------\n");
  150.                 qsort(alumnos, cant_alumnos, sizeof(person), cmp_key);
  151.                 mostrar_alumnos(alumnos, cant_alumnos);
  152.                 system("PAUSE");
  153.                 break;
  154.             }
  155.             case MENU_ORDEN_ALFAB:  // Ordenamiento alfabetico
  156.             {
  157.                 system("CLS");
  158.                 printf("Ordenamiento por orden alfebetico:\n-----------------------------------\n");
  159.                 qsort(alumnos, cant_alumnos, sizeof(person), cmp_alfab);
  160.                 mostrar_alumnos(alumnos, cant_alumnos);
  161.                 system("PAUSE");
  162.                 break;
  163.             }
  164.             case MENU_ORDEN_DNI:  // Ordenamiento por DNI
  165.             {
  166.                 system("CLS");
  167.                 printf("Ordenamiento dado por DNI:\n--------------------------\n");
  168.                 qsort(alumnos, cant_alumnos, sizeof(person), cmp_dni);
  169.                 mostrar_alumnos(alumnos, cant_alumnos);
  170.                 system("PAUSE");
  171.                 break;
  172.             }
  173.             case MENU_CARGAR_DATOS:  // Cargar más datos
  174.             {
  175.                 printf("\nIngrese la cantidad de datos nuevos que desea agregar: ");
  176.                 aux_cant_alumnos = cant_alumnos;
  177.                 scanf("%u", &cant_alumnos);
  178.                 cant_alumnos += aux_cant_alumnos;
  179.                 alumnos = (person *)realloc(alumnos, cant_alumnos*sizeof(person));
  180.                 for(i = aux_cant_alumnos; i < cant_alumnos; i++)
  181.                 {
  182.                     system("CLS");
  183.                     alumnos[i].key = i;
  184.                     printf("Alumno %u:\n-----------------\n", i);
  185.                     printf("DNI: ");
  186.                     scanf("%u", &alumnos[i].dni);
  187.                     printf("Nombre: ");
  188.                     fflush(stdin);
  189.                     fgets(alumnos[i].name, MAX_NAME_SIZE, stdin);
  190.                     printf("Fecha de inscripcion:\n");
  191.                     printf("DD: ");
  192.                     scanf("%u", &alumnos[i].fecha_ins.day);
  193.                     printf("MM: ");
  194.                     scanf("%u", &alumnos[i].fecha_ins.month);
  195.                     printf("AAAA: ");
  196.                     scanf("%u", &alumnos[i].fecha_ins.year);
  197.                 }
  198.                 mostrar_alumnos(alumnos, cant_alumnos);
  199.                 system("PAUSE");
  200.                 break;
  201.             }
  202.             case MENU_SALIR:  // Salir
  203.             {
  204.                 flag_salir = TRUE;
  205.                 break;
  206.             }
  207.         }
  208.     }
  209.     while(!flag_salir);
  210.     system("CLS");
  211.     free((void *)alumnos);
  212.     printf("La ejecuccion ha terminado exitosamente. Presione una tecla para continuar.\n");
  213.     system("PAUSE>NULL");
  214.     return 0;
  215. }
  216. // Orden KEY
  217. int cmp_key(const void *e1, const void *e2)
  218. {
  219.     person * aux_e1 = (person *)e1;
  220.     person * aux_e2 = (person *)e2;
  221.     return (aux_e1->key) - (aux_e2->key);
  222. }
  223.  
  224. // Orden DNI
  225. int cmp_dni(const void *e1, const void *e2)
  226. {
  227.     person * aux_e1 = (person *)e1;
  228.     person * aux_e2 = (person *)e2;
  229.     return (aux_e1->dni) - (aux_e2->dni);
  230. }
  231.  
  232. // Orden FECHA
  233. int cmp_fecha(const void *e1, const void *e2)
  234. {
  235.     long int f1, f2;
  236.     person * aux_e1 = (person *)e1;
  237.     person * aux_e2 = (person *)e2;
  238.     f1 = aux_e1->fecha_ins.year*1000 + aux_e1->fecha_ins.month*100 + aux_e1->fecha_ins.day;
  239.     f2 = aux_e2->fecha_ins.year*1000 + aux_e2->fecha_ins.month*100 + aux_e2->fecha_ins.day;
  240.     return f1 - f2;
  241. }
  242. // Orden ALFABETICO
  243. int cmp_alfab(const void *e1, const void *e2)
  244. {
  245.     person * aux_e1 = (person *)e1;
  246.     person * aux_e2 = (person *)e2;
  247.     return (strcmp(aux_e1->name, aux_e2->name));
  248. }
  249.  
  250. // Mostrar alumnos
  251. void mostrar_alumnos(person *v, unsigned int size)
  252. {
  253.     int i;
  254.     for(i = 0; i < size; i++)
  255.     {
  256.         printf("Alumno %u: ", v[i].key);
  257.         printf("DNI: %u | Fecha: %u\\%u\\%u | Nombre: %s\n", v[i].dni, v[i].fecha_ins.day, v[i].fecha_ins.month, v[i].fecha_ins.year, v[i].name);
  258.     }
  259. }
Advertisement
Add Comment
Please, Sign In to add comment