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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Mensajes
Páginas: 1 ... 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 [284] 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 ... 432
2831  Foros Generales / Foro Libre / Re: Atentado en Alemania: hay 14 heridos por un ataque con cuchillo en un bus de Lüb en: 20 Julio 2018, 19:08 pm
Yo vi la noticia y venia acompañada de esta foto que no se lo que significa...
Ah... esto es el típico plano que le encargan a un arquitecto, para que señale sobre una ciudad la 'zona azul' (peor con tinta negra), el cual luego de horas sin ninguna idea se queda dormido y derrama el tientero por toda la ciudad y cuando el alcalde regresa por "la edición del mapa de la nueva zona azul", queda encantado de que sea tan extensa... y el arquitecto, calla antes que decir que es un manchurrón porque se quedó dormido...

...en resumen, la imagen, como lo antedicho, son sueños delirantes de mentes perturbadas.
2832  Foros Generales / Noticias / Re: Mark Zuckerberg rompe el silencio y termina defendiendo a los que niegan el ... en: 20 Julio 2018, 14:31 pm
El enlace no es correcto...
2833  Foros Generales / Noticias / Re: Encuentra los manuales de millones de productos en esta impresionante web en: 20 Julio 2018, 14:22 pm
Me la agencio...

Siempre he pensado que un sitio así sería fantástico, pero al mismo tiempo que sería prácticamente imposible de existir, porque quién iba a reunir tantos manuales y porqué... (si no hay un beneficio económico) y cómo (si no fuer apor mediación de los usuarios que los escanearan y subieran).

En realidad las leyes de los países debieran exigir a los fabricantes que los manuales deberían estar diponibles durante décadas. en el pasado esto era un problema por el papel, pero actualmente con Internet, esto sería much omás fácil... incluso alguna vez he pensado que el mismo gobierno, debería guardar copia del manual de cada producto,  mercadeado en el país... asi aunque el propio fabricante fuera absorbdo, traspasado, heredado, quebrado... seguirían existiendo, de esta forma además, en cada páis, retendría los de su propio idioma...
2834  Foros Generales / Noticias / Re: Facebook no elimina vídeos con violencia infantil de la plataforma porque .... en: 19 Julio 2018, 16:40 pm
Guau... Esto es lo mismo que decir que:
 los TROLLS están protegidos... en Facebook...

...quién más incendiario que un troll.
2835  Foros Generales / Foro Libre / Re: 8 de cada 10 adultos españoles adictos al móvil en: 17 Julio 2018, 15:51 pm
Según la DGT, en el 90% de los casos de atropello en que el responsable es el peatón, este iba mirando el móvil, es decir;la.mitad.
Falta saber en cuantos de los casos de atropello en el que el responsable es el conductor, éste también iba mirando el móvil. Porque a mí almenos en varias ocasiones casi me atropellan en un paso de peatones conductores que estaban pendientes del móvil.
Exactamente...

Si alguien es atropellado, creo que el fallo está en el que atropella... el peatón tiene el fallo cuando atropella la típica farola o poste de la luz con la que tropieza. Es resto de atropellos es culpa de los conductores, pero tenemos unas leyes muy raras que insisten en hechar la culpa al peatón.
2 peatones a veces se chocan entre sí, pero probablemente menos de 1 por millón acaba en muerte y probablemente menos de 1 por cada 10 mil acabe en algún hueso roto...
A un conductor se le debe exigir insistentemente, el control pelno de su vehículo, especialmente de la velocidad. Los atropellos finalmente suceden al margen de la distracción, porque el tiempo de reacción por parte del conductor queda mermado (el del peatón es nulo, no puede hacer gran cosa en un segundo o menos), y queda mermado por culpa de la velocidad excesiva a la que se recorren las calles.... siempre con prisas, y con una conciencia ridículamente posesiva de ser dueños del asfalto (y el peatón de la acera)...

Poco se puede remediar si se espera que sea el peatón el que in-extremis solvente el problema, cuando el peligro es el vehículo al tándem de un conductor que olvida que porta un 'arma mortal' si se relaja al volante...
2836  Foros Generales / Noticias / Re: ¿Pueden las contraseñas gráficas mantenernos seguros en línea? en: 17 Julio 2018, 03:45 am
Cada ciertto tiempo vemos a un 'lumbreras' iluminarnos con su 'luz'... ceporro más, ceporro menos.

Sumanos otra estupidez en esta noticia... y el tío seguro que estará teniendo un orgasmo de satisfacción.

Pretende remplazar simbolos afanuméricos, por símbolos gráficos... es lo mismo. Remplazar 15 iconos cuyo contenido gráfico son letras, por otros 15 iconos cuyo contenido gráfico es más recargado, no cambia nada, al final cada icono tendrá asociado un número de orden (que será lo que finalmente compone la contraseña), lo cual no es distinto del valor posicional del carácter dentro del ASCII... Además en ASCII dispone de 256 bytes distintos, mal que muchos sitios los restringen finalmente a una cantidad limitada...

Lo único que cambia son los 'colorines' del gráfico... Y ni siquiera se puede admitir que eso fuera más útil para recordar contraseñas...

Yo ya lo he comentado varias veces, el problema no son las contraseñas, incluso aunque algunas sean ridículamente sencillas... el problema es que el alias de registro es conocido y por tanto ya se tiene la mitad, la otra mitad es la contraseña.

Es como si te dejan un caja fuerte de un banco en tu casa, y tu solo tienes que dedicarte a poner combinaciones, hasta lograr entrar... demasiado fácil a pesar de las posibilidades combinacionales.

En sencillo de explicar y de entender...
Si yo quiero acceder a la cuenta (pongamos de este foro), de un usuario concreto, ya se la mitad... su alias... porque lo vemos a diario, sabemos que existe... luego solo necesito dar con la contraseña.

En cambio si cuando un usuario se registra se le piden 3 cosas (y no solo 2)...
1 - El alias, que será el que aparezca como usuario, cuando publique mensajes y que no valdrá para nada más...
2 - Un segundo alias exclusivamente para el login, y que no aparece a la vista de nadie, en ninguna parte.
3 - La consabida y aburrida contraseña.

Ahora si alguien quiere intentar entrar a la cuenta de Randomize (aprovechando que no nos oye), no será tan sencillo como poner en alias "Randomize" y ponerse a probar contraseñas... y si hay suerte entramos a su cuenta...

Simplemente la propbabilidad de entrar a la cuenta de Randomize, no será distinto de intentar entrar a la cuenta de cualquier otro... es más ni Cristo, sabe a qué cuenta estará intentando entrar, primero porque no sabe cual es el alias de login del usuario al que pretenda entrar y segundo, porque quizás fijo que el alias que ponga ni siquiera exista así que aunque alguien tuviera la tonticontraseña de "querty" ó "123456", todavía le faltaría la otra mitad, el alias usado para dicho login... visto que existe un alias distinto, que se usa única y exclusivamente para mostrarse (en el foro, siendo éste el ejemplo) y que no tiene nada que ver con el login... los sitios deberían comprobar y exigir (eso sí), que ningún gilip0llas, use el mismo alias para ambos casos (y al revisarlo, sin pelos en la lengua llamarle estúpido en su cara... y de paso publicar el caso en sus redes sociales, para que sus conocidos se rían, y tal vez haya esperanza de que espabile  :laugh: :laugh: :laugh: :laugh:).

...pero que le vamos a hacer, los que dirigen las grandes empresas, son expertos en exprimir a sus trabajadores para sacar billetes, no son expertos en nada más, mucho menos en seguridad, ni en sentido común...
2837  Programación / .NET (C#, VB.NET, ASP) / Re: [VB.NET(FrameWork)] Matriz (arrays) o Colecciones? en: 15 Julio 2018, 16:55 pm
De entrada, decirte que éste es el foro de vb6, el de NEt está mas arriba... pero bueno ya lo moverá algún moderador si se percata de ello.

También señalarte que con las etiquetas Geshi, has hecho la mitad, le has puesto el 'code', pero te falta asignarle al VBNET, desplegando el combo, s epuede buscar. No se indica el lenguaje específico, cuando no sigue ningún lenguaje esecífico, pero si es así, es preferible usarlo, porque se colorea basado en su sintaxis y resulta más cómodo de leer...


Iba a ir al asunto que trata, pero visto lo visto, procede primero una larga crítica sobre aspectos que conviene usar correctamente...

Por ejemplo la forma de nombrar variables y métodos, más que nada para enseñarte a hacerlo correctamente....

- Una varible, propiedad, debe llevar por nombre SIEMPRE lo que en la gramática del español se llama NOMBRE COMUN.... porque son eso, nombres... Valor, Temperatura, Edad, Año, etc... En cambio si son constantes (valores preconfigurados, conviene además que lleven un adjetivo. Ejemplo: ColorRojo= hex0000FF ColorAzul= HexFF0000)
- Los métodos, en cambio son verbos... Imprimir(esto)... Ordenar(lalista)... Añadir(UnItem)... Vaciar(), etc...
- Aunque el lenguaje lo admita, no uses las barras bajas para dar nombres a tus variables, en general se deben dejar para las constantes y sobretodo son usados por los eventos de objetos instanciados...
...que el propio lenguaje crea así. Como una medida de evitar en lo posible la coincidencia con métodos que los usuarios pudieran tener... Aunque es harto difícil que un método que uno cree venga a llamarse igual que la suma de un "nombre instancia de objeto" + "nombre de evento del objeto instanciado", no es infalible.... siguiendo la norma de "nombre instancia de  objeto" + "_" + "nombre evento", se puede garantizar la ausencia de duplicidad de nombres de métodos y con ello la conflictividad, pero solo si a cambio el propio programador se aplica su parte no usando barras bajas en los nombres.

Usar nombre, no usar verbo ni barra baja, en nombres de variables, propiedades, etc...
Citar
Dim ingrese_butacas As Byte
Dim CantidadButacas as Byte ' o también CantidadButacasReservadas

Usar verbo, no nombre ni barra baja en nombres de métodos y funciones.
Citar
Sub Ingreso_butacas(...)
Sub IngresarButacas(...)

Luego está línea es muy deficiente:
Código
  1. Ingreso_butacas("Ingrese numero de butacas a reservar: ", ingrese_butacas)
Aparte del nombre del método ya comentado y de la variable pasada en el segundo parámetro... resulta que no precisa ser pasado ningún parámetro.
El primero porque si el método va a recibir siempre la misma cadena de texto, ese parámetro (el texto), puede yacer en el propio método, no perdiendo tiempo en pasarlo desde fuera, además se aísla más claramente el método y si a futuro hay que cambiar el texto, basta buscar la función y cambiar el texto ahí... ahora si decides cambiar el texto y el método es llamado desde 20 sitios, tendrías que cambiarlo en los 20 sitios).
El segundo parámetro también sobra... a la entrada siempre es 0 y es usado para devolución (por referencia), y como es un método y por tanto no devuelve nada, lo razonable es que se convierta en una función y devuelva dicho valor...

Luego esa línea y el propio método serán cambiados mucho mejor así:
Código
  1. CantidadButacas = IngresarButacas()
  2.  
  3. private function IngresarButacas() as byte
  4.    dim msj as string = "Ingrese numero de butacas a reservar: "
  5.    Dim cantidad as byte  ' ingreso
  6.  
  7.    ' ...
  8.    ' ....
  9.  
  10.   Devolver cantidad
  11. End function

La siguiente crítica es que siempre que se solicita a un usuario un valor, un algo en general, debe dársele la oportunidad de cambiar de opinión o corregir/confirmar... imagina que quisera poner 4, pero por error hubiera tecleado 44 (a veces la pulsación de teclas tienen un tiempo de repetición inesperado por el usuario, y sin darse cuenta su pulsación genera dos pulsaciones.... que le exigen por ejemplo tener que introducir 44 nombres, DNIs, (que ni siquiera tiene, ni sabe), etc... sería inaceptable... imagina si introduje 4444...
En tu caso, como limitas a 4 el valor máximo, por ahí corriges cierta parte, pero todavía dejas al aire si pone 0...

Con esas ideas en mente, rediseñamos, la función para ser más coherente y certera con la propia realidad cotidiana.

Código
  1. private function IngresarButacas() as byte
  2.    dim msj1 as string, msj2 as string  
  3.    Dim cantidad as byte  ' ingreso
  4.    Dim Confirmacion as boolean
  5.  
  6.    msj1 = "Ingrese numero de butacas a reservar (máximo 4, 0 para abortar) "  
  7.    msj2 = "Confirme si está de acuerdo con el valor ingresado (0=Cambiar, 1=Conforme)" ' el valor se ve en la consla justo en la línea previa
  8.    Do
  9.        Do
  10.            Console.WriteLine(msj1)
  11.            cantidad = Console.ReadLine()
  12.        Loop While (cantidad > 4)
  13.        Console.WriteLine(msj1)
  14.        Confirmacion = (Console.ReadLine()  =  1)
  15.    Loop while Confirmacion=false
  16.  
  17.    Return Cantidad
  18. End function

A la devolución de la función debes verificar si el valor devuelto es 0 (Abortar), en cuyo caso se sale de la función y no se hace nada más.
Si un valor 0 no es admisible, en el bucle dentro de la función debe condicionarse a repetirse "While ((Cantidad=0) or ( Cantidad>4)) "   (tambien "Until ((cantidad>=1) and (Cantidad<=4)) " )

Lo siguiente es que si se debe obtener los DNI, se aproveche la misma función para solicitarlo...
Naturalmente entonces ahora procede cambiar el nombre de la función para que qrefleje mejor lo que hace: IngresarDatos o mejor aún ReservarEntradas

Otro punto a resolver es que si se aportan más de un DNI, no hay ningún sustrato para almacenarlos, es decir el nuevo valor entrado sobrescribe el valor previo... Si la cantidad máxima de reserva es 4, procede declarar un array de 4 elementos a nivel del módulo (es un valor pequeño, no hay problema en ocupar algo más de espacio, si a cambio nos resuelve cuanlquier número entre 1 y 4 ).

Código
  1. private dim Identificaciones(0 to 3) as uint32
  2.  
  3. private function IngresarDatos() as byte
  4.    dim msj1 as string, msj2 as string, msj3 as string  
  5.    Dim cantidad as byte  ' ingreso
  6.    Dim Confirmacion as boolean
  7.    dim i as byte, j as byte, k as byte  
  8.  
  9.    msj1 = "Ingrese numero de butacas a reservar (máximo 4, 0 para abortar) "  
  10.    msj2 = "Confirme si está de acuerdo con el valor ingresado (0=Cambiar, 1=Conforme)"
  11.    msj3 = "Ingrese DNI persona  {0}  (un valor positivo mayor que 0)"
  12.  
  13.    ' 1º Ingresar cantidad de butacas...
  14.    Do
  15.        Do
  16.            Console.WriteLine(msj1)
  17.            cantidad = Console.ReadLine()
  18.        Loop While (cantidad > 4)
  19.        If Cantidad = 0 ) then exit function ' ABORTAR....
  20.  
  21.        Console.WriteLine(msj2)
  22.        Confirmacion = (Console.ReadLine()  =  1)
  23.    Loop while (Confirmacion=false)
  24.  
  25.    ' 2º Ingresar DNI
  26.    for i= 0 to cantidad-1
  27.        do
  28.            do
  29.                Console.WriteLine(msj3, i)
  30.                k = Console.ReadLine()  '
  31.            loop while  (k<1)  ' se exige que sea positivo y razonablemente mayor que 0
  32.  
  33.            ' Verificamos que no esté repetido (comprobando con los valores anteriores ya entrados
  34.            Confirmacion = TRUE
  35.            for j= 0 to i-1
  36.                if (k = Identificaciones(j) ) then
  37.                    Confirmacion = FALSE
  38.                    exit for
  39.                end if
  40.            next            
  41.        loop While (Confirmacion=False) ' se vuelve a preguntar mientras se repita el valor entrado...
  42.  
  43.        Identificaciones(i) = k
  44.    next
  45.  
  46.    Return Cantidad
  47. End function


Respecto de la segunda parte, declaras como se reparte el teatro, pero no señalas que pide el problema...


Y en cuanto a la última cuestión...
Cuando algo es lineal y finito suele recurrirse a un array.
Si las eliminaciones e inserciones serán contínuas, redimensionar un array constantemente no es admisible a tales casos se suele usar listas enlazadas, donde las inserciones y eliminaciones tienen un coste fijo y admisible.
Si las búsquedas priman sobre el resto, debe considerarse que métodos se disponen para proveer solución rápida, para textos y sobretodos cuando son en cantidad enorme, una tabla hash, es iremplazable, el coste de búsqueda es unitario al de acceso aleatorio en un array + el tiempo de hashear el texto a buscar.
Nuevamente si la cantidad es pequeña, un array puede valer, pero redimensionar 1 millón de elemtnos cada vez que se añade o elimina no es práctica... para cantidad pequeñas vale.
Una técnica con arrays es declarar un tamaño mínimoy cuando se alcanza duplicarlo, pero eaunque es válido para añadidos, noes igualmente válido si hay eliminaciones.

Cuando los datos a almacenar son algo más complejos que un simple datos suele recurrirse a una simple estructura que mantenga los datos, en tu caso del ejemplo dado es lo más apropiado.
Código
  1. private structure DatosButaca
  2.    DNI as uint32
  3.    Butaca as short 'si están numeradas del 1 al x vale un número, si tiene fila y asiento, lo siguiente
  4.    ' Usa butaca o esto de aquí abajo, no ambas cosas
  5.    Fila as byte
  6.    Asiento as Byte
  7. end structure
  8.  
  9. Bin CantidadReservas as byte
  10. Dim Entradas(0 to 3) as DatosButaca  ' aunque se declaren 0 a 3, solo se ocupan la cantidad que señala 'CantidadReservas

Si los datos requieren cierta manipulación, la propia estructura puede contener métodos para adecuar los datos...

Cuando los datos van a precisar ciertos métodos genéricos (como ordenar), puede recurrirse a colecciones genéricas o específicas que reúnan los cometidos que precisamos... no puede darse una indicación precisa, porque cada caso debe tratarse y considerarse individualmente.

Si los datos serán bastante complejos y los métodos de las colecciones nos resultan inútiles (no los vamos a usar), o bien los queremos usar, pero no se adecúan al modo en que precisamos, toca crearse una clase que albergue el tipo de datos específico y dotarle de métodos propios, incluso una clase que sea una colección y que almacene tipos primarios (array), estructuras, clases... e incluso si una colección se aproxima a lo que queremos hacer si la colección deja extender métodos, podríamos crear tales métodos y para el resto (inserciones, eliminaciones, búsquedas, cuenta, iterar) utilizar los métodos extendidos (ésto último suele ser a menudo más rápido que construir una colección propia desde cero...

El punto d epartida siempre ha de ser el array, y si no resulta suficiente ver si un array de estructuras, etc...
En fin, no puede darse una regla genérica, solo aproximaciones, orientaciones, pero cada caso debe estudiarse según sus propias circunstancias... cantidades que puede albergar, concurrencia de acceso a ítems, si prolifran las búsquedas, las inserciones, las eliminaciones... el tipo de datos/datos almacenados y qué se va a hacer con tales datos... aunque las colecciones suelen compartir métodos comunes, cada cual tiene sentido explícito para ciertas cosas  y otras para otros (si no para qué hacer distintas implementaciones)...

Para saber sobre cada cual de las colecciones, lo mejor es visitar la página de Mocosoft (MSDN)... y leer, que para eso está... carece de sentido hacer un copy-paste de allí, ni tampoco tiene sentido que uno tenga que hacer un resumen de cada colección... el trabajo de aprendizaje exige leer por tu cuenta y no que te den todo mascado de 'segunda mano'...

Si aclaras que te reclama el problema en la segunda parte, miro de hecharte un pequeño cable...
2838  Programación / Programación General / Re: Duda sobre expresiones condicionales. en: 14 Julio 2018, 23:04 pm
A veces llega algún usuario, al que resulta extremadamente difícil de ayudar, por varias razones...

- La primera es porque tiene conocimientos excesivamente sesgados (de algunas cosas parece tener cierto conocimiento y de otras cosas simples, lagunas completas).
- Quieren que las cosas se ajusten a su modo de hacer, cuando lo inevitable que es que para algo existente sea 'el nuevo' el que deba adaptarse a lo que hay.
- Insisten en lo que creen entender, sin meditar las respuestas que se les dan... pasan por encima (si es que las leen), como aquel que pisa una alfombra que está ahí para ser pisada.
- Muchas más razones, pero no quiero extenderme, ni tampoco pretendo que nadie se sienta ofendido...

El caso es que tú encajas en este tipo de usuarios, donde la dificultad, no radica en lo que se pide (que es relativamente fácil) si no en hacer entender lo que se dice...
Es como dar las respuestas correctas a alguien que luego tomará tu texto, lo traducirá al chino, luego al hebreo, luego al latín luego al ruso, luego al inglés, luego al estonio, luego al portugués y al final de nuevo al español, para luego intentar digerirlo... se perderá todo el sentido tras tanta traducción, siempre sucede de un idioma a otro, luego cuantas más atraviese, más distancia existirá entre el original y la traducción final, de hecho puede que al final, no tenga nada que ver con el original y hasta haya dificultades para saber qué tema trataba.

Intentaré por última vez, arrojar un poco de luz en tu oscuridad y me conformaré solo con que intentes entenderlo, sin más pretensiones, que luego avances a partir de ahí o sigas en tu luna es cosa tuya...


1 - Los paréntesis también son operadores (no los ignores).
Igual que '+' es para una operación aritmética y 'and' para una operación lógica, un paréntesis aplica una operación de 'prioridad' (orden de ejecución).
Es una lástima que en prácticamente ningún lenguaje se describa así... como un operador de prioridad. Quizás porque todo parte de un cuerpo matemático, en el que se da por sentado que todo el mundo que pretende aprender algo de programación tiene al menos una base matemática mínima... o dicho de otro modo, que no se considera necesario explicarlo porque se da por sobreentendido.

2 - Es bueno aprender (en realidad si uno estudió, recordar, porque es algo que puede olvidarse), el significado de las propiedades (conceptos mtemáticos): distributivas (que reparten), conmutativas, asociativas (que conecta, que lo une...). Explicadode forma matemática puede llegar a entenderse, o puede ser complejo si se le da todo el cuerpo matemático lleno de término que quien lo oye también desconoce...

Una sencilla forma de entenderlo, es que en programación los operadores lógicos cumplen dichas funciones, y particularmente resultan mucho más fácil de entender (el cuerpo matemático, al final solo es entendible por otros matemáticos, a causa de la excesiva jerga verborreica que se emplea sin ton ni son, ni tregua de ningún tipo en las matemáticas (no en todas partes eso sí), en programación hay cierta licencia, gracias a que hay muchos programadores que son autodidactas.
Tampoco se puede caer en 'describo todo con mi propio lenguaje', porque entonces no nos entenderíamos. Habría tantas formas de llamar a algo como personas y eso tampoco puede ser... ambos extremos incurren en ineficacia.

3 - Los paréntesis... tu pelea.
Citar
Citar
Cualquier lenguaje por miserable que sea, admitirá paréntesis para resolver la precedencia de operadores (debe importarte nada que un operador sea 'or', 'and' ó '+', '/', o cualquier otro... un operador es un operador sea del tipo que sea y a tí debe bastarte con saber que como tal cualquier operador tiene un valor de precedencia (prioridad en ser resuelto cuando no tiene paréntesis que lo delimite)

Si es tan simple como dices, entonces bárbaro, pero yo no sabía y antes de hacer la prueba menos.
De hecho había planteado este tema a un programador que conozco y me dijo que la interpretación dependía del lenguaje, que no había una respuesta única. Tú mismo también me preguntaste por mi lenguaje como si fuese relevante.

Para ayudarte a entender mejor los paréntesis, voy a partir de exponer un ejemplo práctico asequible de entender para todo el mundo, y luego desde ahí, hacer una traslación al asunto programático, y espero que entonces (al menos), acabes de otorgarle la importancia que merece... y por lo tanto aplicarlo, en vez de querer matarlo (obviarlo).

Mira de construir tu árbol genealógico (basta con 10-20 nombres, es suficiente para darte la idea): Podrás escribir tu nombre y al lado, el de tus hermanos, y encima el de tus padres... tu padre y tu madre también tendrán (se supone) hermanos, luego procede ponerlos, a su vez también cada uno de ellos tendrán ó tuvieron su padre y madre respectivamente...
No importa cuan detallado sea el árbol genealógico, puedes imaginártelo elaborado con flechitas, o mas prosaico en columna, algo similar a esto:


Pedro Eva
    Juan Rosa
        Fermin Raquel
        Antonio
        Rosa Fernando
        Felipe
    Luis Encarna
        Daniel Sara
            Enrique
            Daniela Fabian
                Rosa
                Joaquin
            Evaristo
    Maria
    Andres Rocio
    Ana Martin
        Luis
        Antonio
        Marta Rafael
            Ines
            Francisco
            Miguel Maria
                Sonia
                Miguel
                Felipe


Como se puede entender de un simple vistazo, bajo cada pareja yacen los hijos que tienen, los 'casados' nuevamente tienen pareja, y si tienen hijos bajo ellos aparece la lista.

Veamos como queda si los ponemos en línea:
Pedro Eva Juan Rosa Fermin Raquel Antonio Rosa Fernando Felipe Luis Encarna Daniel Sara Enrique Daniela Fabian Rosa Joaquin Evaristo Maria Andres Rocio Ana Martin Luis Antonio Marta Rafael Ines Francisco Miguel Maria Sonia Miguel Felipe

Se pueden poner en columna igualmente:

Pedro
Eva
Juan
Rosa
Fermin
Raquel
Antonio
Rosa
Fernando
Felipe
Luis
Encarna
Daniel
Sara
Enrique
Daniela
Fabian
Rosa
Joaquin
Evaristo
Maria
Andres
Rocio
Ana
Martin
Luis
Antonio
Marta
Rafael
Ines
Francisco
Miguel
Maria
Sonia
Miguel
Felipe


¿Eres capaz en esta lista de determinar quienes son los hijos de quién?. Imposible... Incluso basado en la idea de que detrás de un hombre aparece su pareja (y viceversa), no hay ningún indicador de relación, podría ser hermano y hermana o hermana y hermano....
En cambio, fíjate como en el árbol jerárquico, no hay lugar a dudas quien es hijo de quien.
Bueno, esta lista de nombres equivale a 'tus' expresiones, y la lista jeráquica a una expresión expresada con paréntesis... luego vuelvo a esto... ahora otro ejemplo, de naturaleza más cercana a la programación...

Mira el menú de la calculadora (de win2). Este es su menú (te lo pongo en inglés):

(Menu)
    Edit
        Copy
        Paste
    View
        Standard
        Scientific
        -
        Hex
        Decimal
        Octal
        Binary
        -
        Qword
        Dword
        Word
        Byte
        -
        Digit Grouping
    Help
        Help topics
        -
        About Calculator


Nuevamente puede verse con claridad, que ítems están bajo que otros ítems.
nota: Los ítems Qword... aparecen si se seleccionó: binary, Octal ó Hex, si se elige Decimal aparece Grados, Radianes...

Pongámoslo en columna sin indentacion (o en línea da igual):


Menu
Edit
Copy
Paste
View
Standard
Scientific
-
Hex
Decimal
Octal
Binary
-
Qword
Dword
Word
Byte
-
Digit Grouping
Help
Help topics
-
About Calculator



Igualmente cuando se ponen en columna son una lista sin concierto, todos al mismo nivel son hijos de... pero no se oberva ninguna relación más entre ellos, todos del mismo orden.

Se puede mejorar aún el menú jerárquico a base de poner indicadores de inicio y fin... en muchos menús (la mayoría) no se ponen porque al ocupar espacio, aumenta el área visible que ocupan...
...dando algo con sentido que solo inicio, podría ser algo como esto:


Menu
    Edit
        Portapapeles
            Copy
            Paste
        Fin menu
    View
        Modelo
            Standard
            Scientific
        Fin grupo
        Base numérica
            Hex
            Decimal
            Octal
            Binary
        Fin grupo
        Tipos de datos
            Qword
            Dword
            Word
            Byte
        Fin grupo
        Otros
            Digit Grouping
        Fin grupo
    Help
        Ayuda
            Help topics
        fin grupo
        Autoria
            About Calculator
        Fin grupo
Fin menu



Igualmente podemos proceder con el árbol genealógico, encabezando el padre, y debajo indentado los hijos y terminando con el nombre de la madre (precedido por ejemplo por 2 puntos), a modo de: fin grupo - fin menú.
 
Si encabeza un hombre, él es el hijo, y por tanto la mujer que cierra los hijos es su cónyuge, en cambio si la lista encabeza por una mujer, es la mujer la descendiente de la familia, y quien cierra la lista de hijos será el hombre, su cónyuge. Si no tienen hijos, solo aparece el nombre del cónyuge...

...a reconstruir el árbol de esta manera:  


Pedro
    Juan
        Fermin
        :Raquel
        Antonio
        Rosa
        :Fernando
        Felipe
    :Rosa
    Luis
        Daniel
            Enrique
            Daniela
                Rosa
                Joaquin
            :Fabian
            Evaristo
        :Sara
     :Encarna
    Maria
    Andres
    :Rocio
    Ana
        Luis
        Antonio
        Marta
            Ines
            Francisco
            Miguel
                Sonia
                Miguel
                Felipe
            :Maria
        :Rafael
    :Martin
:Eva


Ahora puede parecer un poco más lioso de verlo pero al programarlo se podrá buscar recursivamente, mientras esté un nivel más abajo (a la derecha), es hijo. Mientras se mantiene el nivel se suma, cuando cambia el nivel, si sube se hace otra llamada, como padre el actual, los que se devuelvan serán sus hijos, si baja un nivel, se devuelve la cantidad de hijos -1 (se terminó de contar y el último erá el cónyuge).

Bien, todo esto parece no tener nada que ver con tu problema, pero no es así... pese a quien pese y pese a que muy poca gente lo perciba, las expresiones son árboles jerárquicos... en cambio tus expresiones son solo listas...

Vamos a demostrarlo...

z= A + 3 * 5 - B + W / 5 AND T - 2 + X OR P OR H
Podemos obviar los operadores (nos quedamos con los identificadores y las constantes numéricas)y pongámoslos en columna:

Z
A
3
5
B
W
5
T
2
X
P
H

Como se ve es una lista plana, todos al mismo nivel, todos 'hijos' de un supuesto padre... como tus expresiones.

Añadamos paréntesis.... y veremos que pasa...
Supongamos que esta fuera la exresión:
Z = (A + 3) * ((((5 - B) + W) / 5) AND ((T - 2) + X) OR (P OR H))
Ahora pongámoslo en vertical jerárquico (obviando también los operadores, excepto los paréntesis):


Z (
    A
    3
    )
    (
        (
            (
                (
                5
                B
                )
            W
            )
        5
        )
        (
            (
            T
            2
            )
        X
        )
    (
    P
    H
    )
)



Et voilá, eliminando los operadores, esto es dejando el único que al caso importa, puedes ver que subyace una jerarquía... la apertura de paréntesis y cierre delimitan la propia jerarquía, el orden de ejecución... el últérrimo hijo de la descendencia, es el primero que debe ser resuelto, luego el padre, luego el abuelo, etc...

Espero que ahora veas claramente adonde lleva no usar paréntesis. Su uso cordina, da sentido específico...
Igual que si indentas un hijo en otra parte supone que les estás asignando un padre distinto (hijo de su hermano, o nieto, o tío de su hermano, o abuleo de su hermano y padre dle suyo propio), del mismo modo colocar un paréntesis en sitio equivocado cambia el sentido (y el resultado) de la expresión... y del mismo modo que un nieto siempre tendrá padres, es adecuado que ciertos operandos estén entre paréntesis... si deben ejecutarse antes.
También se puede ver que un arbol jerárquico puede ser expresado en línea, y mantiene plenamente su sentido, siempre y cuando sea 'canonizado' con cierres y aperturas, que es lo que hemos hecho anteriormente con el menú de la calculadora y con el árbol geneálogico.

Iguala tu expresión a la lista genealógica, sin pies ni cabezas, sin saber quien es padre y quien es hijo.
Te decía en otro mensaje más arriba, que otra forma es separar una expresión en las subexpresiones que las componen, de modo que sean simples... pero eso da bastante trabajo y tampoco limita la posibilidad de error por confusión...
Observa la genealógica:
Pedro Juan Luis Maria andres Ana Eva
El primer cónyuge es el que aparece en primer lugar, el otro cónyuge el último y en medio los hijos.


Pedro Juan Luis Maria andres Ana Eva
Juan Fermin Antonio Rosa Felipe Rosa
Fermin Raquel
Antonio
Rosa Fernando
Felipe
Luis Daniel Encarna
Daniel Enrique Daniela Evaristo Sara
Daniela Rosa joaquin Fabian
Maria
Andres Rocio
Ana Luis antonio Marta Martin
Luis
antonio
Marta Ines Francisco Miguel Rafael
Miguel Sonia Miguel felipe Maria

Es decir desmontando cada expresión con su propios términos, no requiere paréntesis, pero puedes ver como crece la cantidad de expresiones. Una vez resueltas las subexpresiones, pueden volver a crearse nuevas expresiones con los resultados previos...  hasta llegar a la raíz (la asignación en programación).

La otra forma como ya he expresado varias veces es la notación polaca (no 'el polaco', ni 'en polaco', no es un idioma notación quiere decir "forma, sistema que se usa para expresar conceptos más o menos abstractos", el tipo que lo ideó era polaco, eso sí...).
Usando la notación polaca, no es ni más ni menos que para poder hacer los cálculos ya directamente sin tener que volver a buscar el orden... losd compiladores lo usan, porque al compilar, lo hará de tal forma que la expresión se vaya ejecutando (correctamente) avanzando hacia adelante, sería una caída de rendimiento si tras compilar, cada vez que se evaluara una expresión tuviera que localizar el orden para ejecutarla correctamente... el compilador lo hace una vez y cuando de traduzca a código máquina, ya estará listo, no requiere posterior toqueteo, solo ejecutar...

Resumiendo, no puedes vivir sin paréntesis, la notación polaca primero debes dominarla, pero si te cuesta entender los paréntesis, no es el momento de intentar profundizar en dicha notación...

Citar
Yo creo que tendría que hacer lo inverso: Que el programa genere expresiones en polaco y luego las transforme a normal sin paréntesis. Porque el problema que quería evitar es que las generadas tengan paréntesis, porque no sé cómo hacer eso bien
...
Porque quiero que las expresiones las genere un programa. Hacer que genere Variable1 Comparador1 Variable2 Operador1 y así todo lo que quiera, es fácil, pero si quisiera hacer que ponga paréntesis por ahí no tengo mucha idea
Es que no sé para que lo necesitas... por lo que alcanzo a entender de como te explicas es que tienes alguna función que 'genera' operandos y operadores (ignoro si al azar o si basado en algo específico)... entonces dado lo poco que he leído respcto de lo que intentas hacer, intuyo que tu programa también debe generar los paréntesis, porque como ya te señalé en el punto 1, y como me he extendido en explicaciones a lo largo de la respuesta, son operadores de prioridad, o si quieres jerárquicos (si se entiende como un árbol), cada paréntesis de apertura aumenta (profundiza) la jerarquía y cada cierre la reduce...

Nota como todos los lenguajes tiene términos o símbolos cuyo único objetivo es precisamente jerárquico, abrir o cerrar expresiones, anidamientos, etc... en C por ejemplo, un comedero de cabeza para los principantes es olvidarse de terminas las expresiones convenientemente con ';' en la mayoría d  lenguajes, el salto de línea es un indicador explícito de fin de una expresión, en C, una expresión continua en varias líneas hasta qwue encuentre dicho símbolo... (el punto y coma). Cada lenguaje tiene su propia convención, pero tiene dichos delimitadores...

Citar
Acordate además que cuando inicié este tema ni siquiera sabía eso del orden de procedencia o sea que para mí era un lío mayor que ahora.
Espero que con los ejemplos explícitos que te he expuesto más arriba, puedas finalmente entender la utilidad de la prioridad, la relación de 'inclusión, pertenencia o jerarquía (es todo lo mismo visto bajo diferente prisma). si para una expresión puede ser complejo entenderlo, en cambi sobre un menú, o más cercano un árbol genealógico, es imposible no entender que si no se define debidamente donde empieza y termina los hijos, la confusión es total... Aquí se ha seguido una forma simple y luego la hemos canonizado (se llama canonizar a no omitir nada aunque sea 'sobreentendido', por ejemplo canonizar la frase 'Trabajo el martes', sería: No trabajo el lunes, trabajo el martes, no trabajo el miércoles, ni el jueves, ni el viernes ni el sábado ni el domingo). los hijos quedan encerados en un nivel (+1) indentado entre el padre y la madre, en realidad, los 2 puntos se pueden omitir, si hay indentación el siguiente que aparezca en el mismo nivel será el cónyuge, pero por claridad a veces conviene añadir símbolos, así de un simple vistazo, se acota rápido... (es decir por comodidad 'humana', no estrictamente necesario matemáticamente hablando).

Citar
Citar
Hay 3 tipos de notaciones básicas:
Notación de infijo (o normal): Las que solemos usar, porque las entendemos bién al 'leerlas', los operadores aparecen a ambos lados y el operador en medio.
Ejemplos: A + B;  (A*B)+(C-(D*E)) <-- nota que los ejemplos son los mismos para los 3, para que veas las diferencias).
Notación de prefijo (o polaca): Los operadores van delante, los operadores detrás.
Ejemplos: +AB; +*ABC-*DE  
Notación de sufijo (o postfijo, inversa):Los operandos van delante, los operadores al final.
Ejemplos: AB+; AB*C+DE*-

Lo decía por:...
Ok, sí. Lapsus mío, pero se deduce que si hay tres espacios y he señalado el centro, y un lado, el del lapsus será el otro lado.  No tiene más importancia.

Citar
Citar
XOR no es más complejo que OR ni AND, sino a su mismo nivel...

Tabla de verdad de XOR
----------------------------
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0

En resumen es TRUE si solo una de ellas es TRUE. Si se aplica a más de 2 operandos es TRUE, si el número de evaluaciones TRUE es impar, FALSE si son pares...

1 xor 1 xor 1 xor 1 = 0   (4 unos, son pares luego = FALSE)
1 xor 1 xor 1 xor 0 = 1   ( 3 unos, son impares luego es = TRUE)

XOR te puede ahorrar muchas comparaciones..
Me parece más difícil de entender que los otros operadores, pero con lo último que dices tendré que ver.

No creas, es cuestión de práctica...En realidad suple a esta otra expresión:
Z = (Not(A) or B) and (A or Not(B))
Imagina que tienes un un valor para activar y desactivar algo.
Si quieres encenderlo harías algo como:
Código:
Enabled = TRUE
Si quieres apagarlo:
Código:
Enabled = FALSE
Pero si simplemente quieres poner el estado opuesto, puedes poner:
Código:
Enabled = Enabled xor TRUE
En realidad equivale a:
Código:
Enabled = Not(enabled)
...pero ojo, el not es válido solo porque estamos trabajando con un valor buleano... un valor buleano es un valor donde todos sus bits se comportan como si fueran un único bit.
En cambio si tienes un valor que noe s buleano, el resultado de XOR y NOT, es muy disitnto... con NOT invierte cada bit por el contrario, con XOR solo se invierte si el bit aparece una sola vez (en A o en B)
Not(0011.1010 ) = 1100.0101
0011.1010 xor
1010.1101
-----xor------
1001.0111
Como se ve da un valor muy distinto a los operandos de origen... Xor en realidad es muy interesante se comporta como una suma o como una resta, según el valor de ambos operandos...

Con práctica y tiempo, que consigas entenderlo bien, XOR se volverá un 'amigo invalorable'...
2839  Foros Generales / Noticias / Re: El precio de las GPU baja gracias al desplome de las criptomonedas en: 11 Julio 2018, 15:26 pm
A ver si es verdad que para otoño, me toca comprar nuevo equipo... y no quiero pagar más de lo justo.  :silbar: :silbar: :silbar:
2840  Foros Generales / Noticias / Re: Mozilla paraliza el desarrollo de Firefox para Android en: 11 Julio 2018, 15:24 pm
Lo entnedería si fuer ala propia fundación Mozilla la que estuviera detrás del ¿proyecto Fénix? (juraría haber escuchado proyecto Fenix en relación a la programación, lo menos 4 ó 5 veces antes (proyectos alternativos) si nnada que ver entre sí)...

Parece que Mozilla, se ha acostumbrado a retirarse una y otra vez cuando ve algo de 'hostilidad'... a esto se le suele llamar vulgarmente, cobardía. Cierto que los valientes mueren antes, pero... quién quiere un cobarde a su lado?.
Páginas: 1 ... 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 [284] 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 ... 432
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines