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

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Mensajes
Páginas: 1 ... 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 [382] 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 ... 432
3811  Programación / .NET (C#, VB.NET, ASP) / Re: Eliminar dato de matriz y array en: 30 Junio 2017, 16:25 pm
Elektro, ya te ha respondido...
Imagino que estás empezando y por eso has saltado por encima de las recomendaciones que te daba Elektro, al no entender de que te hablaba... Voy a suponer que es así.

------------------------------------
Tu has colocado una función que requiere que se le pasen 4 parámetros, pero sólo le envías 3 desde la llamada. el 4º parámetro (el 3º según el orden que ocupa en la función) lo obtienes desde dentro de la función... algo que rompe la lógica de las funciones, pero que admeás te genera el error al invocarla (no porque esto dentro, si no porque reclamas un parámetro que no se recibe desde fuera...

Si la función recibe dos arrays, un texto y un entero, esa función debe servir para cualesquiera arrays se reciban, por tanto la petición del texto por consola, la inutiliza para propósitos generales y la hace específica de ese único caso. y a tal efecto, entonces ya porqué no hacerlo más 'íntimo' y 'particular' y obtener el resto de parámetros también desde ahí...  :silbar: :silbar: :silbar:


Esta línea debería estar antes de invocar la función. Para que al invocar la función, 'nom' ya tenga el valor que usará la función
Código
  1. nom = Console.ReadLine().ToUpper().Trim();

Luego tus bucles son extraños... e inenecesarios ¿por qué pones dos bucles uno dentro de otro?. Cuando usas dos bucles de pongamos 100 ciclos cada uno, al final se ejecutan 100x100 ciclos.
Buscar en un array de 100 elementos, solo requiere un máximo 100 ciclos, nunca 10.000 (100x100)

El pseudocódigo de tu función debería ser similar a esto:
Código:
NombreBuscado = Consola.LeerEntradaUser("blablabla")

buleano = Funcion Eliminar (ArrayEntero Lista, ArrayString Nombre, String NombreBuscado, Entero Tope)
     Entero n=-1

     // buscar si existe: Nombrebuscado en la lista
     Bucle para k desde 0 hasta array.items-1
          Si Nombre(k) = NombreBuscado
               n = k
               Salir de este bucle //para continuar en el siguiente
          Fin si
     Siguiente
     // Si Existe, eliminar y bajar todos los elementos encima de él
     Si n >= 0 luego
          Bucle para k desde n hasta Lista.Items-2 // ojo -2, por si se hallara en el último puesto
               Lista(k) = Lista(k+1)
               Nombre(k) = nombre(k+1)
          Siguiente
          // Borramos el último elemento (no es imprescindible).
          Lista(k) = ""
          Nombre(k)= ""
          //tope -= 1 Tope parece ser el punto final hasta el cual buscar, pero.. (comentado más abajo)
          return TRUE
     Fin si
Fin funcion

Como te decía el propósito del parámetro "Tope" parece ser el punto final hasta el cual buscar, pero si es un array, tras eliminar un item en un punto que no sea el final, exige bajar todos los que tiene encima una posición (hasta el final de la lista)...
Salvo que pretendas insertar uno en determinada posición, en cuyo caso crea una función remplazar, con la particularidad que localiza y borra un elemento y si lo encuentra, en el índice marcado como tope inserta el remplazo.

Código:
NombreBuscado = Consola.LeerEntradaUser("blablabla")
NombreRemplazo = Consola.LeerEntradaUser("blablabla")

buleano = Funcion Remplazar (ArrayEntero Lista, ArrayString Nombre, string NombreBuscado, String Nombreremplazo, entero TopeRemplazo)
     entero n=-1
     // buscar si existe: Nombrebuscado en la lista
     Bucle para k desde 0 hasta TopeRemplazo
          Si Nombre(k) = NombreBuscado
               n = k
               Salir de este bucle //para continuar en el siguiente
          Fin si
     Siguiente
     // Si Existe, eliminar y bajar todos los elementos encima de él
     Si n >= 0 luego
          Bucle para k desde n hasta TopeRemplazo-1 // si (n) se haya en el último puesto, no se ejecuta el bucle.
               Lista(k) = Lista(k+1)
               Nombre(k) = nombre(k+1)
          Siguiente
          // el remplazo se coloca en el TopeRemplazo (último elemento donde se permitió buscar).
          //Lista(k) = "" <---- no queda claro que va aquí *
          Nombre(k)= NombreRemplazo
          return TRUE  //señala que el ítem localizado en 'n' fue remplazdo en 'ToopeRemplazo'
     Fin si
Fin funcion

Nota:* Aún así, no me queda claro el propósito del array 'Lista', si tienen valores precisos asignados a cada nombre (algo normal), entonces la función debería incluir  un parámetro más para remplazar en la misma posición y asnignarlo donde he puesto el comentario:   <---- no queda claro que va aquí *

Finalmente aclararte que incluso así, esa función deberían ser dos funciones... para
generar un código más eficiente:
Código:
// Busca un elemento Si existe devuelve el índice donde se localiza, si no , devuelve -1
Entero = Funcion Buscar(ArrayString Nombre, String NombreBuscado)
    Bucle para K desde 0 hasta Nombre.Items -1
        Si Nombre(k) = NombreBuscado luego Devolver K  //y salir de la función.
    Siguiente

    Devolver -1 //No encontrado
Fin Funcion

// Elimina un ítem del array (si existe dicho índice en el array).
Buleano = Funcion Eliminar(ArrayEntero Lista, ArrayString Nombre, Entero Indice )
     Si Indice < Lista.Items entonces
         Bucle para k desde Indice hasta Nombre.Items -1
             Nombre(k) = Nombre(k + 1)
             Lista(k) = Lista(k + 1)
         Fin bucle
         Nombre(k) = ""
         Lista(k) = 0
         Devolver TRUE
     Fin si
Fin Funcion


// Remplaza un ítem del array (si existe dicho índice en el array).
Buleano = Funcion Remplazar(ArrayEntero Lista, ArrayString Nombre, Entero Indice, String Remplazo, entero Valor )
     Si Indice < Lista.Items entonces
         Nombre(Indice) = Remplazo
         Lista(Indice) = Valor
      
         Devolver TRUE
     Fin si
Fin Funcion

Igualmente puedes hacer funciones más específicas de remplazo.
En cualquier caso, siempre que puedas separa la tareas, en este caso en dos funciones: 'Buscar' y luego la acción adicional, resulta más útil... que hacer bastante código en una sola función que "busca y remplaza", o "busca y elimina".
-------------------------------------------
También te decía Elektro, que cuando escribas código si pertenece a un lenguaje 'conocido' (específico), usa las etiqeutas GESHI (aparece en el editor, arriba a la derecha), seleccióna el trozo de código y marca el lenguaje al que pertenece en ese combo desplegable, así queda bien coloreado y las líneas numeradas y mucho más nítido...
3812  Foros Generales / Foro Libre / Re: Que ha pasado exactamente en Venezuela esta vez??? en: 28 Junio 2017, 16:21 pm
¿Venezuela a las puertas de una guerra civil?. Espero que no... espero que alguien cercano a Maduro, haga algo útil por todo el país, y dé fin a un tirano autoproclamado presiedente y demócrata...

...todavía quedaran los cientos de miles (o millones) de trolls que le han seguido la corriente a Chávez y Maduro por sus falsas promesas, y que ahora verían peligrar su...  'su nada', por que nunca fue nada concreto, aspiraciones en un vaso encerrado y tóxico.
3813  Foros Generales / Foro Libre / Re: Como llevarnos todo lo aprendido? en: 28 Junio 2017, 15:58 pm
jejjee... muy ocurrente Constance, pero entonces igualmente podría ser "Fuerte", que también cambia una sola letra... y deberíamos sentirlo, por aquellos que, nacidos en otro idioma no tengan la fortuna de ese 'remplazo' de palabras (por ejemplo para los de habla inglesa: Death <> Luck, pero todavía tendrían Death = Heath (brezo)).

Si nos llevamos algo al morir, no tendría sentido venir a este mundo y marcharse de vacío... pero desde luego nada material...
3814  Foros Generales / Noticias / Re: El mayor portaviones británico, vulnerable ante los 'hackeos' por usar un ... en: 27 Junio 2017, 15:45 pm
Pero vamos a ver... al comienzo de los ataques del WannaCry (que al principio aparecía nombrado como WannaCrypt), se dijo que los sistemas infectados eran en su mayoría XP... pero tiempo más tarde, tras analizar las cosas más detenidamente se desdijo, y que la mayoría de equipos infectados eran win7, y que apenas había equipos win-XP infectados...

Además, para hackear el buque deberá tener un sistema de entrada: ¿tiene acceso a internet?. Si no es así, solo se podría hackear In-situ, es decir por parte del personal en el propio buque. Y si tiene internet, ¿está comunicado el control del buque con las comunicaciones al exterior?. Porque perfectamente el buque podría tener el sistema de control del buque con winXP y las comunicaciones por satélite militar en otro subsistema y aparte tener otro sistema (aunque sea el mismo winXP), pero desconectado, para permitir a la tropa el acceso a Internet...

En fin si yo puedo tener en casa 2 o 3 equipos y todos con red, pero no necesariamente todos conectados a la misma red ni interconectados entre sí, no se porqué un buque ha de tenerlo todo en la misma red y todo interconectado... Aunque igualmente podría ser así... pero es el problema de este tipo de noticias basadas en 'suposiciones' (que en este caso se basa The Telegraph).
3815  Foros Generales / Noticias / Re: Google eliminará registros médicos de su buscador en: 27 Junio 2017, 01:51 am
Estoy asumiendo que un administrador de base de datos, no deja fugas de datos de ninguna manera (conscientemente), tratándose de datos privados. Es parte de su trabajo y se supone que sabe lo que hace.

De hecho ni siquiera existe una centralización del sistema sanitario (al menos en España), de modo que logrando acceso, puedan tener lo que quieran. Si logran un acceso, sería sólo a determinado hospital o como mucho a determinada comunidad (departamento).
3816  Sistemas Operativos / Windows / Re: Asignar porcentaje a programa en CPU en: 26 Junio 2017, 21:37 pm
Deberías mirar si el propio programa incluye alguna opción que permita no devorar todos los recursos del sistema (por ejemplo, no es preciso que vaya mostrando la conversión de los frames mientras los procesa).

Si el programa es parco en ese tipo de ayuda, lo mejor es enviar un mensaje a los autores, para que incluyan rutinas a propósito...

También puedes usar el task-manager de win2, e indicarle una prioridad muy baja, aunque no suele ser muy efectivo.
3817  Foros Generales / Noticias / Re: Empresarios españoles pagan por presionar a los periódicos para que borren ... en: 26 Junio 2017, 21:26 pm
Mmmm... es lo que tiene la fama, el precio.

Si ser famoso puede servir como puerta dorada para acceder a otros sitios, igualmente el doble filo de la fama, es ese, un hecho nauseabundo queda ahí registrado.

No se puede exigir tener solo buena fama. La fama es una moneda con dos lados, no existen monedas con un solo lado.

Que se preocupen de hacer las cosas correctamente y no habrá nada que tachar...
3818  Foros Generales / Noticias / Re: Google eliminará registros médicos de su buscador en: 26 Junio 2017, 21:21 pm
Lo que cuesta un poco más de entender es como van a parar a Google, los datos médicos de la gente...

Dudo mucho que ningún hospital deje entrar a Google a sus bases de Datos, para recoger lo que les venga en gana.
3819  Foros Generales / Noticias / Re: Australia quiere leer tus mensajes cifrados en: 26 Junio 2017, 21:18 pm
Que manía tienen los gobiernos de querer espiar a todos y siempre con la excusa del terrorismo.

Cuando aprenderán que las conversaciones privadas, SIEMPRE son privadas y ninguna ley es legítima sobre el asunto.

Interceptar mensajes o tener acceso a  los mensajes cifrados, es lo mismo que meter un micrófono en tu casa o espiar tu pensamiento. Nadie tiene derecho a ello y si se demuestra que eres un terrorista, entiendo que aquello que lo demuestra es más que suficiente, si no es así, solo es 'presunto' y entonces así todos somos 'presunto'... que es precisamente lo que los gobiernos quieren para tener acceso a todo.
3820  Programación / .NET (C#, VB.NET, ASP) / Re: Colorear marco de textbox o combobox en: 26 Junio 2017, 17:52 pm
Lo que comenta Elektro es totalmente correcto, sin embargo también es complicarse en exceso para alguien que está empezando y no conoce a fondo el lenguaje.

Tú puedes tener una función (o varias sobrecargas, de hecho mejor así, una para textos otra para números, etc... siempre que resulte cómodo y simple) que validen tus datos, correcto... pero no le veo mucho sentido a ir modificando cada vez el campo que no pase la validación (luego deberás volverlo a su estado original).

Al caso, es más fácil tener un control oculto, con el formato ya 'hecho' (por ejemplo con un borde de otro color, un fondo de otro, color el texto resaltado en negrita... pero dicho control, lo que se hace simplemente es que cuando falle una validación se desplaza hasta la ubicación del campo que falla, y se hace del mismo tamaño que el campo que falla se escribe el mismo texto que contiene y acto seguido se le hace visible... y se le entrega el foco...

...et voilá, el usuario lo ve como tu quieres, sin tocar el original, ahora el usuario introduce el texto en ese control, y se intenta validar, se repite hasta que la cumpla o cancele la operación, si pasa la validación entrega el texto al campo original (que llamó la validación y sigue a la espera de la respuesta de su llamada) y se oculta....
Esto, es más sencillo, no requiere redibujar a cada instante, visualmente es equivalente, ya está todo hecho solo hay un Move y Size, y una asignación de texto... todo my simple.

En pseudocódigo sería más o menos así (3 bloques de código):

La lógica de validar todos los campos validables del formulario...
Código:
buleano TodoValidado = true
Por cada campo en camposValidables del formulario
     String Texto = Campo.Texto
    
     Si Validar(Campo, Texto) = TRUE luego
        Campo.texto = texto
     Si no
        TodoValidado = FALSE
        Salir del bucle // fue cancelado...
     Fin si
Fin por cada

Si TodoValidado = TRUE
   // Siguiente paso, que debas hacer en este caso
Si no
   // lo que debas hacer si se canceló.
Fin si

Esta función recoge la lógica de validar expresada más arriba.
Esta función debería tener sobrecargas si hay que validar diferentes cosas aparte de texto o con criterios dispares...
Código:
Buleano = Funcion Validar(control Ctl, String Texto)
    CtlOculto.MoveAndSize(ctl.Left, ctl.Top, ctl.Width, ctl.Height)
    
    //primero se valida el texto original, solo si falla aparecerá el trabajo del control oculto.
    Mientras ValidarP(Texto) = FALSE
        Mensaje de error: "el texto introducido no es válido, corrijalo y luego pulse intro (validar) o   ESC (cancelar)
        CtlOculto.Texto = Texto
        Ctl.Visible = TRUE
        Ctl.SetFocoModal // se da oportunidad al usuario de cambiar el texto y al pulsar intro o Escape  regresa aqui (= MODAL, el código queda a la espera hasta que se cierre el objeto llamado, básicamente podría ser un formulario, si no es modal el código continuará tras la llamada previa y eso no interesa)
            
        // Si se pulsó intro, se debió cerrar el ctlOculto y volver a ser validado su texto.
        Si Tecla = Escape luego
            ctlOculto.Visible = FALSE  //Si el ctlOculto es formulario o está dentro de un formulario, esto no sería necesario, se habrá cerrado el formulario Modal...
            Devolver FALSE // se sale de la función desde aquí
        Fin si
    Repetir
    Texto = ctlOculto.Texto
    ctlOculto.Visible = FALSE //Si el ctlOculto es formulario o está dentro de un formulario, esto no sería necesario, se habrá cerrado el formulario Modal...
    Devolver TRUE
Fin Funcion

El código que hace realmente la validación iría aquí:
Código:
Buleano = ValidarT(Texto) //T de Texto...
    // validación del texto, lo que tu hagas para validarlo
    // Devuelve TRUE si es válido y FALSE si no lo es
Fin Funcion

Y más o menos esto te simplifica mucho tu tarea... el control ctlOculto, ya está con el formato de 'error' así no hay ni que redibujar cada control ni luego volverlo a redibujar de nuevo a su estado original.

p.d.: Yendo un poco más lejos, ni siquiera tienes que reposicionar y redimensionar el control oculto, basta montarlo en un fomrulario nuevo , como te convenga y mostrarlo igual que se haría con un "MessageBox" (de hecho sería eso, un messagebox personalizado) y mostrarlo centrado en la pantalla y más grande si es preciso, ahora con dos botones explíctos OK y Cancelar, pero además puedes añadir una etiqueta indicando que falló o que se espera que se escriba en dicho campo.
Las modificaciones al pseudocódigo para esto son evidentes, así que no veo preciso añadir nada más... para adaptarlo mas concretamente.
Páginas: 1 ... 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 [382] 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 ... 432
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines