25 - Vectores y matrices paralelas (ordenamiento)


Cuando se tienen vectores y matrices paralelas y se ordena uno de ellos hay que tener la precaución de intercambiar los elementos de los vectores o matrices paralelas.

Problema 1:

Confeccionar un programa que permita cargar los nombres de 5 alumnos y sus notas respectivas. Luego ordenar las notas de mayor a menor. Imprimir las notas y los nombres de los alumnos.

Programa: programa127.c

Ver video

#include<stdio.h>
#include<conio.h>
#include<string.h>

void cargar(char nombres[5][40],int notas[5])
{
    int f;
    for(f=0;f<5;f++)
    {
        printf("Ingrese el nombre del alumno:");
        gets(nombres[f]);
        printf("Ingrese la nota del alumno:");
        scanf("%i",&notas[f]);
        fflush(stdin);
    }
}

void ordenar(char nombres[5][40],int notas[5])
{
    int k,f;
    int auxnota;
    char auxnombre[40];
    for(k=0;k<4;k++)
    {
        for(f=0;f<4-k;f++)
        {
            if (notas[f]<notas[f+1])
            {
                auxnota=notas[f];
                notas[f]=notas[f + 1];
                notas[f+1]=auxnota;
                strcpy(auxnombre, nombres[f]);
                strcpy(nombres[f], nombres[f+1]);
                strcpy(nombres[f+1],auxnombre);
            }
        }
    }
}

void imprimir(char nombres[5][40],int notas[5])
{
    int f;
    printf("Listado de alumnos ordenados por notas en forma descendiente\n");
    for(f=0;f<5;f++)
    {
        printf("%s - %i\n",nombres[f],notas[f]);
    }
}


int main()
{
    char nombres[5][40];
    int notas[5];
    cargar(nombres,notas);
    ordenar(nombres,notas);
    imprimir(nombres,notas);
    getch();
    return 0;
}

En la función main definimos la matriz y el vector:

int main()
{
    char nombres[5][40];
    int notas[5];

La función cargar recibe la matriz y el vector para proceder a su carga por teclado:

void cargar(char nombres[5][40],int notas[5])
{
    int f;
    for(f=0;f<5;f++)
    {
        printf("Ingrese el nombre del alumno:");
        gets(nombres[f]);
        printf("Ingrese la nota del alumno:");
        scanf("%i",¬as[f]);
        fflush(stdin);
    }
}

En el proceso de ordenamiento dentro de los dos for verificamos si debemos intercambiar los elementos del vector notas:

    for(k=0;k<4;k++)
    {
        for(f=0;f<4-k;f++)
        {
            if (notas[f]<notas[f+1])
            {

En el caso que la nota de la posición 'f' sea menor a de la posición siguiente 'f+1' procedemos a intercambiar las notas:

                auxnota=notas[f];
                notas[f]=notas[f + 1];
                notas[f+1]=auxnota;

y simultánemamente procedemos a intercambiar los elementos de la matriz paralela (con esto logramos que el vector continúen siendo paralelo a la matriz):

                strcpy(auxnombre, nombres[f]);
                strcpy(nombres[f], nombres[f+1]);
                strcpy(nombres[f+1],auxnombre);

Como vemos utilizamos dos auxiliares distintos porque los elementos de la matriz y el vector son de distinto tipo (int y cadena de caracteres)

Si deseamos ordenar alfabéticamente la condición dependerá de la matriz nombres.

Problema propuesto

Solución
programa128.c

#include<stdio.h>
#include<conio.h>
#include<string.h>

void cargar(char paises[5][40],int habitantes[5])
{
    int f;
    printf("Carga de paises y habitantes.\n");
    for(f=0;f<5;f++)
    {
        printf("Ingrese el nombre del pais:");
        gets(paises[f]);
        printf("Ingrese la cantidad de habitantes:");
        scanf("%i",&habitantes[f]);
        fflush(stdin);
    }
}

void ordenarPorNombres(char paises[5][40],int habitantes[5])
{
    int k,f;
    char auxpais[40];
    int auxhabitante;
    for (k=0;k<4;k++)
    {
        for(f=0;f<4-k;f++)
        {
            if (strcmp(paises[f],paises[f+1])>0)
            {
                strcpy(auxpais,paises[f]);
                strcpy(paises[f],paises[f+1]);
                strcpy(paises[f+1],auxpais);
                auxhabitante=habitantes[f];
                habitantes[f]=habitantes[f+1];
                habitantes[f+1]=auxhabitante;
            }
        }
    }
}

void ordenarPorHabitantes(char paises[5][40],int habitantes[5])
{
    int k,f;
    char auxpais[40];
    int auxhabitante;
    for (k=0;k<4;k++)
    {
        for(f=0;f<4-k;f++)
        {
            if (habitantes[f]<habitantes[f+1])
            {
                strcpy(auxpais,paises[f]);
                strcpy(paises[f],paises[f+1]);
                strcpy(paises[f+1],auxpais);
                auxhabitante=habitantes[f];
                habitantes[f]=habitantes[f+1];
                habitantes[f+1]=auxhabitante;
            }
        }
    }
}

void imprimir(char paises[5][40],int habitantes[5])
{
    int f;
    for(f=0;f<5;f++)
    {
        printf("%s - %i \n",paises[f],habitantes[f]);
    }
}

int main()
{
    char paises[5][40];
    int habitantes[5];
    cargar(paises,habitantes);
    ordenarPorNombres(paises,habitantes);
    printf("Ordenados alfabeticamente\n");
    imprimir(paises,habitantes);
    ordenarPorHabitantes(paises,habitantes);
    printf("Ordenados por cantidad de habitantes\n");
    imprimir(paises,habitantes);
    getch();
    return 0;
}


Retornar