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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


  Mostrar Mensajes
Páginas: 1 ... 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 [61] 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 ... 431
601  Programación / Programación Visual Basic / Re: eliminar registro en: 10 Noviembre 2021, 23:23 pm
En realidad, lo peor no es que no se borren los datos de los textbox (que no solo no importa si no que interesa conservarlo temporalmente)... lo peor es que no se borran de tu array.

Hay una variedad de indicaciones que dar y corregir... pero no quiero extenderme en explicaciones... porque son elementales y uno debiera ceñirse a ellos.

Te pòngo un código que puedes remplazar por todo lo que tienes. nota que he renombrado los textbox y los botones a un valor más acorde y el boton 'nuevo', en realidad sobra, aún así su código todavía es válido.

Nota también, que si no tienes más módulos de código donde uses esos registros de la agenda, el código en el módulo puede ser pasado al formulario (pero con alcance privado).

Código
  1.  
  2. Private Type Registro
  3.    Nombre                  As String * 15
  4.    Apellidos               As String * 25
  5.    Telefono                As String * 15
  6.    Edad                    As String * 3
  7. End Type
  8.  
  9. Private Agenda(0 To 49)     As Registro
  10. Private totalregistros      As Integer
  11. Private NoUpdateTxts        As Boolean
  12.  
  13.  
  14. Private Sub BtnAñadir_Click()
  15.    If (totalregistros = 50) Then
  16.        MsgBox "lista completa", 16, "error"
  17.    Else
  18.        If (Esregistrable = True) Then
  19.            With Agenda(totalregistros)
  20.                .Nombre = TxtNombre.Text
  21.                .Apellidos = TxtApellidos.Text
  22.                .Telefono = TxtTelefono.Text
  23.                .Edad = Val(TxtEdad.Text)
  24.            End With
  25.  
  26.            Combo2.AddItem TxtNombre.Text
  27.            totalregistros = (totalregistros + 1)
  28.  
  29.            Call BtnNuevo_Click
  30.        Else
  31.            MsgBox "El registor está incompleto, no puede añadirse hasta que esté completo."
  32.        End If
  33.    End If
  34. End Sub
  35.  
  36. Private Sub BtnEliminar_Click()
  37.    Dim b As VbMsgBoxResult
  38.    Dim index As Integer, k As Integer, j As Integer
  39.  
  40.    j = (Combo2.ListCount - 1)
  41.    index = Combo2.ListIndex
  42.    If (index = -1) Then  ' exit sub
  43.        Combo2.ListIndex = j  ' si no hay ninguno seleccionado se supone el último.
  44.        index = j
  45.    End If
  46.  
  47.    b = MsgBox("Eliminar Registro: " + TxtNombre.Text, 3 + 32, "Eliminar")
  48.    If (b = vbYes) Then
  49.        ' Los datos a eliminar, se pasan a los textbox, por si se quiere volver a añadir o editar antes de añadir.
  50.        Call Combo2_Click
  51.        ' opcionalmente se puede simplemente borrar...
  52.        'Call BtnNuevo_Click
  53.  
  54.        ' Eliminar el item del combo.
  55.        Combo2.RemoveItem (index)
  56.  
  57.        ' Bajar todos los items en el array por encima del item eliminado una posición.
  58.        For k = index To j - 1
  59.            Agenda(k) = Agenda(k + 1)
  60.        Next
  61.  
  62.        ' ahora el último ítem queda libre, se puede vaciar o dejarlo...
  63.        With Agenda(k)
  64.            .Nombre = ""
  65.            .Apellidos = ""
  66.            .Telefono = ""
  67.            .Edad = ""
  68.        End With
  69.  
  70.        ' queremos que en el combo siempre se vea un item.
  71.        NoUpdateTxts = True
  72.        If (j > 0) Then
  73.            If (index < j) Then
  74.                Combo2.ListIndex = index
  75.            Else
  76.                Combo2.ListIndex = (j - 1)
  77.            End If
  78.        End If
  79.        NoUpdateTxts = False
  80.  
  81.        totalregistros = j ' descontar 1.
  82.  
  83.        ' Desactivar el botón eliminar si no quedan registros.
  84.        BtnEliminar.Enabled = (totalregistros > 0)
  85.    End If
  86. End Sub
  87.  
  88. Private Sub BtnTerminar_Click()
  89.    End
  90. End Sub
  91.  
  92. Private Sub BtnNuevo_Click()
  93.    TxtNombre.Text = ""
  94.    TxtApellidos.Text = ""
  95.    TxtTelefono.Text = ""
  96.    TxtEdad.Text = ""
  97.    TxtNombre.SetFocus
  98. End Sub
  99.  
  100. Private Sub Combo2_Click()
  101.    If (NoUpdateTxts = False) Then
  102.        With Agenda(Combo2.ListIndex)
  103.            TxtNombre.Text = .Nombre
  104.            TxtApellidos.Text = .Apellidos
  105.            TxtTelefono.Text = .Telefono
  106.            TxtEdad.Text = Val(.Edad)
  107.        End With
  108.    End If
  109. End Sub
  110.  
  111. Private Sub TxtEdad_GotFocus()
  112.    Call SelOnGotFocus(TxtEdad)
  113. End Sub
  114.  
  115. Private Sub TxtApellidos_GotFocus()
  116.    Call SelOnGotFocus(TxtApellidos)
  117. End Sub
  118.  
  119. Private Sub TxtNombre_GotFocus()
  120.    Call SelOnGotFocus(TxtNombre)
  121. End Sub
  122.  
  123. Private Sub TxtTelefono_GotFocus()
  124.    Call SelOnGotFocus(TxtTelefono)
  125. End Sub
  126.  
  127. Private Sub SelOnGotFocus(ByRef Txt As TextBox)
  128.    Txt.SelStart = 0
  129.    Txt.SelLength = Len(Txt.Text)
  130. End Sub
  131.  
  132. ' Verifica que los campos dle registor no quedan vacíos (sdon obligatorios)
  133. '  Si un campo no es obligatorio, debe retirarse de aquí.
  134. Private Function Esregistrable() As Boolean
  135.    If (Len(Me.TxtNombre.Text) > 0) Then
  136.        If (Len(Me.TxtApellidos.Text) > 0) Then
  137.            If (Len(Me.TxtTelefono.Text) > 0) Then
  138.                Esregistrable = IsNumeric(Me.TxtEdad.Text)
  139.            End If
  140.        End If
  141.    End If
  142. End Function
  143.  
  144. 'Private Sub Form_Load()
  145. '    totalregistros = 0
  146. 'End Sub
  147.  

Ejecuta el código paso a paso al menos el del botón eliminar, para ver qué va sucediendo a cada instante... (arranca la aplicación con la tecla F8, o bien pon un punto de interrupción (tecla F9) en la línea del boton eliminar y cuando llegue allí se parará y entonces ejecuta paso a paso con la tecla F8).


Por favor, como ya llevas tiempo en el foro, acostumbra a colocar tu código entre etiquetas GESHI (elige VB), que aparecen en el editor cuando redactas tu mensaje...
602  Programación / Programación Visual Basic / Re: Evitar repetición de la pulsación de una tecla en: 10 Noviembre 2021, 20:22 pm
adla,  Tengo una buena noticia para tí...

Me picaba el gusanillo de probar que de alguna manera fuera posible y simple lograr lo que reclamas y lo he conseguido.
Que conste que no hay funcionalidad documentada al respecto, a sí que ha sido tirar de intuición y pruebas.

VB6 suele pasar sus parámetros por referencia... en general esto es más rápido que copiar el valor a una nueva variable y es una razón de peso (velocidad), por la que muchos lenguajes por defecto, han pasado (y siguen pasando) parámetros por referencia...
No obstante esto mismo permite modificar el valor en origen, por lo que ha sido cuestión de probar ciertos casos para jugar con tal eventualidad.

Con el evento keydown, el problema es que te pasa el 'keycode' que es la tecla pulsada, esto es muy útil, ya que te salta cuando pulsas la 'A' pero también cuand pulsas las teclas de cursor, muy útil si tratas de controlar por ejemplo el reposicionamiento del cursor en un control diseñado por tí.
Tu caso es no permitir repetición de teclas pero solo en el caso de las teclas imprimibles, lógicamente que alguien quiera mover el cursor x posiciones a derecha o izquierda (arriba y abajo suelen comportarse traducido a derecha e izquierda), no debiera ser filtrado. Es cómodo dejar el la tecla del cursor pulsada cuando hay que avanzar bastantes caracteres, en ves de pulsar una vez por cada movimiento...
Entonces, filtrar una funcionalidad y no la otra... exige crear un array de teclas, poniendo a 1 (por ejemplo) las teclas imprimibles y a 0 las que no para filtrar solo las imprimibles... el resultado es que no funciona.

Luego he recordado que está también el evento keypress, que también sucede antes del evento change (pero detrás del keydown) y que el parametro que envía no es 'keycode', si no KeyAscii', aquí si funciona, pues todo lo que hay que hacer es anular la tecla pulsada cuando se dé la condición indicada.
Se ve que el evento change es disparado justo a la devolució de este teniendo el cuenta el valor actual de 'KeyAscii' y no el del 'Keycode'.

Sin más te pongo el código.
De ejemplo se supone un formulario con al menos un textbox (llamado al caso text1) y ya:
Código
  1. Private KeyIsDown As Boolean
  2.  
  3.  
  4. Private Sub Text1_KeyPress(KeyAscii As Integer)
  5.    If (KeyIsDown = False) Then
  6.        KeyIsDown = True
  7.    Else
  8.        KeyAscii = 0
  9.    End If
  10.  
  11.    Debug.Print KeyAscii    ' con CTRL +G abre la ventana de debug, para ver los resultados filtrados...
  12. End Sub
  13.  
  14. Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
  15.    KeyIsDown = False  ' sea o no true.
  16.  
  17. End Sub
  18.  
Ahora cuando se pulsa una tecla, solo se acepta como una sola pulsación, sin importar el tiempo que se deje pulsada la tecla, es decir elimina la repetición.

Si deseas que otras teclas (como la de cursor) tampoco se repitan, implementa el array comentado... pero ahora en el evento Keydown.
Nota la diferencia entre una tecla de cursor a izquierda keycode=36, es ditintito de Keypress= 36 que corresponde con el carácter imprimible '$'
...se modifica como aquí consta:
Código
  1.  
  2. Private KeyIsDown As Boolean
  3. Private CodeIsDown As Boolean   ' ojo, esta opera con keydown, la otra con KeyPress...
  4. private charsImprimibles(0 to 255)  as byte
  5.  
  6. Private Sub Form_Load()
  7.    dim k as integer
  8.  
  9.    charsImprimibles(13) = 1
  10.    for k= 32 to 255
  11.         charsImprimibles(k) = 1
  12.    next
  13.  
  14.    ' FALTA: poner a 0 las 'keycode' que quieras que si se repitan (pulsa F2 y busca KeyCodeConstants).
  15.     charsImprimibles(vbKeyUp)= 0
  16.     charsImprimibles(vbKeyDown)= 0
  17.     charsImprimibles(vbKeyLeft)= 1      ' prueba, verás que cursor a derecha exige una pulsación por cada desplazamiento.
  18.     charsImprimibles(vbKeyRight)= 0
  19.     ' etc...
  20. End Sub
  21.  
  22.  
  23. Private Sub Text1_KeyDown(KeyCode As Integer)
  24.    If (charsImprimibles(KeyCode ) > 0) Then
  25.        If (CodeIsDown = False) Then
  26.            CodeIsDown = True
  27.        Else
  28.            KeyCode = 0
  29.        End If
  30.    End If
  31.  
  32.    Debug.Print KeyCode
  33. End Sub
  34.  
  35. Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
  36.    KeyIsDown = False  ' sea o no true.
  37.    CodeIsDown = False
  38.  
  39. End Sub
  40.  


p.d: Nota que si el textbox no es multiline, el salto de línea se ignora, pero no si el textbox es multiline.
603  Seguridad Informática / Seguridad / Re: ¿Como se si mi pc tiene un virus? en: 10 Noviembre 2021, 16:00 pm
No hay forma fidedigna al 100% de saber si tienes un virus.
En general una caída en el rendimiento dle equipo puede elevarse en tales sospechas, pero no es la única cuasa de la caída del rendimiento de un equipo.
Incluso 'viendo' un virus operar podría resultar solamente en un programa de broma, ya que la idea de un virus es (o debe ser) pasar desapercibido, razón por la cual ni siquiera debieran elevar el consumo de los recursos del sistema d eforma significativa que llame la atención... esto era más propio en los 90.

Primero asegúrate que tu disco duro no está dañado, luego que no está lleno (o casi). Cuando apenas queda espacio el sistema se ralentiza, porque encontrar hueco libre para escribir ficheros demora excesivo tiempo, lo que se percibe como una caída del rendimiento global.
Pasa lo mismo cuando la memoria tiene también una alta ocupación. Sea porque hay muchos programas corriendo en segundo plano, sea porque tienes poca memoria sea porque un módulo de memoria se ha dañado y al ignorarlo está sucediendo las dos cosas previas.

Aún así, bastan las sospechas... para como mínimo actualizar el antivirus, desconectar la red y pasarlo a todo el equipo a todos los ficheros (hay que mirar las opciones porque suele haber desactivadas ciertas opciones que consumen mucho tiempo, pero que justamente en estos casos es cuando deben activarse).

También resulta conveniente hacer un chequeo del disco profundo, para revisar el espacio libre... esto también es necesario cuando el disco 'aparenta' estar dañado... si hay un sector dañado, conviene que el sistema rescate el contenido que exista ahí (en lo posible) y lo reubique en otra parte, luego marque el sector como dañado y no lo utilice más.
Algunos virus se 'ocultan' en el espacio libre y luego lo marcan como dañado para que el S.O. no lo utilice. Esta acción (chequeo de disco profundo) ignora la lista de sectores dañados y revisa al completo el disco duro para crear la lista desde cero (sin datos preconcebidos).
Si se hace un chequeo de disco, es buena idea al término 'defragmentar' el disco, esto hace (en lo posible), que el espacio libre quede contiguo y por tanto se amás fácil encontrarlo y también que las diferentes partes de un ficheor (en lo posible), queden contiguas, con lo que la aguja (caso de unidades mecánicas, en unidades SSD (electrónicas al 100%), esto no es necesario), no tiene que buscar otra posición y por tanto acelerar o frenar la rotación dle disco, etc...

Si a pesar de todo se ve que algo no termina de ir bien, como te han dicho vuelve a un punto de restauración anterior... esto no es formatear, esto es eliminar (de forma automática para el usaurio) ciertos cambios acontecidos hasta la fecha actual desde la última vez que se realizó un punto de restauración (el sistema puede hacerlo automáticamente si el servicio no está desactivado cuando se hagan actualizaciones importantes)... busca en tu pc 'volver a un punto de restauración anterior', si no sabes encontrarlo, busca en google añadiendo además el nombre de tu sistema operativo, para ir certero a la ubicación donde se localiza según lo que tienes... habrá miles o millones de entradas en google al respecto (sí, incluso en español).

Y si todo eso falla y se descartó daños del hardware, lo que restasería formatear, pero esta debería ser la última opción cuando quede claro que en efecto lo que hay es un virus (o varios) y que no consigues eliminarlos.... En ese caso el ofrmateo debe ser a bajo nivel (al igual que el chequeo del disco, aquí se revisan en este caso también por sectores dañados para marcarlos como no utilizables).

Cada cosa por parte... puede localizarlo en google de forma detallada, no eres ni el primeor ni el útimo que preguntará por tales temas, luego es asumible que existan muchas entradas tratando casi cualquier tema en detalle y con imagenes, paso a paso en muchas ocasiones... y para los más torpes de entender el PC, seguramente encuentren lo mismo en youtube... aunque en vez de leer algo en 5 minutos, te ocupe 45 en un vídeo alargado...
604  Programación / .NET (C#, VB.NET, ASP) / Re: Condicionar Textbox a un rango determinado ?? en: 9 Noviembre 2021, 22:11 pm
Tu pregunta es demasiado elemental (y la redacción contradictoria).
Simplemente cambia el operador de comparación de un 'mayor que' a un 'menor que' o quizás a un 'menor o igual que' (según sea el caso práctico).

Es tan elemental, que no queda más remedio que derivarte a la lectura. Cabe preguntarse si entiendes el código que has puesto...
605  Foros Generales / Noticias / Ciberataque a los servidores de Mediamarkt en varios países europeos. en: 9 Noviembre 2021, 16:59 pm
Un ataque de ransomware ha afectado a los servidores de MediaMarkt en varios países del centro y el norte de Europa, según han informado fuentes de la multinacional alemana de productos electrónicos.
El ataque se ha producido a primera hora de esta mañana (día 8) y tiene consecuencias en tiendas de Holanda, Bélgica y Alemania, aunque aún no hay información oficial sobre el alcance de la intrusión.
...
El ataque llega en un momento delicado para la compañía alemana, apenas a dos semanas del inicio de la campaña del Black Friday y a un mes vista de la de Navidad. Es el período del año en el que se concentra la mayor parte de las ventas anuales de productos electrónicos.

El resto de la noticia puede leerse en:
https://www.lavanguardia.com/tecnologia/20211108/7847465/ciberataque-mediamarkt.html
606  Comunicaciones / Dispositivos Móviles (PDA's, Smartphones, Tablets) / Re: Subo el rango de precio, presupuesto 250€ como máximo y pido: en: 7 Noviembre 2021, 22:38 pm
Para qué comprarse un tf. de 250 euros cuando no sobra el dinero... no es acaso mejor comprar uno por 150 euros y te ahorras 100, que con eso ya tienes 2/3 para el próximo ?. Pongamos que dentro de dos meses se te cae y se rompe y no fuera reparable (y la garantía no cubre accidentes de tu parte, solo defectos de fábrica)... volverías a gastarte otros 250 euros?.

Con 150 euros estás en una gama media que en realidad satisface todas las necesidades elementales. No creo que tu tengas más necesidades (de prestaciones) que el resto... A partir de cierta cantidad las prestaciones por encima que pagas, salen enormemente más caras, tanto que no merece la pena pagar el precio (salvo que el dinero te caiga por las orejas, de tanto que tienes, que no creo que sea el caso).

Sé responsable con tu dinero, compra lo que necesites, pero sin derrocharlo. Uno por 150 euros cubre las necesidades del 99% de la población, el resto es por capricho o verdadera necesidad.
607  Informática / Software / Re: Bios en: 7 Noviembre 2021, 22:27 pm
Lo primero: La BIOS, no es para manazas... si no se sabe lo que se está ahciendo, lo mejor es no hacer nada, no tocarlo.

Puede que solo lo hayas desconfigurado (probablemente), pero también puedes dañar el hardware (por ejemplo estableciendo valores de voltaje o frecuencia por encima de lo que el propio hardware soporta, en esos casos a falta de conocimiento a lo sumo se elige 'automatico').

Y segundo, pon fotos que puedes hacer con el móvil y detalla dode y qué has cambiado. Para qué va uno a perder tiempo buscando y descargando el manual de la placa base de ese portátil, si al final precisas detallar lo que hayas hecho igualmente?.

Sin esas aclaraciones (imágenes y explicaciones), no tiene sentido indicarte nada más que... vayas a la última pestaña del BIOS y pulses la opción que pone "restablecer a valores de fábrica", y aceptar y rezar porque solo fuera una desconfiguración por tu parte.
608  Programación / Programación Visual Basic / Re: Evitar repetición de la pulsación de una tecla en: 7 Noviembre 2021, 21:33 pm
No existe un modo desde vb6, para evitarlo directamente.
Y no esoty seguro que puedas evitarlo con código (por ejemplo añadiendo varias variables buleanas en el keydown activarla a true si era false y evitar el cambio en el evento change, luego ponerlo en false en el evento Up, etc... creo que es complcado si no imposible sin el uso de un timer (por ejemplo).

Recuerda que la sucesión de eventos es: (Down change)+ up
Es decir si hay repetición Down y change se alternan y cuando se suelte ocurre un Up.
El problema de todo esto es que el evento Change no contiene parámetros que puedan controlarse para esto.

Es más sencillo, que filtres el contenido en el evento validate.
Si no te vale, la mejor opción es escribir tu propio control 'textbox'. En él tu pudes crear un evento 'change' que reciba como parámetro la tecla recibida y otro que señale si ya ha existido un evento down, antes de otro Up... con lo que al usar dicho control, sería extremadamente sencillo evitarlo.

En cualquier caso, es responsabilidad del usuario establecer el 'Repeat Delay' y en 'Repeat Rate' en las propiedades del teclado. No es tu problema que el usuario se quede 'pegado' a la tecla. Si es un usuario con capacidades mermadas, seguramente usará (o debiera usar) 'opciones de accesibilidad' adicionales que satisfagan sus necesidades y qu él habrá elegido o elegirá según sus necesidades.

...todavía a través de la API devicecaps, podrías leer y modificar dichos valores, pero siempre está el volver a restablecerlo a  sus valores previos... y no es buena idea, si el programa se cuelga, no podrás establecer los valores previos, si otra aplicación  (imagina otras 20) haciendo lo mismo, si no se 'resetean' en el mismo orden en que fueron tomados, se restablecerá un valor errado. En general las opciones dle usuairo, no hay que tocarlas, es el cosa dle usuario y no hay nada más irritante que una aplicación toque los valores que has establecido (entiendase resolución, tamaño de fuente, orientación de la pantalla (esta todavía vale si está a pantalla completa, porque se restablece al salir y mientras no hay otras aplicaciones que afecten), y los valores del ratón, teclado, cursor, idioma, etc...

Si insistes en necesitar dicha funcionalidad, recuerda lo que te he mencionado más arriba, podrás lograrlo a base de escribir tu propio control textbox, donde tu controles todo. Ahora, ¿merece el esfuerzo a dedicar escribir un control de usuario solo para poder disponer de esa funcionalidad?. Es mucho trabajo solo para eso (te obliga a implementar mucha funcionalidad ya existente en el textbox, que no incorpora el usercontrol), ...pero si lo haces incorpora otras funcionalidades útiles, todo junto al menos justifican abordarlo...
609  Programación / Desarrollo Web / Re: [Pregunta]: ¿Cómo hago para saber si un parámetro viene de una variable o una constante? en: 7 Noviembre 2021, 16:39 pm
La definición de una función no contempla constantes.
El usuario cuando no quiere que el contenido de un dato sea modificado dentro de la función, es reponsable de mandar una copia, lo que técnicamente es lo mismo que una constante, pero de forma transparente a la función. Porque dentro de la función no se sabe el origen de la misma.

De hecho uno podría hacer todas estas cosas:
Código:
entero = declaracion de funcion Y(entero valor)
   valor +=2
   devolver valor modulo 5
fin funcion

...
...
...

constante de entero x = 25
entero z

z= funcion Y(25)   // técnicamente se está recibiendo una constante inicializada durante la llamada.
...
fin funcion

z= x
z = funcion Y(z)  // es una constante si se pasa como valor, aunque al final el retorno se le entrega a 'z' y acaba así cambiando de valor.
...
fin funcion

z= 25
z= funcion Y(z +0)  //técnicamente se está recibiendo una constante, resultante de la suma de z + un valor constante... que se guardará en la pila, y que en origen tampoco se podrá rescatar.
...
fin funcion

z= funcion Y(x +3)  // igual que anterior, aunque es la suma de dos constantes.
...
fin funcion

z= 7
z= funcion Y(x + z + 3)   // igual que anterior... cuando procede de una expresión es lo mismo que si fuera una constante.
...
fin funcion

Como puedes entender, indistintamente de que se pase en ocasiones por valor o por referencia, una constante, no es meramente aquello que está declarado como constante, puede asumirse que es constante, si el cambio de dicha variable dentro de la función, a la vuelta de la función no afecta a la de origen. Una función no necesita saber que pasa fuera de ella, solo precisa saber que se hace dentro, para eso tiene el código preciso de lo que debe hacer. Si resultara vital saber si una variable es o no una constante (no se me ocurre a bote pronto, ningún caso donde esto deba ser necesario, ni siquiera útil), podría añadirse un parámetro adicional que así lo detalle, pero no hay garantias  de que el usuario tenga que 'decir' la verdad...
610  Foros Generales / Dudas Generales / Re: Diferencia de diccionarios (wordlists) en: 6 Noviembre 2021, 15:47 pm
Me edito.... al relerte de nuevo, veo que quieres justo lo contrario a lo que me pareció entender al principio... Tu quieres crear un fichero con las entradas únicas que constan en ambos ficheros, es decir quieres unirlos y por tanto eliminar entradas repetidas...

Dejo al final del mensaje...lo que antes era el contenido del mismo para posibles interesados
Aunque, todavía si al final se unen A2 + B2 + C en un único fichero se consigue el resultado deseado... No obstante puede hacerse más óptimo si se hace un diseño específico.

Lo mejor para eliminar entradas repetidas es usar una tabla hash.
Código:
funcion UnirFilesSinRepes(  RutaA, RutaB)
    abrir ficheros A(rutaA), B(rutaB)
    crear y abrir fichero temporal C
    
    THash = crear nueva tabla hash
 
    AddFileToTHash(tHash, fichero A)
    AddFileToTHash(tHash, fichero B)

    por cada item en THash
        copiar item al fichero C
    siguiente
    vaciar y eliminar tHash

    cerrar fichero C (y quizás renombrar...)
    cerrar y (seguramente) eliminar A, B
fin funcion

funccion AddFileToTHash(tHash, fichero )
    Por cada linea en fichero
        h = Hashing(linea)
        tHash.Add(h, Linea)
        // habitualmente una tabla hash no admite repes, pero si no fuera el caso...
        //si tHash.Contiene(h) = FALSE
        //   tHash.add(h, linea)
        //fin si
    siguiente
fin funcion  



======================================================

======================================================
Quedaría mejor en un spolier, pero el foro no dispone de ellos...

Esta solución es para tener en un fichero las entradas que constan en los dos ficheros  y dejar en cada fichero solo las entradas que no contiene el otro.

Tienes dos opciones, dependiendo de si al menos uno de los dos ficheros está ordenado o ninguno.

Básicamente como quieres crea 1 fichero con la diferencia y los originales (A1 y B1) quedarán también modificados, necesitarás crear 3 ficheros (A2,B2,C)...

- Si alguno de los fichero no está ordenado... leer en memoria y ordenar, luego guardar a fichero
- Ahora que los dos ficheros están ordenados:
Código:
funcion DiferenciaFiles(  RutaA, RutaB)
    abrir ficheros A1(rutaA), B1(rutaB)
    crear y abrir ficheros temporales A2, B2, C

    Por cada linea1 en fichero A1
        Por cada linea2 en fichero B1
            Si (linea2 > linea1)
                copiar linea1 al fichero A2 y salir dle bucle
            pero Si (linea2 = linea1)
                copiar linea2 al fichero C y salir del bucle.
            si no // linea2 < linea1
                copiar linea2 al fichero B2
            fin si
        siguiente
    siguiente

    cerrar y eliminar A1, B1
    renombrar A2 como A1, y B2 como B1.
fin funcion
 

- Opcionalmente si ninguno (o solo uno) de los dos ficheros está ordenado.
  Se puede crear una tabla hash, y meter en ella las entradas de un fichero...
Código:
funcion DiferenciaFiles(  RutaA, RutaB)
    abrir ficheros A1(rutaA), B1(rutaB)
    crear y abrir ficheros temporales  A2, B2, C

    THash = llenar desde fichero A1
    Por cada linea1 en fichero B1
        h = Hashing(linea1)
        si tHash.Contiene(h)
             copiar linea1 al fichero C y THash.Eliminar(h)
        si no
             copiar linea1 al fichero B2
        fin si
    siguiente
    // como se han ido eliminando las entradas que están contenidas también en B1,
    // al final solo quedan entradas únicas en la tabla hash.
    por cada item en THash
        copiar item al fichero A2
    siguiente

    cerrar y eliminar A1, B1
    renombrar A2 como A1, y B2 como B1.

NOTA: Se supone que siendo un diccionario, en un mismo fichero no habrá entradas repetidas... si fuera el caso, habria que tenerlo en cuenta para modificar el pseudocódigo ofrecido...
======================================================

======================================================
Páginas: 1 ... 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 [61] 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 ... 431
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines