marcoshuck icon

Lista y ordenamiento

marcoshuck | PRO | 04/02/14 03:00:03 AM UTC | 0 ⭐ | 360 👁️ | Never ⏰ | []
C |

8.96 KB

|

None

|

0 👍

/

0 👎

/*******************************************************************************
 
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 <stdio.h>
#include <stdlib.h>
 
// 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);
    }
}

Comments