elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: 4n4lDetector v1.3: herramienta de análisis estático de malware


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 65
21  Programación / .NET / Re: Una ayuda simple (visual basic, 2017) en: 15 Agosto 2017, 02:24
Piensa un poco... Cómo lo resolverías de 'forma humana'?. Supongamos que me pides el año y yo te doy por respuesta: 1518 ... qué harías tú, para asegurarte que te dé un valor en el rango 1800-2020?
22  Programación / Java / Re: Codigo para crear SUDOKUS en: 14 Agosto 2017, 19:15
Sobre las pistas, piensa que teniendo ya resuelto el sudoku, obtener las pistas es simplemente decidir que valores del sudoku dejar ó a la inersa cuales retirar, lo que resulte más breve.

También es preciso saber que si las pistas son menos del 20% de los valores, tiene múltiples soluciones.

Entonces:
- Si un sudoku, tiene una sola solución; la validación la harás con tu matriz del sudoku (resuelta). Comprobando en un bucle que el array Sudoku() (tu le llamas Matriz() ), coincide uno a uno con el array User(). El array User() inicialmente es copia del array Pistas() (por si decide restablecer, se copia de nuevo Pistas() en User()...)
- En cambio si tienes múltiples soluciones, la validación sería recurrir a 1 bucle donde reclamas los ausentes de cada fila, bloque y columna, será validado siempre que en todos los casos dé 0 ausentes.

Código:
Buleano = Funcion ValidarSudokuDeMultiplesSoluciones
    buleano ausentes

    Bucle para k desde 0 a 8
        ausentes = Ausencia (Presencia( GetFila(k) ))
        Si ausentes = false Devolver False //y salir de la función
               
        ausentes = Ausencia (Presencia( GetColumna(k) ))
        Si ausentes = false Devolver False //y salir de la función

        ausentes = Ausencia (Presencia( GetBloque(k) ))
        Si ausentes = false Devolver False //y salir de la función
    Fin bucle
    Devolver True // aparecen todos, una sola vez en fila, columna y bloque.
Fin funcion

NOTA que:
Citar
ausentes = Ausencia (Presencia( Getxxxx(k)))
es una llamada a otra función con la salida de la interna...
Es decir, primero se llama a 'GetXXXX(k) que nos devuelve el array solicitado del array User(). OJO: del array User, no del array Sudoku (Matriz, la llamas tu).
Luego que devuelve ese array es el parámetro de entrada para invocar a la función Presencia(array), y la salida de esta, que también devuelve un array pero de 10 elementos, es usada como la entrada de la función Ausencia(array) que devuelve finalmente un valor buleano.
Es equivalente a esto mismo (pero requiere entonces declarar un array dentro de la función, para recibir y pasar a la siguiente función y más líneas de código).
   
Citar
   array tipo byte Arr() // sería antes del bucle.

   Arr = GetFila(k)
   Arr = Presentes(arr)
   ausentes = Ausencia(arr)

   Si ausentes = false Devolver False //y salir de la función

Esta función ya la conoces, es equivalente a la segunda parte de unificar arrays:
Código:
Array byte = Funcion Presencia(array tipo byte Arr() )
    array tipo byte Tmp(0 a 9) // 10 elementos.

    Bucle para k = 0 a 8
        tmp( arr(k)) = arr(k)
    Fin Bucle
    Devolver Tmp
Fin Funcion

Esta función también la conoces, pero aquí en vez de devolver el array con los ausentes, devolvemos si hay o no ausentes (o la cantidad de ausentes y en destino convertirlo en False si es mayor que 0).
Código:
Buleano = Funcion Ausencia(array tipo byte Presentes() )
    Bucle para k desde 1 a 9 //OJO: 10 elementos, hasta 9
        Si (Presentes(k) <> k) luego
            Devolver FALSE //y salir de la función
        Fin si
    Fin bucle
    Devolver True
Fin funcion

Un último consejo... mira de optimizar el código una vez te funciones bien. Estas dos funciones, podrían llamar a otras que realicen el trabajo 8ya en el código previo) y  aquí solo evaluar el resultado y devolverlo...

No pongo el pseudocódigo de lo que sería la función: 'ValidarSudokuDeUnaSolaSolucion', porque es bastante sencilla.
Ya sabes que puedes ponerle el nombre que quieras a las funciones, siempre que el propio nombre revele su intencionalidad... sin necesidad de llegar a ser tan largo y explícito como: 'ValidarSudokuDeUnaSolaSolucion', que tiene por objeto además ser auto-explicativo... podría ser 'ValidarSolucionSimple' y el otro 'ValidarSolucionMultiple'...

Recuerda que deberás tener varios arrays, como mínimo estos 3:
- El de la Solución (que se genera cuando creas el sudoku).
- El de Pistas (que es una selección-extracción de la solución).
- Y el del Usuario (que inicialmente es copia del array Pistas), y que es donde el usuario va introduciendo los valores que él mismo decida.
Por tanto tras crear el Sudoku (la solución, el array Matriz) satisfactoriamente), tras ello invoca a sendas funciones para inicializar ambos arrays adicionales (pistas y User). Crear el de User también conviene que sea una función aparte, porque si el usuario reclama 'Resetear' la partida, entre otras cosas deberás volver a clonar el array Pistas() en User().
23  Foros Generales / Foro Libre / Re: Que ha pasado exactamente en Venezuela esta vez??? en: 14 Agosto 2017, 00:36
Las autoridades venezolanas capturaron al comandante de la llamada "operación David", Juan Caguaripano Scott, ex capitán de la Guardia Nacional Bolivariana, quien junto a un grupo de hombre se sublevó contra el presidente Nicolás Maduro y asaltó una base militar la semana pasada.
Lástima que no se sumaran más militares en cadena al golpe. ahora a ver que les hacne a estos chicos.

...pero un golpe así, es destruir una casa a martillazos... el golpe debe asestarse en la cocorota de Maduro, así basta uno, uno sólo, en un par de segundos... asaltar cuarteles es destruir la casa a martillazos...
24  Programación / Java / Re: Codigo para crear SUDOKUS en: 14 Agosto 2017, 00:09
Vaya... me alegro, porque te estaba respondiendo y casi había terminado cuando me llamaron para ir a cenar fuera, y a la vuelta he acabado de terminar y enviaba respuesta... de todos modos, la publico...


Vamos por partes....
Citar
mira pido disculpas por no haberte comentado nada de hace tiempo pero no me encontraba en la ciudad y no habia podido continuar con este proyecto.
No te preocupes. Cada uno dispone del tiempo que dispone y nadie tiene derecho a reclamar nada al respecto.


-----------------------
El tema del parámetro de devolución...
Citar
Array Byte = Funcion TomarAusentes(Array Byte Presentes(), Out Entero NumAusentes)
entiendo que es el indice del vector ausentes pero no se manejarlo como tu lo haces
Bien, no importa si no sabes devolver un parámetro por referencia, se recalcula de nuevo, es muy simple...

Varíamos la función, seguimos devolviendo el array y solo el array...
Citar
Array Byte = Funcion TomarAusentes(Array Byte Presentes() )
voy a tu código, donde se llama a todas las funciones y finalmente a TomarAusentes:
Citar
int temp[] = GetArrayAusentes(matriz, x, y);
Ahora entonces hacemos un bucle para tomar el valor que no has sabido devolver:
Código:
Bucle para k desde 1 a 9
  si temp(k) es mayor que cero luego
     NumAusentes = k  // esto se puede hacer de diferentes maneras, esta es la mas sencilla, otra es saliendo del bucle cuando se encuentre un valor 0, etc...
     // se actualiza con cada ocasión que sea cierta la condición, ...no importa es un bucle pequeño.
  Fin si
Fin Bucle
Ya tenemos el valor de NumAusentes.

Ahora la funcion rand.nextInt debe devolver un valor al azar entre 1 y numausentes, pero solo si NumAusentes es mayor que cero
Código:
Si NumAusentes > 0 luego
   azar = rand.nextInt(entre 1 y NumAusentes)  
Si no
   // este es el caso de que no haya números ausentes, se devlvería 0.
Fin si

Cuando una función para devolver un número al azar, no permite especificar un rango, y siempre fuerza desde '0' hasta 'x', se puede truncar... veamos como:
Sea el rango entre 5 y 12, entonces en la función se toma el mismo espacio del rango pero empezando en 0, esto es, si empeiza en 0 y no en 5, es que (es como si) hemos restado 5, luego al valor mayor del rango también le restamos 5. Luego al valor que salga (que será: 0,1,2,3,4,5,6 ó 7), pués le sumamos 5 y efectivamente tendremos el valor en el rango 5-12 , la demostración sencilla sería: (0+5, 1+5, 2+5, 3+5, 4+5, 6+5 ó 7+5), que en efecto es entre 5 y 12
 n = ...rand.nextInt(12-5) + 5  

Unificando un poco el código de esta sección, sería más o menos así
Código:
SeleccionarValorAzar (matriz(), x, y)
        int n, Numausentes
        int temp[] = GetArrayAusentes(matriz, x, y)

        Bucle para i desde 1 a temp.length //OJO: desde 1, porque el indice 0, sabemos que SIEMPRE vale 0
            Si matriz(i) > 0 luego
                NumAusentes = i
            Fin si
        Fin bucle

        Si NumAusentes > 0 luego  //falta esta condición en tu código.
            Random rand = new Random()
            n =  rand.nextInt(Numausentes-1) +1
        
            System.out.println(":" + temp[n])
            return temp[n];
        Si no
            devolver 0
       Fin si
Fin Funcion

-----------------------
Siguiente el error: Si miras la cascada de llamadas hasta el error, (dentro del programa desde main) se llama inicialmente a la función 'GeneradorAleatorio', la cual llama a su vez a 'SeleccionarValorAzar' y en esta se invoca a la función: 'Random.nextInt', que verás que es la última función ejecutada (es la que origina el error)...
Citar
Exception in thread "main" java.lang.IllegalArgumentException: bound must be positive
   at java.util.Random.nextInt(Random.java:388)
Básicamente el error está generado por la elección del número al azar. En el caso de este juego, los valores deben estar comprendidos siempre entre 1 y 9, y específicamente en cada momento concreto entre 1 y 'numausentes'. Ya que lo que elegimos es el índice de aquel array de ausentes y devolvemos el valor contenido en ese indice del array.

Ahora miro el código, para ver por qué dicha función trata de elegir un número negativo.... bien pego la línea donde se origina el error:
Citar
n = + rand.nextInt(temp.length);
...de entrada, el valor pasado a rand.nextInt, no es correcto.
Sabemos que ese array tiene 10 elementos, porque procede de la función TomarAusentes, pero no son elegibles todos los índices, solo son elegibles desde el índice 1 hasta el índice de 'numausentes' (que algunas veces podrá ser 9). Justo lo acabo de explicar en el punto anterior.
Recuerda que el array de TomarAusentes, podría no arrojar valores, porque todos los valores estén ocupados; algunos en la fila, otros en la columna y otros en el bloque.

En ese caso, no hay que forzar a elegir un valor al azar, directamente la función SeleccionarValorAzar  (más arriba puse su pseudocódigo) devuelve 0. Y la función que recibe el resultado (GeneradorAleatorio), ya tiene previsto el caso para solucionar el bloqueo (ese '0', indica el bloqueo).

NOTA: que pongo parcialmente el código de la función (no conviene poner todo un libro, solo para citar 2 párrafos):
              
Código:
...  
                valor  = SeleccionarValorAzar(matriz, fila, columna);
                if (valor > 0) {
                    matriz[fila][columna] = valor;
                    columna++;
                }else{
                   //ResolverBloqueo
                fin si
...

Citar
...por otro lado el metodo 'generarSudoku' ya lo hice si tenias razon era algo muy sencillo probe el codigo hasta donde me devuelve los valores ausentes y todo esta correcto pero aun asi me sigue presentando el bloqueo y solo me llena aproximadamente unos 36 a 44 valores de ahi no me pasa...

Si, bueno, yo lo que veo es que has pueto el límite de intentos en 5, yo lo puse en 12 y luego lo bajé a 10... y lo pongo a generar sudokus (y al tiempo dibujar cada valor generado) durante una hora o algo más y tras 15500 sudokus calculados, lo he parado... es decir no se bloquea. Cambia el número de intentos a 10...

----------------

p.d.: Como ejercicio de optimización, te aclaro que todas las funciones de: getFila, getColumna, getBloque, UnificarArrays y TomarAusentes, puede ser muy optimizado en apenas 5 bucles (uno detrás del otro) usando siempre el mismo y único array, para los 3 get y otro para las otra dos secciones...
25  Programación / .NET / Re: Declaración duplicada del miembro Size y Point. en: 12 Agosto 2017, 17:43
Bien... pero incluso si no has hecho el código, o si fue 'traducido' desde otro lenguaje, sería conveniente que aclares lo desastroso del código a quien te hizo el encargo y que puedes optimizarlo para que sea más rápido, claro y conciso (menos tamaño en disco y en memoria), por un precio extra... y que es conveniente hacer eso antes de los cambios que reclamen hacer.

Ahora mismo cualquier cambio supone un cierto 'sufrimiento', y mucho tiempo extra, porque exige repasar la infinidad de variables y líneas cuasi equivalentes, por si hay alguna discrepancia que no salte con claridad a la vista. Sin embargo tras perder el tiempo repasando, al final se ve que la mayor parte del código es ineficiente y redundante, podría abreviarse probablemente a una vigésima parte del tamaño actual... En fin si te han encargado hacer cambios, diles que la propia ineficiencia del código requiere un cambio urgente... y de paso cóbralo...


-----------------------------
En cuanto a tu dilema, ya te he conestado, aunque quizás te haya pasado inadvertido entre tantas sugerencias, me autocito y lo comento más específicamente:

Donde tienes cada una de las líneas de éstas (con size y point):
Código
  1.    Dim point = New Point(&H2C8, &H1F0)
  2.    Me.TextBox5.Location = point
  3.    size = New Size(120, &H1D)
  4.    Me.TextBox5.Size = size
  5.  

Cámbialas por otras equivalente, es decir elimina la declaración del:
 size =...
 point = ...
y lo que está al otro lado del igual se lo asignas directamente a la línea que antes recibía un:
 textbox...Location = point
 textox... Size = size

Y te quedarían así:
Código
  1.    TextBox5.Location = New Point(&H2C8, &H1F0)
  2.    TextBox5.Size = New Size(120, &H1D)

Habiéndo remplazado todas las líneas que tienes con size y point, de este modo, ya no puede darte problemas con 'size' ni 'point', porque han desaparecido del código...

---------------------------
...y en cuanto a los valores hexadecimales, no tiene demasiada importancia en que sistema de numeración estén los valores, pero si te cuesta entender los valores hexadecimales cámbialos a decimales... si lo precisas usa la calculadora 'científica' (de win2).
26  Programación / .NET / Re: Declaración duplicada del miembro Size y Point. en: 12 Agosto 2017, 07:46
Es imposible ejecutar el proyecto para ver qué error marca, faltan ficheros y arroja un montón de errores (para en el número 103)...

Es muy probable que hayas declarado en algún método dos veces un campo del mismo nombre.

Te voy algunos consejos, que deberías aplicar d eforma inmediata a tu sopa de espaguetis digo código:
1 - No es buena idea llamar a un miembro con el mismo nombre que el tipo cual es, se presta a confusión, además, cualquier cambio al nombre podría aplicarse también al tipo de forma inadvertida.
Código
  1. Dim point = New Point(&H2C8, &H1F0)
Podrías llamarlo por ejemplo en español, y quedaría así:
Código
  1. Dim punto = New Point(&H2C8, &H1F0)

2 - Cuando creas una variable para establecerla una sola vez y aisgnarla una sola vez, te la puedes ahorrar. Esto, es una idiotez:
Código
  1. Dim point = New Point(&H2C8, &H1F0)
  2. Me.TextBox5.Location = point
  3. size = New Size(120, &H1D)
  4. Me.TextBox5.Size = size
  5.  
Puedes hacer directamente:
Código
  1. Me.TextBox5.Location = New Point(&H2C8, &H1F0)
  2.  
  3. Me.TextBox5.Size = New Size(120, &H1D)
  4.  

3 - el código está lleno de referencias a "Me". cuando un objeto se llama cada vez, se lo busca en la tabla para obtener su dirección y con ella prosigue la búsqueda para el miembro interno.... entonces esto que sigue... es perder tiempo... es como si 5 personas en una mesa te piden tabaco una detrás de otra, y tú cada vez, sacas la cajetilla de tu tabaco, ofreces y la vuelves a guardar, vuelves a sacarla, ofreces y la vuelves a guardar... acaso no es mejor sacarla, ofrecer a todos y ya entonces la guardas????
Código
  1.            Me.TextBox4.Location = point
  2.            Me.TextBox4.MaxLength = 5
  3.            Me.TextBox4.Name = "TextBox4"
  4.            size = New Size(&H48, &H1D)
  5.            Me.TextBox4.Size = size
  6.            Me.TextBox4.TabIndex = &H19
  7.            Me.TextBox4.Text = ""
  8.            Me.TextBox5.Enabled = False
  9.            point = New Point(&H2C8, &H1F0)
  10.            Me.TextBox5.Location = point
  11.            Me.TextBox5.Name = "TextBox5"
  12.            size = New Size(120, &H1D)
  13.            Me.TextBox5.Size = size
  14.            Me.TextBox5.TabIndex = &H1A
  15.            Me.TextBox5.Text = "TextBox5"
  16.            Me.TextBox6.Enabled = False
Es mejor hacelro así:
Código
  1.     With Me
  2.            .TextBox4.Location = point
  3.            .TextBox4.MaxLength = 5
  4.            .TextBox4.Name = "TextBox4"
  5.            size = New Size(&H48, &H1D)
  6.            .TextBox4.Size = size
  7.            .TextBox4.TabIndex = &H19
  8.            .TextBox4.Text = ""
  9.            .TextBox5.Enabled = False
  10.            point = New Point(&H2C8, &H1F0)
  11.            .TextBox5.Location = point
  12.            .TextBox5.Name = "TextBox5"
  13.            size = New Size(120, &H1D)
  14.            .TextBox5.Size = size
  15.            .TextBox5.TabIndex = &H1A
  16.            .TextBox5.Text = "TextBox5"
  17.            .TextBox6.Enabled = False
  18.     End With

4 - No conoces el bloque de condiciones "select case"?. Esto queda horrooroso y es ineficiente...
Código
  1. If (Me.OPCB = 1) Then
  2.                str = "Select COD,NOMBRE,ORD,LIM_TRIPLE,LIM_TERMI,PRE_TRIPLE,PRE_TERMI,CIERRE,ACTIVA,APRO,PUNTA,COLA from loteria WHERE TIPO='L' order by ord"
  3.                Me.ListBox4.Items.Add("Cod         Nombre                                Orden     Lim/Triple  Lim/Term  P/Triple   P/Term   H/Cierre  Activado Punta Cola")
  4.            End If
  5.            If (Me.OPCB = 4) Then
  6.                str = "Select COD,NOMBRE,ORD,LIM_TRI_ZOD,LIM_TER_ZOD,PRE_TR_ZOD,PRE_TE_ZOD,CIERRE,ACTIVA,APRO FROM LOTERIA WHERE TIPO='Z' order by ord"
  7.                Me.ListBox4.Items.Add("Cod      Nombre                                    Orden Lim/Tr/Zod Lim/Te/Zod P/Tr/Zod P/Te/Zod H/Cierre Activado")
  8.            End If
  9.            If (Me.OPCB = 3) Then
  10.                str = "Select COD,NOMBRE,ORD,LIM_COMBO,LIM_ANIMAL,PRE_COMBO,PRE_ANIMAL,CIERRE,ACTIVA,APRO from loteria WHERE TIPO='A' order by ord"
  11.                Me.ListBox4.Items.Add("Cod      Nombre                                    Orden Lim/Animal Lim/Combo  Pre/Anim Pre/Term H/Cierre Activado")
  12.            End If
  13.            If (Me.OPCB = 5) Then
  14.                str = "Select COD,NOMBRE FROM animal ORDER BY COD"
  15.                Me.ListBox4.Items.Add("Cod      Nombre                 ")
  16.            End If
  17.            If (Me.OPCB = 6) Then
Si la ejecución de una condición no modifica el objeto que se sigue mirando, el código anterior es ineficiente, porque solo puede ser un valor entre ellos (o ninguno), pero tú obligas a compararse en todos los casos iempre incluso cuando ya se haya encontrado. El bloque Select Case, evalúa la condición y 'SALTA' al punto del código donde corresponde y no evalúa para ninguna otra condición....
Código
  1. Select case Me.OPCB
  2.     case 1
  3.           str = "Select COD,NOMBRE,ORD,LIM_TRIPLE,LIM_TERMI,PRE_TRIPLE,PRE_TERMI,CIERRE,ACTIVA,APRO,PUNTA,COLA from loteria WHERE TIPO='L' order by ord"
  4.                Me.ListBox4.Items.Add("Cod         Nombre                                Orden     Lim/Triple  Lim/Term  P/Triple   P/Term   H/Cierre  Activado Punta Cola")      
  5.     case 4
  6.                str = "Select COD,NOMBRE,ORD,LIM_TRI_ZOD,LIM_TER_ZOD,PRE_TR_ZOD,PRE_TE_ZOD,CIERRE,ACTIVA,APRO FROM LOTERIA WHERE TIPO='Z' order by ord"
  7.                Me.ListBox4.Items.Add("Cod      Nombre                                    Orden Lim/Tr/Zod Lim/Te/Zod P/Tr/Zod P/Te/Zod H/Cierre Activado")          
  8.     case 3
  9.                str = "Select COD,NOMBRE,ORD,LIM_COMBO,LIM_ANIMAL,PRE_COMBO,PRE_ANIMAL,CIERRE,ACTIVA,APRO from loteria WHERE TIPO='A' order by ord"
  10.                Me.ListBox4.Items.Add("Cod      Nombre                                    Orden Lim/Animal Lim/Combo  Pre/Anim Pre/Term H/Cierre Activado")
  11.     case 5
  12.                str = "Select COD,NOMBRE FROM animal ORDER BY COD"
  13.                Me.ListBox4.Items.Add("Cod      Nombre                 ")
  14.     case 6
  15.         '.....
  16.     case else
  17.         '....
  18. End Select

5 - No hace falta que pongas una línea por cada declaración... especialmente si no le vas a asignar ningún valor de entrada.... Así este código:
Código
  1.                Dim str2 As String
  2.                Dim str3 As String
  3.                Dim str4 As String
  4.                Dim str5 As String
  5.                Dim str6 As String
  6.                Dim str7 As String
  7.                Dim str8 As String
  8.                Dim str9 As String
  9.                Dim str10 As String
  10.                Dim str11 As String
Se vería más claro así:
            
Código
  1.    Dim str2 As String, str3 As String, str4 As String, str5 As String, str6 As String
  2.                Dim str7 As String, str8 As String, str9 As String, str10 As String, str11 As String
  3.  

6 - Cuando tienes varias asignaciones o código repetitivo, es preferible usar un bucle. es más limpio y claro el código... esto es cansino:
Código
  1. str2 = reader.Item(0).ToString
  2.                        str3 = reader.Item(1).ToString
  3.                        str4 = reader.Item(2).ToString
  4.                        str5 = reader.Item(3).ToString
  5.                        str6 = reader.Item(4).ToString
  6.                        str7 = reader.Item(5).ToString
  7.                        str8 = reader.Item(6).ToString
  8.                        str9 = reader.Item(7).ToString
  9.                        str10 = reader.Item(8).ToString
  10.                        Me.ListBox4.Items.Add(String.Concat(New String() { str2, ChrW(9), str3, ChrW(9), str4, ChrW(9), str5, ChrW(9), str6, ChrW(9), str7, ChrW(9), str8, ChrW(9), str9, ChrW(9), str10 }))
Es mucho mejor declarar un array de string, y asignarlas en un bucle, finalmente hay dos opciones para añadirlos al listbox...
Código
  1.    Dim str2(0 to 8) as string
  2.    Dim k as integer
  3.    For k=0 to 8
  4.        Str2(k) = reader.Item(k).ToString & chrW(9) ' <----- Notar
  5.    Next
  6.    ListBox4.Items.AddRange(str2)  '¡ puedes usar AddRange...
  7.  
   
Código
  1. Dim str2(0 to 8) as string
  2.    Dim k as integer
  3.    For k=0 to 8
  4.        Str2(k) = reader.Item(k).ToString
  5.    Next
  6.    ListBox4.Items.Add(Strings.Join(str2,ChrW(9))  ' <---- se usa Join, para concatenar el array de strings, y el separador sigue siendo el mismo. El tabulador...

7 - Tienes bloques de código a patadas como el siguiente, que en realidad se pueden resolver en un bucle, y en cualquier caso mucho más simplificado que esta madeja de hilos dejada al gato para su entretenimiento... tiene multitud de sangre derramándose... :laugh: :laugh: :laugh: :laugh:
Código
  1.            If (Strings.Len(str3) = 4) Then
  2.                If (StringType.StrCmp(Strings.Mid(str3, 1, 1), ".", False) = 0) Then
  3.                    str2 = String.Concat(New String() {Strings.Mid(Strings.Trim(str3), 2, 1), Strings.Mid(Strings.Trim(str3), 3, 1), ".", Strings.Mid(Strings.Trim(str3), 4, 1), "0"})
  4.                    Return obj2
  5.                End If
  6.                If (StringType.StrCmp(Strings.Mid(str3, 2, 1), ".", False) = 0) Then
  7.                    str2 = ("0" & Strings.Mid(Strings.Trim(str3), 1, 1) & "." & Strings.Mid(Strings.Trim(str3), 3, 2))
  8.                    Return obj2
  9.                End If
  10.                If (StringType.StrCmp(Strings.Mid(str3, 3, 1), ".", False) = 0) Then
  11.                    str2 = (Strings.Mid(Strings.Trim(str3), 1, 2) & "." & Strings.Mid(Strings.Trim(str3), 4, 1) & "0")
  12.                    Return obj2
  13.                End If
  14.                If (StringType.StrCmp(Strings.Mid(str3, 4, 1), ".", False) = 0) Then
  15.                    str2 = (Strings.Mid(Strings.Trim(str3), 1, 3) & "." & Strings.Mid(Strings.Trim(str3), 5, 1) & "0")
  16.                    Return obj2
  17.                End If
  18.                If (StringType.StrCmp(Strings.Mid(str3, 5, 1), ".", False) = 0) Then
  19.                    str2 = (Strings.Mid(Strings.Trim(str3), 1, 3) & "." & Strings.Mid(Strings.Trim(str3), 5, 2))
  20.                    Return obj2
  21.                End If
  22.                str2 = (Strings.Mid(Strings.Trim(str3), 1, 2) & "." & Strings.Mid(Strings.Trim(str3), 3, 2))
  23.                Return obj2
  24.            End If

Primero como str3 es una cadena de texto, puedes directamente escribir
Código
  1. if (str3.Length = 6) then
en vez de
Código
  1. If (Strings.Len(str3) = 6) Then
Ya que lenght es un método del tipo String, igualmente poseee el método Trim, TrimEnd, TrimStart, y aunque no tieme Mid, es equivalente a Char.
Así este código:
Código
  1. Strings.Mid(str3, 5, 1)
Puede rescribirse mejor así:
Código
  1. Str3.Char(5)
Si en vez de recibir un solo carácter es preciso recioger varios, entonces en vez de Char, se usaría el método Substring
Así un código como este:
Código
  1. Strings.Mid(str3, 5, 4)
Puede rescribirse mejor así:
Código
  1. Str3.SubString(5,4)

Dado que cada vez estás haciendo Trim, ahorrarías código si durante la asignación de la cadena ya retiras sus espacios en blanco y así no es preciso escribirlo en cada ocasión... se hace una sola vez al comienzo y listo.
Código
  1. str3 = "...loque sea la asignación".Trim

Mirando por encima ese bloque de código, simplemente estás tratando de ver si hay un punto, y si no lo hay en algunos caso añades más ceros, en otros dado que el punto no tiene mayúsculas ni minúsculas, también te puedes evitar la comparación de esa forma. Como te he dicho si necesitas buscar si está en alguna posición, es mejor hacer un bucle.

  
Código:
dim k as integer
    dim strx() as char = str3.ToChararray
    For k=0 to strx.Lenght -1
        if strx(k) = "." then
        
            ' .... lo que tengas que hacer.
            ' Si ya no se requiere seguir buscando Exit for , ó Return Obj2
        End if
    Next
Ahora bien, si debes hacer cosas distintas según donde esté o debiera estar el punto, entonces lo mejor es buscar directamente si existe el punto en la cadena y obtener su posición.
    
Código
  1. Dim k As Integer = str3.IndexOf(".")
Si k es -1 implica que no aparece en la cadena, entonces no es necesario buscar una a una en cada posición. Y si debe aparecer en varias posiciones y hacer algo si no aparece en una en concreto, entonces lo metes en un bucle:

    
Código
  1. Dim j as integer
  2.     Dim k As Integer = str3.IndexOf(".")
  3.     If (k>-1)then
  4.       k+=1
  5.       j=(k +1)
  6.       do While str3.IndexOf(".",k)
  7.           If (k > j) then
  8.              ' no aparece en la posición j... hacer lo que proceda hacer.
  9.           Else
  10.               k+=1
  11.               j = k
  12.           End if
  13.       Loop
  14.    Else
  15.         ' no aparece en la posición 0... hacer lo que proceda hacer.
  16.    End if
       
8 - tampoco tiene sentido que la cadena str3, no cambia de tamaño, esté continuamente poniendo código para ver su tamaño, eso se hace de una sola vez:
    n = Str3.Length
    Si (n = 1) luego....
   y ya no hay que estar preguntando cada vez por el tamaño de la cadena.
    
9 - Los comentarios brillan por su ausencia... excelente ayuda para que te ayuden....


 ...en fín podría seguir enumerando "problemas con el codigo", pero cuando son tantos, el problema no es el código, si no el programador... te falta mucha base. si ni siquiera conoces los típos básicos como el String...para que´seguir con cosas más complejas.
27  Foros Generales / Foro Libre / Re: Vamos a hacernos ricos, o no en: 11 Agosto 2017, 03:38
Cuando aprenderemos a entender que la CIENCIA, no es la VERDAD.

Que la ciencia diga o deje de decir, son solo tonterías, disquisiciones entre egos... A la VERDAD, le importa 333 EGGS, lo que digan los libros, la ciencia ni los científicos, ni nadie más. La VERDAD es la que es.

La ciencia, va avanzando... pero con respecto al Universo, es nada.

Por supuesto es una herramienta que tenemos a mano, para alcanzar a conocer algo de la VERDAD...lo repito: ALCANZAR a CONOCER ALGO. Estos ignifica que cualquiera que erige a la ciencia como la verdad suprema, no está demostrando otra cosa que es un paleto egocéntrico.

La ciencia ahora niega cosas que dentro de varios siglos podrá afirmar rotndamente. Pero ahora lo niega sistemáticamente e incluso molesta o persigue a quien no lo acepta, solo porque lo ha verificado con sus propios ojos... a quién carajo le importa si puedo demostrar todo lo que veo o no?. Nadie puede demostrar todo lo que ve. Tenemos fé en que si uno dice haber ido de viaje a Francia, es verdad y si luego resulta que miente, es su problema. También hemos visto farsantes en la Ciencia y no por eso se considera farsante a todo científico.

La Ciencia tiene poco de qué presumir. Ha ido negando sistemáticamente todo, hasta que algún 'cabezón' que más sistemático se ha negado a pasar por el aro, una y otra vez, hasta que al fin ha podido demostrar que estaban equivocados. entonce sla ciencia 'tacha' lo que decía, cambia y (aquí no ha pasado nunca nada, decimos aquello de que la ciencia evoluciona y hale).

Que la Ciencia no es nadie concreto, todo el mundo lo sabe, pero que la 'Ciencia' impone criterios es incuestionable... Pocos científicos serios tienen el valor suficiente para afirmar sus creencias, por el 'miedito' que les entra que lo destierren de su puesto de trabajo (solo por una creencia). Así que menos payasadas... que esto es harto comprobable si tuvieras (hablo generícamente, nadie se sienta aludido) la edad y amigos o conocidos científicos suficientes y la confianza extrema para que te hablen de sus creencias.
28  Foros Generales / Foro Libre / Re: Si hicieras un lenguaje de programación, para que lenguaje se dirigiria? en: 11 Agosto 2017, 03:19
Curiosamente yo siempre he pensado lo mismo.

Inicialmente lo haría en español, pero no sería tan cretino como son los angloparlantes y permitiría la flexibilidad para que pudiera cambiarse la sintaxis a (casi) cualquier idioma...

En realidad, el código ha de ser luego compilado, luego basta una fase previa desde el lenguaje foráneo x al lenguaje del diseño, y de ahí ya se compila. Obviamente las palabras clave en un idioma, se sumarían a las palabas clave por defecto, como términos prohibidos.

Sería necesario o cuando menos conveniente que en cada idioma se dispusiera de un diccionario de traducción de términos informáticos 'oficial', para no elegir cualquier palabra si no la que los nativos de tal o cual idioma designen como más propicias para la traducción correcta del inglés...

Y por qué no?. Una sintaxis particular si uno decide hacerlo así?. es solo crear un fichero de traducción de las palabras clave en origen por las que se debe remplazar en el código mientras se escribe el código (para que por ejemplo, actúe tambien el intellisense y otras partes) y luego el inverso al compilar... no sería nada complejo, solo una cuestión de voluntad.

Tras muchos años, lo que observo es que los angloparlantes lo tienen enromemente más fácil de aprender que cualquiera que hable español de forma nativa. es demasiado frecuente ver a estudiantes entre 15-25 años con un inglés pésimo y que aprenden demasiado lento, precisamente por que no entienden gran cosa de inglés. Si no tuvieran que lidiar con el idioma, sin duda su curva de aprendizaje sería mucho más fructífera... y tiempo (es cosa aparte), tendrán de aprender inglés de un modo 'adecuado'...

Tus capacidades 'mentales' no deben estar restringidas ni frenadas por un idioma (al menos no por un idioma que no es tu idiaoma nativo). Es ridículo... Imponer como primer requisito aprender inglés, deja en desventaja a todo el planeta que no habla inglés...
29  Programación / .NET / Re: Redondear Multiplos en: 11 Agosto 2017, 02:53
Tienes varias opciones de redondeo...

La función adecuada depende de como esperes que responda, también con los números negativos.

Si Siempre ha de ser por exceso, la función es Ceiling.
Si lo que deseas es un redondeo al número más próximo, la función es Round.
Si siempre ha de ser la parte entera (eliminar los decimales), la función es Fix.
Si siempre ha de ser el valor más bajo, la función es Int, o Floor.

Aquí un ejemplo de prueba y comentado el resultado que arroja:
Código
  1. Dim x as single, y as integer
  2.        x = 15.62
  3.        y = Int(x) ' 15
  4.        y = Fix(x) ' 15
  5.        y = Math.Ceiling(x) ' 16
  6.        y = Math.Floor(x)   ' 15
  7.        y = Math.Round(x)   ' 16
  8.  
  9.        x = 15.32
  10.        y = Int(x) ' 15
  11.        y = Fix(x) ' 15
  12.        y = Math.Ceiling(x) ' 16
  13.        y = Math.Floor(x)   ' 15
  14.        y = Math.Round(x)   ' 15
  15.  
  16.        x = -15.62
  17.        y = Int(x) ' -16
  18.        y = Fix(x) ' -15
  19.        y = Math.Ceiling(x) ' -15
  20.        y = Math.Floor(x)   ' -16
  21.        y = Math.Round(x)   ' -16
  22.  
  23.        x = -15.32
  24.        y = Int(x) ' -16
  25.        y = Fix(x) ' -15
  26.        y = Math.Ceiling(x) ' -15
  27.        y = Math.Floor(x)   ' -16
  28.        y = Math.Round(x)   ' -15


p.d.: Para hacelro con un múltiplo (si mal no entendí, ya me dirás)... sería así un ejemplo:
Código
  1. X = (20\(20\3)) * Math.ceiling(20/3)
  2. (20\6) = 3
  3. (20/3) = 6.6666 : Math.Ceiling(6.66666) = 7
  4. x = (3 * 7) = 21
30  Programación / Programación Visual Basic / Re: Buscar y contar palabras en un listbox en: 11 Agosto 2017, 02:24
claro... perdón, lo escribí rápido...

La instrucción InStrRev, exige al menos 2 parámetros obligatorios... la cadena donde se busca, y la cadena que se quiere buscar y devuelve la posición donde se localiza. 0 si no se encontró.

Lo corrijo, aunque esperaba que cualquier error de sintaxis, fueras tu mismo capaz de arreglarlo... corrijo también la falta de los parétesis de cierre...

Código
  1.    Dim k as integer
  2.  
  3.    For k = 0 to Listbox1.Listcount-1
  4.        If (Instrrev(Listbox1.List(k), "[1]")>0) then  ' (Instrrev(Listbox1.List(k) = "[1]"
  5.            Cuenta1 = (Cuenta1 + 1)
  6.        Elseif Instrrev(Listbox1.List(k),"[2]")>0) then
  7.            Cuenta2 = (Cuenta2 + 1)
  8.        End if
  9.    Next
  10.  
  11.    Msgbox "Cuenta de [1]: " & cstr(Cuenta1) & vbcrlf & _
  12.           "Cuenta de [2]: " & cstr(cuenta2)
  13.  

- Aunque estés empezando, cuando se te presenten dudas con alguna instrucción, o alguna palabra clave, llevas el puntero sobre la palabra (o la seleccionas) y usas la tecla F1, aparecerá la ayuda (si la tienes instalada), sobre dicha instrucción o palabra clave, para profundizar sobre el tema, con los detalles precisos.
- También si te canta un error puedes ir a a la ayuda para profundizar en el tema si el mensaje te resulta tan breve que no te aclara demasiado...
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 65
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines