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


 


Tema destacado: Análisis del vídeo del hackeo al Sindicato de los Mossos de Esquadra


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ... 93
121  Programación / Programación C/C++ / Re: ordenar arreglos en: 24 Octubre 2017, 16:18
Hay varias formas de hacerlo

La más sencilla es:
1 - ordenar ambos arrays,
2 - Recorrer los arrays y verificar item a ítem si contienen el mismo valor
Si Array1(k) = Array2(k) luego iguales +=1
3 - Recorrer otra vez los bucles (pero desde el índice 1) y verificar que no hay ítems repetidos:
Si Array1(k) = Array1(k-1) luego RepesEnArray1 +=1
Si Array2(k) = Array2(k-1) luego RepesEnArray2 +=1

4 - Al final arrojas la cantidad de iguales (o distintos) hallados entre ambos arrays y la cantidad de repes en cada array, conforme a lo que te soliciten, que no queda claramente indicado...

Bueno, ya tienes las indicaciones adecuadas para empezar, ahora te toca escribir código....
122  Programación / Programación C/C++ / Re: Listas doblemente enlazadas en: 23 Octubre 2017, 17:33
Cuando señalas insertar (al inicio o al final), no debieras imprimir la lista, eso haría inecesario en el menú, la opción imprimir... (que yo añadiría esa opción al menú) bien que mientras diseñas si tengas activa esa línea para ir verificando que las operaciones se realizan correctamente...
entonces lo pondrías tras la llamada en el menú, antes del  Break...

El nombre de 'Final', no es para nada ilustrativo de su funcionalidad. Insertar, siempre es añadir delante de algún item, OK, pero al final puedes llamarlo simplemente Añadir... sin más expecificaciones, al añadir, siempre se añade al final.

Por último, no veo que lleves la cuenta de la cantidad de ítems en la lista... es más eficiente preguntar que 'Si Items=0', que 'Si Lista es null', y añadir al comienzo puede indicarse con un 0 y añadir al final con -1, y Añadir en cualquier otra posición (insertar), con cualquier otro valor entre 1 e ítems -2
Un control de la cuenta de nodos en la lista, aunque no es imprescindible, si es más que aconsejable, simplifica la lógica y funcionalidad de la misma a cambio de algo de código extra.



Y ahora yendo a tus dudas:
- Tu función 'Final' no está bien implementada... Trato de explicarte con un sencillo ejemplo, sea una lista con varios elementos, consideremos estos 3:  Marte -> Jueves -> domingo
vemos que domingo.anterior = jueves
y vemos que Jueves.siguiente = domingo
Ahora insertemos un elemento en medio, por ejemplo viernes.
Las operaciones a realizar serán 4, verás:
Código:
viernes.siguiente = domingo
domingo.anterior = viernes
Viernes.anterior = jueves
Jueves.siguiente = viernes
Es decir se necesita apuntar desde el nuevo elemento a los extremos donde se inserta, y se necesita apuntar desde los extremos donde se inserta al nuevo elemento. Siempre son 4 asignaciones (si está en medio)
Si el nodo a añadir es un extremo, solo necesita 2 asignaciones (si la lista doblemente enlazada no es circular)...




Modifico tu código a pseudocódigo para hacerlo más legible:
Esta función está bien, salvo la redundancia de establecer nulos, donde ya los hay y no llevar cuenta de ítems que tiene la lista.
Código:
   if (lista = Nulo)
        lista = q  //OK
        q.sig = Nulo  //Innecesario
        q.ant = Nulo  //Innecesario
    else
        q.sig = lista //OK
        q.ant = lista.ant; //Innecesario
        lista.ant = q //OK
     }
¿No cuentas los items que lleva la lista.... por qué?

Así tu función externa podría ser:
Código:
Funcion Añadir(dato, posicion)
   nodo n

   n.Dato = dato
   // o bien como en tu caso operas por consola, desde aquí solicitas la entrada del dato, 1 solo sitio para las 3 funciones internas (y retiras el parámetro dato de la funcion)

   Si (posicion=0) ó (Items=0) luego
       AñadirAlComienzo(n)
   PeroSi (posicion menor que 0) ó (posicion mayor o igual que Items-1) luego
       AñadirAlFinal(n)
   Sino
       Insertar(n, posicion)
   Fin si
   actual =n
Fin funcion

Y tus funciones internas serían ahora: AñadirAlFinal, AñadirAlComienzo, Insertar

Fíjate que ahora insertar exigirá localizar el ítem en la posición pedida. al caso actual es una buena estrategia, porque recordando su posición, puede partirse desde 0 hasta actual desde actual hasta 0, desde actual hasta último, desde último hasta actual, según quede más cerca de un nodo u otro de los 3 implicados: primero, actual ó último...

Reviso tu función 'Final' (Añadir):
Simplifico tu código hacia pseudocódigo, más sencillo de ver así...
Código:
funcion Final
    ...
    if(lista = Nulo)
        lista = q
        q.sig = Nulo //Innecesario
        q.ant = Nulo  //Innecesario
    else
        //3 líneas 3 errores...
        q.sig = lista.sig  //Innecesario, asignar nulo al final de la lista no es preciso, el nodo recién creado ya tiene su .siguiente en nulo. Pero además es un error.
        lista.sig = q  //NO lista.sig apunta al segundo nodo, no al último.
        q.ant = lista //NO, le estás diciendo que el anterior a este nodo es el primer nodo.
    }
¿Igual que la otra, no llevas cuenta de los ítems, por qué?
Fin funcion

Esta función te falla... porque
Una lista, basta que tenga el nodo 'inicial, pero si tienes una lista doblemente enlazada, debieras mantener referencia al primer y último elemento.
Cuando apuntas a lista (tu nodo lista), estás apuntando al primero nodo en ella, entonces lista.siguiente apunta al siguiente nodo en la lista, es decir al segundo nodo, no al último. Será el último solo si la lista tiene 2 ítems...
Entonces tu función Final, está insertando nodos incorrectamente... usa nombre días o de meses y haz las asignaciones en papel para ver como va quedando concada inserción, para entender el problema.



La implementación debe mantener referencia al primer y último nodo, y deja de llamar lista al primer nodo, porque eso te 'nubla la vista'.

Aquí una sencilla implementación con referencias al primero, último y actual nodos, además lleva la cuenta de ítems...
Estos son los miembros en la clase, debajo los métodos...
Código:
nodo Primero   //primer nodo de la lista.
nodo Ultimo     // Ultimo nodo de la lista.
nodo Actual     // Nodo actual, también podría ser el primero y el último

entero ixActual  // indice que ocupa el nodo en la lista.
entero Items   // Cantidad de nodos que contiene la lista actualmente.

Función externa para añadir nodos...
Con cada añadido, se hace actual al nodo añadido, y se conserva su posición.
Código:
Funcion Añadir(Posicion)
    nodo n
    entero dato

    dato = PedirDatoAlUsuario

    Si (Items=0) luego
        CrearLista(n)
        ixActual=0
    Sino
        Si (posicion=0) luego
            AñadirAlComienzo(n)
            ixActual=0
        PeroSi ((posicion < 0) ó (posicion >(Items-2))) luego
            AñadirAlFinal(n)
            ixActual= items
        Sino
           Insertar(n, posicion)
           ixActual= posicion
        Fin si
    Fin Si
    actual = n
    Items +=1
Fin Funcion

Añade el primer nodo a la lista.
Código:
funcion CrearLista (nodo n)
    primero = n
    ultimo = n  // vuando solo hay 1 nodo en la lista, es el primero y también el último.
Fin funcion

Añade un nodo al comienzo de la lista.
Código:
Funcion AñadirAlComienzo(nodo n)
    n.siguiente = primero
    primero.anterior = n
    primero = n
    Si (items=1) luego
        ultimo.anterior = n //el primero
    fin si
Fin funcion

Añade un nodo al final de la lista.
Código:
Funcion AñadirAlFinal(nodo n)
    n.anterior = ultimo
    ultimo.siguiente = n
    ultimo = n
    Si (items = 1) luego
        primero.siguiente = n // el ultimo
    Fin si
Fin si

Insertar un nodo en posiciones distintas del último y el primero.
Código:
Funcion Insertar(nodo n, entero posicion)
    nodo busca

    busca = BuscarNodo(posicion)

    n.anterior = busca.anterior
    n.siguiente = busca
    busca.anterior.siguiente = n
    busca.anterior = n    
Fin funcion

Busca desde el primero hasta hallar el nodo en la posición pedida.
Código:
nodo = funcion BuscarNodo(entero posicion)
    nodo n
    entero k

    n= primero
    mientras (k < posicion)
        n = n.siguiente
        k +=1
    repetir
    devolver n
Fin funcion

Búsqueda optimizada, basada en el actual... para una lista con pocos elementos no se nota, cuanto más crece la lista, más útil resulta...
Código:
nodo = funcion BuscarNodo(entero posicion)
    nodo n
    entero k, s

    Si (posicion <= ixactual) luego //está entre el primero e ixactual
        Si ((posicion-ixactaul) < (ixActual /2)) luego //si está más cerca de ixActual que de 0...
            n = ixactual  
            k = ixactaul
            s = -1
        Sino
            n = primero
            k = 0
            s = 1
        fin si
    Sino //está entre ixactual y el último
        k = (items-ixActual)
        Si ((k/2) => (k - (posicion-ixactaual))) luego // si está más cerca de ixActual que del final
            n = ixactual  
            k = ixactaul
            s = 1
        Sino
            n = ultimo
            k = Items-1
            s = -1
        fin si        
    Fin si
    
    Si (s = 1) luego //busca hacia arriba (itera sobre siguiente
        mientras (k < posicion)  // <> es distintode
            n = n.siguiente
            k +=1
        repetir
    Sino  //busca hacia abajo (itera sobre anterior)
        mientras (k>posicion)
            n = n.anterior
            k -=1
        repetir
    devolver n
Fin funcion

Dejo a tu cargo Imprimir(DesdePosicion, HastaPosicion), con valores Imprimir(0,-1) debería imprimir toda la lista.
123  Programación / Programación General / Re: Como hacer un lenguaje de programación? en: 23 Octubre 2017, 14:29
Una sintaxis simple, como Python y Ruby
Cuando uno decide crear un lenguaje nuevo, tiene la oportunidad dorada, de decidir como ha de ser su lenguaje y desterrar del mismo las tonterías que encuentra en otros lenguajes y añadir lo que cree que falta.

Si al final encuentras que tales lenguajes no contienen tonterías sobrantes, ni les falta nada, entonces es una pérdida de tiempo, pretender hacer un lenguaje prácticamente idéntico a uno ya "existonto"... Si es meramente por practicar, haz lo que muchos crea un lenguaje simple para una calculadora, sigue siendo un ejercicio, pero sin la pérdida considerable de tiempo y esfuerzo (como el que lleva un lenguaje complejo y completo).

Te recomiendo encarecidamente que te leas la notación BNF
Esto puede ilustrarte bastante:
https://tools.ietf.org/html/rfc5511  RBNF
https://www.ietf.org/rfc/rfc2234.txt ABNF
124  Programación / Java / Re: [AYUDA] Como reflejar una Matriz en: 23 Octubre 2017, 14:01
No queda claro... ¿los valores son 4,3 y luego cambian de orden 3,4 o el valor es "43" y luego vale "34".?

Qués lo que quiere "reflejar", los valores o las posiciones?
125  Foros Generales / Dudas Generales / Re: [VBA]Error definido por la aplicación o definido por el objeto Al Usar Cells() en: 23 Octubre 2017, 13:56
Seguro que esos rangos están dentro de los límites de la hoja?

Es decir tu le estás diciendo que tienes al menos 6 filas (0-5) de 2 columnas (0-1)... o son 2 filas (0-1) de 6 columnas(0-5)?

Aunque luego al poner i+1, exige que tengas una columa más, 7 ... (0-6)

Luego anecdóticamente veo inútil esto que pones, los valores que quedarán al final, son los que marco con OK, los previos se escriben para acto seguido ser sobrescritos. Con qué finalidad?

            Cells(j, i) = title.Text OK
            Cells(j, i + 1) = content.Text
            Cells(j, i + 1) = dat.Text
            Cells(j, i + 1) = fonts.Text OK

En cualquier caso este tma debería ir al hilo de VB... no aquí.
126  Foros Generales / Noticias / Re: Crackear Denuvo ahora sólo requiere unas pocas horas en: 22 Octubre 2017, 15:44
La seguridad basada en software, es una utopia.

Si el hardware no proporciona la base adecuada, el software siempre podrá ser derivado...
127  Foros Generales / Noticias / Re: Botnet IoT crece en las sombras durante el mes de septiembre en: 22 Octubre 2017, 15:14
Con todos los problemas de seguridad que han venido apareciendo desde hace ya tres décadas, no acabo de entender como han 'dejado suelto', al hardware silencioso pero que ha de 'vigilar', 'reponer', 'investigar', 'solucionar' el mundo... los peqeños artefactos, resultan los más dañinos, precisamente porque son y han de ser omnipresentes (y omniocultos), pero son los más inseguros...

Esos pequeños cachivaches debieran ser precisamente los mejor diseñados en cuanto a seguridad. El ansia de querer controlarlo todo en remoto, deja siempre abierta la posibilidad del hackeo (además facil, porque no usan sistemas exlusivamente diseñados a tal efecto).

Quizás debieran funcionar a piñón fijo, esto es con una ROM y punto... y cuando quedaren obsoletos, se cambia el hardware por completo (y no solo se renueva el software). Después de todo, cuando pasen unos años, el cambio del software acaba haciendo inútil al harware (por que se hace así a propósito), y se exige un cambio de hardware aunque funciones perfectamente (lo vemos a diario en nuestros PCs, que aún funcionando perfectamente, se salta a nuevas versiones de S.O. pasra dejar obsoleto tu hardware y forzar la compra cada pocos años de nuevos equipos). Si así funcionan equipos que en teoría debieran funcionar entre 15-20 años, ¿porqué no hacerlo forzado con los equipos de IOT, con ROMs, y remplazarlos cada 5 años por otros nuevos?.

En fin, los intereses económicos siempre tiran por delante y como los políticos se venden haciendo leyes a su favor o no controlando todo ese desdén, ellos van empujando detrás, y así todos en manada dirigidos por las grandes corporaciones hacia... el abismo.
128  Programación / Programación C/C++ / Re: Manipulando ficheros de texto en: 22 Octubre 2017, 14:31
Asumo que el fichero lo has creado tú y por tanto la estructura que sigue depende enteramente de tí.

Si tienes campos fijos, entonces debes crear una estructura:
Código:
Estructura Datos
  Nombre
  Direccion
  Telefono
Fin estructura
Ahora entonces es posible leer de una vez una estructura como una única variable.
Cuántas erstrcuturas tienes?. Pués calcula: si el fichero tiene x bytes y cada estructura ocupa y bytes, habrá z estructuras (z=/x/y)
También podrías dejar al comienzo un valor de 4 bytes indicando cuantas estructuras tiene el fichero, no es imprescindible, en cualquier caso, el código vendría ser:

Código:
Estructura Dts()
entero = Funcion Leerfichero(ficheroX)
    Estructura Dt
    Entero n, k
    Buleano b
    
    b= AbrirFichero(ficheroX)
    Si b=TRUE luego
        n = ContarEstructuras // sea leyendo un campo del mismo, o del modo señalado)
        Redimensionar array Dts(0 a n-1)
        // x deberá ser el valor que competa al caso.
        PosicionarPunteroDeLectura(x) //al comienzo de la estructuras //si fuere necesario porque antes hubieres saltado a algún otro punto, para leer alguna cosa...
        
        Bucle para k desde 0 hasta n-1
            LeerFichero(dt)
            dts(k) = dt
        Fin bucle
        CerrarFichero
        Devolver n //númeor de estructuras hallados
    Si no
        Devolver -1 //error
    Fin si
Fin funcion

Parte de lo que solicitas ya te respondío el compañero más arriba.

Finalmente solo indicarte que sí, que es posible el "acceso aleatorio" en un fichero. Si está compuesto de registros (estructuras, datos cordinados), es conveniente que se señale el número de registro siguiente a leer, en vez de el puntero donde comenzar, y cuando vayas a continuar leyendo, calcular el posición exacta, multiplicando el número de estructuras,por los bytes que ocupa cada una, más el posible desplazamiento de estructuras únicas que hubiere al comienzo (del fichero) de las estructuras repetidas.
Ese dato, del punto de lectura, no conviene guardarlo en el mismo fichero si no en otro aparte...
Modificando la función anterior, que antes era:
Código:
entero = Funcion Leerfichero(ficheroX)
ahora se le añade un parámetro más y quedaría:
Código:
entero = Funcion Leerfichero(ficheroX, Registro)
    entero posicion
    ...
   posicion = ((Size(dt) * Registro) + DesplazamientoInicial)
   PosicionarPunteroDeLectura(posicion)
   ...
Fin funcion
129  Foros Generales / Foro Libre / Re: El examen que ha dado la vuelta a España: ¿Es correcta la respuesta de este niño en: 21 Octubre 2017, 02:13
La respuesta no es correcta, pero el ceporro es el profesor. Él es quien debiera interpretar correctamente que el alumno (un niño), malinterpretó su pregunta por que no estaba perfectamente delimitada (para la comprensión de un niño).

En cualquier caso, no veo a que viene tanto debate por el asunto. El niño no se está 'jugando' el premio Nobel, pasados 3 días ni se acordará del asunto...
130  Foros Generales / Noticias / Re: ‘Lo estás haciendo mal’, esta es la solución oficial a un problema de Windows... en: 19 Octubre 2017, 18:12
Qué rayos de programación más estúpida debe haber por debajo, para que el nombre de un usuario incida en el rendimiento de un programa...

...yo despedía al programador, sin más (o a todo el equipo si son conscientes de esa monstruosidad y lo toleraron).
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ... 93
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines