• Viernes 8 de Noviembre de 2024, 07:02

Autor Tema:  ordenar ms y min en una lista  (Leído 1622 veces)

MoonSorroW

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
ordenar ms y min en una lista
« en: Domingo 2 de Noviembre de 2008, 01:55 »
0
que onda gente pues ocupo ayuda  con mi programa de visua lo que quiero es que me encuentre el numero mayor y menor de un arreglo burbuja que ya lo hize solo me falta lo de encontrar el max y min y q eme o muestre en un text aaqui es dejo el codigo que llevo . el problema que tengo es que siempre me encuentra el de la pocision 0 y no el mayor  LO QUE OCUPO ES QUE ME ENCUENTRE EL MAYOR Y LE MINIMO EN  FUNCIONES espero qeu me ayuden a corregir mi programa
aqui es el formulario
Código: Text
  1. Dim multi() As Integer
  2. Dim mayo As Integer, may As Integer, men As Integer
  3. Dim n As Integer
  4.  
  5.  
  6. Private Sub Command1_Click()
  7. List1.AddItem Text1.Text
  8. Text1.Text = ""
  9. Text1.SetFocus
  10.  
  11. End Sub
  12.  
  13. Private Sub Command2_Click()
  14. Dim p As Integer
  15. p = List1.ListCount
  16. List1.RemoveItem (p - 1)
  17.  
  18. End Sub
  19.  
  20. Private Sub Command3_Click()
  21.  
  22. nume = List1.ListCount
  23.  
  24. ReDim multi(nume)
  25.  
  26.  
  27. For i = 0 To nume - 1
  28.     multi(i) = List1.List(i)
  29. Next i
  30. Call menu(multi, nume)
  31.  
  32. List1.Clear
  33. Text1.SetFocus
  34. For i = 0 To nume - 1
  35.     List1.List(i) = multi(i)
  36. Next i
  37.  
  38.  
  39.  
  40. End Sub
  41.  
  42. Private Sub Command4_Click()
  43. List1.Clear
  44. Text1.SetFocus
  45.  
  46.  
  47. End Sub
  48.  
  49. Private Sub Command5_Click()
  50. Unload Me
  51. End Sub
  52.  
  53. Private Sub Command6_Click()
  54. nume = List1.ListCount
  55. may = List1.List(0)
  56. mx (may)
  57. n = mx(may)
  58. If n = 1 Then
  59. Text2.Text = Str(may)
  60. End If
  61.  
  62.  
  63. End Sub
  64.  
  65. Private Sub Command7_Click()
  66. nume = List1.ListCount
  67. men = List1.List(0)
  68. mn (men)
  69. n = mn(men)
  70. If n = 1 Then
  71. Text3.Text = Str(men)
  72. End If
  73.  
  74.  
  75.  
  76. End Sub
  77.  
  78. Private Sub Command8_Click()
  79. Dim i As Integer
  80. Dim suma As Integer
  81. suma = 0
  82. nume = List1.ListCount
  83.  
  84. For i = 0 To nume - 1
  85. suma = suma + List1.List(i)
  86.  
  87. Next i
  88. Text4.Text = suma
  89.  
  90. End Sub
  91.  
  92.  

aqui el moduo donde van las funciones
Código: Text
  1.  
  2.  
  3. Dim nume, j As Integer, y As Integer, i, p As Integer
  4. Sub menu(multi, nume)
  5.  
  6. For i = 0 To nume - 1
  7.     For y = i + 1 To nume
  8.         If multi(i) < multi(y) Then
  9.             j = multi(i)
  10.             multi(i) = multi(y)
  11.             multi(y) = j
  12.         End If
  13.     Next y
  14. Next i
  15.  
  16.  
  17. End Sub
  18.  
  19. Function mx(may As Integer)
  20.  
  21. For i = 0 To nume - 1
  22. If List1.List(i) < may Then
  23. may = List1.List(i)(nume - 1)
  24. End If
  25. Next i
  26. mx = 1
  27. End Function
  28.  
  29. Function mn(men As Integer)
  30. For i = 0 To nume - 1
  31. If List1.List(i) > men Then
  32. men = List1.List(i)
  33. End If
  34. Next i
  35. mn = 1
  36. End Function
  37.  

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: ordenar ms y min en una lista
« Respuesta #1 en: Lunes 3 de Noviembre de 2008, 13:14 »
0
Es normal que no te devuelva correctamente ....
Tienes varias cosas que corregir, pero sólo me voy a ceñir a las 2 funciones del módulo

1º ) Esta declaración: 'Function mx(may As Integer)' (y la otra del menor) , cualquier declaración de una función sin tipo de retorno se entiende como Variant, sin embargo se observa que recibe un entero,y viendo lo que hace sería pués lo correcto que devolviera un entero tal que declararla así: 'Function mx(may As Integer) as integer' . Si en una función no vas a usar el parámetro de retorno y lo devuelves por referencia directamente desde el parámetro, entonces sería mejor que fuera una sub en vez de una function. aunque en algunos casos una sub pueda funcionar más rápido en devolver valores que una función, sólo interesa cuando la cantidad de llamadas es muy grande y no usamos inmeditamente el valor devuelto, ya que si esto último no se cumple no existe ventaja en la velocidad.

La función (funciones) que tienes son un ejemplo donde es conveniente devolver el valor como devolución de llamada porque el valor es un resultado final, si una matriz fuera evaluada sobre un sólo ítem la llamada a la función sería acorde que se devolviera con byref a través del parámetro dejando la devolución de la llamada libre para devolver una circunstancia concreta, ya que sería un valor 'medio' de un proceso mayor y no un proceso final en sí mismo.

En una función no conviene usar otroas variables que las declaradas explícitamente dentro de la misma, a través de sus parámetros y/o algunas constantes globales, así usar 'list1', no es lo adecuado, porque al hacer eso restringes la capacidad de una función, ya que la fuerzas a trabajar a una parcela concreta (sólo funciona con esa lista) si en cambio le pasas como parámetro un listbox la función podría aplicarse a cualquier lista que le pasaras y no sólo a list1.Es decir le estás restando universalidad a la función.  Pero bueno, supondremos que es sólo un ejercicio...

Si como dices esas funciones están en un módulo, duiudo que funcionen ya que marcarían error al usar list1, y en ese caso se debería indicar como form1.list1... por lo que queda claro que no lo tienes en un módulo como señalas sino dentro del formulario.

En la devolución de las funciones (las dos) lo que devuelves es 1, fíjate ya le dices después de hacer lo que sea que 'mx = 1', por tanto lo que devolverá es 1. Por otro lado puesto que no declaras may dentro del parámetro se sobrenetiende que es byRef por lo que todavía podría funcionar, sin embargo al recibir la llamada, ignoras ese valor en favor del retorno explíxito de la llamada.
'n = mx(may)' . O usas call mx(may) y sigues usando may hasta el final o usas mx= may al final de la función.

También se observa en relación con lo anterior un intento mísero de querer tener control del resultado de la función cuando usas: 'If n = 1 Then', sin embargo resulta absurdo desde el momento en que nunca tiene oportunidad de ser un valor distinto de 1 ya que la función al final hace un si o si  'mx = 1', esto sólo puede variar cuando haya un error y en ese caso ya el propio entorno se encarga de parar la ejecución porque tampoco existe control de errores (si es que esperaras uno, sobre código adicional que hayas retirado al mostrar el ejemplo).

Luego veo que en el supuesto módulo declaras variables globales a variables que se repiten dentro de una y otra función, al respecto debes saber que las variables de una función 'nacen' y deben 'morir'  en la función, así la línea 'Dim nume, j As Integer, y As Integer, i, p As Integer' es casi un insulto a la función, pués que impide en un momento dado usar i ó p en otra función y obtener errores porque de entrada no eran 0, debo recordar si el valor que tiene actualmente me es útil al caso presente o acaso si es opuesto ?.... esto no son formas...
 
En fin en tan poco código produces tantos y tantos errores que se me han quitado hasta las ganas de resolverte las dudas... porque creo que igualmente sólo serviría para cometer otras decenas de atropellos... sólo puedo recomendarte que dejes el código de momento, y que no vuelvas a escribir una línea más hasta que te hayas leído por lo menos un manual que sepas que es una variable, qué es una función, que es un método o subrutina, etc, etc, etc... de lo contrario adquirirás muy malos hábitos que luego te costará mucho corregir y serás un programador caótico e ineficiente sin futuro alguno.
«Ma non troppo»
----> ModoVacaciones = False<----

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: ordenar ms y min en una lista
« Respuesta #2 en: Viernes 28 de Noviembre de 2008, 01:47 »
0
Me da gusto ver cuando Nebire responde una duda

Nota:
Lo coloque en Verde por Respeto
Saludos.


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]