Ejercicio en C++: Ordenamiento Burbuja

Descripción del Problema

Quienes recibiran 20 cables de longitudes distintas que van desde 1 cm a 35 cm de manera al azar, nmo recibirán cables de longitudes iguales. Representar cada cable con * por cada centímetro y al final de cada cable su longitud representada en unidades. Por ejemplo:

Imprimir de manera automática todos los pasos de ordenamiento. Debe poder verse cada paso del ordenamiento en pantalla y diga en cuantos pasos se ha realizado una vez terminado el proceso de impresión de ordenamiento. Por ejemplo:

Solución

#include <stdio.h>
#include <stdlib.h>

int NUMERO_DE_CABLES = 20;
int NUMERO_DE_ALUMNOS = 10;
int MINIMO = 1;
int MAXIMO = 35;

char nombres[10][50] = {
    "Agustin",
    "Beatriz",
    "Carlos",
    "Daniela",
    "Eugenio",
    "Fabiola",
    "Gustavo",
    "Hilda",
    "Ignacio",
    "Juan"
};

int cables[10][20];

void printCablesAlumno(int id)
{
    system("cls");
    if(id < 0 || id > NUMERO_DE_ALUMNOS-1)
    {
        printf("El alumno que seleccionaste no existe el rango esta entre 1-10.\n");
    }
    else
    {
        printf("%i-\t%s\n",id+1, nombres[id]);
        int i,j;
        for(i = 0; i < NUMERO_DE_CABLES; i++)
        {
            for(j=0; j < cables[id][i]; j++)
            {
                printf("*");
            }
            printf(" %i cm\n", cables[id][i]);
        }
    }
}

void ordenarCables(int id_alumno)
{
    system("cls");
    printf("%i-\t%s\n",id_alumno+1, nombres[id_alumno]);

    int i,j,temp, numero_de_permutaciones = 0;

    // procedemos a ordenar con el metodo burbuja
    for (i=1; i<NUMERO_DE_CABLES; i++)
        for(j=0 ; j<NUMERO_DE_CABLES - 1; j++)
            if (cables[id_alumno][j] > cables[id_alumno][j+1])
            {
                system("cls");
                printf("%i-\t%s\n",id_alumno+1, nombres[id_alumno]);

                // Hacemos una Permutacion
                temp = cables[id_alumno][j];
                cables[id_alumno][j] = cables[id_alumno][j+1];
                cables[id_alumno][j+1] = temp;

                // Imprimimos en Pantalla el nuevo ordenamiento de los cables
                printCablesAlumno(id_alumno);

                // Contabilizamos las permituaciones
                numero_de_permutaciones++;
            }
    printf("Se ordenaron en %i pasos", numero_de_permutaciones);

    // scanneamos el enter
    fflush(stdin);
    getchar();
}

void listarAlumnos()
{
    int i;
    printf("Alumnos con cables:\n");
    for(i = 0; i < NUMERO_DE_ALUMNOS; i++)
    {
        printf("%i-\t%s\n",i+1, nombres[i]);
    }
}

/**
 * @brief inicializarCables
 * Con esta funcion inicializamos los valores de los cables que tendra cada alumno
 */
void inicializarCables()
{
    int N_ALUMNO,N_CABLE;
    int numero_aleatorio;
    int i;

    for(N_ALUMNO=0; N_ALUMNO < NUMERO_DE_ALUMNOS; N_ALUMNO++)
    {
        for(N_CABLE=0; N_CABLE < NUMERO_DE_CABLES; N_CABLE++)
        {
            buscar:
            numero_aleatorio = (rand() % (MAXIMO - MINIMO + 1)) + MINIMO;
            // nos aseguramos que el numero aleatorio no este en uso
            for (i = 0; i < NUMERO_DE_CABLES; i++)
            {
                if(cables[N_ALUMNO][i] == numero_aleatorio )
                {
                    // una vez  que ya encontramos que el numero esta en uso no necesitamos segiur checando
                    goto buscar;
                }
            }

            cables[N_ALUMNO][N_CABLE] = numero_aleatorio;
        }
    }
}

int main()
{
    int opcion;
    int opcion_de_ordenamiento;
    int alumno_id;
    int i,j;

    inicializarCables();

    do{
        system("cls");
        listarAlumnos();

        printf("\nOpciones:\n");
        printf("1-Ver a los alumnos por separado\n");
        printf("2-Ordenar a todos los alumnos\n");
        printf("3-Salir\n\n");

        printf("Opcion:");
        scanf("%i",&opcion);

        switch (opcion)
        {
        case 1:
            system("cls");
            listarAlumnos();

            printf("Que alumno Deseas ver? ");
            scanf("%i", &alumno_id);
            printCablesAlumno(alumno_id-1);

            printf("Deseas ordenar (1-SI, 2-NO)");
            scanf("%i", &opcion_de_ordenamiento);

            if(opcion_de_ordenamiento == 1)
            {
                // SI
                ordenarCables(alumno_id-1);
            }
            break;
        case 2:
            for(i = 0; i < NUMERO_DE_ALUMNOS; i++)
            {
                ordenarCables(i);
            }
            break;
        case 3:
            printf("\nPrograma Terminado.\n\n");
            break;
        }
    }while(opcion != 3);

    return 0;
}

Comentarios