20 - Vectores - Ordenamiento con vectores paralelos


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

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:

Module Module1

    Public Class PruebaVector16

        Private nombres(4) As String
        Private notas(4) As Integer

        Public Sub Cargar()
            Console.WriteLine("Carga de nombres y notas")
            Dim f As Integer
            For f = 0 To nombres.GetUpperBound(0)
                Console.Write("Ingese el nombre del alumno:")
                nombres(f) = Console.ReadLine()
                Console.Write("Ingrese la nota del alumno:")
                notas(f) = Console.ReadLine()
            Next
        End Sub

        Public Sub Ordenar()
            Dim f, k As Integer
            For k = 0 To notas.GetUpperBound(0) - 1
                For f = 0 To notas.GetUpperBound(0) - 1 - k
                    If notas(f) < notas(f + 1) Then
                        Dim auxnota As Integer
                        auxnota = notas(f)
                        notas(f) = notas(f + 1)
                        notas(f + 1) = auxnota
                        Dim auxnombre As String
                        auxnombre = nombres(f)
                        nombres(f) = nombres(f + 1)
                        nombres(f + 1) = auxnombre
                    End If
                Next
            Next
        End Sub

        Public Sub Imprimir()
            Console.WriteLine("Nombres de alumnos y notas de mayor a menor")
            Dim f As Integer
            For f = 0 To notas.GetUpperBound(0)
                Console.WriteLine(nombres(f) & " - " & notas(f))
            Next
            Console.ReadKey()
        End Sub
    End Class


    Sub Main()
        Dim pv As New PruebaVector16()
        pv.Cargar()
        pv.Ordenar()
        pv.Imprimir()
    End Sub

End Module

Definimos los dos vectores de 5 elementos cada uno (comienzan a numerarse a partir de cero las componentes):

        Private nombres(4) As String
        Private notas(4) As Integer

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

            Dim f, k As Integer
            For k = 0 To notas.GetUpperBound(0) - 1
                For f = 0 To notas.GetUpperBound(0) - 1 - k
                    If notas(f) < notas(f + 1) Then

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:

                        Dim auxnota As Integer
                        auxnota = notas(f)
                        notas(f) = notas(f + 1)
                        notas(f + 1) = auxnota

y simultáneamente procedemos a intercambiar los elementos del vector paralelo (con esto logramos que los dos vectores continúen siendo vectores paralelos):

                        Dim auxnombre As String
                        auxnombre = nombres(f)
                        nombres(f) = nombres(f + 1)
                        nombres(f + 1) = auxnombre

Como vemos utilizamos dos auxiliares distintos porque los elementos de los dos vectores son de distinto tipo (Integer y String)

Problema propuesto

  1. Cargar en un vector los nombres de 5 países y en otro vector paralelo la cantidad de habitantes del mismo. Ordenar alfabéticamente e imprimir los resultados. Por último ordenar con respecto a la cantidad de habitantes (de mayor a menor) e imprimir nuevamente.
Solución
Module Module1

    Public Class PruebaVector17

        Private paises(4) As String
        Private habitantes(4) As Integer

        Public Sub Cargar()
            Dim f As Integer
            Console.WriteLine("Carga de paises y habitantes")
            For f = 0 To paises.GetUpperBound(0)
                Console.Write("Ingese el nombre del pais:")
                paises(f) = Console.ReadLine()
                Console.Write("Ingrese la cantidad de habitantes:")
                habitantes(f) = Console.ReadLine()
            Next
        End Sub

        Public Sub OrdenarPorNombres()
            Dim f, k As Integer
            For k = 0 To paises.GetUpperBound(0) - 1
                For f = 0 To paises.GetUpperBound(0) - 1 - k
                    If paises(f) > paises(f + 1) Then
                        Dim auxpais As String
                        auxpais = paises(f)
                        paises(f) = paises(f + 1)
                        paises(f + 1) = auxpais
                        Dim auxhabitante As Integer
                        auxhabitante = habitantes(f)
                        habitantes(f) = habitantes(f + 1)
                        habitantes(f + 1) = auxhabitante
                    End If
                Next
            Next
        End Sub

        Public Sub OrdenarPorHabitantes()
            Dim f, k As Integer
            For k = 0 To paises.GetUpperBound(0) - 1
                For f = 0 To paises.GetUpperBound(0) - 1 - k
                    If habitantes(f) < habitantes(f + 1) Then
                        Dim auxpais As String
                        auxpais = paises(f)
                        paises(f) = paises(f + 1)
                        paises(f + 1) = auxpais
                        Dim auxhabitante As Integer
                        auxhabitante = habitantes(f)
                        habitantes(f) = habitantes(f + 1)
                        habitantes(f + 1) = auxhabitante
                    End If
                Next
            Next
        End Sub

        Public Sub Imprimir()
            Dim f As Integer
            For f = 0 To paises.GetUpperBound(0)

                Console.WriteLine(paises(f) & " - " & habitantes(f))
            Next
        End Sub

    End Class


    Sub Main()
        Dim pv As New PruebaVector17()
        pv.Cargar()
        pv.OrdenarPorNombres()
        Console.WriteLine("Ordenados alfabéticamente")
        pv.Imprimir()
        pv.OrdenarPorHabitantes()
        Console.WriteLine("Ordenados por cantidad de habitnates")
        pv.Imprimir()
        Console.ReadKey()
    End Sub

End Module

Retornar