Visual Basic - ¿For superanidado?

Life is soft - evento anual de software empresarial
 
Vista:

¿For superanidado?

Publicado por Jose Juarez (2 intervenciones) el 05/08/2007 22:40:23
Hola, en programa necesito hacer varios ciclos para hacer combinaciones de elementos. Es mas o menos esto:

for i=1 to 60
for j=1 to 60
for k=1 to 60
for h=1 to 60 (así hasta n veces)
.
.
.
next h
next k
next j
next i

el problema es que no puedo saber cuantos ciclos habrá sino hasta la ejecución del programa, pues serán n ciclos for. Como puedo hacerle para programar esto, es decir, si necesito una variable diferente por cada for (i,j,k,h,,,), tal vez con una función recursiva?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:¿For superanidado?

Publicado por barca1010 (132 intervenciones) el 06/08/2007 12:14:32
yo crearia un funcion publica dentro del proyecto y cada vez que tuvieras que ejecutar el ciclo lo unico que haces es llamar a la funcion y le pasas los parametros si son necesarios

Public Function Prueba()

For i = 1 To 60
next i

End Function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿For superanidado?

Publicado por Antoni Masana (79 intervenciones) el 06/08/2007 12:59:53
La recursividad podria ser una solucion pero quizas no es la mejor pues no es infinita y tiene sus limites.

Escribir 100 o más FOR anidados no es la mejor idea por que es muy complicado de mantener y las anidaciones tambien tienen sus limites.

Se me ocurre una idea ( Falta estudiarla y pulirla ).

Crear una tabla de N elementos numericos y un puntero.
Cada elemento de la tabla representaria un FOR y el puntero (de la tabla) en que FOR esta.

Pongamos un ejemplo con tres elementos: Tabla a cero, puntero a cero

01. Sumo 1 al puntero
02. Sumo 1 a la tabla en la posicion del puntero ( FOR 1 )
03. Sumo 1 al puntero
04. Sumo 1 a la tabla en la posicion del puntero ( FOR 2 )
05. Sumo 1 al puntero
06. Sumo 1 a la tabla en la posicion del puntero hasta el Valor maximo ( FOR 3 )
07. Resto 1 al puntero
08. Si es CERO Fin
09. Sumo 1 a la tabla en la posicion del puntero ( FOR 2 )
10. Si es menor que el valor MAXIMO voy al punto 5
11'. Resto 1 al puntero
12. Si es CERO Fin
13. Sumo 1 a la tabla en la posicion del puntero ( FOR 1 )
14. Si es menor que el valor MAXIMO voy al punto 3

Esto es un extracto de lo que deberia hacerse, parece complicado y puede que lo sea, pero creo que es más simple

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿For superanidado?

Publicado por Antoni Masana (79 intervenciones) el 07/08/2007 12:38:26
Hola de nuevo.

Como estaba aburrido y no sabia que hacer he realizado en QBasic la solucion que comente ayer.

Esta la version de la tabla y la del FOR (3 fors y 3 bucles)

Para modificar la primera solo es necesario cambiar:
- La dimension de la tabla en el DIM si es necesario
- El Max% (Valor maximo del bucle)
- El Ele% (numero de bucles)

DIM TB%(90)

Pun% = 1
Max% = 3
Ele% = 3

WHILE Pun% > 0
TB%(Pun%) = TB%(Pun%) + 1

' ---&--- Antes del siguiente FOR
PRINT STRING$(Pun%, ".") + CHR$(Pun% + 64);
' ---&---

IF Pun% < Ele% THEN
Pun% = Pun% + 1
END IF

WHILE TB%(Pun%) = Max%
TB%(Pun%) = 0
Pun% = Pun% - 1
IF Pun% > 0 THEN
' ---&--- Despues del Next
PRINT STRING$(Pun%, "."); CHR$(Pun% + 64);
' ---&---
IF Pun% = 1 THEN PRINT
END IF
WEND
WEND

PRINT "-----------------------------------------------------------"

FOR a = 1 TO 3
PRINT ".A";
FOR b = 1 TO 3
PRINT "..B";
FOR c = 1 TO 3
PRINT "...C";
NEXT
PRINT "..B";
NEXT
PRINT ".A"
NEXT

' ---------------------------------------------------

Supongamos que donde imprime "...C" quedemos que imprima A*B*C...

Pondriamos:

IF Pun%=Ele% then
Tot#=1
FOR A%=1 to Pun%
Tot# = Tot# * Tb%(A%)
NEXT
PRINT Tot#
ENDIF

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar