Autor Tema: Ordenar un array y extraer elementos duplicados  (Leído 1349 veces)

0 Usuarios y 1 Visitante están viendo este tema.

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Ordenar un array y extraer elementos duplicados
« en: Agosto 04, 2016, 12:58:35 pm »
Saludos a esta distinguida comunidad forera !!! y En especial a mis compadres ;D YAcosta y ssccaann43 !!!
Tiempo sin pasar por aquí... Bueno, bueno, suficiente. Muchos saludos y después queremos tomarnos unas 'chelas' ('birras', 'frías' o como carajo quieran llamarle ;D) y así no se puede programar...!!! :o ;D

Como no tenía nada que hacer, he estado diseñando una calculadora científica (gran vaina, ¿no? :o ::) ;D) en C# 2013, pero para mantener la práctica (si, ya se que el foro es de VB y VB .Net, pero esperen un poquito,por favor).

El asunto es que una de las funciones que le estoy agregando, es sobre algunos cálculos estadísticos: Población, Frecuencia Absoluta, Frecuencia Absoluta Acumulada, Frecuencia Relativa, Frecuencia Relativa Acumulada, Media Aritmética, entre otras...

Aquí les dejo el código, en él, primero se ingresa el nro de datos deseado, luego los datos uno por uno. Estos se guardan en un arreglo tal cual fueron introducidos. Luego se procede a ordenarlos y a continuación, se extraen los elementos duplicados para 'armar' un arreglo de elementos únicos, de manera que pueda compararse con el arreglo original y así determinar las veces que un elemento se repite, de tal forma, establecer su Frecuencia Absoluta y posteriormente su Frecuencias Relativa, etc...
Repito, no es gran cosa pero me sirvió de práctica y ahí va:

Código: (VB) [Seleccionar]
    Sub Main()
        '// Dim datos() as integer = { 29, 8, 43, 4, 29, 83, 55, 62, 81, 5, 8, 77, 34, 29, 81, 18, 29, 8 };
        Dim array() As Integer
        Dim nTerminos As Integer = 0
        Dim sumaTerminos As Integer = 0
        Dim datoTemporal As Integer = 0
        '// Para depurar el array, eliminando los elementos repetidos...
        Dim arraySR() As Integer
        Dim tTerminosSinDupl As Integer = 0
        '/* Array para guardar las veces que se repite un
        ' * elemento en el array original (frecuencia absoluta)... */
        Dim frecuenciaAbsoluta() As Integer
        Dim cont As Integer = 0     '// Se cuentan las veces que se repite un elemento...
        '/* Para calcular el promedio de todos los elementos del
        ' * array original... */
        Dim promedio As Decimal = 0
        '// Para calcular la frecuecia relativa de cada elemento...
        Dim frecuenciaRelativa() As Decimal
        '// Array para guardar las frecuencias relativas acumuladas...
        Dim frecuenciaRelativaAcumulada() As Decimal
        '// Array para guardar las frecuencias absolutas acumuladas...
        Dim frecuenciaAbsolutaAcumulada() As Integer
        Dim fa As Decimal     '// Frecuencia absoluta...
        Dim faa As Decimal     '// Frecuencia absoluta acumulada...
        Dim fr As Decimal     '// Frecuancia relativa..
        Dim fra As Decimal     '// Frecuencia relativa acumulada...
        Dim sinDupl As Decimal

        Console.Clear()
        '/* Se ingresan los datos que seran guardados en un
        '* arreglo "array()"... */
        Console.Write("    ")
        Console.Write("Cuantos números desea ingresar? ")
        nTerminos = Convert.ToInt32(Console.ReadLine())
        ReDim array(nTerminos)
        Console.WriteLine()

        For i As Integer = 0 To (nTerminos - 1)
            Console.Write("    ")
            Console.Write("Ingrese el número [{0}]: ", i + 1)
            '// Cargando el array...
            array(i) = Convert.ToInt32(Console.ReadLine())
        Next

        Console.WriteLine()
        Console.WriteLine()
        Console.WriteLine()
        Console.Write("    ")
        Console.WriteLine("Mostrando array en el orden en el cual fueron introducidos los datos...")
        Console.WriteLine()
        Console.Write("    ")
        For i As Integer = 0 To (nTerminos - 1)
            Console.Write("{0} ", array(i))
        Next

        '/* Se ordena el Vector de datos o Array mediante el
        ' * método de la burbuja... */
        For i As Integer = 0 To nTerminos - 1
            For j As Integer = 0 To nTerminos - 1
                '// Se procede a ordenarlo...
                If array(i) < array(j) Then
                    datoTemporal = array(i)
                    array(i) = array(j)
                    array(j) = datoTemporal
                End If
            Next
        Next

        Console.WriteLine()
        Console.WriteLine()
        Console.WriteLine()
        Console.Write("    ")
        Console.WriteLine("Array ordenado en forma creciente...")
        Console.WriteLine()
        '// Se muestra el array ya ordenado...
        Console.Write("    ")
        For i As Integer = 0 To nTerminos - 1
            Console.Write("{0} ", array(i))
        Next

        '// Se depura el array, eliminando los elementos repetidos...
        arraySR = array.Distinct().ToArray()
        tTerminosSinDupl = arraySR.Length

        Console.WriteLine()
        Console.WriteLine()
        Console.WriteLine()
        Console.Write("    ")
        Console.WriteLine("Array ordenado y sin duplicados...")
        Console.WriteLine()

        '// Se muestra el array sin elementos duplicados...
        Console.Write("    ")
        For i As Integer = 0 To tTerminosSinDupl - 2
            Console.Write("{0} ", arraySR(i))
        Next

        ReDim frecuenciaAbsoluta(tTerminosSinDupl)

        For i As Integer = 0 To tTerminosSinDupl - 1
            For j As Integer = 0 To nTerminos - 1
                If arraySR(i) = array(j) Then
                    '// Se cuenta el número de repeticiones...
                    cont += 1
                End If
            Next
            '/* Se guarda el número de repeticiones por cada
            ' * elemento en el array "frecuenciaAbsoluta()"... */
            frecuenciaAbsoluta(i) = cont
            '/* Se lleva el contador a cero nuevamente para
            ' * poder contabilizar otro elemento distinto... */
            cont = 0
        Next

        Console.WriteLine()
        Console.WriteLine()
        Console.WriteLine()
        Console.Write("    ")
        Console.WriteLine("Frecuencias Absolutas...")
        Console.WriteLine()
        '/* Se muestra el array con la frecuencia absoluta
        ' * "frecuenciaAbsoluta()"... */
        Console.Write("    ")
        For i As Integer = 0 To tTerminosSinDupl - 2
            Console.Write("{0} ", frecuenciaAbsoluta(i))
        Next

        '/* Se calcula la frecuecia relativa de cada elemento:
        ' * el valor de la frecuencia absoluta de un elemento
        ' * dado entre el número total de los mismos y se guarda
        ' * en el array "frecuanciaRelativa()" */
        ReDim frecuenciaRelativa(tTerminosSinDupl)
        ReDim frecuenciaAbsolutaAcumulada(tTerminosSinDupl)
        ReDim frecuenciaRelativaAcumulada(tTerminosSinDupl)

        For f As Integer = 0 To tTerminosSinDupl - 1
            fa = frecuenciaAbsoluta(f)
            '// Se calcula la frecuencia absoluta acumulada...
            faa = faa + fa
            frecuenciaAbsolutaAcumulada(f) = Convert.ToInt32(faa)
            sinDupl = Convert.ToDecimal(arraySR(f))
            '// Se calcula la frecuencia relativa...
            fr = fa / nTerminos
            '// Se guarda en el array "frecuanciaRelativa()"...
            frecuenciaRelativa(f) = fr
            '// Se calcula la frecuencia relativa acumulada...
            fra = faa / nTerminos
            frecuenciaRelativaAcumulada(f) = fra
        Next

        '// Se calcula el propmedio...
        '// promedio = array.Average() // No funciona correctamente en VB (en C# sin problemas)...
        For prom As Integer = 0 To nTerminos - 1
            sumaTerminos = sumaTerminos + array(prom)
        Next
        promedio = Convert.ToDecimal(sumaTerminos / nTerminos)

        Console.WriteLine()
        Console.WriteLine()
        Console.WriteLine()
        Console.Write("    ")
        '// Se muestra el promedio de todos los datos...
        Console.Write("Promedio: {0}", promedio.ToString("f3"))
        Console.WriteLine()
        Console.WriteLine()
        Console.WriteLine()
        Console.Write("    ")
        Console.WriteLine("Frecuencias: Absolutas, Relativas,")
        Console.Write("    ")
        Console.WriteLine("Absolutas acumuladas y Relativas Acumuladas: ")
        Console.WriteLine()
        '/* Se muestran los elementos del array sin duplicados "arraySR()"
        ' * y las respectivas frecuencias absolutas frecuencias relativas,
        ' * guardadas en los arrays "frecuenciaAbsoluta()", "frecuenciaRelativa()",
        ' * además "FrecuenciaAbsolutaAcumulada() y frecuenciaRelativaAcumulada() */
        Console.Write("    ")
        Console.WriteLine("Xi   fi   Fi     ni      Ni")
        Console.Write("    ")
        Console.WriteLine("────────────────────────────")
        For f As Integer = 0 To tTerminosSinDupl - 2
            Console.Write("    ")
            Console.Write("{0}   ", arraySR(f).ToString("00"))
            Console.Write("{0}   ", frecuenciaAbsoluta(f).ToString("00"))
            Console.Write("{0}   ", frecuenciaAbsolutaAcumulada(f).ToString("00"))
            Console.Write("{0}   ", frecuenciaRelativa(f).ToString("f3"))
            Console.WriteLine("{0}", frecuenciaRelativaAcumulada(f).ToString("f3"))
            Console.WriteLine("    ────────────────────────────")
        Next

        Console.ReadKey()
    End Sub

Originalmente lo diseñé en C#, lo 'traduje' a nuestro queridísimo VB (versiones 2013, pero por el código utilizado, también lo pueden transcribir a versión 2010...)

Espero de verdad que aunque poco 'ortodoxo', le pueda servir de alguna utilidad a alguien.
Y si lo pueden mejorar (que yo pienso que sí) por favor háganlo y eso sí... No olviden subirlo !!!



Saludos !!!

Manuel F. Borrego Sterling  8)
Barcelona, Edo. Anzoátegui. Venezuela.
[Mientras nos permitan seguir comunicándonos...]
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ordenar un array y extraer elementos duplicados
« Respuesta #1 en: Agosto 04, 2016, 11:18:05 pm »
Solo pasaba por aquí para mandarte un gran saludo y un fuerte abrazo y espero que pronto salgan de esa situación.

Saludos

P.D: Sabes pq no comento nada sobre el código  :-) peor igual celebro que lo estés haciendo.
Me encuentras en YAcosta.com