No Puedo poner los for que me da la gana

Iniciado por llegaraprogramador, 12 Junio 2010, 00:51 AM

0 Miembros y 4 Visitantes están viendo este tema.

llegaraprogramador

Cuando llega el codigo al algoritmo de la burbuja, no me ordena los vaores de la matriz, no puedo poner muchos for, esa es la pregunta.

Un salduo
Gracias


Private Sub Command1_Click()
Dim numescaños As Double
numescaños = Val(Text3.Text - 1)
Dim temp, n As Double
Dim hasta As Double
Dim m As Double
n = Val(4 * (numescaños + 1))

Dim i, j As Double

ReDim matriz(numescaños, 3)
ReDim vector(n)
Dim votos(3) As Long
m = 0


matriz(0, 0) = Text1(0).Text
matriz(0, 1) = Text1(1).Text
matriz(0, 2) = Text1(2).Text
matriz(0, 3) = Text1(3).Text

vector(0) = Text1(0).Text

vector(1) = Text1(1).Text
vector(2) = Text1(2).Text
vector(3) = Text1(3).Text

minimo = -3


For i = 1 To numescaños
minimo = minimo + 3

For j = 0 To 3
dimension = Val(i + j + minimo + 3)
matriz(i, j) = Val(matriz(0, j) / (i + 1))
vector(dimension) = Val(matriz(0, j) / (i + 1))

'MsgBox (matriz(i, j))

Next
Next

For z = 0 To n - 1

For x = 0 To n

If vector(x) > vector(x + 1) Then
temp = vector(x)

vector(x + 1) = vector(x)
vector(x) = temp
End If



Next x

Next z

For a = 0 To n - 1



MsgBox (vector(a))

Next


hasta = vector(numescaños)
MsgBox (hasta)





MsgBox (hasta)
For t = 0 To 3
votos(t) = 0
Next


For x = 0 To numescaños


For j = 0 To 3
If matriz(x, j) > hasta Then
votos(j) = Val(votos(j) + 1)

k = k + 1
Else

End If

Next
Next
MsgBox (k)
For z = 0 To 3
MsgBox (votos(z))
Next


End Sub

Shell Root

#1
1. No entendí un carajo. Obviamente puedo poner todos los FOR que se te de la gana, la cuestión es el motivo de usar tantos. Por ejemplo:
Código (vb) [Seleccionar]
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim e As Integer
Dim f As Integer

For a = 0 To 10
  For b = 0 To 10
    For c = 0 To 10
      For d = 0 To 10
        For e = 0 To 10
          For f = 0 To 10
            MsgBox "Esto para que?"
          Next
        Next
      Next
    Next
  Next
Next


2. Pon el código entre la etiqueta correspondiente.
3. Que quieres hacer?
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

BlackZeroX

Cita de: llegaraprogramador en 12 Junio 2010, 00:51 AM
Cuando llega el codigo al algoritmo de la burbuja:

Aqui tienes uno mas rapido:



http://foro.elhacker.net/empty-t272312.0.html



y aqui uno por parte de LeandroA



http://www.leandroascierto.com.ar/foro/index.php?topic=279.0



PD.: Usa Geshi code=vb, Ordena tu Codigo para que sea mas legible. seguro no puedes agregar muchos For Next por que no as cerrado algun For!¡.

Dulce Infieno Lunar!¡.
The Dark Shadow is my passion.

Shell Root

Todo eso para ordenar por burbuja?
Código (vb) [Seleccionar]
Private Sub Command1_Click()
 Dim numescaños As Double
 Dim temp, n As Double
 Dim hasta As Double
 Dim m As Double
 Dim i, j As Double
 Dim votos(3) As Long
 ReDim matriz(numescaños, 3)
 ReDim vector(n)

 numescaños = Val(Text3.Text - 1)
 n = Val(4 * (numescaños + 1))
 m = 0
 matriz(0, 0) = Text1(0).Text
 matriz(0, 1) = Text1(1).Text
 matriz(0, 2) = Text1(2).Text
 matriz(0, 3) = Text1(3).Text

 vector(0) = Text1(0).Text
 vector(1) = Text1(1).Text
 vector(2) = Text1(2).Text
 vector(3) = Text1(3).Text

 minimo = -3 ' ¿?
 
 For i = 1 To numescaños
   minimo = minimo + 3
   For j = 0 To 3
     dimension = Val(i + j + minimo + 3)
     matriz(i, j) = Val(matriz(0, j) / (i + 1))
     vector(dimension) = Val(matriz(0, j) / (i + 1))
     'MsgBox (matriz(i, j))
   Next j
 Next i

 For z = 0 To n - 1
   For x = 0 To n
     If vector(x) > vector(x + 1) Then
       temp = vector(x)
       vector(x + 1) = vector(x)
       vector(x) = temp
     End If
   Next x
 Next z

 For a = 0 To n - 1
   MsgBox (vector(a)) ' ¿(a)?
 Next a

 hasta = vector(numescaños)
 MsgBox (hasta)

 MsgBox (hasta)
 For t = 0 To 3
   votos(t) = 0' ¿?
 Next t

 For x = 0 To numescaños
   For j = 0 To 3
     If matriz(x, j) > hasta Then
       votos(j) = Val(votos(j) + 1)
       k = k + 1
     Else
       'What the fuck this is?
     End If
   Next j
 Next x
 
 MsgBox (k) ' ¿Que es k?
 
 For z = 0 To 3
   MsgBox (votos(z)) ' ¿(z)?
 Next z

End Sub
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

BlackZeroX


por hay lei que
Código (vb) [Seleccionar]

  For z = 0 To 3
    MsgBox (votos(z)) ' ¿(z)?
  Next


Es mas rapido que

Código (vb) [Seleccionar]

  For z = 0 To 3
    MsgBox (votos(z)) ' ¿(z)?
  Next z


Ya que Next buscaria el for que invoca al contador z

Dulce Infierno Lunar!¡,
The Dark Shadow is my passion.

Shell Root

Interesting donde lo leiste, igual yo no lo uso, solo los puse para identificar la cantidad y cierre de FOR's
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

BlackZeroX

#6
Cita de: shellroot@alex-laptop:~$ en 12 Junio 2010, 02:00 AM
Interesting donde lo leiste, igual yo no lo uso, solo los puse para identificar la cantidad y cierre de FOR's

yo hago algo similar solo que enlugar de poner la variable contador porgo la expresion xP

Código (vb) [Seleccionar]


   For z = 0 To 3
       MsgBox (votos(z)) ' ¿(z)?
   Next    '   //  For z = 0 To 3



Aqui un codigo de Prueva para lo del For ... Next (Aun que no estoy muy convensido)

Código (vb) [Seleccionar]


Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Sub main()
Dim Lng_Ini             As Long
Dim Lng_IniforNext      As Long
Const Lng_ForNextMax    As Long = 9999952#
Dim Int_Test            As Integer
Const Int_CantTest      As Integer = 10

    Int_Test = 0
    Do While Int_Test < Int_CantTest
        Debug.Print ""
        Debug.Print "prueba Numero"; Int_Test + 1
        Debug.Print "Inicializando: For ... Next Lng_IniforNext"
        Lng_Ini = GetTickCount
        For Lng_IniforNext = 1 To Lng_ForNextMax
        Next
        Debug.Print "Tiempo Transcurrido;"; GetTickCount - Lng_IniforNext
       
        Debug.Print "Inicializando: For ... Next"
        Lng_Ini = GetTickCount
        For Lng_IniforNext = 1 To Lng_ForNextMax
        Next Lng_IniforNext
        Debug.Print "Tiempo Transcurrido;"; GetTickCount - Lng_IniforNext
        Int_Test = Int_Test + 1
    Loop
End Sub



P.D.: Creo que lo vi en VBSpeed.

Dulce Infierno Lunar!¡.
The Dark Shadow is my passion.

llegaraprogramador

Este programa es para calcular los votos de cuatro partidos polítocos por la lei de  d´hont  http://www.elmundo.es/elecciones2000/cifras/dhont.html, para realizar esta tarea tengo que hacer division de los votos por cada escaña es decir:
El indice de partidos y escaños empieza por 0 para que sea mas facil de orientarse en una matriz
Partido A: 60 VOTOS
PARTIDO B: 100 VOTOS
PARTIDO C: 400 VOTOS
PARTIDO D: 200 VOTOS
En cada escaño se van haciendo sucesivas divisiones.
Partidos/Escaños     0  (Escaño1)    1  (Escaño2)   2 (Escaño 3)     3 (Escaño 4)
0  (A)                       60                      30                   20                15
1   (B)                      100                     50                   16,3             25
2   (C)                      400                    200                  133,33       100       
3   (D)                      200                     100                  66,6         50


Se cogen los valores mas altos de todo el array, hasta el numero de escaños que quieras. En el ejemplo de arriba 400,200,200,133,3

Como lo quiero hacer yo, creo una matriz de dos dimensiones, los valores del primer escaño ya los pongo directamente sin bucle, despues con un bucle for anidadado hago las sucesivas divisiones para los demas escaños

For i = 1 To numescaños
minimo = minimo + 3

For j = 0 To 3
dimension = Val(i + j + minimo + 3)
matriz(i, j) = Val(matriz(0, j) / (i + 1))
vector(dimension) = Val(matriz(0, j) / (i + 1))

'MsgBox (matriz(i, j))

Next
Next

ademas creo otra matriz pero esta vez unidireccional para despues ordenarlos, es decir una matriz de 16 dimensiones para el ejemplo anterior. Los cuatro primeros valores de esa matriz tambien son introducidos manualmente.
Pero despues para introducir las dimensiones al mismo tiempo que la matriz de dos dimensiones hago esto

minimo = -3


For i = 1 To numescaños
minimo = minimo + 3

For j = 0 To 3
dimension = Val(i + j + minimo + 3)
matriz(i, j) = Val(matriz(0, j) / (i + 1))
vector(dimension) = Val(matriz(0, j) / (i + 1))
para enterdo seria asi
que hace el bucle con la matriz de dos dimensiones

10= 1 + 3 +0    20= 2 +3 +3      30=3 + 3 + 6
11= 2 + 3 + 0    21=3 + 3 +3      31= 4 + 3 +6
12= 3  + 3+ 0   22=4 + 3 + 2       32 = 5 + 3 + 6
13= 4 + 3 +0    23= 5  + 3 + 3      33= 6 + 3 +6


despues con un algorimo de ordenamiento, por ejemplo el de burbuja pretendo ordenar esa matriz unidirecional para  15 elementos, posteriormente cogeria el valor que coincide con la variable numdeescaños   

hasta = vector(numescaños)

Con unos bucles for anidados pretendo hacer comparar todo el array de dos dimensiones con el valor hasta anteriormnete calculado, los valores iguales o mayores que los introduzca a otro array con un contador.
La variable es para saber si conto el numero de escaños que debia, hay bastantes msgbox por todo el programa, son para saber si hace lo que tiene que hacer
Un saludo
Gracias
Espero que entienedan el funcionamiento del programa
Todo el problema viene cuando empieza a ordenar en el algoritmode burbuja, coge valores atípicos en el segundo valore

For x = 0 To numescaños


For j = 0 To 3
If matriz(x, j) >= hasta Then
votos(j) = Val(votos(j) + 1)

k = k + 1
Else

End If

Next
Next




Private Sub Command1_Click()
Dim numescaños As Double
numescaños = Val(Text3.Text - 1)
Dim temp, n As Double
Dim hasta As Double
Dim m As Double
n = Val(4 * (numescaños + 1))

Dim i, j As Double

ReDim matriz(numescaños, 3)
ReDim vector(n)
Dim votos(3) As Long
m = 0


matriz(0, 0) = Text1(0).Text
matriz(0, 1) = Text1(1).Text
matriz(0, 2) = Text1(2).Text
matriz(0, 3) = Text1(3).Text

vector(0) = Text1(0).Text

vector(1) = Text1(1).Text
vector(2) = Text1(2).Text
vector(3) = Text1(3).Text

minimo = -3


For i = 1 To numescaños
minimo = minimo + 3

For j = 0 To 3
dimension = Val(i + j + minimo + 3)
matriz(i, j) = Val(matriz(0, j) / (i + 1))
vector(dimension) = Val(matriz(0, j) / (i + 1))

'MsgBox (matriz(i, j))

Next
Next

For z = 0 To n - 1

For x = 0 To n

If vector(x) > vector(x + 1) Then
temp = vector(x)

vector(x + 1) = vector(x)
vector(x) = temp
End If



Next x

Next z

For a = 0 To n - 1



MsgBox (vector(a))

Next


hasta = vector(numescaños)
MsgBox (hasta)





MsgBox (hasta)
For t = 0 To 3
votos(t) = 0
Next


For x = 0 To numescaños


For j = 0 To 3
If matriz(x, j) > hasta Then
votos(j) = Val(votos(j) + 1)

k = k + 1
Else

End If

Next
Next
MsgBox (k)
For z = 0 To 3
MsgBox (votos(z))
Next


End Sub

llegaraprogramador


Dreamaker

Te recomiendo que escribas tu código en GeSHi porque sino resulta ilegible el código y nadie le hará la gana de leerlo

Un poco más prolijo los posts señores.. :¬¬