Foros del Web » Programación para mayores de 30 ;) » .NET »

Ordenar numeros en arrays y mostrar ordenados y originales

Estas en el tema de Ordenar numeros en arrays y mostrar ordenados y originales en el foro de .NET en Foros del Web. Muy buenas a ver si alguien me puede hechar una mano porque no entiendo varias cosas sobre un codigo que me han puesto. Esto simplemente ...
  #1 (permalink)  
Antiguo 05/11/2011, 15:29
 
Fecha de Ingreso: mayo-2008
Mensajes: 228
Antigüedad: 15 años, 10 meses
Puntos: 2
Ordenar numeros en arrays y mostrar ordenados y originales

Muy buenas a ver si alguien me puede hechar una mano porque no entiendo varias cosas sobre un codigo que me han puesto.

Esto simplemente lo que hace es ordenar unos nº que introducire por pantalla, esta por ejemplo ordena de forma ascendente y aqui es donde empiezo a perderme, en la funcion ordenar en el for se le dice el tamaño del array -2, esto correjidme pero con-1 funcionaria de empezar el array en 1 pero al empezar en 0 se le quita 2 espacios dejando subindice 0,1,2,3 por ejemplo de 4 nº...? esque no lo entiendo, no se que hace.

Otra cosa es que si le doy los valores 6,8,5y3 lo que se esta haciendo no se si es recorrer el array parreglo con los valores 6,8,5,3 unas 2 veces una con j y otra con i con diferentes subindices ?, por lo que los 2 arrays tienen el mismo contenido? ¿en el primer bucle se recorre desde el subindice 0 hasta el 3 y en el 2º del subindice 1 hasta el 4? y se pregunta si el subindice 0 de parreglo(i) es > que el j con subindice 1?, osea si 6 > 6?, despues si es asi igualo los 2 arrays a 6?. A ver si alguien me puede hechar una mano con esto que no lo veo nada claro, y lo mejor de todo es que funciona correctamente pero sigo sin verlo, yo por ejemplo habria dado a comparar



Código VBnet:
Ver original
  1. Module Module1
  2.  
  3.     Sub Main()
  4.         Dim sdatoconsola As String
  5.         Dim N As Integer
  6.         Dim arrDatosConsola() As String
  7.         Dim arrOrdenado() As String
  8.         Dim sTipoOrdenamiento As String
  9.         Dim iCursorLeft, iCursorTop As Integer
  10.  
  11.  
  12.         While True
  13.             Console.Clear()
  14.  
  15.             Console.Write("Escriba la cantidad de numeros entre 1 y 9: ")
  16.             sdatoconsola = Console.ReadLine
  17.  
  18.             If sdatoconsola.Length = 0 Then 'salida al pulsar intro o no introducir nada
  19.                 Exit Sub
  20.             End If
  21.  
  22.             ' Validamos si es numerico
  23.             If sdatoconsola < "1" Or sdatoconsola > "9" Then
  24.                 Console.WriteLine("Error: valor numerico fuera de rango")
  25.                 Console.ReadLine()
  26.                 Continue While
  27.             End If
  28.             N = CInt(sdatoconsola) 'CInt convierte a entero
  29.             'desde el nº escrito de la cantidad hasta la cantidad puesta
  30.  
  31.             Console.Write("Ordenamiento: A(Ascendente), D (Descendente)")
  32.             iCursorLeft = Console.CursorLeft
  33.             iCursorTop = Console.CursorTop
  34.  
  35.             While True
  36.                 'desplazamientos de cursor al escribir
  37.                 sTipoOrdenamiento = Console.ReadLine()
  38.                 If sTipoOrdenamiento.Length = 0 Then Exit While
  39.                 If sTipoOrdenamiento.ToUpper = "A" Or sTipoOrdenamiento.ToUpper = "D" Then Exit While
  40.                 Console.Beep()
  41.                 Console.CursorTop = iCursorTop
  42.                 Console.CursorLeft = iCursorLeft
  43.                 Console.Write(Space(20))
  44.                 Console.CursorLeft = iCursorLeft
  45.  
  46.             End While
  47.  
  48.             If sTipoOrdenamiento.Length = 0 Then Continue While
  49.  
  50.  
  51.             For i = 1 To N
  52.                 Console.Write("Valores a ordenar: ")
  53.                 sdatoconsola = Console.ReadLine
  54.                 ' Validamos si los nºs introducidos son correctos
  55.                 ReDim Preserve arrDatosConsola(i - 1) 'Redim da dimension al array y declara subindice 0 empieza el bucle el array seria el arrDatosConsola(0),2º arrDatosConsola(1)...
  56.                 'sin preserve se redimensionaria continuamente el ultimo pero al redimensionar te borra los anteriores y solo te queda el ultimo que te hizo
  57.                 'con preserve preserva los anteriores.
  58.                 arrDatosConsola(i - 1) = sdatoconsola 'se almacena en indice 0 aunque empecemos en i=1
  59.             Next
  60.  
  61.             ReDim arrOrdenado(N)
  62.             arrOrdenado = arrDatosConsola
  63.             arrOrdenado = Ordenar(arrDatosConsola.Clone, sTipoOrdenamiento) 'copia que no cambia el original sino la copia
  64.             'con "A" Ascendente y "D" Descendente
  65.  
  66.             Console.WriteLine()
  67.             Console.WriteLine("Original Ordenado")
  68.             For i = 0 To arrOrdenado.Length - 1
  69.                 Console.WriteLine(arrDatosConsola(i) & "          " & _
  70.                 arrOrdenado(i))
  71.             Next
  72.  
  73.             Console.ReadLine()
  74.         End While
  75.  
  76.     End Sub
  77.  
  78.  
  79.  
  80.     Function Ordenar(ByVal pArreglo As String(), ByVal pTipoOrden As String) As String()
  81.         'la funcion devuelve un array de contenidos string
  82.  
  83.         Dim sauxiliar As String
  84.  
  85.         If ValidarArrayNumerico(pArreglo) Then 'si validararraynumerico devuelve true... es numerico
  86.             For i As Integer = 0 To pArreglo.Length - 2
  87.                 For j As Integer = i + 1 To pArreglo.Length - 1
  88.                     If pTipoOrden.ToUpper = "A" Then
  89.                         'transforma en mayuscula upper para evitar mayusculas y minusculas
  90.                         If pArreglo(i) > pArreglo(j) Then
  91.                             sauxiliar = pArreglo(i)
  92.                             pArreglo(i) = pArreglo(j)
  93.                             pArreglo(j) = sauxiliar
  94.                         End If
  95.                     Else 'si son cadenas
  96.                         If pArreglo(i) < pArreglo(j) Then
  97.                             sauxiliar = pArreglo(i)
  98.                             pArreglo(i) = pArreglo(j)
  99.                             pArreglo(j) = sauxiliar
  100.                         End If
  101.                     End If
  102.                 Next
  103.             Next
  104.  
  105.         Else
  106.  
  107.             For i As Integer = 0 To pArreglo.Length - 2
  108.                 For j As Integer = i + 1 To pArreglo.Length - 1
  109.                     If CInt(pArreglo(i)) > CInt(pArreglo(j)) Then
  110.                         If pArreglo(i) > pArreglo(j) Then
  111.                             sauxiliar = pArreglo(i)
  112.                             pArreglo(i) = pArreglo(j)
  113.                             pArreglo(j) = sauxiliar
  114.                         End If
  115.                     Else
  116.                         If pArreglo(i) > pArreglo(j) Then
  117.                             sauxiliar = pArreglo(i)
  118.                             pArreglo(i) = pArreglo(j)
  119.                             pArreglo(j) = sauxiliar
  120.                         End If
  121.                     End If
  122.  
  123.                 Next
  124.             Next
  125.  
  126.         End If
  127.  
  128.         ' -2 porque si hay 4 numeros hace falta recorrerlos, length da 4 elementos
  129.         ' el for estando paradao en i recorre el resto.
  130.  
  131.  
  132.         Ordenar = pArreglo
  133.  
  134.     End Function
  135.  
  136.     Function ValidarArrayNumerico(ByVal pArreglo() As String) As Boolean
  137.         Dim sElementoArreglo As String
  138.  
  139.         For i As Integer = 0 To pArreglo.Length - 1
  140.             sElementoArreglo = pArreglo(i)
  141.             For j As Integer = 0 To sElementoArreglo.Length - 1 'recorre las cadenas del array
  142.                 'parar el bucle en cada caracter de la string y preguntar si es numerico con substring
  143.                 If sElementoArreglo.Substring(j, 1) < "0" _
  144.                 Or sElementoArreglo.Substring(j, 1) > "9" Then
  145.                     ValidarArrayNumerico = False
  146.                     ' o tambien return fase
  147.                     'si el elemento arreglo pilla la cadena que recorre j de un caracter
  148.                     ' y lo compara con <0 o > 9 entonces son caracteres
  149.                 End If
  150.             Next
  151.         Next
  152.         ValidarArrayNumerico = True
  153.         'return true
  154.     End Function
  155.  
  156.  
  157. End Module

Última edición por arts; 05/11/2011 a las 17:16
  #2 (permalink)  
Antiguo 06/11/2011, 10:54
 
Fecha de Ingreso: mayo-2008
Mensajes: 228
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ordenar numeros en arrays y mostrar ordenados y originales

Voy a cambiar la pregunta jeje, sabia que era demasiado compleja, al final he estado viendo metodos de ordenacion y este que se usa en la funcion dice la gente que se llama metodo de la burbuja donde se compara la posicion 1 conla 2 si es mayor la 1 que 2 hace el intercambio y asi con la 2 con la 3... hasta el final, curiosamente he encontrado este video que aunque se ve fatal y se oye mnal algo empiezo a entender del porque se le pone ese -2 a length del array.

http://www.youtube.com/watch?v=qpyM4...eature=related
  #3 (permalink)  
Antiguo 07/11/2011, 04:46
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Ordenar numeros en arrays y mostrar ordenados y originales

¿Sigues teniendo alguna pregunta o ya tienes la duda resuelta?

Porque no lo dejas muy claro.

Saludos.
  #4 (permalink)  
Antiguo 07/11/2011, 15:48
 
Fecha de Ingreso: mayo-2008
Mensajes: 228
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ordenar numeros en arrays y mostrar ordenados y originales

Pues esactamente lo que nollego a comprender del todo es como realiza el intercambio de numeros enel for, ese pArreglo(i) = pArreglo(j) que hace, que se supone que intercambia el contenido de i a j, cosa que no la entiendo porque a mi paraecer lo que diria que hace al ver esto seria igualar el contenido de j al de i, es decir si le pongo por ejemplo los numeros 4,6,2,5

no se escatamente que cambios realiza el bucle for.
  #5 (permalink)  
Antiguo 08/11/2011, 09:04
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Ordenar numeros en arrays y mostrar ordenados y originales

Si que realiza un intercambio, pero es que no te has fijado en todo el código.


Código vb:
Ver original
  1. sauxiliar = pArreglo(i)
  2. pArreglo(i) = pArreglo(j)
  3. pArreglo(j) = sauxiliar

Si te fijas, para realizar el intercambio utiliza una variable auxiliar llamada sauxiliar. En esta variable guardar el valor que se encuentra en la posicion i del vector. Luego asigna el valor de la posición j a la posición i y finalmente guarda el valor de la variable sauxiliar en la posicion i del vector.

Con todo esto lo que realiza es un intercambio de los valores.

Saludos.
  #6 (permalink)  
Antiguo 08/11/2011, 10:57
 
Fecha de Ingreso: mayo-2008
Mensajes: 228
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Ordenar numeros en arrays y mostrar ordenados y originales

Madre mia!!, xDD no se porque me ha sido tan dificil imaginarme ese cambio que se realiza, si esque esta claro... gracias apor la explicacion lo he ido haciendo con monedas como arrays de i y de j haciendo el intercambio manualmente y lo he visto claro, juer.. no sabia que una tonteria asi se me podria complicar tanto. :/

Etiquetas: arrays, numeros, originales
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:03.