CLR: .Net / Mono / Boo / Otros CLR > VB .NET

 Programa De Combinaciones

(1/1)

dacaba:
Bueno que tal a todos soy nuevo en esto de la programacion y encontre este foro al cual pienso concurrir mucho biggrin.gif

Aqui mi duda: :rolleyes:

Necesito crear un programa que muestre las combinaciones posibles para cuatro elementos ingrsados por el usuario por el inputbox (los elementos deben ser letras, numeros o numeros y letras).
Trabajo con Visual.Net 2005 y bueno les comento a mas detalles para que me colaboren:

Al cargar el formulario este queda inactivo esperando que el usuario haga algo  :comp:
cuando el usuario de click en un boton llamado "START"  el programa le muestre un msgbox("Donde le dice que acontinuación debe ingresar los elementos a combinar")
luego la captura de datos la tengo que hacer con inputbox, y aquí empiezan mis dudas, pues no se si es mejor capturar los elemtos (datos) en un arreglo(unidimensional), o en variable propia para cada dato , o en una variable tipo String.

Dependiendo de esto:
a= inputbox("el dato")
b= inputbox("el dato")
=================>>> Este seria manejando una variable para cada dato
num(0) = inputbox("el dato") Pero al hacer esto me produce error porque debo de hacer referencia new para el elemento... es lo que dice
=================>>> Este seria con arreglo
dim cadena as Sring
cadena = inutbox("se toman todos los 4 datos aqui") y luego seguiria trabajar con los funciones de cadena
======================================================
Amigos lo siguiente es hacerla combinaciones:

Debo de utilizar sentencias de control como: if else end if; while end while... For to step  next;
Para hacer as combinaciones no se como hacerlo
Gracias por su tiempo y por la colaboración

lencho:
http://foros.solocodigo.com/index.php?showtopic=31489&hl=
http://foros.solocodigo.com/index.php?showtopic=31490&hl=

No es necesario que repitas tu mismo problema en varios lugares, solo basta una vez. <_<

BYTE

Nebire:
Si sólo tienes que hacer permutaciones con 4 elementos, lo mejor es ni siquiera clacularlo, puesto que su factorial es 24, estas las puedes guardar directamente ya en una matriz, así no tienes que calcularlo cada vez que supuestamente pasares por una rutina dada, simplemente bastaría con leerlo de la función que toma las asignaciones:

sería algo como:


--- Código: Text ---  rutina donde se usan las combinaciones   dim combina(0 to 23)     .....    .....   combina=asignaCombinas 'llamar a la asignación de combinaciones     ....fin rutina funcion asignaCombinas() as string()   asignaCombinas(0)=&#34;ABCD&#34;   asignaCombinas(1)=&#34;ABDC&#34;   asignaCombinas(2)=&#34;ACBD&#34;          ...         ...           ...   asignaCombinas(22)=&#34;DCAB&#34;   asignaCombinas(23)=&#34;DCBA&#34;fin funcion  
Claro que si usas muy a menudo esto entonces es mejor hacer la variable combina pública, e invocar sólo una vez a la función asignaCombinas, es decir en el evento load del programa, así te quedaría disponible el resto del programa.

Es una solución rápida y eficaz para un problema concreto (4 elementos con 24 permutaciones), así que si es así de concreto, va adecuado.
p.d.: releyendo tu pregunta... dices que los guarismos a usar son los que entren por un inputbox, en ese caso tienes que llamar a otra función después de la de asignación que consisite en un bucle de sustitución.

en ese caso debes sustituir cada "J" por cada "A" que aparezca en los elementos de combina()... fíjate de no cometer el error, de si coinciden un guarismo que se entra con otro que está en uso (excepto que sea el último guarismo), ya que si haces así, como ocurriría con la entrada(1) ("C"), entonces todas las "B" existentes serían "C", pero como también existen "C" entonces el siguiente cambio daría erróneo.

Esto se evita con un guarismo intermedio, es decir antes de intercambiar, debes comprobar que los guarismos de entrada noo son idénticos a los que ya hay, si los hay entonces aquel que ya exista (excepto si es el último, debes cambiarlo temporalmente por otro que no exista, por ejemplo por "~" ú otros poco frecuentes, después de terminar, ya no habra "C" 'ces' con lo que cambiarías "~" por "C".... si sólo hay una coincidencia, podrías hacer ese cambio el último, así no precisarías hacer un cambio intermedio....

Espero que me entiendas...

Es decir si el usuario introdjo: entrada(0)="J", entrada(1)="C", entrada(2)="K", entrada(3)="Y"

--- Código: Text --- funcion remplazaCombinas   dim suelto(0 to 3)   dim temp(0 to 3)   dim usar(0 to 3)   temp(0)=&#34;#&#34; : temp(1)=&#34;€&#34; : temp(2)=&#34;@&#34; : temp(3)=&#34;~&#34; 'matriz supuesta para reemplazar temporalmente a la matriz entrada.      suelto=deshaceCombina(combina(0))      existen=compruebaCoincidencias(entrada,suelto)      if existen=true entonces '           usar=temp '  usamos la matriz temp      no existen  'entonces usamos la matriz entrada         usar=entrada      fin existe     for i=0 to 3      cambiarPor=usar(i)      for k=1 to 23         suelto=deshaceCombina(combina(K))         combina(k)=intercambia(suelto, cambiarPor)      fin k   fin i   if existen=true then  'si existen ya que se mudaron por algunos que 'supuestamente no existen, ahora los cambiamos por los que introdujo el usuario....      for i=0 to 3         cambiarPor=entrada(i)         for k=1 to 23            suelto=deshaceCombina(combina(K))            combina(k)=intercambia(suelto, cambiarPor)         fin k      fin i   end iffin funcion ' intercambia los valores y los reune en una cadena que devuelvefuncio intercambia(destino(),origen) as string    for i=0 to 3       if origen=destino(i) luego          destino(i)=origen(i)       end if       intercambia=intercambia & destino(i)    fin i  fin funcion ' comprueba si un guarismo entrado ya existe en la cadena a sustituirfuncion compruebaCoincidencias(a() as string,b() as string) as boolean   dim repes as byte   for i=0 to 3      for k=0 to 3         if a(i)=b(k) then                 repes=respes +1         end if      fin k   fin i   compruebaCoincidencias=(repes&#62;0)fin funcion ' entrando un string en la forma &#34;ABCD&#34; devuelve una matriz ' enla forma c(0)=&#34;A&#34;, c(1)=&#34;B&#34;, c(2)=&#34;C&#34;, c(3)=&#34;D&#34;funcion deshaceCombina(cadena as string) as string()   deshaceCombina(0)=mid(cadena,1,1)   deshaceCombina(1)=mid(cadena,2,1)   deshaceCombina(2)=mid(cadena,3,1)   deshaceCombina(3)=mid(cadena,4,1) fin funcion  
Fíjate que no te he resuelto el caso de que sólo haya una equivalencia entre los guarismos usados, he asumido que todos están repes, y he asumido que dichos caracteres no los va a usar el usuario, en realidad eso es algo que tendrás que poner tú, yo te he puesto esos valores, para que no sea todo muy en el aire...con poco esfuerzo puedes mejorarlo, ya que yo lo he escrito de corrido...procurando que me entiendas sin liarte demasiado.

jpaler:
el algoritmo q buscas es el tipico algoritmo del anagrama...
...,buscalo en internet e intenta entenderlo, realmente tiene solo
unas cuantas lines, pero es algo complejo...

ya sabes... anagrama...

Salu2 !!!

Navegación

[0] Índice de Mensajes

Ir a la versión completa