/******************************************************************************* CONSIGNA: Genere una aplicación que permita ingresar una lista alumnos, cuya cantidad de alumnos debe ser ingresada por el usuario. La aplicación debe permitir mediante un menú de opciones, mostrar la estructura según su fecha de inscripción, o según su orden de carga o alfabéticamente de acuerdo al nombre del alumno. Es de interés registrar la siguiente información de cada alumno: su dni, su nombre y su fecha de inscripción. La fecha de inscripción como es de amplio conocimiento esta formada por sus 3 componentes enteres día, mes y año. Nota: Utilice vectores dinámicos de estructuras para gestionar las inscripciones, y una estructura para modelar la fecha. Utilice qsort para ordenar los datos. *******************************************************************************/ #include #include // Maximos caracteres para el nombre #define MAX_NAME_SIZE 70 // Constantes del menú #define MENU_ORDEN_FECHA 1 #define MENU_ORDEN_CARGA 2 #define MENU_ORDEN_ALFAB 3 #define MENU_ORDEN_DNI 4 #define MENU_CARGAR_DATOS 5 #define MENU_SALIR 6 // Constantes generales #define TRUE 1 #define FALSE 0 // Definición de estructuras typedef struct { unsigned int day, month, year; } fecha; // Día/mes/año de inscripción del alumno. typedef struct { unsigned short key; // Key de ordenamiento unsigned long int dni; // DNI del alumno char name[MAX_NAME_SIZE]; // Nombre del alumno fecha fecha_ins; } person; // Funciones int cmp_key(const void *e1, const void *e2); // Orden de carga int cmp_dni(const void *e1, const void *e2); // Orden DNI int cmp_fecha(const void *e1, const void *e2); // Orden fecha int cmp_alfab(const void *e1, const void *e2); // Orden alfab void mostrar_alumnos(person *v, unsigned int size); // Mostrar vector int main(int argc, char *argv[]) { // Variables unsigned int cant_alumnos, aux_cant_alumnos; unsigned int i; unsigned int opc; unsigned short flag_salir; // Estructura person *alumnos; // Inicio del programa printf("Lista de Alumnos:\n-----------------\n"); printf("Cantidad de alumnos que desea ingresar: "); // Cantidad de alumnos a ingresar scanf("%u", &cant_alumnos); // Warning (1) - Cantidad de alumnos no válida while(cant_alumnos < 1) { printf("\nWARNING: La cantidad de alumnos no es valida!\n--------\nIngrese la cantidad de alumnos (mayor a 0): "); scanf("%u", &cant_alumnos); } // Vector dinámico alumnos = (person *)calloc(cant_alumnos, sizeof(person)); if(alumnos == NULL) { // Warning (2) - No hay espacio en la memoria printf("\nWARNING: No hay suficiente espacio en la memoria.\n"); system("PAUSE"); return -1; } // Proceso de carga for(i = 0; i < cant_alumnos; i++) { system("CLS"); alumnos[i].key = i; printf("Alumno %u:\n-----------------\n", i); printf("DNI: "); scanf("%u", &alumnos[i].dni); printf("Nombre: "); fflush(stdin); fgets(alumnos[i].name, MAX_NAME_SIZE, stdin); printf("Fecha de inscripcion:\n"); printf("DD: "); scanf("%u", &alumnos[i].fecha_ins.day); printf("MM: "); scanf("%u", &alumnos[i].fecha_ins.month); printf("AAAA: "); scanf("%u", &alumnos[i].fecha_ins.year); } system("CLS"); // Mostrar datos cargados printf("Datos cargados:\n---------------\n"); mostrar_alumnos(alumnos, cant_alumnos); system("PAUSE"); // Mostrar menu inicial y ordenamiento system("CLS"); do { system("CLS"); printf("MENU:\n-----\n\n"); printf("\t%u- Mostrar datos ordenados segun fecha de inscripcion.\n", MENU_ORDEN_FECHA); printf("\t%u- Mostrar datos ordenados segun orden de carga.\n", MENU_ORDEN_CARGA); printf("\t%u- Mostrar datos ordenados alfabeticamente.\n", MENU_ORDEN_ALFAB); printf("\t%u- Mostrar datos ordenados segun DNI.\n", MENU_ORDEN_DNI); printf("\t%u- Cargar mas datos.\n", MENU_CARGAR_DATOS); printf("\t%u- Salir.\n\n", MENU_SALIR); flag_salir = FALSE; printf("Opcion elegida: "); scanf("%u", &opc); switch(opc) { case MENU_ORDEN_FECHA: // Ordenamiento por fecha { system("CLS"); printf("Ordenamiento de datos por fecha:\n--------------------------------\n"); qsort(alumnos, cant_alumnos, sizeof(person), cmp_fecha); mostrar_alumnos(alumnos, cant_alumnos); system("PAUSE"); break; } case MENU_ORDEN_CARGA: // Ordenamiento original { system("CLS"); printf("Ordenamiento dado por la carga original de datos:\n-------------------------------------------------\n"); qsort(alumnos, cant_alumnos, sizeof(person), cmp_key); mostrar_alumnos(alumnos, cant_alumnos); system("PAUSE"); break; } case MENU_ORDEN_ALFAB: // Ordenamiento alfabetico { system("CLS"); printf("Ordenamiento por orden alfebetico:\n-----------------------------------\n"); qsort(alumnos, cant_alumnos, sizeof(person), cmp_alfab); mostrar_alumnos(alumnos, cant_alumnos); system("PAUSE"); break; } case MENU_ORDEN_DNI: // Ordenamiento por DNI { system("CLS"); printf("Ordenamiento dado por DNI:\n--------------------------\n"); qsort(alumnos, cant_alumnos, sizeof(person), cmp_dni); mostrar_alumnos(alumnos, cant_alumnos); system("PAUSE"); break; } case MENU_CARGAR_DATOS: // Cargar más datos { printf("\nIngrese la cantidad de datos nuevos que desea agregar: "); aux_cant_alumnos = cant_alumnos; scanf("%u", &cant_alumnos); cant_alumnos += aux_cant_alumnos; alumnos = (person *)realloc(alumnos, cant_alumnos*sizeof(person)); for(i = aux_cant_alumnos; i < cant_alumnos; i++) { system("CLS"); alumnos[i].key = i; printf("Alumno %u:\n-----------------\n", i); printf("DNI: "); scanf("%u", &alumnos[i].dni); printf("Nombre: "); fflush(stdin); fgets(alumnos[i].name, MAX_NAME_SIZE, stdin); printf("Fecha de inscripcion:\n"); printf("DD: "); scanf("%u", &alumnos[i].fecha_ins.day); printf("MM: "); scanf("%u", &alumnos[i].fecha_ins.month); printf("AAAA: "); scanf("%u", &alumnos[i].fecha_ins.year); } mostrar_alumnos(alumnos, cant_alumnos); system("PAUSE"); break; } case MENU_SALIR: // Salir { flag_salir = TRUE; break; } } } while(!flag_salir); system("CLS"); free((void *)alumnos); printf("La ejecuccion ha terminado exitosamente. Presione una tecla para continuar.\n"); system("PAUSE>NULL"); return 0; } // Orden KEY int cmp_key(const void *e1, const void *e2) { person * aux_e1 = (person *)e1; person * aux_e2 = (person *)e2; return (aux_e1->key) - (aux_e2->key); } // Orden DNI int cmp_dni(const void *e1, const void *e2) { person * aux_e1 = (person *)e1; person * aux_e2 = (person *)e2; return (aux_e1->dni) - (aux_e2->dni); } // Orden FECHA int cmp_fecha(const void *e1, const void *e2) { long int f1, f2; person * aux_e1 = (person *)e1; person * aux_e2 = (person *)e2; f1 = aux_e1->fecha_ins.year*1000 + aux_e1->fecha_ins.month*100 + aux_e1->fecha_ins.day; f2 = aux_e2->fecha_ins.year*1000 + aux_e2->fecha_ins.month*100 + aux_e2->fecha_ins.day; return f1 - f2; } // Orden ALFABETICO int cmp_alfab(const void *e1, const void *e2) { person * aux_e1 = (person *)e1; person * aux_e2 = (person *)e2; return (strcmp(aux_e1->name, aux_e2->name)); } // Mostrar alumnos void mostrar_alumnos(person *v, unsigned int size) { int i; for(i = 0; i < size; i++) { printf("Alumno %u: ", v[i].key); 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); } }