|
3431
|
Programación / Programación Visual Basic / Re: Ayuda Launcher
|
en: 13 Diciembre 2017, 03:31 am
|
Hay una sencilla forma, no costosa ni invasiva, pero igualmente restrictiva... Crea tu ejecutable del juego, esperando un comando.... (command$) Sólo cuando se reciba el comando específico, que arranque por ejemplo: lL2.exe /Play:xMnfi5689FgjEodf84W78sH34 Tu ejecutable deberá arrancar desde un módulo, no desde el formulario... y en Main, harías algo como: En el módulo este código: Option Private Module Private Const KeyPriv As String = "pH91jksdet4YU83ReWab..+gX" Public Ok As String #Const DebugP = True ' Poner a true, para generar una key oculta dadas dos keys; una privada aquí y otra en el ejecutable que invoca a éste. ' poner a false, cuando ya se haya generado, copiado y pegado en su sitio, para probar el funcionamiento, pero sobre todo para compilar... Private Sub Main() Dim f As Form1 Dim cm As String Dim k As Long If (Len(Command$) > 0) Then k = InStr(UCase$(Command$), "/PLAY:") If (k = 1) Then cm = Right$(Command$, Len(Command$) - Len("/play:")) #If DebugP Then On Local Error GoTo NoCompilar Call GenerarKeyOculta(cm) #End If On Local Error Resume Next ' otros errores no deben mostrar dicho mensaje... If VerificarKey(cm) = True Then Set f = New Form1 f.Show 1 ' modal... End If End If End If Exit Sub NoCompilar: MsgBox "Si ya ha generado y colocado la key oculta, y quiere compilar (o ha compilado) el proyecto debiera desactivar la función GenerarKeyOculta, poniendo DebugP a false" End Sub Private Function VerificarKey(ByRef Key As String) As Boolean Dim k1() As Byte, k2() As Byte, k3() As Byte Dim k As Long, n As Long k1 = StrConv(Key, vbFromUnicode) Debug.Print StrConv(k1, vbUnicode) k2 = StrConv(KeyPriv, vbFromUnicode) Debug.Print StrConv(k2, vbUnicode) k3 = StrConv("WW^E\\2S3WW4]c6U]cTl", vbFromUnicode) Debug.Print StrConv(k3, vbUnicode) For k = 0 To UBound(k1) If (k1(k) Xor k2(k)) <> k3(k) Then Exit Function Next Ok = CStr(Now) VerificarKey = True End Function ' No puede formar parte del código del programa, solo durante diseño... #If DebugP Then Private Sub GenerarKeyOculta(ByRef Key As String) Dim k1() As Byte, k2() As Byte, k3() As Byte Dim k As Long, n As Long If (Len(Key) <> Len(KeyPriv)) Then Call Err.Raise(vbObjectError + 1, "mi programa", "Las dos claves deben tener la misma cantidad de caracteres: (Key y KeyPriv))") Else k1 = StrConv(Key, vbUnicode) k2 = StrConv(KeyPriv, vbUnicode) ReDim k3(0 To UBound(k1)) For k = 0 To UBound(k1) k3(k) = (k1(k) Xor k2(k)) Next Debug.Print StrConv(k3, vbFromUnicode) Call MsgBox("Ahora puede copiar (de la ventana de debug) y pegar el valor resultante en 'k3' en la función 'VerificarKey'..." & vbCrLf & StrConv(k3, vbFromUnicode), vbExclamation, "Key oculta generada") 'strconv End If End Sub #End If
En el formulario, añadir un control Timer y colocar este código: Private Sub Form_Load() Randomize Timer Timer1.Interval = Int((30000 - 12000) * Rnd + 12000) ' espera un tiempo aleatorio entre 12 y 30 segundos... Timer1.Enabled = True ' otras cosas que requieran ser inicializadas... End Sub ' Hace una comprobación posterior. ' Es muy básico simplemente busca si hay algún carac´ter 'raro' en el valor de 'ok' ' el cual debiera tener solo caracteres propios de fecha y hora. Private Sub Timer1_Timer() Dim salida As Boolean Dim s As String Timer1.Enabled = False If (Len(Module1.Ok) > 0) Then For k = 1 To Len(Module1.Ok) s = Mid$(Module1.Ok, k, 1) If (InStr("0123456789 :-\/", s) = 0) Then salida = True Exit For End If Next Else salida = True End If If (salida = True) Then End End Sub
El funcionamiento es como sigue: El módulo tiene una clave, por comando se le pasa otra key, luego una función verifica mediante un ximple xor, si se valida o no... adicionalmente se añade otra simple tontería de control si se parchea la función verificar para arrojar true sin ejecutarse, el formulario cuando arranca pone en marcha un timer con un intérvalo al azar entre 12 y 30 segundos, transcurrido el cual verifica si un texto generado cuando se ejecutó la función que verificaba la key, tiene texto y si el mismo es inválido. NOTA: Que las keys debes generalas tú con cada versión, pon lo que te dé la gana pero que tengane l mismo tamaño, una vez creadas la que se pase por comando y la que se alamcene en KeyPriv, invocar la función GenerarKey, para tener la 3 contra la que se verifican las dos previas... Ambas protecciones son muy elementales y fáciles de romper, pero si tu programa no va tener una popularidad fuera de serie, posiblemente sea suficiente... Algo más elaborado es que tu proyecto sea una librería dll, que arranque luego el formulario principaly ya desde ahí tu programa se inicia. El programa que arranca el otro, crea una instancia de la librería y utiliza métodos "Friend", para hacer validaciones simples como las previas, solo que por métodos y propiedades directas, en vez de un comando que puede fácilmente ser interceptado por una aplicación que suplante la identidad de tu programa y/o se interponga en medio.
Opino como Elektro, es tontería... si publicas un ejecutable será para que sea usado, no para impedir que se use. Y si tu problema se resume en que alguien lo tome y luego lo publique como propio dentro de algo más, lo adecuado al caso, es forzar dependencias, así o se lo lleva todo o nada y si se lo lleva todo, ya no puede pasar desapercibido como 'suyo'... si lo que te preocupa es la autoría.
|
|
|
3432
|
Programación / .NET (C#, VB.NET, ASP) / Re: Algun experto en AxWindowsMediaPlayer, ayuda con pantalla completa
|
en: 13 Diciembre 2017, 01:39 am
|
De entrada el tema debías haberlo puesto en el foro de NET. Aunque estés importando un control Activex de vb6, estás operando en NET. ...de entrada usas (en ambos casos) el evento keydown, claramente sería mejor al menos el KeyUp y aún mejor el Click e inmejorablemente el dobleclick... dejando el clik para play/pausa. Además para ponerlo en pantalla completa estás usando el propio formulario... si no tienes más objetos que el control WMP, vale pero si no... todavía estás pasándolo a pantalla completa pero solo si pulsas F5, pero no es coherente, sí o sí fuerzas pantalla completa... y para regeresar de ella, debes hacerlo pisando el control... tampoco es coherente... Yo modificaría el código... de esta manera: Con doble click, sólo si está en play o pausa, cambia el estado de pantalla completa (al otro estado). Private Sub Form1_DoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.DoubleClick, Handles wmp.DoubleClickEvent If ((Wmp.playState = wmppsPlaying) or (Wmp.playState = wmppsPaused)) Then 'if (wmp.fullScreen = false) then ' wmp.fullScreen = True 'else ' wmp.fullScreen = false 'en if wmp.fullScreen = not (wmp.fullScreen) ' más breve y claro, alternamos el estado cuandos e pulsa doble click. End If End Sub
Y dejaría el evento KeyUp para cuestiones específicas... incluso pantalla completa si se pulsa la letra F Si solo vas a usar Play-pausa, mejor usar el evento click, para alternar entre ambos estados. en esta pieza de código se usa el evento KeyUp... Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp, Handles wmp.KeyUpEvent Select Case e.KeyCode Case Keys.Space, keys.Pause If Wmp.playState = wmppsPlaying Then Wmp.Controls.pause Elseif ((Wmp.playState = wmppsPaused) oralso (Wmp.playState = mppsStopped)Then if (wmp.url.length >0) then Wmp.Controls.play end if End if Case Keys.Clear, Keys.Delete Wmp.Controls.stop case keys.Escape Wmp.Controls.stop if (wmp.fullScreen = True) then wmp.fullScreen = False case keys.F wmp.fullScreen = not (wmp.fullScreen) ' otros casos a considerar... por ejemplo, manejar volumen, pasar a la siguiente pista en la lista de reproducción (keys.PageDown) o previa (keys.pageUp), etc... End select End sub
- Nota que las constantes las he puesto de memoria, es posible que se llamen de otra manera, especialmente al importarlo a NET... el wrapper, las haya modificado. - Donde proceda coloca el conveniente try...catch... - Por último, nota también que yo he preferido abreviar el nombre desde: AxWindowsMediaPlayer1 a wmp, luego si copias cambia donde proceda...
|
|
|
3434
|
Seguridad Informática / Seguridad / Re: Archivo txt codificado !!! por favor ayuda
|
en: 11 Diciembre 2017, 17:50 pm
|
Ya te han respondido los compañeros...
Sin embargo, si tú (u otro) no ha cambiado la codificacón de tu equipo, no debieran aparecer caracteres chinos. Prueba a abrirlo en el equipo de un amigo y a ver si sale igual. Abriendo en binario, podrás ver los bytes, fíjate en alguna contraseña que reconozcas de memoria como 2es la primera en el ficheor del correo de x sitio" y que sabiendo que por ejemplo empieza por una "A", el byte debeiera ser 65... viendo la distribución de bytes en el fichero (por ejemplo si ves muchos bytes por encima del valor 127), se puede concluir si está dañado/cifrado...
En cualquier caso, con los ficheros de texto plano que almacenen contraseñas, aconsejo comprimirlos y cifrarlos y tener copia en un equipo sin conexiones de red (para solventar el peor caso). Y mejor aún, nunca poner la contraseñas tal cual son, regálales algún pequeño truco, como añadir x caracteres, número, etc... por ejemplo si tu contraseña fuera algo tan tonto como: cigüe389ña, mira de hacer algo como vtxcig56üe389PTañ básicamente simplificando: los 3 primeros caracteres son al azar, y hay que desecharlos, las cifras si aparecen solo 2 se eleimina, las buena son 3, también las desaparecen las letras mayúsculas si están al final, y las dos letras del final cambiadas de orden... complícalo como quieras, es una sencilla idea... pero si mantienes algo así, tu siempre podrás seguir conociendo y usando tus contraseñas y quien tuviere acceso a ellas, no lo tendría tan fácil... pouedes complicarlo más, pero no quiero extenderme, usa tu imaginación.
|
|
|
3435
|
Programación / Java / Re: Duda, mala práctica?
|
en: 11 Diciembre 2017, 17:19 pm
|
La solución de un problema dado puede aparecer en cualquier punto dentro de una función. En general si se sale de una función desde "cualquier" parte, el único problema que presenta es que para "ojos ajenos", pueda ser más difícil de leer... Entonces si programas para tí, haz lo que te venga en gana según tu criterio, y si programas para una empresa, sométete a la regla que allí sigan. En cualquier caso, la salida se puede diferir siempre al final de la función de modo que allí se resuma la devolución. entero = funcion X(entero p) Si p=5 devolver p+2 OSi p<0 devolver 0 Osi p>129 devolver 32 Osi p=51 devolver Sumatorio(p/3) Sino devolver p Fin si Fin funcion La función previa de ejemplo tiene varias salidas, pero todas pueden cosiderarse finales, por cuanto tras cada devolución, no hay más código que se fuera a ejecutar. Aún así los puristas prefieren siempre 1 o a lo sumo dos devoluciones, en tal caso puede modificarse como sigue: entero = funcion X(entero p) entero y
Si p=5 y= p+2 OSi p<0 y= 0 Osi p>129 y= 32 Osi p=51 y = Sumatorio(p/3) Sino y= p Fin si
devolver y Fin funcion Para mi, no gana en claridad, tampoco en velocidad, ni en ahorro de memoria, aunque si que puede ganar en mantenimiento si en un futuro hubiese de sufrir cambios (en general), al final sigue devolviendo, lo que sea que previamente se haya calculado-considerado. Cuando el código tiene a ser complejo es cuando suele resultar de más interés, peor especialmente si otros han de leer tu código (o si a tí mismo resulta complicado leerte pasado el tiempo, que les pasa a muchos).
|
|
|
3436
|
Programación / .NET (C#, VB.NET, ASP) / Re: Libreria ookii ayuda
|
en: 11 Diciembre 2017, 16:58 pm
|
Ya se te ha comentado en alguna ocasión...
Aprende al menos lo básico y elemental para programar, antes de ponerte a hacer nada más complejo que el "hola mundo".
No se puede pretender hacer un avión, si uno está continuamente tropezando con cada tornillo y tuerca que aparezca a la vista.
Sin aprender lo más básico sobre programar carece de sentido dar soporte de ningún tipo, es tiempo perdido, para tí y para el que te responde. Tu copias-pegas, resuelves el problema puntual y vuelves a tropezar en el siguiente paso. Así no se aprende, tómate un par de libros y estudia unos meses (y practica los ejercicios que pudieran traer, con paciencia).
Aprende lo elemental o abandona. "Programadores copypaste", sobran en el mundo...
|
|
|
3437
|
Programación / Programación C/C++ / Re: Ayuda juego Mastermind en C++
|
en: 11 Diciembre 2017, 03:56 am
|
Darte un código, no me parece lo más adecuado. Con copiar y pegar, no se aprende. Debes pensar por ti mismo, aunque tengas orientación. Supongamos que las líneas contienen 4 bolas que el usuario debe resolver, elegibles sobre un total de 8 bolas Quiere el jugador seguir jugando? buleano = Funcion PedirPartida dato= PedirDatoAlUsuario("¿ DeseaJugar otra partida (S/N)? ") Si (dato="S") ó (dato="s") luego devolver TRUE Sino devolver FALSE Fin si Fin funcion
Crear el array de bolas de la 'banca' y barajarlo... Array de bytes =Funcion BarajarBolas(entero cantidad) //8 bolas Array bytes Bolas() entero i, j, k
RedimensionarArray Bolas(0 a cantidad-1)
// Meter en el "saco" todas las bolas que participan bucle para k desde 0 a cantidad-1 Bolas(k) = k Repetir
//Barajar el array. // aunque se barajan todas, el usuario solo debe resolver las 4 primeras. bucle para k desde cantidad-1 a 1 regresivamente j= Random(entre 0 y k) i=bolas(k) bolas(k)= bolas(j) bolas(j)=i repetir devolver bolas //devuelve el array barajado. Fin funcion
Cuando el jugador completa su apuesta (todas las bolas d euna línea), se verifica si es la 'respuesta' coincidente con la que almacena la banca. cantidad es el tamaño del array bolas (8), y cantidadUser son 4, las que debe resolver el jugador. Devuelve FALSE si la partida terminó. buleano = funcion VerificarLinea(entero cantidad, entero cantidadUser, arraybytes bolasUser()) entero h, i, j, k
bucle para k desde 0 a cantidadUser-1 j= EstaBolaUserEnBanca(bolasUser(k), cantidad) Si (j>=0) luego //la bola que eligió el jugador está en la línea... i +=1 si (j= bolas(k)) luego //además coincide en el sitio h +=1 fin si fin si Fin bucle Pintar h bolas, de blanco //indicador de bolas correctas y en su sitio. Si (h=cantidadUser) luego mensaje "enhorabuena, juego resuelto" devolver FALSE Sino pintar i-h bolas, de gris // indicador de bolas correctas pero fuera de sitio. pintar cantidaduser - i bolas, de negro //indicador de bolas erróneas tiradas +=1 //intentos del jugador Si (tiradas = Maxtiradas) luego // por ejemplo 10, ó 12 tintentos mensaje "Lo sentimos, perdiste todas tus oportunidades de acertar. GAME OVER" devolver FALSE sino devolver TRUE //el jugador puede seguir jugando... Fin si Fin si // puede resumirse en (pintar) solo dos informaciones en vez de en 3... al gusto (omitiendo el 1º de los 3 puntosm, pintar h bolas de blanco), y/o cambiar colores para expresar una u otra cosa. Fin funcion
Verifica si la bola apostada, consta en la línea de la banca... Si está devuelve su posición, si no está devuelve -1 entero = Funcion EstaBolaUserEnBanca(entero Bola, entero cantidad) // esta cantidad es la de bolas totales que hay entero k
bucle para k desde 0 a cantidad-1 si bola = Bolas(k) luego devolver k fin si fin bucle
devolver -1 Fin funcion
Verifica si la bola y la posición donde el jugador la quiere depositar es válida. Devuelve FALSE mientras al jugador le falte colocar alguna bola No se verifica 'posición', se supone que si el jugador solo puede posicionarla en 4 posiciones no va a poder elegir un valor fuera del rango 0-3 (tampoco se verifica que la bola esté en el rango esperado (0-7) buleano = Funcion BolaValida(entero bola, entero posicion, entero cantidadUser) entero j, k
Si (bola=-1) luego // equivale a eliminar una bola, ...para ubicarla en otra posición bolasUser(posicion) = -1 // -1 equivale a un hueco libre en el array de apuesta del jugador devolver FALSE fin si // Comprobar que esa bola no haya sido ya elegida bucle para k desde 0 a cantidadUser-1 Si (bola = bolasUser(k)) luego mensaje "Ya tienes esa bola elegida" devolver FALSE //solo puede elegirse una vez una bola del mismo color. sino Si (bolasUser(k) >-1) luego Si (k=posicion) luego // pretende ubicarse la bola en una posición ya ocupada... // podria hacerse diferentes cosas, pero lo mejor es impedirlo e indicarlo. mensaje "Ya hay una bola en esa posición, solo puede colocar bolas en huecos libres. si lo precisa retire una bola de la posición deseada antes de colocar otra. fin si sino Si (k=posicion) luego bolasUser(k)= bola //el jugador mete su bola en un hueco sino j +=1 // queda un hueco más en el array para alojar una bola... fin si fin si fin si fin bucle
Si (j=0) devolver TRUE //Si no hay huecos, si ya tiene todas las bolas devuelve TRUE sino devolver FALSE fin si fin funcion
Función principal... Funcion IniciarPartida array bytes bolas(), bolasUser() entero bola, posicion, tiradas, maxTiradas
maxTiradas=10 Hacer mientras PedirPartida = TRUE bolas = llamada a BarajarBolas(8) tiradas =0
Hacer // nueva tirada del jugador bolasUser = llamada a BorrarBolasUser(4) Hacer // pedir bolas de una línea al jugador bola = PedirDatoBola al jugador (0-7) // volver a pedir mientras esté fuera del rango 0-7 posicion = pedirDatoPosicion al jugador (0-3) // volver a pedir mientras quede fuera del rango 0-3 Repetir mientras BolaValida(bola, posicion, 4) = FALSE // al salir del bucle el jugador completo su apuesta y consta en el array bolasUser
Repetir mientras VerificarLinea(8, 4, bolasUser) = TRUE Repetir fin funcion
Se resetea la apuesta del jugador (todo el array a valor -1) arrayBytes = funcion BorrarBolasUser(entero cantidadUser) array bytes arr() entero k bucle para k desde 0 a cantidadUser-1 arr(k) = -1 fin bucle devolver arr fin funcion
Quizás me deje alguna pequeña funcionalidad en el tintero, pero ya tienes suficientes detalles para entenderlo y modificarlo a tu antojo... eso sí, pensando... que es de lo que trata la programación (para copiar y pegar están las impresoras, los escáneras, las cámaras de fotos... pero ellas no cran programas, se requiere pensar). p.d.: Los niveles de dificultad, pueden crearse modificando el número de intentos que tiene el jugador así como el número de bolas que debe acertar y las bolas elegibles... - Cuantos menos intentos, más difícil. - Cuantas más bolas deba acertar (tenga la línea d ela banca a acertar), más difícil. - Cuantas más bolas elegibles entre las que apostar, más difícil...
|
|
|
3438
|
Programación / Programación General / Re: Problema Dll C++ DevC++ y Visual Basic 6
|
en: 11 Diciembre 2017, 02:27 am
|
VB6 puede operar con dos tipos de cadenas. 1 byte por carácter y con 2 bytes por carácter, y para pasar de una a otras se utiliza la función Strconv (o bien hacerlo manualmente). Aparte las cadenas de longitud fija herencia de Basic más antiguos (QuickBasic)... Básicamente si usa dos bytes por carácter, el segundo (los impares) debe ser un null (byte 0) y la cadena de texto siempre debe acabar en un null (el último byte par). Cuando se usa en Dll, el error más común suele aparecer porque se considere o no el carácter de fin de cadena (null), o bien porque no se pase correctamente el puntero de la cadena. Cuando proceda (o inténtalo y ver si así se resuelve tu problema), pasa un array de bytes. VB6 convierte automáticamente un array de bytes en cadena así como una cadena en un array de bytes, cuando se haga dicha asignación. Private Sub Form_Load() Dim miArray() As Byte Dim texto As String, otroTexto As String Dim k As Long texto = "ejemplo" miArray = texto For k = 0 To UBound(miArray) MsgBox Chr$(miArray(k)) Next otroTexto = miArray MsgBox otroTexto End Sub Salida: E null j null e null m null p null l null o null
Técnicamente un "string" en VB6 es un "BStr" de C. https://msdn.microsoft.com/es-es/library/windows/desktop/ms221069(v=vs.85).aspx
|
|
|
3439
|
Programación / Programación C/C++ / Re: LLenado De Matriz QR EN C
|
en: 10 Diciembre 2017, 16:18 pm
|
A ver, si el problema se limita a mover un valor a una determinada posición en un array bidimensional... pués es bastante obvio: Sea z el valor a colocar en la cordenada x,y: Si el array es unidimensional no es mucho más complejo, sabiendo el 'ancho' de la diemsnión... La letra P, tiene dos bits a 1, el 64 y el 16, porque 64+16=80, el resto son 0. Luego quiere decir que necesitas un bucle de 8 ciclos (porque 8 bits tiene un byte), alojado dentro de otro bucle cuya cantidad de ciclos sean los caracteres. Así que en pseudocodigo sería algo como: entero i, j, k byte letra
Bucle j por cada letra en Palabra i=1 Bucle para k de 0 a 7 bit= (letra and i) //entiendo que si el bit está a 0, se consigna un 0. letra /=2 llamada a funcion Posicionar(k, bit) i +=i // así va tomando valores 1,2,4,8,16... Fin bucle Fin bucle Tu problema luego se resume en que no hay una única forma d eposicionar en el array... "x" e "y", se modifican de forma diferente a cada caso... luego necesitas una función para cada caso, y posiblemente eso suponga que el bucle externo, no pueda ser un bucle y deba ser código lineal... letra= palabra.char(0) i=1 bucle para k de 0 a 7 bit= (letra and i) //entiendo que si el bit está a 0, se consigna un 0. letra /=2 llamada a función x001(k,bit) i +=i // así va tomando valores 1,2,4,8,16... fin bucle
letra= palabra.char(1) i=1 bucle para k de 0 a 7 bit= (letra and i) //entiendo que si el bit está a 0, se consigna un 0. letra /=2 llamada a función x002(k,bit) i +=i // así va tomando valores 1,2,4,8,16... fin bucle
letra= palabra.char(2) i=1 bucle para k de 0 a 7 bit= (letra and i) //entiendo que si el bit está a 0, se consigna un 0. letra /=2 llamada a función x003(k,bit) i +=i // así va tomando valores 1,2,4,8,16... fin bucle ...etc...
Y dichas funciones, como puedes apreciar reciben dos parámetros, el valor del bit y el índice del bit... el índice es necesario para reposicionar el par de cordenadas X e Y, al punto correcto... Ejemplo para una de ellas: entero x, y //declaradas al nivel del módulo, no dentro de una función, pues sus valores deben permanecer inalteradas tras salir de la función. Funcion PosicionarCuadrante1119(entero indice, entero bit) Si (indice=0) luego //Reset X e Y al inicio del cuadrante x= 19 y= 11 Sino Si (x=20) luego x= 19 y +=1 Sino x +=1 // x= 20 Fin si Fin si
Array(x,y) = bit Fin funcion Como hay diferentes cuadrantes, y cada uno tiene sus propias cordenadas, las diferencias entre cada función se limitan a señalar correctamente los valores X e Y a cada caso... ...resumiendo, nada de otro mundo... nada que con un mínimo de atención pueda conseguir cualquiera... queda a tu esfuerzo el resto de funciones, la llamada como: "PosicionarCuadrante1119", se aplica al cuadrante que apuntas en la inagen con una llave, más exactamente al cuadrante que comienza en Y=11 y x=19... (de ahí el nombre). Puede haber más cuadrantes que se 'rellenen' del mismo modo, por lo que también queda a tu esfuerzo simplificar el código (esto es, reunir todas las que se rellenan igual en una sola)... y así tendrías solo una función por cada forma distinta de llenar un cuadrante y para todos los cuadrantes que se rellenan igual, se diferenciarían sólo en los valores iniciales de sus cordenadas. Ya está todo dicho...
|
|
|
3440
|
Programación / Java / Re: Ayuda con Busqueda dicotomica
|
en: 10 Diciembre 2017, 15:37 pm
|
mi duda era que cual uso cuando hago un metodo para ordenar de mayor a menor y de menor a mayor eso es lo que quiero saber que simbolo uso para ordenar de ambas maneras...
No importa. ¿(5>3)? da la misma respuesta que preguntar ¿(3<5)? Da lo mismo decir "no es lunes, ni martes, ni miércoles ni jueves, ni viernes, ni sábado", que decir "es domingo", lo uno si es lo inverso de lo otro, no importa entonces como se describa, si como afirmando lo uno o negando el resto. en general se usa lo que resulte más breve, legible o entendible... en el ejemplo: es domingo es más conciso y claro. Igualmente puede valorarse: que Eso si, nota que no siempre al hacer algoritmos la inclusión del símbolo igual genera el mismo resultado, es decir hay veces en que: en un algoritmo puede llegar a ser igual que por lo que antes de expresar algo de una forma opuesta, se debe estar plenamente seguro de si la exclusión es totalmente correcta. Cuando un caso tenga numerosas variables en juego, lo mejor es hacer una tabla de verdad, con ella se elige luego la forma que mejor resume y lleve a cabo (la que requiera menos comparaciones en general, además de más rápida es más clara) y si algo no resulta evidente, siempre dejar un comentario en el código... pasado el tiempo, puede ser que no recuerdes lo que tiempo atrás era muy evidente y hacer cambios que luego fallan.
|
|
|
|
|
|
|