• Lunes 23 de Diciembre de 2024, 04:38

Autor Tema:  Procesamiento De Datos  (Leído 1250 veces)

riesgobudro22

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Procesamiento De Datos
« en: Jueves 12 de Junio de 2008, 10:53 »
0
Hola amigos,

Soy nuevo en esto del visual basic y ando algo perdido. No encuentro cómo hacer lo que quiero y me pregunto si es demasiado difícil o simplemente que no encuentro la solución.
Vamos a ver, querría hacer un programa en 2 partes

1. Imaginemos que tengo una lista de números determinada:

1
2
3
0
0
2
3
4

Me gustaría tener dos columnas o dos cuadros de textos en los que incluir esta cadena y, en la otra columna o cuadro, el resultado. Mi idea es que el programa filtrase un determinado número de 0 contiguos.
Por ejemplo, indicarle al programa que filtre un determinado número de 0 consecutivos (por ejemplo, que filtre todos los 0 consecutivos que no sean superiores a 10 o 15). Así, en el anterior caso tendríamos: 1,2,3,2,3,4 (porque me habría eliminado los 2 0 no superiores a 10)

2. Ahora la segunda parte.
Tengo una lista con números positivos y negativos. Lo que me gustaría es eliminar en otra columna o cuadro de texto todos aquellos número positivos o negativos contiguos que sean inferiores a un número. Por ejemplo, imaginemos que tengo 1,2,3,7, 3, 4,5, 7,-4,-5, 5, 6, -4, -2, -3, -4, -5, 6.
Si yo quisiera tener positivos o negativos consecutivos superiores a 3, me quedaría la siguiente lista: 1,2,3,7,3,4,5,7,-4,-2,-3,-4,-5

Si no entiendo mal esto del visual basic lo que necesito es lo siguiente:

Dos cuadros de texto o dos columnas datagrid.
Dos botones asociados a dos cuadros de textos en los que indicar el número de consecuciones de 0 o de números positivos o negativos.

¿Es muy difícil hacerlo? Yo no he conseguido nada. Y os pido ayuda. Si alguien puede echarme un cable le estaré eternamente agradecido. Si es muy difícil, me lo decís y ya me apañaré de alguna manera con excel.

Un saludo,
Adrián

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Procesamiento De Datos
« Respuesta #1 en: Jueves 12 de Junio de 2008, 16:33 »
0
Faltan detalles para señalarte la solución más óptima, por ejemplo ¿ cual es el origen de los datos ?.... se introducen manualmente ?, ¿se toman desde un fichero? , ¿ son el resultado de un cálculo...?.

Si se introducen manualmente, ances de aceptar el dato se valida con la condición que quieres que cumpla si lo pasa se añade y si no no.

si se introducen desde fichero, se filtran a medida que se leen.
Si proceden de un cálculo, se guardan en una matriz y luego en un bucle 'FOR ... NEXT' se examina todo el bucle.

Cuando ya estén filtrados se vuelcan al listbox o combobox. Si sólo son dos columnas y especialmente si son de diferente tamaño y no guardan relación entre si, los controles listbox ó combobox son los recomendados.

Dicho de otro modo, lo acorde es que los datos se vayan filtrando a medida que se vayan obteniendo, sin embargo podría darse el caso de que quieras ver el 'resultado' de lo que sea que estés haciendo, antes y después (sólo es práctico para este caso). En cuyo caso entonces se deberá trabajar directamente sobre el listbox/combobox. Cuando se necesita recorrer estos objetos para eliminar elementos (listbox1.remove()) debe iniciarse el bucle desde el final hacia el primero. Imagina un bloque de pisos de 10 alturas, deseamos eliminar el ubicado como 3º porque cumple una condición, lógicamente luego comprobaremos el 4º, pero si elimino el piso 3º, los que están encima bajan todos una posición, así el 4º pasa a ser el 3º, puesto que estamos usando un bucle se apuntaría luego al 4º que sería el que antes era el 5º, pués el 4º de antes es ahora el 3º.....

Si a pesar de ello quieres hacer la cuenta hacia delante, no debes usar un bucle 'for ... next' sino un bucle 'do ... loop' de tal modo que cuando eliminas un elemento, el puntero no se aumenta, esto exige entonces tener 2 punteros uno de avance y otro de eliminados, cuya suma siempre se usa para verificar la condición de final del bucle cuando sumen el total de elementos previos, es decir si 'n' era el total de elementos 'a' el puntero de avance y 'e' la cuenta de eliminados la condición final sería: 'while (a + e) <> n '  ó usando until: 'until  (a + e ) = n' . en cualquier caso el bucle 'do ... loop' así formado es más complejo que un simple 'for ...next' con cuenta regresiva. No olvides inicializar 'a' y 'e' a los valoes acordes teniendo en cuenta el indice 0 del listbox. Si usas matrices y señalaste que la matriz se iniciaba en el índice 1 y conviertes la función para usarla con índice 0 siempre hay que tener en cuenta esto y acordarse de hacer los 'reajustes' necesarios.

Si usas matrices, puedes o bien añadir los elementos a una 2ª matriz, o volcarlos ya directamente al listbox. Pero como digo el método más provechoso se elige conforme al origen de procedencia de los datos. Si las matrices son pequeñas (pongamos 1000 elementos, incluso 10000) no tiene ninguna repercusión en el rendimiento que se vuelque entre 2 matrices antes de ir a parar al listbox o que se vuelque desde el listbox a una matriz y luego al listbox, salvo que la operación se repita muy a menudo (si sólo se ejecuta 1 vez no importa) ...

Para resolver los numeros consecutivos , debes comparar el ultimo elemento con el anterior (usando el bucle for con cuenta regresiva). Un número es consecutivo de otro si sumándole 1 es igual a aquel, pero como usas tanto positivos como negativos primero debes saber que sumar si -1 o +1, además parece que al hablar de consecutivos (según tu ejemplo) los positivos son ascendentes y los negativos descendentes, no se si eso es realmente lo que quieres hacer es decir cual de estos casos es válido: 1,2,3,4,5 .... 9,8,7,6,5   ... -3,-4,-5,-6 ...  -8,-7,-6,-5, ya que según el caso no será necesario sumar -1 sino sólo +1; 6+1=7 ; -5 +1=-4 ...
Ten en cuenta que al hacer cuenta regresiva se supone que primero aparecerá 9 luego 8 y luego 7 cuando el orden real es 7,8,9 por tanto la lógica de decisión debe ser:

Código: Text
  1. si el (valor del puesto del 8) +1 &#60;&#62;  del (valor del puesto del 9) luego
  2.     eliminar puesto del valor del 9
  3. fin si
  4. ahora asigna como 2º término el valor del 1º
  5.  
   

El código para eliminar los 0 consecutivos no superiores a x , podría ser éste:

Código: Text
  1.  
  2. ' nota: repeticiones es el valor x de límite de consecutivos.
  3. public sub Eliminar_Ceros(repeticiones as integer)
  4.      dim ceros as integer
  5.      dim nuevaCuenta as boolean
  6.  
  7.      for k =listbox1.listcount -1 to 0 step -1
  8.            if listbox1.list(k) = 0 then
  9.                  if nuevacuenta=false then
  10.                        nuevacuenta=true
  11.                  end if
  12.                  ceros=ceros +1
  13.            else
  14.                 if ceros &#60;= repeticiones then
  15.                      call Eliminar_Items(k,repeticiones)
  16.                 end if
  17.                 ceros=0
  18.                 nuevaCuenta=false
  19.            end if
  20.      next
  21. end sub
  22.  
  23. private sub Eliminar_Items(IndiceFin as integer, NumeroItems as integer)
  24.       for k= (indicefin + repeticiones) to (IndiceFin +1) step -1
  25.            listbox1.remove(k)
  26.      next
  27. end sub
  28.  

Revisa que funciones bien y corrige algún gazapo que se me haya escapado... el otro es ejercicio para ti....
«Ma non troppo»
----> ModoVacaciones = False<----

riesgobudro22

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Procesamiento De Datos
« Respuesta #2 en: Viernes 13 de Junio de 2008, 08:51 »
0
Muchas gracias, Nebire. Es una respuesta muy detallada.

Voy a ver si lo consigo. El origen de los datos en principio es un archivo TXT con los números ya incluidos donde cada número ocupa una línea.

Gracias de nuevo por el código. A ver si sale.

Adrián.