o

occhi45

Usuario (Argentina)

Primer post: 1 mar 2009
39
Posts
173
Puntos totales
8
Comentarios
G
Guia de Algoritmos Computacionales
InfoporAnónimo12/12/2009

Algoritmos computacionales Resumen de Conceptos Introducción: Los problemas y algoritmos desarrollados en la unidad anterior, reflejan situaciones de la vida diaria. En la mayoría de los casos fueron planteados para que los resuelva o ejecute una persona. Pero el objetivo es desarrollar algoritmos que pueden ser interpretados por una computadora. Para ello es necesario utilizar un lenguaje que interprete una computadora y que permita una descripción precisa de cada una de las acciones a emplear en la solución del problema. Esta unidad propone describir la formalización necesaria para el desarrollo de Algoritmos Computacionales empleando un pseudolenguaje similar a los empleados en la confección de programas.. De aquí en más, cuando se mencione al ejecutante de un algoritmo , se estará haciendo referencia a una computadora. En el ejemplo que se propone a continuación se desarrolla un algoritmo completo de acuerdo a la formalización que se propone. Ejemplo Problema: plantear un algoritmo computacional que calcule la hipotenusa de un triángulo rectángulo. Se conoce como información de entrada las longitudes de los catetos. Análisis del Problema: Datos: Longitudes de los catetos. Resultado a informar: Hipotenusa. Relaciones entre datos y resultados: Teorema de Pitágoras. Algoritmo: Proceso Hipotenusa Leer A,B; H  RC(A2+B2); Escribir 'Hipotenusa =',H; FinProceso En el ejemplo A, B y H constituyen identificadores de variables; 2 e 'Hipotenusa' son constantes; Leer, Escribir y  son las acciones primitivas de la lectura, escritura y asignación respectivamente; RC(A  2 + B  2) es una expresión numérica y RC ( ) es la función cuadrada. En esta unidad se desarrollarán todos estos elementos que conforman un lenguaje algorítmico formal que llamado pseudocódigo. Descripción de los elementos presentes en el ejemplo Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 3 La forma general de un algoritmo escrito en pseudocódigo es la siguiente: PROCESO nombre del proceso acción 1; acción 2; . . . FINPROCESO Elementos de un algoritmo computacional Se define constante, como el valor que no puede alterarse en el transcurso de un algoritmo . Constante Ejemplos de constantes: 123 Esta información se expresa mediante un valor intrínseco y único que no puede alterarse. Se utilizarán con frecuencia estos datos para asignarlos a variables o construir expresiones. 'López' Falso 3.1459 Una variable es una posición de memoria capaz de almacenar un único valor por vez. A medida que se ejecuten las acciones que describe el algoritmo esa variable podrá representar a nuevos valores. En un algoritmo una variable se referencia a través de nombres o identificadores. En el ejemplo inicial del cáclculo de la hipotenusa: Variable Proceso Hipotenusa Leer A,B; H  RC(A2+B2); Escribir 'Hipotenusa =',H; FinProceso se observa que 2 e ‘Hipotenusa=’ constituyen constantes. A, B H son variables. Para proponer el nombre o identificador de algún elemento del algoritmo -como las variables- el diseñador tiene amplia libertad y solo debe respetar tres reglas simples: Nombres o identificadores 1) Utilizar sólo letras y/o dígitos, comenzando siempre con una letra. 2) No utilizar palabras claves para acciones primitivas que emplea el pseudocódigo: LEER, ESCRIBIR, MIENTRAS, HACER, SEGUN, etc., o para las funciones internas: RC, SEN, TRUNC, LN, etc., o las palabras que corresponden a las constantes lógicas VERDAD y FALSO Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 4 3) No hacer distinción entre mayúsculas y minúsculas. Esto implica que VENTA, venta y Venta, constituyen en el algoritmo el mismo nombre. Esta sintaxis y sus restricciones no representan inconvenientes para proponer nombres de cualquier elemento del algoritmo : variables, algoritmos, procedimientos, funciones, archivos; pues se dispone de un sinnúmero de combinaciones diferentes de letras y dígitos. Ejemplos de identificadores: venta Se mencionó que el diseñador del algoritmo tiene total libertad para proponer nombres a sus elementos, aunque como consejo, es conveniente proponer identificadores que tengan alguna relación con lo que el elemento representa. En nuestro ejemplo inicial del cálculo de la hipotenusa de un triángulo rectángulo, se podría haber empleado los nombres de variables CATETO1, CATETO2, HIPOT, en lugar A, B, H. x12 resultado SUMA2 M3M Se define como expresión a un conjunto de operandos ligados por operadores cuya evaluación arroja un resultado. En el ejemplo incial RC(A  2 + B  2) es una expresión numérica (relación de Pitágoras) que permite calcular el valor de la hipotenusa. Expresión Ejemplos de expresiones: 2+a-x*5 45 A < B TRUNC(R) + 1 Tipos de Información Se puede clasificar la información que puede manejar una computadora a través de un algoritmo en los tipos siguientes:    tipo NUMERICO tipo CARACTER tipo LOGICO Esta clasificación nos define los tipos primitivos de la información. Se estudiará a cada uno de ellos y su modo de empleo. Tipo Numérico Constantes Numéricas Los valores o constantes de tipo numérico se decimal y pueden estar precedidos por los signos '+ o '-' . La ausencia de signo implica un número positivo. Se pueden subdividir en reales y enteros, o admitir clasificaciones más detalladas, de acuerdo al lenguaje de programación empleado. Para la formalización propuesta mediante el empleo de un pseudocódigo universal, no se harán distinciones de esta clase y simplemente se hablará de tipo numérico. Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 5 Un detalle importante: los números reales deben separar su parte entera de la fracción decimal con un punto en lugar de la coma. Se reserva la coma como separador. No se utilizará ningún símbolo para separación de miles. Ejemplos de constantes numéricas: 14 En los 2 últimos ejemplos se indican constantes numéricas con notación científica. Donde la cifra a la derecha de la E indica el exponente de la potencia de base 10. Es decir: 1.3 E+2 = 1.3*102 = 130 Variables Numéricas Una posición de memoria, que contenga cualquier valor de tipo numérico se denomina Variable Numérica. Las variables se identifican en un algoritmo a través de nombres o identificadores. Expresiones Numéricas Las expresiones numéricas se plantean en general con constantes numéricas, variables numéricas y funciones; y los operadores algebraicos como nexo: -12500 +1.9452 -567.91 1.3E+2 -0.94E-3 Operadores algebraicos + : suma : resta * : multiplicación / : división  : potenciación Es de mencionar que ciertos lenguajes de programación no disponen de todos los operadores antes descritos, así como es posible hallar otros operadores algebraicos adicionales a los presentados. La jerarquía de estos operadores es idéntica a la planteada por el álgebra de números y sólo puede ser alterada a través de la intercalación de niveles de paréntesis. Ejemplos de expresiones numéricas 2+a*102-800/C 1-(2*TOT-30 )(1+P) AREA*(Y+1.34 /(X2-T )) Obsérvese que el operador de radicación no existe; pero esto no es un problema porque esta operación puede plantearse fácilmente a través de la potenciación de exponente fraccionario: n m m n a De todas maneras es común hallar en casi todos los lenguajes de programación una función que realiza el cálculo de la raíz cuadrada. En pseudocódigo se utiliza para el ejemplo inicial y se llama RC( ). Además se asume que el ejecutante del algoritmo , conoce y puede resolver ciertas funciones numéricas. A estas funciones se las llama funciones predefinidas y tienen la propiedad de devolver un valor o resultado, al ser aplicadas sobre un argumento que se indica entre paréntesis. a Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 6 Funciones Predefinidas Algunas de las funciones predefinidas que incluye el pseudocódigo: RC( ) : ABS( ) : LN( ) : EXP( ) : SEN( ) : COS( ) : ATAN( ) : TRUNC( ) : REDON( ) : Raíz cuadrada Valor absoluto Logaritmo natural Función exponencial Seno de un ángulo en radianes Coseno de un ángulo en radianes Arco Tangente del argumento Parte entera del argumento Entero mas cercano Con estos nuevos elementos, se puede ampliar el uso de expresiones numéricas. Ejemplos de expresiones numéricas TRUNC(2/3)-ABS(X)-2*(X-1) SEN(X)+1-TAN(C/2) (-b+RC(b*b-4*a*c))/(2*a) Nota: Los lenguajes de programación suelen disponer de un número mucho mayor de funciones predefinidas. Tipo Caracter Constantes Tipo Caracter Se incluyen aquí a todos los caracteres y símbolos del código ASCII (Código Standard Americano para Intercambio de Información), los cuales pueden obtenerse de las teclas o combinaciones de teclas de su computadora, es decir, las letras del alfabeto en minúsculas y las letras mayúsculas, los signos de puntuación, los operadores aritméticos, paréntesis, el espacio en blanco, caracteres especiales, etc. También se incluyen dentro de este tipo a las cadenas de caracteres, como los apellidos, nombres, direcciones y también cadenas de caracteres numéricos: Ejemplos de constantes tipo carácter 'Luis Rodríguez' '25 de Mayo' 'Z' '3124' 'Resultado=' '123/890-12' Importante: En este tipo de información: el conjunto de caracteres ASCII, es un conjunto ordenado, y por tanto existe una relación de precedencia u orden entre sus elementos. Cada elemento del conjunto tiene un número de orden en lo que se conoce como tabla o código ASCII, y ese número es el que determina la relación de orden: El código ASCII se ha convertido en un standard mundial que permite compatibilizar la información que manejan las computadoras. La siguiente tabla muestra algunos de los caracteres del código ASCII y su correspondiente número de orden. En total son 255 caracteres. Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 7 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 '' '!' '"' '#' '$' '%' '&' ''' '(' ')' '*' '+' ',' '-' '.' '/' 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' ':' ';' '<' '=' '>' '?' 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 '@' 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' '[' '\' ']' '^' '_' 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 '`' 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' '{' '|' '}' '~' '• ' Si se tiene en cuenta la relación de orden dada por el código ASCII se puede afirmar que son verdaderas las expresiones siguientes: La letra 'a' es mayor que la letra 'B'. (‘a’ tienen número de orden 97 que es mayor al 66 de la ‘B’) El caracter '5' es menor que la letra 'A'. (el carácter ‘5’ tiene código 53 y el de la letra ‘A’ es 65) La cadena de caracteres 'Mario' es menor que ‘Roberto’. (se encuentra antes alfabéticamente) Se observa que a las constantes tipo caracter o las cadenas de caracteres se indican entre apóstrofos o simples comillas. Esto es para evitar confundir estos datos con identificadores de otros elementos del algoritmo . Por ejemplo, 'A' es un dato tipo caracter y A un identificador de un elemento del algoritmo . Variables Tipo Caracter Una posición de memoria, que contenga cualquier dato de tipo caracter o cadena de caracteres se denomina Variable Tipo Caracter. Expresiones Tipo Caracter En el pseudolenguaje que se empleará en esta primer parte de Fundamentos de Programación no se utilizarán operadores ni funciones para el manejo de caracteres y cadenas de caracteres. Por lo que las expresiones de este tipo quedan reducidas a simples constantes o variables. Tipo Lógico Constantes de Tipo Lógico Dentro de este tipo se incluye a solo dos constantes o valores posibles: VERDADERO y FALSO. Esto implica tener en cuenta una nueva limitación al proponer identificadores: no pueden utilizarse los nombres VERDADERO y FALSO para evitar ambigüedades. Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 8 Variables Lógicas Una posición de memoria, que contenga cualquier dato de tipo lógico es una Variable Lógica. Expresiones Lógicas Aquí cobran mucha importancia una serie de operadores que nos permiten plantear expresiones de tipo lógico. Las expresiones mas simples son las relacionales que utilizan los operadores relacionales matemáticos para comparar operandos de igual tipo. Operadores relacionales Operador Significado --------------- -----------------> Mayor que < Menor que = Igual que <= Menor o igual que >= Mayor o igual que <> Distinto que Ejemplos de expresiones lógicas relacionales 23<45 'ANA'<'LUIS' Las expresiones lógicas simples mostradas en el ejemplo se conocen como expresiones relacionales, pues permiten comparar o relacionar a 2 operandos del mismo tipo. Justamente, la ultima expresión del ejemplo anterior no es valida, pues compara a una expresión numérica con un caracter. La algorítmica computacional, permite también formar expresiones lógicas mas complejas a través de los conectores que emplea la lógica proposicional: (2+B) >=Trunc(2+B) 7>'M' A+2>=100 'a'<>LETRA Operadores lógicos Operador Significado --------------- ----------------- Disyunción  Conjunción ~ Negación Se observa entonces el valor de verdad de las expresiones lógicas propuestas en el ejemplo siguiente: Ejemplo: Expresión Lógica -------------------------------------(7<10)  ('a'<'c') ('A'<'a')  (12>19) Resultado ------------------------VERDADERO VERDADERO Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 9 ( 37<18 ) ( SEN(x)<=1 ) ('MARIA'<'MARTA') ('MARIA'<'MARTA')  (1>2) FALSO VERDADERO VERDADERO FALSO Acciones Algorítmicas En el lenguaje algorítmico (pseudocódigo), las primitivas se identifican con palabras claves o reservadas. Se han empleado en el ejemplo inicial las primitivas: LEER, ESCRIBIR y  (asignar). La ejecución de las acciones primitivas de un algoritmo suele ser diferente según el caso, lo cual lleva a plantear la siguiente clasificación: Primitivas Primitivas de Estructura Secuencial Primitivas de Estructura Condicional Primitivas de Control Primitivas de Estructura Repetitiva En la próxima unidad se desarrollarán las estructuras algorítmicas de control que implican el uso de primitivas de estructura condicional y de estructura repetitiva. Se plantea a continuación, algunas acciones de estructura secuencial. Acciones Primitivas de Estructura Secuencial Esta acción, permite a un identificador de variable, representar o memorizar cierto valor. Para describirla se utilizará la notación siguiente: Asignación V  E; Donde V es el nombre de la variable ( o simplemente la variable ) a la cual el ejecutante debe asignar el valor de la expresión E. El símbolo ' ' puede leerse toma el valor. Los tipos de V y E deben ser coincidentes, en caso contrario será causa de error. Según el tipo de V y E una asignación puede ser:  Asignación numérica.  Asignación tipo caracter.  Asignación lógica. Si V es una variable numérica y E cualquier expresión de tipo numérica la asignación es numérica. Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 10 Ejemplos de Asignaciones Numéricas ( A toma el valor 43 ) A  43; ( X toma el valor contenido en A ) X  A; NUM  3*X/A+2; ( NUM toma el valor del resultado de hacer 3*X/A+2 ) Importante: Nótese que para poder realizar una asignación aritmética se debe evaluar primero la expresión de la derecha, por lo tanto es perfectamente válida la acción: NN+1; que puede leerse: tomar el valor actual de N, sumarle 1, y asignar ese resultado a la variable N. Por ejemplo, si antes de la acción, N contenía el valor 8, luego de dicha acción contendrá 9. Obsérvese que esta acción algorítmica no tiene nada que ver con los conceptos asimilados en matemáticas, donde N=N+1 es una expresión incompatible. Del mismo modo se definen las asignaciones tipo caracter y tipo lógica. Ejemplos de Asignaciones tipo caracter LETRA  'A'; ( LETRA toma el valor 'A' ) X3  A; ( X toma el valor contenido en A ) NOMBRE 'Jorge'; ( NOMBRE toma el valor de 'Jorge' ) Ejemplos de Asignaciones Lógicas M  FALSO; //M toma el valor FALSO CIERTO  34 <= 78 ; //CIERTO toma el valor VERDADERO G (A<2)  (C=10); //G toma el valor lógico // resultante de la expresión (A<2)  (C=10) ) Todo algoritmo tiene por objetivo principal producir resultados, pudiendo o no incorporar información del medio externo (datos), al ambiente o sistema que observa. Esta incorporación de valores desde el exterior, nos lleva a definir una acción algorítmica primitiva de Lectura o Entrada. Se usará para ello la palabra clave LEER que permitirá al ejecutante identificar esta acción, seguida de la variable o lista de variables, que representan en el algoritmo la los valores que deben ser ingresados. Entrada Ejemplos de entrada de datos LEER Dat; LEER Nombre, Apellido, DNI; Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 11 Esta acción tiene el mismo efecto que una asignación, solo que esta última utiliza valores del ambiente del algoritmo ; en cambio la lectura asigna valores desde el exterior. También esta acción contribuye a hacer a los algoritmos de uso general, pues permite incorporar información nueva para producir nuevos resultados. Sin esta acción, la ejecución de un algoritmo producirá siempre la misma respuesta. Las acciones de lectura y asignación permiten definir variables en un algoritmo . La acción primitiva que permite a un algoritmo comunicar resultados o salida de información al medio exterior, se representará con la palabra clave ESCRIBIR; y a continuación una variable, una constante, una lista de variables y/o constantes o expresiones. Salida Ejemplos ESCRIBIR ESCRIBIR ESCRIBIR ESCRIBIR Dat, Nombre; 23; 'Dato=',X; 'Resultado=',3*X+(X-1)/2; Se destacan algunas diferencias entre las acciones de lectura y escritura. La lectura se realiza solamente a través de variables; y por lo tanto, si se lee una variable que ya fue definida en el algoritmo , implicara un acceso destructivo; esto es, la variable perderá su valor para tomar el del nuevo dato que se ingresa. En cambio, si se escriben resultados a través de variables el ejecutante realizara un acceso no destructivo a dichas variables, pues solo necesita conocer su contenido, para ejecutar la escritura. Aquí las variables conservan sus valores después de la acción. En el ejemplo inicial para calcular la hipotenusa la expresión utilizada era: H  RC(A2+B2); en ese caso se accede a los valores A y B en forma no destructiva (se usan sus valores para el cálculo sin modificarlos). Las acciones de lectura y escritura son conocidas como acciones de entrada/salida o abreviadamente E/S. Representación Gráfica de Algoritmos Computacionales Las acciones descritas antes corresponden a un lenguaje algorítmico denominado pseudocódigo. El pseudocódigo es una de las formas que se puede emplear para representar algoritmos. Además, se diseñarán algoritmos en forma gráfica a través de los llamados diagramas de flujo. En un diagrama de flujo, las estructuras de las primitivas del pseudocódigo se representan con una forma geométrica identificatoria o bloque. Estos bloques se unen con flechas que nos indican la secuencia u orden en que deben ejecutarse las instrucciones, es decir el flujo o recorrido que ha de seguirse en el diagrama. Por ejemplo, para las acciones de lectura y escritura se empleará un paralelogramo con una pequeña flecha que apunta hacia adentro o hacia afuera Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 12 del bloque, respectivamente. Para la acción de asignación, se utilizará un rectángulo. Una de las ventajas del empleo de diagramas de flujo, es la visualización plana de las acciones que forman el algoritmo , permitiendo seguir fácilmente su lógica. Estas ventajas se apreciaran mas adelante, cuando se describan primitivas de estructura condicional y repetitiva. Se observan ahora, algunas de las formas geométricas que identifican acciones en un diagrama de flujo. En las próximas unidades se incorporarán nuevas acciones con su simbología correspondiente: Inicio o fin de proceso Asignación Escritura o salida de información Lectura o entrada de datos V F Estructura condicional Si-entonces Ejemplo Conectores Problema: Intercambiar los valores de 2 variables numéricas que se leen como datos. Algoritmo ( en pseudocódigo ) Proceso Intercambio Leer A,B; AUX  A; A  B; B  AUX; Escribir A,B; FinProceso Algoritmo ( diagrama de flujo ) Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 13 Proceso Intercambio A,B AUX <- A A <- B B <- AUX A,B Fin Proceso Prueba de escritorio o seguimiento de algoritmos En las etapas de resolución de problemas se propuso la etapa de prueba luego de escribir la codificación ( algoritmo ). Probar un algoritmo es ejecutar cada una de las acciones incluidas en él; pero cómo efectuar una prueba en un algoritmo escrito en pseudocódigo o mediante un diagrama de flujo ?. La prueba de escritorio o seguimiento de un algoritmo puede efectuarse de la siguiente manera: a) Proponga un conjunto de datos. Estos datos deben coincidir en cantidad y tipo con las variables que aparecen en las acciones de lectura. b) Construya una tabla y coloque --encabezando cada columna de la tabla-cada una de las variables que aparezcan en el algoritmo . c) Escriba SALIDA en el encabezado de la ultima columna de la tabla. Aquí se anotarán los resultados que produzca el algoritmo como consecuencia de la acción de Escribir . d) Comience a ejecutar las acciones del algoritmo . Cuando encuentre una asignación de una variable coloque el valor o dato a asignar en la columna correspondiente a esa variable. e) Si lee una variable, tome el dato de prueba propuesto para esa variable y colóquelo en la columna de esa variable. f) Si vuelve a asignar o a leer una variable ya creada, continúe anotando en la columna correspondiente. g) Al terminar de ejecutar las acciones, los resultados o salida del algoritmo deben aparecer en la columna de SALIDA. Ejemplo El siguiente algoritmo calcula el promedio de 3 números utilizando una sola variable para leer los datos de entrada. Proceso Promediar Sum  0; Leer X; Sum  Sum+X; 1 2 3 Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 14 4 5 6 7 8 9 Leer X; Sum  Sum+X; Leer X; Sum  Sum+X; Prom  Sum/3; Escribir ‘Promedio=’,Prom; FinProceso Se realizará la prueba o seguimiento para los datos 15, 40 y 35. Cada acción del algoritmo se halla numerada para poder seguir en detalle la modificación de cada Sum x Prom Salida variable. 1 0 Cada fila de la tabla se 15 corresponde con una acción 2 3 algorítmica. La tabla con las 15 4 variables sería la indicada a 40 la derecha 5 55 6 35 7 90 8 30 9 Promedio= 30 Obsérvese en la fila 1, se ha asignado 0 a la variable sum. En la fila 2 la acción es Leer X y como el primer dato propuesto para la prueba es 15, se coloca 15 en la columna de la x. En el paso 3 se debe sumar sum+x, para lo cual se observa en la tabla que el valor actual de sum es cero y el de x es 15 con lo cual la operación arroja 15; luego, se asigna ese resultado a sum. Es decir que en el paso 3 la variable sum cambió tomando un nuevo valor (15) y perdiendo el anterior(0). Así sucesivamente hasta llegar a la acción de salida en el paso 9, donde se refleja el resultado de dicha acción en la última columna de la derecha de la tabla. Documentación La documentación de programas es fundamental para diseñadores y usuarios. En pseudocódigo solo se documentarán los algoritmos internamente, esto es, se efectuarán comentarios de ciertas acciones o grupos de acciones para permitir al diseñador o al equipo de diseño releer el algoritmo con facilidad. Esto evita a veces, tener que recordar por qué se definió tal variable, o por qué se utilizó tal expresión, etc. Para documentar internamente un algoritmo en pseudocódigo se empleará la doble barra ( // ) y a continuación el texto o la frase explicativa. Al ejecutar el algoritmo , este texto a la derecha de la // debe ser ignorado pues no constituye una acción algorítmica. Obsérvese el ejemplo: Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 15 Ejemplo: Calcular el área del trapecio de la figura conociendo como datos la base menor b, el ángulo y la altura h. h  Algoritmo b Proceso Trapecio Leer b, alfa, h; //si x es la diferencia entre // la base mayor y b x  2*(h/TAN(alfa)); Bmayor  b+x; // cálculo del área del trapecio AreaT  (Bmayor+b)*h/2; Escribir `Area trapecio=`, AreaT; FinProceso Utilice comentarios con frecuencia, le evitará pérdidas de tiempo a la hora de recordar pasos, o depurar algoritmos. Síntesis 1. Para plantear algoritmos computacionales y dar solución a problemas diversos se requiere de un lenguaje algorítmico formal. Se empleará un pseudolenguaje de estructura y sintaxis similar al de los lenguajes de programación de computadoras: pseudocódigo. Esa formalización es necesaria para utilizar -más tarde- lenguajes de programación y construir programas que una computadora pueda interpretar. Para codificar un algoritmo computacional empleando pseudocódigo se debe comenzar con la palabra Proceso <Nombre>. A continuación se plantean las acciones que conforman el algoritmo y se finaliza con la palabra FinProceso. Los elementos del pseudocódigo presentes en un algoritmo son las constantes, variables, identificadores, expresiones y primitivas del lenguaje. Las variables son lugares de memoria que permiten almacenar información. Se las suele identificar con nombres (identificadores). Una de las formas de colocar un dato en una variable es a través de la asignación. Otra forma es con la acción de lectura. Por ejemplo: X<-4.5; Leer z; La información que maneja un algoritmo puede ser de naturaleza diferente, por ello se definen 3 tipos de datos: numérico, caracter y lógico. Para cada tipo se plantean operaciones diferentes y no se pueden mezclar en 2. 3. 4. 5. 6. Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 16 una misma expresión datos de distinto tipo. 7. Dentro del tipo numérico se pueden emplear los operadores algebraicos de la matemática básica y se dispone de una serie de funciones predefinidas similares a las que Ud. puede hallar en una calculadora científica: SEN, COS, TRUNC, LN, etc. Las expresiones permiten combinar variables, constantes y operadores para realizar cálculos y comparaciones necesarios para resolver diversos casos. El tipo lógico tiene 2 constantes: VERDADERO y FALSO. En una expresión lógica se pueden usar operadores relacionales y operadores lógicos. El tipo caracter se basa en el conjunto de caracteres del código ASCII. Cada caracter tiene un número de orden y gracias a ese orden es posible establecer relaciones de orden: menor que, igual que, mayor que. Las acciones primitivas son órdenes perfectamente definidas y preestablecidas para que el ejecutante (la computadora) las interprete y las lleve a cabo. Las acciones primitivas de estructura secuencial, se denominan así porque se ejecutan una tras otra secuencialmente. Son ellas: la lectura o ingreso de datos, la asignación, la escritura o salida de información. Estas acciones se identifican unívocamente a través de palabras claves. Estas palabras son reservadas y no pueden emplearse como identificadores de otros elementos del algoritmo . Los algoritmos computacionales también pueden representarse gráficamente a través de diagramas de flujo. En estos diagramas los bloques o formas gráficas representan acciones. El diseño en 2 dimensiones permite seguir con más claridad la lógica propuesta. Es posible probar algoritmos mediante un seguimiento del mismo. Esto es, proponer una lista de datos que coincida con la cantidad y tipo de variables a leer. Luego ejecute cada acción y anote en una tabla de variables como estas se van modificando. Cada acción de escribir con el estado actual de las variables me permite determinar la salida del algoritmo . La documentación interna de algoritmos puede hacerse en pseudocódigo a través de la doble barra (//). Utilice estos comentarios para describir la lógica aplicada a ciertas acciones, o para recordar por qué efectuó cierto cálculo, etc. Estos comentarios son útiles a la hora depurar (corregir) el código o interpretar la lógica del algoritmo más ágilmente. 8. 9. 10. 11. 12. 13. 14. 15. 16. Por último: Los conceptos tratados hasta aquí, contribuyen a formalizar la metodología del diseño de algoritmos computacionales a través de ciertas reglas formales, eliminando acciones ambiguas o carentes de precisión. Esto no quiere decir, que planteado un problema, el algoritmo que lo resuelva responda a una metodología única. Al contrario, el diseño de los algoritmos requiere una gran Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 17 dosis de creatividad, y es común hallar varios caminos para la obtención de un resultado. Solo se trata de establecer pautas claras y precisas para que el ejecutante (luego, la computadora) las interprete y pueda procesar la secuencia de acciones que conforman un algoritmo computacional. Actividades Ejercicios Ejercicio 2.1. Los siguientes ejemplos son casos de identificadores no válidos. Indique la causa. (total) 3resultado 2X4 SUMA-2 M3/M Ejercicio 2.2 Proponga 5 ejemplos de constantes numéricas. Ejercicio 2.3 Dadas las siguientes constantes, si están escritas correctamente señale el tipo; en caso contrario, indique el error: a) TGB4 d) VERDADERO g) '------------' b) 'silla' e) 98,765,43 h) 7.2E+3 c) '41$/' f) 85/4 i) 345.2 Ejercicio 2.4 Proponga 3 ejemplos de expresiones numéricas. Ejercicio 2.5 Investigue los posibles valores de verdad (tablas de verdad) para cada uno de los operadores lógicos. Ejercicio 2.6 Proponga 3 ejemplos de expresiones lógicas usando operadores relacionales y operadores lógicos. Ejercicio 2.7 Dadas las siguientes expresiones, si están planteadas en forma incorrecta señale la causa, en caso contrario señale el tipo y el resultado de cada una: a) 3 + 4  3 - 9 * 3 b) 145 < '789' c) 'FICH' < 79 d) TRUNC(x) <= REDOND(x) e) V  (54>97) f) ('a'<'c') V (35>98) Ejercicio 2.8 Proponga 2 ejemplos de asignaciones para cada uno de los tipos de datos estudiados. Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 18 Ejercicio 2.9 Observe las proposiciones siguientes. Describa qué representa para Ud. cada una de ellas, de acuerdo a la formalización algorítmica que conoce: a) CALC = 189 c) CALC  154 e) AB12  AB12 + 1 b) 'DATO' = X d) ABC  980<'980' f) T  'X' = T Ejercicio 2.10 Dado el siguiente algoritmo : a) realice un seguimiento con los valores de prueba 73 y 105; b) proponga un enunciado para un problema que tenga al algoritmo por solución; c) intente hacer un seguimiento con los datos 290 y 'Luis López' y exprese su conclusión. Proceso Ejercicio210 Leer A, B; Escribir 'Valores Iniciales:', A, B; Aux  A; A  B; B  Aux; Escribir "Valores Actuales:', A,B; FinProceso Ejercicio 2.11 En un algoritmo se deben ingresar los datos para calcular el área de un círculo y el área de un rectángulo. Proponga la acción de entrada correspondiente. Ejercicio 2.12 En el mismo algoritmo del ejercicio anterior se desea mostrar los resultados del problema: área del círculo y área del rectángulo. Proponga la acción de salida, indicando con mensajes alusivos cual es el resultado que se muestra. Ejercicio 2.13 Resuelva los ejercicios siguientes en base a las etapas de resolución de problemas que Ud. conoce. Exprese los algoritmos empleando pseudocódigo y diagramas de flujo. a) Calcule las raíces o soluciones de una ecuación cuadrática del tipo ax2+ bx + c=0, conociendo como datos los coeficientes a, b y c. Suponer que los datos corresponden a ecuaciones de raíces reales. b) Un usuario desea conocer cuánto debe pagar por el consumo de energía eléctrica realizado en el último período. Se conocen el costo del KW sin impuestos, la lectura actual del medidor y la lectura del período anterior. Además en concepto de impuestos los usuarios abonan un 22% sobre el total correspondiente al consumo. c) Un canal tiene sección trapezoidal como indica la figura. Se conocen como datos la base b, el nivel h y el ángulo de inclinación de las paredes (alfa). Si la velocidad media de la corriente es h  b Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 19 conocida y tiene un valor v, determine e informe el caudal medio Q que pasa por dicho canal. (Nota: Q medio se calcula con el producto entre la velocidad media y el área de la sección). e) Obtener la liquidación del sueldo de un empleado en base al detalle indicado más abajo. La empresa empleadora, bonifica sobre el sueldo básico (SB) la antigüedad del empleado con un 1.2% por año. Además paga el presentismo con una monto fijo (MP). Entre los descuentos, se deben contabilizar: el aporte jubilatorio (AJ) que representa un 11% del sueldo básico; aporte a obra social (OS) con un 3% del básico y el aporte gremial (AG) con un 1% del básico. El empleador paga además $ 30.00 por esposa y $ 40.00 por cada hijo. Son datos del problema: nombre y apellido del empleado, DNI, sueldo básico, antigüedad en años, estado civil ( 1 si es casado, 0 si es soltero ), número de hijos, presentismo ( 1 si corresponde cobrar, 0 si no cobra ). Obtenga una salida como la siguiente: Empleado: .......................... DNI: ................... Haberes Básico: .......................... Antigüedad: .......................... Presentismo: .......................... Salario Familiar: .......................... Descuentos Aporte Jubilatorio: .......................... Obra Social: .......................... Aporte Gremial: .......................... Líquido a Cobrar: ............................ : Cuestionario 2.1 Señale la diferencia entre un identificador y una variable. 2.2. Una constante es una expresión ? Y una variable? 2.3 En una misma expresión lógica ¿ pueden aparecer variables y constantes de tipo caracter y de tipo lógico ?. Explique. 2.4 ¿Es posible comparar dos expresiones de diferente tipo en una expresión lógica relacional? 2.5 Es posible plantear un algoritmo sin la acción de lectura ? Explique. 2.6 ¿ Puede plantearse un algoritmo sin la acción de escritura ? Explique. 2.7 En una proposición de asignación, qué variables intervinientes deben estar previamente definidas? Ingeniería Informática – Fundamentos de Programación 2008 Unidad 2 20 2.8 ¿Es posible leer una variable que fue definida en un paso anterior ? 2.9 ¿Se puede proponer como salida una variable que no ha sido definida antes ? 2.10 ¿Cuáles acciones algorítmicas permitendefinir (crear) una variable dentro de un algoritmo ? Recordatorio Fundamentos de Programación Régimen de evaluación y promoción 2008 Evaluaciones parciales Se efectuarán 2 evaluaciones parciales de carácter individual. Para el cálculo del promedio entre ambas calificaciones, la del 2do parcial se computa doble. Solo se recupera el 2do Parcial y la nota del recuperatorio sustituye la nota inicial. Promoción Promoverán directamente la asignatura sin examen final, aquellos alumnos que obtengan simultáneamente: a. Calificación de 80% o más de promedio entre las 2 evaluaciones parciales (computando doble el 2do parcial) b. 75% de asistencia a las clases teóricas y prácticas. Se admite la recuperación del 2do parcial para promover la materia. Regularidad Los alumnos que no promuevan directamente la asignatura pero cumplan con las dos condiciones siguientes, serán considerados alumnos regulares: a. Promedio de 50% entre los 2 parciales (la nota del 2do parcial vale doble). b. 75% de asistencia a las clases teóricas y prácticas. Alumnos Libres Serán considerados libres quienes no cumplan con las condiciones de regularidad. Los alumnos libres rendirán el mismo examen final que los alumnos regulares, más ejercicios y/o preguntas adicionales. Ingeniería Informática – Fundamentos de Programación 2008

0
4
D
Diseño Estructural de Algoritmos
InfoporAnónimo12/5/2009

Conceptos Básicos Y Metodología Para La Solución De Problemas Por Medio De Computadoras 1.1 Definición De Lenguaje 1.2 Definición De Algoritmo 1.3 Algoritmo Cotidiano 1.4 Definición De Lenguaje Algorítmico 1.5 Historia Y Aplicación De Los Lenguajes Algorítmicos 1.6 Definición De Problemas 1.7 Análisis De Los Datos 1.8 Diseño De La Solución 1.9 Codificación 1.10 Prueba y Depuración 1.11 Documentación 1.12 Mantenimiento 1.1 Definición De Lenguaje Lenguaje Medio de comunicación entre los seres humanos a través de signos orales y escritos que poseen un significado. También podría decirse que es cualquier procedimiento que sirve para comunicarse, representado mediante símbolos y caracteres específicos Desde El Punto De Vista Informático El Lenguaje Es: La representación por medio de signos, símbolos y caracteres que existe entre la comunicación de la PC. Lenguajes De Programación Son los lenguajes utilizados para escribir programas de computadoras que puedan ser entendidos por ellas. Los lenguajes de programación se clasifican en tres grandes categorías: - Máquina - Bajo nivel (ensamblador) y - Alto nivel Lenguaje Máquina Es el lenguaje propio de la computadora, basado en la lógica binaria, de ceros y unos (00010111). Este lenguaje resulta difícil de utilizar para las personas; ya que el programador debe introducir todos y cada uno de los comandos y datos en forma binaria, y una operación sencilla como comparar el contenido de un registro con los datos situados en una ubicación del chip de memoria puede tener el siguiente formato: 11001010 00010111 11110101 00101011. La programación en lenguaje máquina es una tarea tan tediosa y consume tanto tiempo que muy raras veces lo que se ahorra en la ejecución del programa justifica los días o semanas que se han necesitado para escribir el mismo. Lenguaje De Bajo Nivel (Ensamblador) Como vimos anteriormente la programación en lenguaje máquina es difícil por ello se necesitan lenguajes que faciliten este proceso. Por este motivo han sido diseñados los lenguajes de bajo nivel. Estos lenguajes dan a cada instrucción un mnemónico, como por ejemplo STORE, ADD o JUMP. Los lenguajes de bajo nivel permiten crear programas muy rápidos, pero que son a menudo difíciles de aprender. Esta abstracción da como resultado un lenguaje de muy bajo nivel que es específico de cada microprocesador: El Lenguaje Ensamblador .Al asignar un código mnemotécnico (por lo general de tres letras) a cada comando en lenguaje máquina, es posible escribir y depurar o eliminar los errores lógicos y de datos en los programas escritos en lenguaje ensamblador, empleando para ello sólo una fracción del tiempo necesario para programar en lenguaje máquina. En el lenguaje ensamblador, cada comando mnemotécnico y sus operadores simbólicos equivalen a una instrucción de máquina. Un programa ensamblador traduce el código fuente, (una lista de códigos de operación mnemotécnicos y de operadores simbólicos), a código objeto (es decir, a lenguaje máquina) y, a continuación ejecuta el programa, todo esto gracias a un intérprete o a un compilador, los cuáles veremos más adelante Sin embargo, el lenguaje ensamblador puede utilizarse con un solo tipo de chip de CPU o microprocesador, por lo que los programas escritos en un bajo nivel son prácticamente específicos para cada procesador. Si se quiere ejecutar el programa en otra máquina con otra tecnología, será necesario rescribir el programa desde el principio. Así que los programadores necesitaban un método abreviado en el que un enunciado simbólico pudiera representar una secuencia de numerosas instrucciones en lenguaje máquina, y un método que permitiera que el mismo programa pudiera ejecutarse en varios tipos de máquinas. Estas necesidades llevaron al desarrollo de lenguajes de alto nivel. Lenguaje De Alto Nivel Los llamados lenguajes de alto nivel son los que se emplean con mayor frecuencia como lenguajes de programación, porque permiten expresar los algoritmos de una manera y con un estilo fácilmente reconocible por parte de diversos programadores y usuarios; debido a que están formados por elementos de lenguajes naturales, como el inglés utilizando términos del tipo LIST, PRINT u OPEN como comandos. En Basic, el lenguaje de alto nivel más conocido, los comandos se introducen desde el teclado, desde un programa residente en la memoria o desde un dispositivo de almacenamiento, y son interceptados por un programa que los traduce a instrucciones en lenguaje máquina. Asimismo, presentan una ventaja fundamental: la facilidad de poder ser transportados de una máquina a otra sin necesidad de realizar grandes cambios en ellos, por lo que se dice que son independientes de la máquina empleada. A este grupo pertenecen los lenguajes más conocidos, tales como el APL, FORTRAN, PASCAL, COBOL, LISP, PROLOG, C, ADA, PL/I. Sin embargo, tanto los lenguajes de alto nivel como los de bajo nivel, no son entendibles directamente por la máquina, sino que necesitan ser traducidos a instrucciones en lenguaje máquina que entiendan las computadoras por lo que es necesario disponer de una interfase con el lenguaje máquina para que el programa sea ejecutable. Al respecto existen dos tipos fundamentales de interfase, que son: a) Compiladores b) Intérpretes Un compilador es: Un traductor que facilita la comunicación entre el programador y la máquina, por medio de un proceso de transformación llamado compilación. De esta manera traduce un programa íntegro a lenguaje máquina antes de su ejecución, por lo cual se ejecutan con tanta rapidez como si hubiesen sido escritos directamente en lenguaje máquina. El compilador es el más eficaz para la mayor parte de las máquinas, puesto que presenta la ventaja de de que cada una de las sentencias del programa es interpretada y traducida al lenguaje máquina solo una vez. Un compilador crea una lista de instrucciones de código máquina, el código objeto, basándose en un código fuente. El código objeto resultante es un programa rápido y listo para funcionar, pero que puede hacer que falle el ordenador si no está bien diseñado. . Un intérprete es: Es un programa que se traduce línea por línea bajo la misma plataforma. Es Un traductor pero más lento que los compiladores ya que no producen un código objeto, sino que recorren el código fuente una línea cada vez. Cada línea se traduce a código máquina y se ejecuta. Cuando la línea se lee por segunda vez, como en el caso de los programas en que se reutilizan partes del código, debe compilarse de nuevo. Aunque este proceso es más lento, es menos susceptible de provocar fallos en la computadora 1.2 Definición De Algoritmo ALGORITMO Un algoritmo es una serie de pasos lógicos para realizar una acción, programa o tarea ya que es el primer paso para realizar un programa. Y tiene ciertas características que son: Preciso Esto quiere decir que debe indicar el orden en cada paso. Definido Es decir, si se sigue dos veces, obtiene el mismo resultado cada vez. Finito Que tiene fin, o sea un número definido de pasos. Ejemplos de algoritmos son: Instrucciones para montar una bicicleta Hacer una receta de cocina Obtener el máximo común divisor de dos números, etc. Los algoritmos se pueden expresar por fórmulas, diagramas de flujo, y pseudocódigos. Ésta última representación es la más utilizada en lenguajes estructurados como Turbo Pascal. 1.3 Algoritmo Cotidiano Un algoritmo cotidiano es: La serie de pasos que realizamos en nuestra vida diaria para realizar las diferentes tareas y actividades comunes, desde los pasos al levantarnos, así como ir de compras, etc. 1.4 Definición De Lenguaje Algorítmico Para definir el lenguaje algorítmico: Cabe recordar que el conjunto de todas las operaciones a realizar, y el orden en el que deben efectuarse, se le denomina algoritmo. Así que el lenguaje algorítmico es aquel por medio del cual se realiza un análisis previo del problema a resolver y encontrar un método que permita resolverlo. 1.5 Historia Y Aplicación De Los Lenguajes Algorítmicos Al igual que los idiomas sirven de vehículo de comunicación entre los seres humanos, existen lenguajes que realizan la comunicación entre los seres humanos y las computadoras. Estos lenguajes permiten expresar los programas o el conjunto de instrucciones que el operador humano desea que la computadora ejecute. Los lenguajes de computadoras toman diferentes formas; los de las primeras computadoras, como la ENIAC y la EDSAC, se componían en el lenguaje real de las máquinas mismas. La dificultad de programar las máquinas de esta manera limitaba drásticamente su utilidad y proporcionaba un fuerte incentivo para que se desarrollaran lenguajes de programación más orientados hacia la expresión de soluciones con la notación de los problemas mismos. Los primeros lenguajes de programación se conocieron como Lenguajes Ensambladores, un ejemplo es: TRANSCODE, desarrollado para la computadora FERUT. En los lenguajes ensambladores como mencionamos anteriormente en el apartado 1.1 se define un código especial llamado mnemotécnico para cada una de las operaciones de la máquina y se introduce una notación especial para especificar el dato con el cual debe realizarse la operación. A mediados de los años 60's aparecieron los primeros lenguajes de propósito general como FORTRAN, FORTRAN IV, ALGOL, COBOL, BASIC, PL/I, ADA, C, C++, PASCAL, etc. pero el desarrollo de nuevas tecnologías, tanto en arquitectura de computadoras como en lenguajes de programación, continúa a paso acelerado, cada vez con mayor velocidad, el panorama está cambiando de una etapa de sistemas y lenguajes especialmente desarrollados para aplicaciones individuales. Los lenguajes de programación actuales son los conocidos como Lenguajes visuales, como por ejemplo Visual Fox, Visual Basic, Visual C. 1.6 Definición De Problemas Con el fin de resolver un problema utilizando un sistema de cómputo, debe seguirse una serie de pasos que permiten avanzar por etapas bien definidas hacia la solución y ejecución de la misma Esta serie de fases o pasos deben seguirlas todos los programadores. Estas etapas son las siguientes . Definición del problema La primera fase en la resolución de un problema por computadora es la definición o análisis del problema. En donde lo más importante es que conozcamos exactamente lo que debe hacer el programa y "que se desea obtener al final del proceso” Para poder definir con precisión el problema se requiere que las especificaciones de entrada y salida sean descritas con detalle ya que esto es un requisito para lograr una solución eficaz; por lo que es conveniente hacerse las siguientes preguntas: 1.- ¿Qué entradas se requieren? (Tipo Y Cantidad) 2.- ¿Cuál es la salida deseada? (Tipo Y Cantidad) 3.- ¿Qué método produce la salida deseada?} 1.7 Análisis De Los Datos Una vez que el problema ha sido definido y comprendido, deben analizarse los siguientes aspectos: 1.- Los resultados esperados. 2.- Los datos disponibles. 3.- Herramientas a nuestro alcance para manipular los datos y alcanzar un resultado. Esta sería un diagrama de la resolución de un problema en su más mínima expresión. Y mientras esto no se comprenda no puede pasarse a la siguiente etapa. 1.8 Diseño De La Solución Para realizar el diseño de la solución: Como todos sabemos, una computadora no tiene capacidad para solucionar problemas más que cuando se le proporcionan los sucesivos pasos a realizar, esto se refiere a la obtención de un algoritmo que resuelva adecuadamente el problema. En caso de que obtengamos varios algoritmos, seleccionaremos uno de ellos utilizando criterios ya conocidos. Esta etapa incluye: La descripción del algoritmo resultante en un lenguaje natural, en un diagrama de flujo o natural de programación. De esta manera, solo se establece la metodología para alcanzar la solución en forma conceptual, es decir; sin alcanzar la implementación en el sistema de cómputo. Así tenemos que la información proporcionada constituye su entrada y la información producida por el algoritmo constituye su salida. Los problemas complejos se pueden resolver más eficazmente por la computadora cuando se dividen en subproblemas que sean más fáciles de solucionar. | 1.9 Codificación Codificación es la escritura en un lenguaje de programación de la representación del algoritmo desarrollada en etapas precedentes. Esto se refiere a la obtención de un programa definitivo que pueda ser comprensible para la máquina. Cabe destacar que si la codificación original se realizó en papel, previo a la compilación deberá existir un paso conocido como trascripción. Y posteriormente, una vez que el algoritmo se ha convertido en un programa fuente. Este programa fuente debe ser traducido a lenguaje máquina, este proceso se realiza con el compilador, y se obtiene el programa objeto, (siempre y cuando el programa fuente sea correcto) que posteriormente se vuelve un programa ejecutable. Estos pasos a continuación se describen de una forma esquematizada: 1.10 Prueba y Depuración La Prueba se realiza tras la compilación. Si tras la compilación se presentan errores (errores de compilación) en el programa fuente, es preciso volver a editar el programa, corregir los errores y compilar de nuevo, este proceso se repite hasta que no se producen errores. De esta manera se obtiene el programa objeto, que todavía no es ejecutable directamente, pero si no contiene errores se debe instruir al sistema para que realice la fase de montaje o enlace del programa objeto con las librerías del programa del compilador; este proceso de montaje produce un programa ejecutable. La Depuración es el proceso de encontrar los errores del programa y corregir o eliminar dichos errores. Cuando se ejecuta un programa, se pueden producir tres tipos de errores: 1.- Errores de compilación. Se producen normalmente por un uso incorrecto de las reglas del lenguaje de programación y suelen ser errores de sintaxis, por lo tanto la computadora no puede comprender la instrucción, y obviamente no se obtendrá el programa objeto, y el compilador imprimirá una lista de todos los errores encontrados durante la compilación. 2.- Errores de ejecución. Estos errores se producen por instrucciones que las computadoras pueden comprender, pero no ejecutar. Ejemplos de éstos son: una división por cero, y raíces cuadradas de números negativos; por lo que en este caso se detiene la ejecución del programa y se imprime un mensaje de error. 3.- Errores lógicos. Se producen en la lógica del programa y la fuente del error suele ser el diseño del algoritmo. Estos errores son los más difíciles de detectar, ya que el programa puede funcionar y no producir errores de compilación ni ejecución, y solo puede detectarse cuando se advierte un error por la obtención de resultados incorrectos. En este caso se debe volver a la fase del diseño del algoritmo, modificarlo, cambiar el programa fuente, compilar y ejecutar una vez más. 1.11 Documentación La documentación de un problema consta de las descripciones de los pasos a dar en el proceso de resolución de un problema. La importancia de la documentación es por su decisiva influencia en el producto final. Programas pobremente documentados son difíciles de leer, más difíciles de depurar y casi imposibles de mantener y modificar. Por ello la importancia de la documentación, sin la documentación es imposible corregir errores futuros o bien cambiar el programa 1.12 Mantenimiento El mantenimiento se define como la modificación del programa por medio de actualizaciones, que mejoran al programa, corrigiendo errores o bien actualizándolos para un mejor funcionamiento. Por ello la documentación es sin duda muy importante para poder llevar a cabo el mantenimiento. Instituto Tecnológico Superior De Coatzacoalcos Diseño Estructural de algoritmos I Unidad I COMPILACIÓN Código Fuente Programa Ejecutable Código objeto Codificación Diseño de la solución Análisis de los datos Definición del problema Prueba y depuración Mantenimiento Definición de un problema Diseño Del Algoritmo Resolución del problema con la computadora Resolución de un problema ALGORITMO RESULTANTE EN LENGUAJE NATURAL ALGORITMO QUE RESUELVA EL PROBLEMA TRANSCRIPCION Si la codificación se escribió en papel Se realiza la: Algoritmo realizado en etapas anteriores Para realizar la conversión del algoritmo en programa, se deben sustituir las palabras reservadas en español por sus homónimos en inglés, (hablando de un lenguaje de alto nivel) y las operaciones, instrucciones indicadas en lenguaje natural. CODIFICACIÓN COMPILACIÓN PROGRAMA FUENTE PROGRAMA OBJETO PROGRAMA EJECUTABLE INTERNA Esta documentación son los comentarios o mensajes que facilitan el entendimiento del proceso. EXTERNA Incluye análisis, diagramas de flujo, y/o pseudocódigos, manuales de usuario, con instrucciones para ejecutar el programa y para interpretar los resultados.

10
2
la matematica en la seguridad
la matematica en la seguridad
InfoporAnónimo12/2/2009

1. INTRODUCCIÓN La información, tanto por la cantidad como por la velocidad con la que circula, se ha convertido en una seña de identidad del momento actual. El trabajo de Shannon, en el que se da carácter matemático a la información, convirtiéndola en algo que se puede medir y tratar de modo científico, representó, sin lugar a dudas, un punto de inflexión en la teoría de la información. Hoy en día nadie duda de que la información es poder y como tal, un bien valioso que tiene que ser protegido de ataques a su integridad o a su confidencialidad. Si lo pensamos detenidamente, la cantidad de información, en muchos casos información muy sensible, que circula actualmente por canales más o menos públicos, puede hacernos sentir vértigo. La mayoría de nosotros entra de modo habitual en Internet y sabe que se puede encontrar información sobre prácticamente todo, si uno sabe buscarla. Tambien estamos acostumbrados a intercambiar información con nuestro banco, con una agencia de viajes o realizando compras a través de la red. Es claro que todos nosotros deseamos tener la seguridad de que la información que enviamos sólo es accesible para su legítimo receptor y que no cae en “manos indebidas”. La seguridad de la información ha pasado de ser exclusividad de la Política, la Diplomacia, los Servicios de Inteligencia o las Altas Finanzas, a convertirse en algo cotidiano, que en mayor o menor medida nos afecta a todos y cada uno de nosotros. Parece claro que la información tiene que ser protegida, tanto en los aspectos de fidelidad de la información, detectando y corrigiendo los posibles errores generados por el ruido (nombre genérico para todas las perturbaciones eléctricas, magnéticas o de cualquier tipo que afecten al canal por el que se transmite la información) como en el aspecto de confidencialidad e integridad de la misma. Y en este punto las Matemáticas juegan un papel de extraordinaria importancia. Siguiendo a N. Koblitz podemos decir que: “La enorme utilidad de las matemáticas en la seguridad de la información está bordeando el misterio y no existe explicación racional para ella”, parafraseando a Eugene Wigner que escribió esa afirmación en relación al papel jugado por las matemáticas en las Ciencias Naturales y especialmente en Física. LAS MATEMÁTICAS DE LA SEGURIDAD 2. CORRECCIÓN DE ERRORES Cuando hablamos de información siempre tenemos en mente información digital, secuencias de ceros y unos, que pueden ser transmitidos por un canal. La información de un periódico o de una fotografía no es digital, pero se puede transformar en información digital y por eso podemos leer el periódico por internet o enviar fotografías por correo electrónico. Los códigos se inventaron para corregir los errores que se producen en la comunicación a través de canales con ruido. Tratan de reproducir lo que hacemos en la vida cotidiana cuando estamos hablando y un ruido ambiental nos impide entender lo que nos ha dicho nuestro interlocutor. Le pedimos que nos repita lo que ha dicho. Por eso el primer paso es la detección de los errores en la información recibida. Pero no siempre podemos solicitar que nos reenvíen la información que ha llegado defectuosa. Aparte del coste que tiene el uso del canal, puede ser inviable. Pensemos en información almacenada en un disco y que se abre al cabo de un tiempo, cuando ya no se puede pensar en su reenvio. O en una fotografía enviada por un satélite espacial desde una posición concreta. La idea es sencilla. Se añade a la información que se quiere enviar una serie de dígitos (de control) que no contienen información, pero permiten detectar y, eventualmente corregir, errores, siempre que el número de errores producidos no exceda la capacidad correctora del código. Los códigos correctores forman parte de nuestra vida cotidiana, como ocurre con la letra que se añade al DNI o el ISBN de los libros. También lo utiliza la naturaleza en el código genético, aunque no sepamos exactamente como funciona. En el diseño de códigos correctores de errores cuyo almacenamiento no desborde las capacidades de nuestro ordenador, las matemáticas juegan un papel decisivo. Todos los códigos considerados de modo usual son códigos lineales, es decir, disponemos de todas las herramientas del álgebra lineal. Pero no son las únicas. Teoría de cuerpos finitos, polinomios sobre ellos, geometría algebraica o matemática discreta (diseños, geometrías finitas, etc.), teoría de anillos, son algunas de las partes de las matemáticas que juegan un papel importante en la teoría de códigos correctores de errores. Dado que en general no existen algoritmos eficientes para la descodificación de un código lineal, el diseño de códigos con buenas propiedades, es decir con algoritmos de descodificación eficientes, sigue siendo un campo abierto al trabajo y la imaginación de los matemáticos, que pueden aplicar las técnicas y herramientas que les son familiares; probablemente en algunos casos de modo sorprendente. 3. SEGURIDAD Pero nuestro objetivo es poner de relieve el papel que juegan las matemáticas en la seguridad de la información. La protección de la información, o más concretamente de cierto tipo de información, ha sido una preocupación de la humanidad desde tiempos remotos. Todos hemos oido hablar del cifrado usado por César para enviar sus mensajes o del escítalo de los lacedemonios. En algunos casos los procesos de cifrado fueron especialmente eficaces. Pensemos en los jeroglíficos usados por los sacerdotes egipcios, que no fueron descifrados hasta el siglo XIX. Todos estos cifrados, usados desde la antigüedad corresponden a lo que hoy llamamos criptografía de clave privada o simétrica. El texto se enmascara, transformándolo en un texto cifrado, usando para ello una clave que debe permanecer secreta y debe ser conocida sólamente por el remitente (o emisor) del mensaje y su legítimo receptor, que básicamente utiliza la misma clave para recuperar el mensaje original, o en todo caso, el coste computacional de cifrar y descifrar un mensaje es el mismo. La auténtica revolución que cambió el panorama de la criptografía se produjo en el año 74, con el artículo en el que Diffe y Hellman introducen la criptografía de clave pública. La idea base es que la clave de cifrado de un determinado usuario A sea pública y cualquier otro usuario de la red le pueda enviar mensajes cifrados a A usando dicha clave pública. Pero sólo A, que tiene la clave privada, será capaz de descifrar los mensajes cifrados. ¿Cómo es posible que cualquier usuario pueda cifrar mensajes y no pueda descifrarlos? Es en este punto dónde las matemáticas juegan un papel esencial. La existencia de criptografía de clave pública se basa en la existencia de funciones de una vía. Una función de una vía es una función para la cual es fácil calcular la imagen de cualquier elemento, pero la determinación de la imagen inversa de un elemento, aún sabiendo que exista, es muy costoso computacionalmente, de hecho inasumible. S. GONZÁLEZ Y C. MARTÍNEZ Los criptosistemas de clave pública más usuales se basan en el problema de la factorización (RSA) y en el problema del logaritmo discreto. Dados dos números primos, aunque sean muy grandes, se pueden multiplicar sin problemas, pero factorizar un número grande (pensemos en números de 200 cifras decimales), aún sabiendo que es compuesto, es extremadamente costoso y requiere un tiempo que no lo hace factible. Para diseñar un esquema RSA el usuario debe elegir dos primos grandes p y q (para garantizar la seguridad p y q deben cumplir algunas propiedades adicionales) y un cierto entero e, que también veremos debe cumplir alguna condición. Su clave pública será el par (N, e) dónde N = pq. De este modo, los mensajes, que se identifican previamente con clases de restos módulo N (o si se quiere con enteros positivos menores que N), se cifran haciendo una exponenciación modular. Es decir, el cifrado de un mensaje m es el resto de dividir me entre N. Notemos que para descifrar necesitariamos hallar la inversa de la exponenciación anterior módulo N, lo que en general no se puede hacer si no se dispone de una información adicional, de la que dispone el propietario de la clave y que debe evitar llegue a ser conocida. En este caso dicha información adicional es el par de números primos p y q en los que se factoriza N. Dado un entero n mayor que 1, se llama función de Euler de n, f(n), al número de enteros positivos, menores que n y relativamente primos con n. Si tratamos de calcular la función de Euler de un número grande n, el procedimiento es muy costoso computacionalmente, comparable al coste de factorizar el número n. Pero si conocemos a priori la factorización de n, entonces es inmediato calcular f(n). En nuestro caso, si N = pq, entonces f(N) = (p – 1) (q – 1). Tambien probó Euler (del que se conmemora este año el 300 aniversario de su nacimiento) que si a es un entero relativamente primo con N, entonces la potencia f(N) de a es congruente con 1 módulo N (af(N) ≡ 1 mod N). Si elegimos el entero e relativamente primo con f(N), entonces podemos encontrar muy fácilmente, usando el algoritmo euclídeo de la división, otro entero d tal que ed ≡ 1 mod f(N). Ahora para el propietario de la clave es muy fácil descifrar. Para recuperar el mensaje m cuyo texto cifrado es c (c ≡ me mod N) sólo tiene que hacer una nueva exponenciación, m ≡ cd mod N. Son resultados de teoría de números los que suministran la función de una vía en la que se sustenta la seguridad del RSA. Otra función de una vía viene asociada al problema del logaritmo discreto. Si G = < g > es un grupo cíclico convenientemente elegido, es computacionalmente imposible encontrar, para un elemento arbitrario y del grupo, el exponente x tal que y = gx. Tal exponente x se llama el logaritmo discreto de y en base g. En particular se sabe que ese es el caso si tomamos como grupo cíclico el grupo multiplicativo de los elementos no nulos de un cuerpo finito (suficientemente grande) o el grupo asociado a una buena curva elíptica. En este caso, si un usuario A quiere diseñar un criptosistema de clave pública tipo ElGamal, selecciona un adecuado grupo cíclico G = < g >, que hace público al igual que el generador del mismo y también hace público un elemento del grupo, y con y = gk, siendo k un número adecuado que debe mantener secreto, difícil de determinar para cualquier otro usuario y que permitirá a A descifrar los mensajes que le envian. Notemos que k es el logaritmo discreto de y en base g, luego la seguridad del sistema se basa en que sea computacionalmente imposible calcularlo. Ahora los mensajes se identifican de algún modo con elementos del grupo. Para cifrar el mensaje m, otro usuario B determina aleatoriamente un r y envia el par (gr, myr). Para descifrar el mensaje, A considera la primera componente del par, gr y la eleva a su clave privada k. Como (gr)k = (gk)r = yr, para recuperar el mensaje m basta que divida la segunda componente del par recibido por el elemento (gr)k que acaba de calcular. Notemos que r tambien debe elegirse de modo adecuado, pues un tercer usuario podría recuperar el mensaje concreto m si es capaz de determinar r que es el logaritmo discreto en base g de la primera componente del mensaje cifrado. 4. OTROS TIPOS DE CRIPTOGRAFÍA Hay otras muchas partes de las matemáticas que tienen aplicaciones en Criptografía. Por ejemplo la Combinatoria. En el año 78 se recibió con entusiasmo una propuesta de Hellman y Merkle de un criptosistema basado en el problema de la mochila. El problema de la mochila consiste en, dada una sucesión de números {b1, ..., bn} y un número S (menor o igual que la suma de los términos de la sucesión) determinar si es posible encontrar algunos términos de la sucesión cuya suma LAS MATEMÁTICAS DE LA SEGURIDAD nos dé el número S. Se sabe que en general es un problema difícil y no existe ningún algoritmo eficiente para resolverlo (en términos de teoría de la complejidad es un problema NP-completo). Pero existe un caso en el que el problema es especialmente sencillo de resolver, las llamadas sucesiones supercrecientes, en que cada término es mayor que la suma de los que le preceden. Por ello se parte de una sucesión supercreciente, que forma parte de la clave secreta, y se enmascara con una serie de operaciones algebraicas, que tambien deben mantenerse secretas, para transformarla en una sucesión aparentemente arbitraria y sin “buenas propiedades”, que es la clave pública. El recuperar el mensaje enviado a partir de su texto cifrado obligaría a un usuario no autorizado a resolver el problema de la mochila en un caso difícil, mientras que el propietario de la clave lo transforma, deshaciendo las operaciones algebraicas de su clave secreta, en un problema de la mochila en el caso sencillo de sucesiones supercrecientes, para las cuales existe un algoritmo muy eficaz. Este esquema de cifrado y descifrado era muy eficiente, unas 100 veces más rápido que el RSA. Pero en 1984 Shamir, uno de los padres del RSA, rompió completamente el criptosistema, sin recuperar la clave secreta, sino encontrando nuevos elementos que jugaban un papel análogo y le permitian recuperar el mensaje en claro sin conocer la clave secreta. Aunque se intentó salvar el criptosistema, introduciendo iteraciones y modificaciones, todas ellas fueron rotas por Shamir. Durante un tiempo se consideró que la criptografía basada en problemas combinatorios no tenia futuro, a pesar de la existencia de muchos problemas NP-completos conocidos que serian los candidatos naturales para definir una función de una vía. No obstante hoy en día se ha recuperado la idea de utilizar problemas de combinatoria y se está produciendo una notable actividad en esta dirección, si bien no hay todavía ninguna propuesta concreta que sea viable y eficaz. La aparición de los ordenadores cuánticos supondria una amenaza letal para los sistemas criptográficos de clave pública más utilizados (basados en factorización y en el problema del logaritmos discreto), dado que el proceso de multiplicar dos números y la factorización de un número pasarian a ser problemas de complejidad similar con un ordenador cuántico. Por ello se han buscado primitivas criptográficas basadas en otros aspectos matemáticos, con problemas en los que un ordenador cuántico no supondría un cambio sensible. Una de las ramas que ha jugado y juega un papel fundamental es la teoría de grupos, tanto finitos como infinitos. En general los grupos infinitos considerados en criptografía son finitamente presentados, es decir admiten un conjunto de generadores finito que satisfacen un conjunto finito de relaciones. Los esquemas propuestos se basan en la conocida dificultad de dos problemas, el de la palabra (¿podemos determinar si una palabra en los generadores representa o no el elemento identidad en el grupo?) y el de la conjugación (determinar si dos elementos del grupo son o no conjugados en el grupo). En el caso de grupos finitos en general las propuestas se basan en la existencia de ciertos conjuntos, con propiedades especiales, que permiten escribir todos los elementos del grupo como producto de elementos de dichos conjuntos (como signaturas logarítmicas, mallas o cubiertas, ver ). También se han utilizado grupos Braid en criptografía, si bien los esquemas diseñados han sido criptoanalizados en la mayoría de los casos. Finalmente, en este sentido, comentemos que la primera propuesta de diseño para un criptosistema IND-CCA (que se ha convertido actualmente en la noción standard de seguridad deseable), se debe a Cramer y Shoup tomando como base grupos abelianos. También se han presentado propuestas basadas en grupos no abelianos 5. CRIPTOANÁLISIS Las exigencias de seguridad han ido cambiando, dependiendo de necesidades y del perfeccionamiento y la sistematización lograda por el criptoanálisis. Se han desarrollado diversas nociones de seguridad, siendo este un campo teórico de trabajo en el que aún queda mucho por hacer. La noción de seguridad considerada depende de la cantidad de información conocida por un adversario y el tipo de ataques que pueda llevar a cabo. En algunos casos el adversario conoce pares de texto y sus cifrados, pero en otros casos puede obARBOR CLXXXIII 725 mayo-junio [2007] 419-425 ISSN: 0210-1963 423 S. GONZÁLEZ Y C. MARTÍNEZ tener el cifrado de cualquier mensaje previamente elegido, como ocurre en la criptografía de clave pública. Tambien puede ocurrir que cuando el atacante trata de recuperar un mensaje concreto m a partir de su cifrado c, tenga acceso al descifrado de cualquier otro texto cifrado. El criptoanálisis y la criptografía van íntimamente ligados. Antes de proponer un sitema de cifrado, es necesario hacer una tarea de criptoanálisis, para tener una mínima seguridad de la robustez del esquema. El criptoanalista, en su tarea de buscar vulnerabilidades de los esquemas propuestos, utiliza gran variedad de herramientas matemáticas: técnicas estadísticas, algebraicas, algoritmos de optimización, teoría de números, etc. Una de las técnicas más potentes utilizadas por el criptoanálisis está basada en retículos. Un retículo es el conjunto de combinaciones lineales enteras de un conjunto de vectores linealmente independientes (su estructura en dimensión 2 ó 3 se parece a una red). Estas estructuras tienen aplicaciones en otras partes de las matemáticas, como álgebras de Lie, en teoría de códigos correctores o en otras ciencias, como la cristalografía. Las aplicaciones a criptología se hacen a través de la resolución de ciertos problemas como el del vector más corto. La complejidad de los mejores algoritmos conocidos para resolverlos crecen, al menos en el peor de los casos, exponencialmente con la dimensión del retículo. Sin embargo A. J. Lenstra, H. W. Lenstra y L. Lovász vieron que si se quiere encontrar un vector relativamente corto, el problema es mucho más fácil y diseñaron un algoritmo, el LLL, que lo resuelve en un tiempo de ejecución que es polinomial en la dimensión del retículo. El algoritmo LLL se utilizó en el problema de la mochila y en el criptoanálisis al sistema mencionado propuesto por Merkle y Hellman y también para probar la debilidad de algunas funciones hash (que juegan un importante papel en criptografía) o la vulnerabilidad de algunos generadores pseudoaleatorios de números. Aunque la aplicación más espectacular de los retículos ha sido en criptoanálisis, también se han aplicado en criptografía. Ajtai y Dwork propusieron un criptosistema de clave pública basado en una variante, tambien difícil, del problema del vector más corto y además la seguridad se basaba en la difícultad de resolver el problema en un caso cualquiera, no en uno especialmente desfavorable. Pero si el tamaño de las claves es grande, el criptosistema es ineficiente y si se reducen las claves, el criptosistema es, a pesar de todo, vulnerable. Goldwaser, Goldreich y Halevi propusieron otro criptosistema de clave pública cuya seguridad dependia de otro problema difícil, el encontrar el vector de un reticulo más cercano a otro vector dado. Este algoritmo es más eficiente que el de Ajtai y Dwork, pero la forma especial de los retículos utilizados los hace vulnerables ante un cierto tipo de ataques. En la actualidad sólo existe un criptosistema de clave pública en uso que se basa en retículos, si bien no en su descripción inicial. El ataque más fuerte conocido se basa en resolver el problema del vector más corto en un retículo que se construye a partir de la clave pública y que no consigue resolverse porque se pueden utilizar dimensiones grandes debido a la eficiencia del sistema. Hay que hacer notar, sin embargo, que no hay ninguna demostración de que atacar al sistema pase necesariamente por resolver el problema del vector más corto. Coppersmith realizó un significativo avance en el campo del criptoanálisis al publicar en 1996 unos algoritmos basados en retículos que permitian encontrar, con complejidad polinómica, soluciones pequeñas de ecuaciones enteras. Una versión modificada y más operativa dada por Howgrave-Graham permitió encontrar soluciones pequeñas de ecuaciones modulares. El diseño por parte de Boneh y Durfee de un algoritmo para atacar el RSA cuando la clave privada se escoge demasiado pequeña ha sido, probablemente, la aplicación más importante. Finalmente notemos que en ocasiones herramientas del criptoanáliss se utilizan para probar la seguridad de un sistema criptográfico. Es el caso de un algoritmo de Coppersmith que busca raíces pequeñas de ecuaciones enteras en dos variables y que fue utilizado por May para probar que, en ciertas condiciones, la seguridad del RSA es equivalente al problema de la factorización. LAS MATEMÁTICAS DE LA SEGURIDAD 6. CONCLUSIONES No se debe deducir de lo anterior, que la criptología se reduce al diseño de criptosistemas y al posterior estudio de sus debilidades en el criptoanálisis. Los problemas de los que se ocupa la criptografía son muy numerosos y no podríamos enumerarlos en estas páginas. Aparte del uso de passwords, ya generalizado, y todo lo que rodea al comercio y dinero electrónico, mencionaremos, a modo de ejemplo, sólo algunos de ellos: 1. Autenticación de mensaje y firma digital: Se trata de una de las principales aplicaciones de la criptografía de clave pública, aunque en muchas ocasiones se combine con clave privada. La firma digital, a diferencia de la manuscrita, garantiza no sólo que el emisor es quien afirma ser, sino que el mensaje llega a su destinatario sin alteraciones o modificaciones en el mismo. 2. Compartición de secretos: Se quiere dar información a un grupo de gente de modo que una información secreta sea recuperada si cualquier subconjunto de k personas colabora, pero no se consiga si son sólamente k – 1 los que colaboran. 3. Acuerdo de bit: Reproduce el proceso de lanzamiento de una moneda entre dos personas que están a distancia y tienen que interactuar de modo secuencial y no en el mismo instante. 4. Pruebas de conocimiento cero y transferencia olvidadiza (oblivious transfer): Se utiliza cuando una persona quiere convencer a otra de que posee una información o es capaz de hacer algo (por ejemplo demostrar un teorema) sin revelar los detalles. Un modo de construir pruebas de conocimiento cero no interactivas es a través de un canal de transferencia olvidadiza, que es un sistema para enviar dos paquetes de información cifrada sabiendo emisor y receptor que sólo uno de los dos paquetes puede ser descifrado y leido por el receptor y el emisor ignora cual de los dos paquetes será el que puede leer el receptor. A los anteriores problemas podemos añadir el descubrimiento parcial de secretos, la venta de secretos, esquema electoral, transferencia inconsciente, firma de contratos, correo con acuse de recibo, etc. Como vemos la lista se prolonga de un modo realmente impresionante y la actividad en el campo es incesante. Basta echar un vistazo a las actas de alguna de las importantes reuniones que se celebran anualmente en el ámbito internacional, por ejemplo las del último Eurocyrpt en San Petersburgo (el de este año será en Barcelona) o a las de TCC 2007 (Theory of Cryptography Conference) que se celebrará este febrero en Amsterdam para ver la cantidad de investigación que se está realizando. Hemos tratado de reflejar como distintas partes de las Matemáticas han jugado y están llamadas a jugar un papel esencial en el desarrollo de la Criptografia, especialmente en Clave Pública. Por supuesto la seguridad de la información necesita profesionales de muchos ámbitos, y muy especialmente informáticos. Shafi Goldwasser publicó un artículo en los Proceedings del IEEE en 1997 con el título: “Nuevas direcciones en Criptografía, Veinte años más tarde”, en alusión a los 20 años transcurridos desde la introducción de la Criptografía de clave pública. El subtítulo de dicho artículo es “Criptografía y Teoría de la Complejidad: un emparejamiento hecho en el cielo”. Esta idea aparece también expresada por Koblitz, que plantea la importancia de propuestas en criptografía, aunque no sean prácticas ni aplicables eventualmente. Las cuatro razones esgrimidas para ello son: 1. Pueden dar origen a nuevas cuestiones matemáticas o generar nuevos puntos de vista sobre teorías anteriores. 2. Pueden sugerir nuevas líneas de investigación en aspectos teóricos de Ciencias de la Computación y arrojar luz sobre las interrelaciones entre clases de complejidad. 3. Pueden ser un medio de popularizar matemáticas y Ciencias de la computación. 4. Pueden ser un medio efectivo para la enseñanza a niveles no-universitarios. Por tanto los matemáticos han jugado y están llamados a jugar un importante papel en la seguridad de la información. Y al mismo tiempo, la fructífera relación con Ciencias de la Computación debe ser cuidada, mantenida y estimulada.

0
0
Sistema Binario (muy completo)
Sistema Binario (muy completo)
InfoporAnónimoFecha desconocida

Sistema binario El sistema binario, en matemáticas e informática, es un sistema de numeración en el que los números se representan utilizando solamente las cifras cero y uno (0 y 1). Es el que se utiliza en los ordenadores, pues trabajan internamente con dos niveles de voltaje, por lo que su sistema de numeración natural es el sistema binario (encendido 1, apagado 0). Historia del sistema binario El antiguo matemático hindú Pingala presentó la primera descripción que se conoce de un sistema de numeración binario en el siglo tercero antes de nuestra era, lo cual coincidió con su descubrimiento del concepto del número cero. Una serie completa de 8 trigramas y 64 hexagramas (análogos a 3 bit) y números binarios de 6 bit, eran conocidos en la antigua china en el texto clásico del I Ching. Series similares de combinaciones binarias también han sido utilizados en sistemas de adivinación tradicionales africanos, como el Ifá, así como en la geomancia medieval occidental. Un arreglo binario ordenado de los hexagramas del I Ching, representando la secuencia decimal de 0 a 63, y un método para generar el mismo, fue desarrollado por el erudito y filósofo Chino Shao Yong en el siglo XI. Sin embargo, no hay ninguna prueba de que Shao entendió el cómputo binario. En 1605 Francis Bacon habló de un sistema por el cual las letras del alfabeto podrían reducirse a secuencias de dígitos binarios, la cuales podrían ser codificados como variaciones apenas visibles en la fuente de cualquier texto arbitrario. El sistema binario moderno fue documentado en su totalidad por Leibniz, en el siglo diecisiete, en su artículo "Explication de l'Arithmétique Binaire". En él se mencionan los símbolos binarios usados por matemáticos chinos. Leibniz usó el 0 y el 1, al igual que el sistema de numeración binario actual. En 1854, el matemático británico George Boole, publicó un artículo que marcó un antes y un después, detallando un sistema de lógica que terminaría denominándose Álgebra de Boole. Dicho sistema desempeñaría un papel fundamental en el desarrollo del sistema binario actual, particularmente en el desarrollo de circuitos electrónicos. Aplicaciones En 1937, Claude Shannon realizó su tesis doctoral en el MIT, en la cual implementaba el Álgebra de Boole y aritmética binaria utilizando relés y conmutadores por primera vez en la historia. Titulada Un Análisis Simbólico de Circuitos Conmutadores y Relés, la tesis de Shannon básicamente fundó el diseño práctico de circuitos digitales. En noviembre de 1937, George Stibitz, trabajando por aquel entonces en los Laboratorios Bell, construyó un ordenador basado en relés - al cual apodó "Modelo K" (porque lo construyó en una cocina, en inglés "kitchen"- que utilizaba la suma binaria para realizar los cálculos. Los Laboratorios Bell autorizaron un completo programa de investigación a finales de 1938, con Stibitz al mando. El 8 de enero de 1940 terminaron el diseño de una Calculadora de Números Complejos, la cual era capaz de realizar cálculos con números complejos. En una demostración en la conferencia de la Sociedad Americana de Matemáticas, el 11 de septiembre de 1940, Stibitz logró enviar comandos de manera remota a la Calculadora de Números Complejos a través de la línea telefónica mediante un teletipo. Fue la primera máquina computadora utilizada de manera remota a través de la línea de teléfono. Algunos participantes de la conferencia que presenciaron la demostración fueron John Von Neumann, John Mauchly y Norbert Wiener, el cual escribió acerca de dicho suceso en sus diferentes tipos de memorias en la cual alcanzó diferentes logros. Véase también: Código binario Representación Un número binario puede ser representado por cualquier secuencia de bits (dígitos binarios), que a su vez pueden ser representados por cualquier mecanismo capaz de estar en dos estados mutuamente exclusivos. Las secuencias siguientes de símbolos podrían ser interpretadas todas como el mismo valor binario numérico: 1 0 1 0 0 1 1 0 1 0 | - | - - | | - | - x o x o o x x o x o y n y n n y y n y n El valor numérico representado en cada caso depende del valor asignado a cada símbolo. En un ordenador, los valores numéricos pueden ser representados por dos voltajes diferentes y también se pueden usar polaridades magnéticas sobre un disco magnético. Un "positivo", "sí", o "sobre el estado" no es necesariamente el equivalente al valor numérico de uno; esto depende de la arquitectura usada. De acuerdo con la representación acostumbrada de cifras que usan números árabes, los números binarios comúnmente son escritos usando los símbolos 0 y 1. Cuando son escritos, los números binarios son a menudo subindicados, prefijados o sufijados para indicar su base, o la raíz. Las notaciones siguientes son equivalentes: * 100101 binario (declaración explícita de formato) * 100101b (un sufijo que indica formato binario) * 100101B (un sufijo que indica formato binario) * bin 100101 (un prefijo que indica formato binario) * 1001012 (un subíndice que indica base 2 (binaria) notación) * %100101 (un prefijo que indica formato binario) * 0b100101 (un prefijo que indica formato binario, común en lenguajes de programación) Conversión entre binario y decimal Decimal a binario Se divide el número del sistema decimal entre 2, cuyo resultado entero se vuelve a dividir entre 2, y así sucesivamente. Ordenados los restos, del último al primero, este será el número binario que buscamos. Ejemplo Transformar el número decimal 131 en binario. El método es muy simple: 131 dividido por 2 da 65 y el resto es igual a 1 65 dividido por 2 da 32 y el resto es igual a 1 32 dividido por 2 da 16 y el resto es igual a 0 16 dividido por 2 da 8 y el resto es igual a 0 8 dividido por 2 da 4 y el resto es igual a 0 4 dividido por 2 da 2 y el resto es igual a 0 2 dividido por 2 da 1 y el resto es igual a 0 1 dividido por 2 da 0 y el resto es igual a 1 -> Ordenamos los restos, del último al primero: 10000011 en sistema binario, 131 se escribe 10000011 Ejemplo Transformar el número decimal 100 en binario. Archivo:Conversion.JPG Otra forma de conversión consiste en un método parecido a la factorización en números primos. Es relativamente fácil dividir cualquier número entre 2. Este método consiste también en divisiones sucesivas. Dependiendo de si el número es par o impar, colocaremos un cero o un uno en la columna de la derecha. Si es impar, le restaremos uno y seguiremos dividiendo entre dos, hasta llegar a 1. Después sólo nos queda tomar el último resultado de la columna izquierda (que siempre será 1) y todos los de la columna de la derecha y ordenar los dígitos de abajo a arriba. Ejemplo 100|0 50|0 25|1 --> 1, 25-1=24 y seguimos dividiendo por 2 12|0 6|0 3|1 1|1 --> (100)10 = (1100100)2 Existe un último método denominado de distribución. Consiste en distribuir los unos necesarios entre las potencias sucesivas de 2 de modo que su suma resulte ser el número decimal a convertir. Sea por ejemplo el número 151, para el que se necesitarán las 8 primeras potencias de 2, ya que la siguiente, 28=256, es superior al número a convertir. Se comienza poniendo un 1 en 128, por lo que aún faltarán 23, 151 - 128 = 23, para llegar al 151. Este valor se conseguirá distribuyendo unos entre las potencias cuya suma de el resultado buscado y poniendo ceros en el resto. En el ejemplo resultan ser las potencias 4, 2, 1 y 0, esto es, 16, 4, 2 y 1, respectivamente. Ejemplo 20= 1|1 21= 2|1 22= 4|1 23= 0 24= 16|1 25= 32|0 26= 64|0 27= 121 128 + 16 + 4 + 2 + 1 = (151)10 = (10010111)2 Decimal (con decimales) a binario Para transformar un número del sistema decimal al sistema binario: 1. Se inicia por el lado izquierdo, multiplicando cada número por 2 (si la parte entera es mayor que 0 en binario será 1, y en caso contrario es 0) 2. En caso de ser 1, en la siguiente multiplicación se utilizan sólo los decimales. 3. Después de realizar cada multiplicación, se colocan los números obtenidos en el orden de su obtención. 4. Algunos números se transforman en dígitos periódicos, por ejemplo: el 0,1 Ejemplo 0,3125 (decimal) => 0,0101 (binario). Proceso: 0,3125 x 2 = 0,625 => 0 0,625 x 2 = 1,25 => 1 0,25 x 2 = 0,5 => 0 0,5 x 2 = 1 => 1 En orden: 0101 -> 0,0101 (binario) Ejemplo 0,1 (decimal) => 0,0 0011 0011 ... (binario). Proceso: 0,1 x 2 = 0,2 => 0 0,2 x 2 = 0,4 => 0 0,4 x 2 = 0,8 => 0 0,8 x 2 = 1,6 => 1 0,6 x 2 = 1,2 => 1 0,2 x 2 = 0,4 => 0 <- se repiten las cuatro cifras, periódicamente 0,4 x 2 = 0,8 => 0 <- 0,8 x 2 = 1,6 => 1 <- 0,6 x 2 = 1,2 => 1 <- ... En orden: 0 0011 0011 ... Binario a decimal Para realizar la conversión de binario a decimal, realice lo siguiente: 1. Inicie por el lado derecho del número en binario, cada número multiplíquelo por 2 y elévelo a la potencia consecutiva (comenzando por la potencia 0). 2. Después de realizar cada una de las multiplicaciones, sume todas y el número resultante será el equivalente al sistema decimal. Ejemplos: * (Los números de arriba indican la potencia a la que hay que elevar 2) \overset{5}{\mathop{1}}\,\overset{4}{\mathop{1}}\,\overset{3}{\mathop{0}}\,\overset{2}{\mathop{1}}\,\overset{1}{\mathop{0}}\,\overset{0}{\mathop{1}}\,_{2}=1\cdot 2^{5}+1\cdot 2^{4}+0\cdot 2^{3}+1\cdot 2^{2}+0\cdot 2^{1}+1\cdot 2^{0}=32+16+0+4+0+1=53 \overset{7}{\mathop{1}}\,\overset{6}{\mathop{0}}\,\overset{5}{\mathop{0}}\,\overset{4}{\mathop{1}}\,\overset{3}{\mathop{0}}\,\overset{2}{\mathop{1}}\,\overset{1}{\mathop{1}}\,\overset{0}{\mathop{1}}\,_{2}=1\cdot 2^{7}+0\cdot 2^{6}+0\cdot 2^{5}+1\cdot 2^{4}+0\cdot 2^{3}+1\cdot 2^{2}+1\cdot 2^{1}+1\cdot 2^{0}=128+0+0+16+0+4+2+1=151 \overset{5}{\mathop{1}}\,\overset{4}{\mathop{1}}\,\overset{3}{\mathop{0}}\,\overset{2}{\mathop{1}}\,\overset{1}{\mathop{1}}\,\overset{0}{\mathop{1}}\,_{2}=1\cdot 2^{5}+1\cdot 2^{4}+0\cdot 2^{3}+1\cdot 2^{2}+1\cdot 2^{1}+1\cdot 2^{0}=32+16+0+4+2+1=55 También se puede optar por utilizar los valores que presenta cada posición del número binario a ser transformado, comenzando de derecha a izquierda, y sumando los valores de las posiciones que tienen un 1. Ejemplo El número binario 1010010 corresponde en decimal al 82 se puede representar de la siguiente manera: \overset{64}{\mathop{1}}\,\overset{32}{\mathop{0}}\,\overset{16}{\mathop{1}}\,\overset{8}{\mathop{0}}\,\overset{4}{\mathop{0}}\,\overset{2}{\mathop{1}}\,\overset{1}{\mathop{0}}\,_{2} entonces se suma los números 64, 16 y 2: \overset{64}{\mathop{1}}\,\overset{32}{\mathop{0}}\,\overset{16}{\mathop{1}}\,\overset{8}{\mathop{0}}\,\overset{4}{\mathop{0}}\,\overset{2}{\mathop{1}}\,\overset{1}{\mathop{0}}\,_{2}=64+16+2=82 Para cambiar de binario con decimales a decimal se hace exactamente igual, salvo que la posición cero (la que el dos es elevado a la cero) es la que está a la izquierda de la coma y se cuenta hacia la derecha a partir de -1: \begin{align} & \overset{5}{\mathop{1}}\,\overset{4}{\mathop{1}}\,\overset{3}{\mathop{0}}\,\overset{2}{\mathop{1}}\,\overset{1}{\mathop{0}}\,\overset{0}{\mathop{1}}\,,\overset{-1}{\mathop{1}}\,\overset{-2}{\mathop{0}}\,\overset{-3}{\mathop{1}}\,=1\cdot 2^{5}+1\cdot 2^{4}+0\cdot 2^{3}+1\cdot 2^{2}+0\cdot 2^{1}+1\cdot 2^{0}+1\cdot 2^{-1}+0\cdot 2^{-2}+1\cdot 2^{-3}= \\ & =32+16+0+4+0+1+\frac{1}{2^{1}}+\frac{1}{2^{2}}+\frac{1}{2^{3}}=32+16+0+4+0+1+0,5+0+0,125=53,625 \\ \end{align} Binario a decimal (con decimal binario) 1. Inicie por el lado izquierdo, cada número multiplíquelo por 2 y elévelo a la potencia consecutiva a la inversa(comenzando por la potencia -1). 2.Después de realizar cada una de las multiplicaciones, sume todas y el número resultante será el equivalente al sistema decimal. Ejemplos * 0.101001 (binario) = 0.640625(decimal). Proceso: 1*(2) elevado a (-1)=0.5 0*(2) elevado a (-2)=0 1*(2) elevado a (-3)=0.125 0*(2) elevado a (-4)=0 0*(2) elevado a (-5)=0 1*(2) elevado a (-6)=0.015625 La suma es: 0.640625 * 0.110111 (binario) = 0.859375(decimal). Proceso: 1*(2) elevado a (-1)=0.5 1*(2) elevado a (-2)=0.25 0*(2) elevado a (-3)=0 1*(2) elevado a (-4)=0.0625 1*(2) elevado a (-5)=0.03125 1*(2) elevado a (-6)=0.015625 La suma es: 0.859375 Operaciones con números binarios Suma de números Binarios Las posibles combinaciones al sumar dos bits son: * 0 + 0 = 0 * 0 + 1 = 1 * 1 + 0 = 1 * 1 + 1 = 10 al sumar 1+1 siempre nos llevamos 1 a la siguiente operación. Ejemplo 10011000 + 00010101 ——————————— 10101101 Se puede convertir la operación binaria en una operación decimal, resolver la decimal, y después transformar el resultado en un (número) binario. Operamos como en el sistema decimal: comenzamos a sumar desde la derecha, en nuestro ejemplo, 1 + 1 = 10, entonces escribimos 0 en la fila del resultado y llevamos 1 (este "1" se llama acarreo o arrastre). A continuación se suma el acarreo a la siguiente columna: 1 + 0 + 0 = 1, y seguimos hasta terminar todas la columnas (exactamente como en decimal). Resta de números binarios El algoritmo de la resta en sistema binario es el mismo que en el sistema decimal. Pero conviene repasar la operación de restar en decimal para comprender la operación binaria, que es más sencilla. Los términos que intervienen en la resta se llaman minuendo, sustraendo y diferencia. Las restas básicas 0 - 0, 1 - 0 y 1 - 1 son evidentes: * 0 - 0 = 0 * 1 - 0 = 1 * 1 - 1 = 0 * 0 - 1 = 1 (se transforma en 10 - 1 = 1) (en sistema decimal equivale a 2 - 1 = 1) La resta 0 - 1 se resuelve, igual que en el sistema decimal, tomando una unidad prestada de la posición siguiente: 0 - 1 = 1 y me llevo 1, lo que equivale a decir en el sistema decimal, 2 - 1 = 1. Ejemplos 10001 11011001 -01010 -10101011 —————— ————————— 00111 00101110 En sistema decimal sería: 17 - 10 = 7 y 217 - 171 = 46. Para simplificar las restas y reducir la posibilidad de cometer errores hay varios métodos: * Dividir los números largos en grupos. En el siguiente ejemplo, vemos cómo se divide una resta larga en tres restas cortas: 100110011101 1001 1001 1101 -010101110010 -0101 -0111 -0010 ————————————— = ————— ————— ————— 010000101011 0100 0010 1011 * Utilizando el complemento a dos (C2). La resta de dos números binarios puede obtenerse sumando al minuendo el «complemento a dos» del sustraendo. Ejemplo La siguiente resta, 91 - 46 = 45, en binario es: 1011011 1011011 -0101110 el C2 de 0101110 es 1010010 +1010010 ———————— ———————— 0101101 10101101 En el resultado nos sobra un bit, que se desborda por la izquierda. Pero, como el número resultante no puede ser más largo que el minuendo, el bit sobrante se desprecia. Un último ejemplo: vamos a restar 219 - 23 = 196, directamente y utilizando el complemento a dos: 11011011 11011011 -00010111 el C2 de 00010111 es 11101001 +11101001 ————————— ————————— 11000100 111000100 Y, despreciando el bit que se desborda por la izquierda, llegamos al resultado correcto: 11000100 en binario, 196 en decimal. * Utilizando el complemento a uno. La resta de dos números binarios puede obtenerse sumando al minuendo el complemento a uno del sustraendo y a su vez sumarle el bit que se desborda. Producto de números binarios El algoritmo del producto en binario es igual que en números decimales; aunque se lleva cabo con más sencillez, ya que el 0 multiplicado por cualquier número da 0, y el 1 es el elemento neutro del producto. Por ejemplo, multipliquemos 10110 por 1001: 10110 1001 ————————— 10110 00000 00000 10110 ————————— 11000110 En sistemas electrónicos, donde suelen usarse números mayores, se utiliza el método llamado algoritmo de Booth. 11101111 111011 __________ 11101111 11101111 00000000 11101111 11101111 11101111 ______________ 11011100010101 División de números binarios La división en binario es similar a la decimal, la única diferencia es que a la hora de hacer las restas, dentro de la división, estas deben ser realizadas en binario. Ejemplo Dividir 100010010 (274) entre 1101 (13): 100010010 |1101 —————— - 0000 010101 ——————— 10001 - 1101 ——————— 01000 - 0000 ——————— 10000 - 1101 ——————— 00111 - 0000 ——————— 01110 - 1101 ——————— 00001 Conversión entre binario y octal Binario a octal Para realizar la conversión de binario a octal, realice lo siguiente: 1) Agrupe la cantidad binaria en grupos de 3 en 3 iniciando por el lado derecho. Si al terminar de agrupar no completa 3 dígitos, entonces agregue ceros a la izquierda. 2) Posteriormente vea el valor que corresponde de acuerdo a la tabla: Número en binario 000 001 010 011 100 101 110 111 Número en octal 0 1 2 3 4 5 6 7 3) La cantidad correspondiente en octal se agrupa de izquierda a derecha. Ejemplos * 110111 (binario) = 67 (octal). Proceso: 111 = 7 110 = 6 Agrupe de izquierda a derecha: 67 * 11001111 (binario) = 317 (octal). Proceso: 111 = 7 001 = 1 11 entonces agregue un cero, con lo que se obtiene 011 = 3 Agrupe de izquierda a derecha: 317 * 1000011 (binario) = 103 (octal). Proceso: 011 = 3 000 = 0 1 entonces agregue 001 = 1 Agrupe de izquierda a derecha: 103 Octal a binario Cada dígito octal se lo convierte en su binario equivalente de 3 bits y se juntan en el mismo orden. Ejemplo * 247 (octal) = 010100111 (binario). El 2 en binario es 10, pero en binario de 3 bits es Oc(2) = B(010); el Oc(4) = B(100) y el Oc(7) = (111), luego el número en binario será 010100111. Conversión entre binario y hexadecimal Binario a hexadecimal Para realizar la conversión de binario a hexadecimal, realice lo siguiente: 1) Agrupe la cantidad binaria en grupos de 4 en 4 iniciando por el lado derecho. Si al terminar de agrupar no completa 4 dígitos, entonces agregue ceros a la izquierda. 2) Posteriormente vea el valor que corresponde de acuerdo a la tabla: Número en binario 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Número en hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F 3) La cantidad correspondiente en hexadecimal se agrupa de derecha a izquierda. Ejemplos * 110111010 (binario) = 1BA (hexadecimal). Proceso: 1010 = A 1011 = B 1 entonces agregue 0001 = 1 Agrupe de derecha a izquierda: 1BA * 11011110101 (binario) = 6F5 (hexadecimal). Proceso: 0101 = 5 1111 = F 110 entonces agregue 0110 = 6 Agrupe de derecha a izquierda: 6F5 Hexadecimal a binario Ídem que para pasar de octal a binario, sólo que se remplaza por el equivalente de 4 bits, como de octal a binario. Tabla de conversión entre decimal, binario, hexadecimal, octal, BCD, Exceso 3 y Código Gray o Reflejado Decimal Binario Reflejado | 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111 01000001 A 01000010 B 01000011 C 01000100 D 01000101 E 01000110 F 01000111 G 01001000 H 01001001 I 01001010 J 01001011 K 01001100 L 01001101 M 01001110 N 01001111 O 01010000 P 01010001 Q 01010010 R 01010011 S 01010100 T 01010101 U 01010110 V 01010111 W 01011000 X 01011001 Y 01011010 Z 01001000 01001111 01001100 01000001 H________O________l________A 01010100 01000001 01010010 01001001 01001110 01000111 01000001 T_______A_________R________I________N________G_______A

7
5
P
Programar en batch(.bat) rapido y sencillo
InfoporAnónimo12/2/2009

Necesitaremos: -Bloc de notas Así quedaria el principio: Ante todo decir que esto es un manual de introducción y no un manual para expertos. ¿Qué es Batch? Un archivo batch (o bat) es un archivo de procesamiento por lotes: se trata de archivos de texto sin formato, guardados con la extensión .bat que contienen un conjunto de comandos DOS. Cuando se ejecuta este archivo bat, los comandos contenidos son ejecutados en grupo, de forma secuencial, permitiendo automatizar diversas tareas. Cualquier comando DOS puede ser utilizado en un archivo batch. Tienes también varios comandos especiales para este tipo de archivos. ¿Qué es un Comando? Es una orden que le damos al sistema operativo para que haga una tarea determinada. Ya sabeis lo necesario...ahora empecemos. Siempre que termineis un programa, debeis de cambiarle la extensión .txt por .bat SIEMPRE y cuando digo SIEMPRE es SIEMPRE que inicies un programa .bat se iniciara con: @echo off Este comando, deshabilita el echo para que no muestre los comandos, que se ejecutaran posteriormente. Asi será como siempre comenzaremos el programa. Ahora, para ponerle un titulo a la ventana tenemos que escribir este comando: title **TITULO** Sustituyendo **TITULO** por lo que quieras poner de titulo. Así quedaria el principio: @echo off title Mi Primer Programa Seguimos con más comandos.. Para mostrar un mensaje en la ventana, debeis escribir este comando: echo **MENSAJE** Sustituyendo **MENSAJE** por lo que quieras poner en el mensaje. Para dejar un espacio de linea en el programa. Es lo equivalente a pulsar intro en el Word hay que escribir este comando: echo. Para poner un automensaje, es decir, tan solo se vera en el modo edición, donde estamos ahora, en el bloc de notas...(suele escribirse para hacer tus aclaraciones) debemos escribir este comando: rem **ACLARACIÓN** Sustituyendo **ACLARACIÓN** por lo que quieras aclararte. Bien, un ejemplo con todos estos comandos: @echo off rem esto es el principio title HOLA rem esto es el titulo echo Hola qué tal? rem esto es un simple mensaje echo. rem bajo la linea echo Jejeje rem otro mensaje ¿Lo entendeis? Es sencillo no?? bien, sigamos.. Para hacer una pausa y que te diga el programa "Pulse una tecla para continuar..." debeis escribir este comando: pause Si en cambio, lo que quereis es que haga una pausa, pero no diga nada el programa, y que siga al pulsar una tecla, pero sin decirte nada, debeis escribir este comando: pause > nul Si quereis acabar el programa y que salga de la ventana, debeis escribir este comando: exit Bien, dicho todo esto, podemos ya hacer un programita... EJEMPLO @echo off title hola echo jeje echo. echo jeje pause echo lo estais entendiendo todo? pause > nul rem hasta aqui todo exit Ahora, compliquemos un poquito la cosa...las variables. Una variable, es una especie de memoria a la que podemos asignarle un dato, para hacerle referencia más adelante. Para entenderlo, un ejemplo: EJEMPLO @echo off title ejemplo variable set var=hola %var% qué tal? pause exit La variable se hace con este comando: set var=**LA VARIABLE** Sustituyendo **LA VARIABLE** por lo que querais... y después haciendole referencia con este otro comando: %var% Hemos puesto var como ejemplo, pero también puedes hacerlo asi: set **PALABRA**=**LA VARIABLE** Sustituyendo **PALABRA* y *LA VARIABLE** por lo que querais... y después haciendole referencia con este otro comando: %**PALABRA QUE HAYAIS PUESTO**% Sustituyendo **PALABRA QUE HAYAIS PUESTO** por la palabra puesta anteriormente... Un ejemplo de variable: @echo off echo hola echo. set var=hola set jeje=papa %var% %jeje% exit En este código donde puse %var% %jeje% aparecerá hola papa Ahora vamos a otro tipo de variables, son muy parecidas, estan hacen que puedas escribir algo y él ejecutador te responda...un ejemplo: @echo off title ejemplo variables2 set/p=¿como te llamas? echo. pause echo. set/p edad=¿y cuantos años tienes? echo. pause echo. echo te llamas %nombre% y tienes %edad% años echo. pause > nul exit ¿¿Lo entendeis?? Es exactamente igual, escribimos el codigo: set/p **VARIABLE**=**PREGUNTA, TEXTO, ETC..** Sustituyendo **VARIABLE** por lo que querais y **PREGUNTA, TEXTO, ETC..** por la pregunta, texto, etc que querais que le aparezca... Y Después le haceis referencia así: %**VARIABLE PUESTA ANTERIORMENTE**% Sustituyendo **VARIABLE PUESTA ANTERIORMENTE** por la variable puesta anteriormente... Vayamos con otro comando, este, sirve para limpiar lo anterior escrito en pantalla, es decir, elimina de la vision del ejecutador lo anterior...es este: cls Ejemplo: @echo off title hola echo hola echo. echo qué tal? echo. cls pause exit ¿Fácil no? Ahora vamos con los códigos de los colores, para la ventana.. 0 = Negro 1 = Azul 2 = Verde 3 = Aguamarina 4 = Rojo 5 = Púrpura 6 = Amarillo 7 = Blanco 8 = Gris 9 = Azul claro A = Verde claro B = Aguamarina claro C = Rojo claro D = Púrpura claro E = Amarillo claro F = Blanco brillante Un ejemplo de como aplicarlos: @echo off title hola color 5E echo hola exit Seria asi el comando: color **COLOR VENTANA****COLOR LETRA** Sustituyendo **COLOR VENTANA** por el color de fondo y **COLOR LETRA** por el color de la letra...por ejemplo color 6C o color F1... Ahora vamos con nuevas variables...es para operaciones matemáticas...se expresa asi: set/a **VARIABLE**=**PREGUNTA, TEXTO, ETC..** Mejor ver un ejemplo: @echo off title ejemplo set/p a=¿cual es tu nota en matematicas? cls set/p b=¿cual es tu nota en tecnologia? cls set/p c=¿cual es tu nota en lengua? cls set/p d= ¿cual es tu nota en ingles? cls set/p e=¿cual es tu nota en sociales? cls set/p f=¿cual es tu nota en dibujo? cls set asig=6 rem esto que acabo de poner es para sacar una media, al valor asig le asignamos 6, porque son 6 las preguntas.. set/a suma=a+b+c+d+e+f rem aqui sumamos set/a media=%suma%/%asig% rem aqui sacamos la media dividiendo suma que es = a+b+c+d+e+f que es el resultado puesto por el ejecutante entre asig, que es = 6, y asi, sacamos la media... echo tu nota media es de : %media% pause exit ¿¿Lo habeis entendido?? Ahora vamos con el if, menus y gotos.. Para hacer menus en nuestro bat, debeis utilizar este comando: :**NOMBRE MENU** Sustituyendo **NOMBRE MENU** por el nombre del menu...ejemplo; :menu1 o :menu2 .. Para dar saltos de menus a menus, se utiliza este comando: goto **NOMBRE MENU** Sustituyendo **NOMBRE MENU** por el nombre del menu al que queremos saltar.. Para establecer una condicion, como...si esto se cumple haz esto, y si no se cumple, haz lo otro utilizamos el comando if, es algo complejo, os lo explico: Primero se le da un valor al variable: set/p **VARIABLE**=**PREGUNTA, TEXTO, ETC..** Sustituyendo **VARIABLE** por lo que querais y **PREGUNTA, TEXTO, ETC..** por la pregunta, texto, etc que querais que le aparezca... Y Después le haceis referencia así: %**VARIABLE PUESTA ANTERIORMENTE**% Sustituyendo **VARIABLE PUESTA ANTERIORMENTE** por la variable puesta anteriormente... Y Despues se ponen las condiciones: If %**VARIABLE PUESTA ANTERIORMENTE**%==**RESPUESTA** goto *NOMBRE MENU** If %**VARIABLE PUESTA ANTERIORMENTE**% LSS **RESPUESTA** goto *NOMBRE MENU** If %**VARIABLE PUESTA ANTERIORMENTE**% GTR **RESPUESTA** goto *NOMBRE MENU** If %**VARIABLE PUESTA ANTERIORMENTE**% LEQ **RESPUESTA** goto *NOMBRE MENU** If %**VARIABLE PUESTA ANTERIORMENTE**% GEQ **RESPUESTA** goto *NOMBRE MENU** Cuando es == es si la variable puesta anteriormente es igual a la respuesta ve a este menu Cuando es LSS es si la variable puesta anteriormente es menor a la respuesta ve a este menu Cuando es GTR es si la variable puesta anteriormente es mayor a la respuesta ve a este menu Cuando es LEQ es si la variable puesta anteriormente es menor o igual a la respuesta ve a este menu Cuando es GTR es si la variable puesta anteriormente es mayor o igual a la respuesta ve a este menu Un ejemplo de adivinanza de número: @echo off title ejemplo :menu cls echo debes averiguar el numero para poder salir echo. set /p var=pon un numero: If %var%==5 goto si If %var% LSS 5 goto menor If %Var% GTR 5 goto mayor :si cls echo correcto!! pause goto salir :menor cls echo elije otro mas alto echo. echo sigue jugando pause > nul goto menu :mayor echo elije otro mas pequeño echo. echo sigue probando pause > nul goto menu :salir exit Tambien pueden usar el comando if not que hace lo contrario que el if. En vez de decir SI pasa esto....haz esto, lo que hace es decir, SI NO pasa esto...haz esto. Si en vez de escribir un número lo que hace es escribir letras, pasará a la siguiente linea...pero no os preocupeis, esto, tiene solucion....con el comando else.. EJEMPLO : if %vari%=1 (goto menu1) else goto menu2 Esto quiere decir que si la variable es = a 1 va al menu 1, y si no, va al menu 2, la primera accion SIEMPRE debe ir entre parentesis... Sigamos... Para eliminar archivos pidiendote confirmacion es este comando: del /p **RUTA ARCHIVO** Sustituyendo **RUTA ARCHIVO** por la ruta del archivo a querer borrar.. Para eliminar archivos a la fuerza, y hasta los que estan "en solo lectura" es este comando: del /f **RUTA ARCHIVO** Sustituyendo **RUTA ARCHIVO** por la ruta del archivo a querer borrar.. Para eliminar archivos y los subdirectorios es este comando: del /s**RUTA ARCHIVO** Sustituyendo **RUTA ARCHIVO** por la ruta del archivo a querer borrar.. Para eliminar archivos silenciosamente, es decir, sin pedir confirmación, es este comando: del /q**RUTA ARCHIVO** Sustituyendo **RUTA ARCHIVO** por la ruta del archivo a querer borrar.. Tambien se pueden unir en todas las combinaciones que querais: del /q /s**RUTA ARCHIVO** Sustituyendo **RUTA ARCHIVO** por la ruta del archivo a querer borrar.. Para comenzar algo, como por ejemplo, una web, es este comando: star **DIRECCION WEB** Sustituyendo **DIRECCION WEB** por la web. Para matar un proceso, es este comando: taskkill **NOMBRE PROCESO** Sustituyendo **NOMBRE PROCESO** por el nombre del proceso.. Para formatear una unidad, es este comando: Format **UNIDAD** Sustituyendo **UNIDAD** por el nombre de la unidad, como c: por ejemplo. Para enviar un mensaje en una ventana de windows es este comando: msg* **MENSAJE** Sustituyendo **MENSAJE** por el mensaje.. Ahora el caracter * Si ponemos: del *.jpg eliminará todos los archivos con la extension .jpg Si ponemos: a*.jpg eliminará todos los archivos que empiecen por a y tengan extension .jpg.. Para reiniciar el ordenador es este comando: shutdown -r Para apagar el ordenador es este comando: shutdown -s Para cerrar todos los programas es este comando: shutdown -f Para indicar un tiempo de realizacion a un valor anterior es este comando: shutdown -**r/s/t SEGUN LA PREFERENCIA** -t **TIEMPO EN SEGUNDOS** Sustituyendo **r/s/t SEGUN LA PREFERENCIA** por r, s o f.. y **TIEMPO EN SEGUNDOS** por el tiempo de espera a realizar la accion, en segundos.. Bueno yo creo que no queda mucho más por explicar, conforme vaya yo aprendiendo os lo explicare.

50
7
P
Pequeña maravilla de las matemáticas: el código ISBN
InfoporAnónimo12/2/2009

Pequeña maravilla de las matemáticas: el código ISBN ISBN Por Occhi45 Tome un libro cualquiera. Fíjese en la parte de atrás (o algunas veces en alguna de las primeras páginas pares). Usted va a encontrar un número como el siguiente: 1-84046-637-5 Este número o código se llama ISBN, o sea (International Standard Book Number), es decir, un número que internacionalmente se asocia con el libro). Esta sucesión de diez dígitos identifica al libro. Bárbaro. Pero ¿qué más? Uno podría decir que el primer dígito (o los primeros) identifica(n) el país de origen, que los siguientes indican la editorial, el título, la edición, etc. Y esto estaría bien. Pero aún no sería suficiente para merecer un comentario aparte. Lo notable es que el ISBN tiene propiedades escondidas que lo hacen muy interesante. Más aún: no todos los números de 10 cifras pueden ser códigos ISBN válidos. Olvídese de los guiones que separan los dígitos. Hagamos de cuenta que el número es: 1 8 4 0 4 6 6 3 7 5 Uno los pone en una columna y agrega, en otra columna, los números del 1 al 10. Y los aparea (o sea, los va poniendo en el mismo renglón), y se obtiene entonces, la siguiente situación: 1 1 8 2 4 3 0 4 4 5 6 6 6 7 3 8 7 9 5 10 Una vez hecho esto, multiplique los números de cada renglón. Se tiene los siguientes resultados que ponemos en una tercera columna. 1 x 1 = 1 8 x 2 = 16 4 x 3 = 12 0 x 4 = 0 4 x 5 = 20 6 x 6 = 36 6 x 7 = 42 3 x 8 = 24 7 x 9 = 63 5 x 10 = 50 Luego, sume los valores de la última columna. En este caso, se obtiene el número 264. Ahora, una breve pausa. Acá aparece la clave de lo que estamos haciendo. ¡Este número tiene que ser siempre un múltiplo de 11! Y lo es. Justamente 264 = 11 x 24. Supongamos que alguien quiere encargar libros para una biblioteca o para una librería. El pedido no lo hace basado en los títulos, ni en los autores, sino en el ISBN que cada uno tiene asignado. Si por alguna razón, al hacer la operación que figura más arriba (de aparear los dígitos que aparecen en el ISBN y luego multiplicarlos) el número resultante no es un múltiplo de 11, entonces eso implica que se produjo un error en el código ISBN que esa persona envió. Vale la pena que usted pruebe con cualquier libro que tenga en su casa o en su poder. Haga la cuenta y descubra usted mismo que lo que leyó hasta acá se verifica en la realidad. Con este proceso verdaderamente simple una persona (o una computadora) detecta inmediatamente el error en el pedido. Surgen varias preguntas: ¿por qué tiene que ser un múltiplo de 11? ¿Hay “algo” en el número 11 que lo haga diferente? La respuesta es sí. Hay razones para haber elegido al número 11. En principio, porque es un número primo. Pero, además, tome cualquier par de dígitos distintos (los dígitos son los números 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9). Ahora, réstelos. Nunca puede dar un múltiplo de 11 (¿se da cuenta por qué?). Y eso también terminará siendo importante, como verá más adelante si sigue leyendo. Un agregado interesante más. Uno de los problemas más comunes al escribir números de varios dígitos son las permutaciones o transposiciones. Es decir, es muy común que uno quiera escribir el número 3759 y sin embargo, escriba 3579, porque uno conmutó los dígitos 7 con el 5. Lo curioso, e interesante a la vez, es que el código ISBN permite descubrir en dónde puede estar el error, si es que uno produjo una transposición al enviar el ISBN de un libro. Primero, un ejemplo. Supongamos que el código ISBN que uno quiere mandar es: 1 8 4 0 4 6 6 3 7 5 pero comete un error, y transpone el 4 con el 8 en el segundo y tercer dígito. Es decir, un escribió por error el número: 1 4 8 0 4 6 6 3 7 5. Al hacer el apareamiento y multiplicación, como vimos más arriba, el número que resulta (y lo invito a que haga la cuenta solo/a) ahora, no es un múltiplo de 11. Es decir, con el ISBN correcto la suma de los números de la tercera columna resulta ser 264, que es un múltiplo de 11. En realidad, 264 = 11 x 24 En cambio, si uno suma los números de la tercera columna en el caso equivocado, obtiene el número 268 que no es un múltiplo de 11. Entonces, ya sabe que hay un error. Y éste es un avance no menor: usted ya sabe entonces que la persona que envió la lista de libros se equivocó en este seguro. Y eso uno lo sabe porque no le dio un múltiplo de 11. Ahora bien: ¿puede avanzar más? ¿Puede detectar en qué lugar se produjo el error y repararlo? ¿Habrá sido una permutación de dos dígitos? Veamos. Al encolumnar los números ahora con los números transpuestos, aparece 1 x 1 = 1 4 x 2 = 8 8 x 3 = 24 0 x 4 = 0 4 x 5 = 20 6 x 6 = 36 6 x 7 = 42 3 x 8 = 24 7 x 9 = 63 5 x 10 = 50 Ahora, el total, es 268. Es decir, cuatro más que con el número correcto. Todo lo que hay que hacer ahora es fijarse en la primera columna y descubrir en qué lugar (o lugares) hay una diferencia de cuatro entre dígitos sucesivos y uno puede, entonces, intentar corregir el error. En este caso, habría dos posibles lugares: entre el segundo y el tercero (intercambiar el 4 con el 8, que es lo que habría que hacer para reparar el problema), o intentar con cuarto y quinto renglón. En este caso, uno tendría que intercambiar el cuatro con el cero. Uno produce esos cambios. Se fija si en la tercera columna, cuando usted suma, el número que resulta es –ahora sí– múltiplo de 11. Si no lo es, descarta el cambio y el sistema no le sirvió para descubrir el error. Si en cambio, el resultado sí es un múltiplo de 11, entonces trata de verificar si con ese cambio el ISBN ahora sí corresponde a algún libro que usted tenga en el stock. En general, este tipo de códigos que sirven para detectar errores, se llaman –en inglés– “error detecting codes”. Como se ve entonces, ese número tan ingenuo al que uno nunca le presta atención, el ISBN, permite no sólo clasificar todos los libros que se imprimen en el mundo, sino que con una adecuada utilización de la matemática es posible detectar (entre otras cosas) errores en los potenciales pedidos que hagan librerías o bibliotecas. fuente: http://www.pagina12.com.ar/diario/contratapa/13-113285-2008-10-14.html

1
0
E
Explicasion codigo binario (Resumido)
InfoporAnónimoFecha desconocida

Bueno, como un amigo me pidio si le podia enseñar prometi subir una explicacion sencilla aca de como aprender codigo binario, sea tanto para pasar a decimal o a letras (ASCII) Simplemente deben tener al dia matematicas (algo siempre presente para programadores) las operaciones no son complicadas pero hay que hacerlas rapido para ir entendiendo bien un texto. Antes que nada hay que aclarar que binario se lee de derecha a izquierda, es algo muy importante ! Primero pasemos un numero cualquiera a binario, tomemos por ejemplo el 33. Y ahora vamos diviendolo por 2 y anotando el resultado y el sobrante. ( / es igual a dividido) Tomando solamente numeros enteros, y hasta llegar a 1 que divido 2 es 0, con un sobrante de 1. 33/2 =igual= 16 (sobrante 1) 33/2 = 16 (1) 16/2 = 8 (0) 8/2 = 4 (0) 4/2 = 2 (0) 2/2 = 1 (0) 1/2 = 0 (1) Binario = Sobrantes = 100001 Ahora hay que completar (SIEMPRE)0 digitos, por eso agregamos dos veces el numero 0 a la izquierda adelante de todo, porque como dije… binario se lee de derecha a izquierda y los invertimos. Como es capicua sin agregar los dos 0 restantes no se notan, pero los sobrantes los escriben de abajo hacia arriba, o de arriba hacia abajo y luego lo invierten. Nuestro numero binario quedaria asi = 00100001 Ahora para pasar de la forma contraria la forma mas facil es tener en mente esta tablita: 128 – 64 – 32 – 16 – 8 – 4 – 2 – 1 Y simplemente ponen debajo el numero en binario. 128 – 64 – 32 – 16 – 8 – 4 – 2 – 1 0——-0—–1——0—0—0—0—1 (seguramente por la configuracion del blog se puede llegar a mover esto, pero entiendan que cada numero binario (1 o 0) corresponde a un numero de arriba (2,4,16,64, etc) Ahora simplemente, como si los binarios 1 tildaran una casilla y los 0 la destildaran, suman los numeros de arriba de la tabla que estan tildados o corresponden a un 1. 32 + 1 = 33 Simple, no ? Lo importante es tener en cuenta la tablita, con el tiempo lo van a hacer mucho mas rapido y diria que casi como si fuera algo normal, cuando lean codigo binario lo van a traducir instantaneamente en la cabeza como si fuera un idioma mas como el ingles, aleman, mandarin, etc. Bueno, ahora si quieren formar palabras se complica un poco mas, para esto deben saber el codigo ASCII, que no se los voy a explicar, pero les voy a dar una tablita en la cual pueden ver que letra corresponde que numero, y luego ese numero lo pasan a binario. Tabla ASCII Tabla ASCII Caracteres extendidos Simplemente en la parte izquierda de la tabla, tomemos por ejemplo las letras minisculas, el numero correspondiente es el que figura despues de &#. Por ejemplo la H que es 104. Si quieren recordar esta tablita facilmente, solo recuerden que empieza con el 97 y correspondiendole a cada letra comenzando obviamente por la a. Por ende: a 97 b 98 c 99 d 100 y asi…. Ahora simplemente pasan ese numero a binario, tomemos por ejemplo la palabra “hola” h = 104 o = 111 l = 108 a = 97 DECIMAL — BINARIO 104 01101000 111 01101111 108 01101100 97 01100001 Resultado = 01101000 01101111 01101100 01100001 (hola) Metodo inverso para convertir codigo binario a texto. Pasan de binario a ASCII, luego de ASCII a la letra y listo.

20
8
Que es un Algoritmo ( Resumido)
Que es un Algoritmo ( Resumido)
InfoporAnónimo12/5/2009

Algoritmos Un algoritmo es una serie de pasos lógicos, que se estructuran para resolver un problema. Generalmente un algoritmo se compone de sentencias simples y sentencias de control. Los algoritmos están delimitados por la palabras : INICIO y FIN Sentencias simples Asignación de variables Se le asigna un valor a una variable, a través del simbolo de flecha(<--) que dice que el valor a la derecha tiene que ser asignado a la variable que está a la izquierda. ej: a <-- 10 Se asigna un valor 10 a la variable a. Al escribir esta sentencia por primera vez en un algoritmo, da por entendido su declaración o creación. Comunmente al lado derecho de la flecha, se pueden realizar operaciones aritméticas (+,-,/,*), para que su resultado se le asigne a la variable. Además en estas operaciones se puede incluir la misma variable u otras. ejemplo : INICIO x <-- 5 y <-- 10 z <-- x + y z <-- y * x + 7 z <-- x/8 + y/9 + (7 + x/8) z <-- z + 1 z <-- z * z + y * y x <-- -x + -y + -3 FIN Ejemplo : determinar cuánto vale (a,b,c) después de las siguientes sentencias de asignación INICIO a <-- 2 b <-- a * 4 /* b <-- 2 * 4 = 8 */ a <-- b + 2 * a /* a <-- 8 + 2 * 2 = 12 */ b <-- 2 - a * b /* b <-- 2 - 12 * 8 = 2 - 96 = -94 */ a <-- a - b /* a <-- 12 - -94 = 12 + 94 = 106 */ b <-- -b + 6 /* b <-- --94 + 6 = 94 + 6 = 100 */ FIN Para seguir en forma ordenada, el cambio de valores en las variables, se utiliza una tabla llamada traza. a 2 --------------- b a 2 --------------- b 8 a 2 12 --------------- b 8 a 2 12 --------------- b 8 -94 a 2 12 106 ---------------- b 8 -94 100 valores finales : a = 106 , b = 100 Por lo tanto si se pide una traza, se debe mostrar la última tabla. Los pasos anteriores son sólo pasos explicativos. ejercicio : hacer la traza del siguiente algoritmo INICIO t <-- 1 p <-- 4 t <-- 3 * t p <-- p - 12 t <-- -t + 6 p <-- -p * -2 FIN valores finales : t = 3 y p = -16 Lectura de variables En muchos algoritmos, el valor de alguna variable debe ser introducido dinámicamente por el usuario a través del teclado o algún otro medio. A esa acción le llamaremos "leer", que consiste en la asignación del valor de entrada, a la variable correspondiente. ejemplo: INICIO a <-- 12 leer b a <-- a + b FIN Si se tiene que leer más de una variable, se pueden escribir usando el separado coma. Ej : Leer a, b, c /* lee en ese orden las variables a, b y c */ Declaración de una constante Si se necesita incluir en el algoritmo alguna constante, se debe seguir la misma metodología de la asignación de variables, pero con la limitación que el identificador debe estar escrito con letras mayúsculas y que la declaración se haga a continuación del inicio del algoritmo. Comentarios Todo comentario de alguna sentencia, debe ir entre los simbolos /* */. Los comentarios son útiles para explicar mejor alguna sentencia que puede estar no clara, para alguien que se enfrenta a las sentencias por primera vez. Ej : INICIO PI <-- 3.14 /* constante */ Leer radio area <-- 4 * PI * radio * radio /* area de una esfera */ FIN Comparaciones Para comparar dos variables se usará la siguiente nomenclatura : a < b /* esta sentencia es verdadera (true) si a es menor que b, y es falsa (false) en caso contrario */ a > b /* esta sentencia es verdadera (true) si a es mayor que b , y es falsa (false) en caso contrario */ a <= b /* esta sentencia es verdadera (true) si a es menor o igual que b, y ees falsa " " */ a >= b /* esta sentencia es verdadera (true) si a es mayor o igual que b , y es falsa " " */ a == b /* esta sentencia es verdadera si a tiene el mismo valor de b, y es falsa en caso contrario */ a != b /* esta sentencia es verdadera si a no tiene el mismo valor de b, y es falsa en caso contrario */ Método imprimir Se usara un método llamado "imprimir", para identificar una salida estándar (ej : pantalla o consola). El método consiste de la palabra "imprimir", seguido de un conjunto de argumentos, delimitado entre paréntesis. imprimir(..argumentos..) Los argumentos pueden ser de dos tipos : constantes alfanuméricas o variables. Si se quiere encadenar una constante con una variable, se debe usar el separador '+'. Ej: INICIO imprimir("Ingrese radio : " /* imprime el mensaje constante "Ingrese x : " */ leer radio imprimir("El valor del radio ingresado es : " + radio) /* se encadena lo constante con lo variable */ imprimir(r * 2) /* imprime el resultado de la operación aritmética */ FIN En el caso que la operación tenga el operador suma, se deben adicionar paréntesis para su correcta interpretación. Debe ser interpretado como un operador aritmético y no de concatenación. imprimir("la suma de a y b es : " + (a + b) ) imprimir("a + b + c +++" /* como el simbolo suma esta dentro de la cadena constante, limitada por comillas "", es interpretado como caracter */ SENTENCIAS DE CONTROL SENTENCIA SI SI (condicion) ENTONCES sentencia_1 sentencia_2 : sentencia_n FIN SI Si la condición es verdadera, entonces se ejecutarán en orden las sentencias delimitadas por el FIN SI. Si la condición es falsa o no se cumple, el punto de algoritmo ejecutará la sentencia posterior al FIN SI. Ejemplo : Una vez leidos b y c, si c es mayor que b, entonces asignar a b el valor de c y a continuación asignar a c el valor del doble de b. INICIO leer b leer c SI (c > b) ENTONCES b <-- c c <-- 2 * b FIN SI FIN Ejemplo : Si a es igual a b, entonces imprimir "Diferencia cero". A continuación imprimir "Concluida la comparación" INICIO leer b,c SI (c == b) ENTONCES imprimir("Diferencia cero" FIN SI imprimir("Concluida la comparación" FIN EN GENERAL : Es válido, ejecutar un conjunto de sentencias de control, dentro de otra del mismo tipo. Para una ordenada notación, todas las sentencias contenidas dentro de otra sentencia, se escribiran dejando un número positivo (recomendado : 4) de espacios a la derecha, de la columna correspondiente al inicio de la sentencia. Para el caso de la sentencia SI, a continuación se muestra una abertura del ciclo de segundo orden : INICIO SI (c + a > 0 ) ENTONCES imprimir("c + a es mayor que cero" SI (c - a > 0) ENTONCES imprimir("a es menor que c ); FIN SI FIN SI FIN SENTENCIA SI - SINO SI (condicion) ENTONCES sentencia(s) SINO sentencia(s) FIN SI Si la condición es verdadera, entonces se ejecutarán las sentencias anteriores al SINO. Si la condición es falsa, el punto de algoritmo ejecutará las sentencias posteriores al SINO. Ejemplo : SI (a != b) ENTONCES imprimir("a es distinto de b" SINO imprimir("a es igual b " FIN SI SENTENCIA DE SELECCIÓN SELECCION (variable) constante_1 : sentencia(s) constante_2 : sentencia(s) : : constante_n : sentencia(s) FIN SELECCION Para eliminar el problema de tener muchas condiciones "SI (variable == valor_i) ENTONCES", se agrupan las instrucciones, en función del valor que tome cierta variable. Ejemplo : Algoritmo de la Calculadora INICIO imprimir("1.- suma"; imprimir("2.- resta"; imprimir("3.- multiplicacion" imprimir("4.- division" imprimir("Ingrese opcion : " Leer a,b,opcion SELECCION(opcion) 1 : imprimir("suma de " + a + " y " + b + " igual a : " + (a + b)) 2 : imprimir("resta de " + a + " y " + b + " igual a : " + (a - b)) 3 : imprimir("multiplicacion de " + a + " y " + b + " igual a : " + (a * b)) 4 : SI (b != 0) ENTONCES imprimir("division de " + a + " y " + b + " igual a : " + (a / b)) SINO imprimir("division por cero --> infinito " FIN SI FIN SELECCION FIN CICLOS ITERATIVOS SENTENCIA MIENTRAS MIENTRAS (condicion) HACER sentencia(s) FIN MIENTRAS Mientras se cumpla la condición, se ejecutarán las sentencias anteriores al FIN MIENTRAS. Además se cumple, que se puede entrar al ciclo, sólo si se cumple la condición. Finalmente, es muy importante determinar la variación de alguna variable, para quebrar la condición y no convertir al ciclo iterativo, en un "loop" o ciclo infinito. Ej : Cantidad de dígitos de un número INICIO Leer numero contador <-- 0 MIENTRAS (numero > 0) HACER numero <-- numero / 10 contador <-- contador + 1 FIN MIENTRAS imprimir("cantidad de digitos : " + contador) FIN SENTENCIA HACER MIENTRAS HACER sentencia(s) MIENTRAS (condición) Se ejecutarán las sentencias, mientras se cumpla la condición. Además, una diferencia con la sentencia de control anterior, es que en ésta por lo menos se entra una vez en el ciclo. Ej : leer un carácter, mientras sea distinto de '#' INICIO HACER leer caracter MIENTRAS (caracter != '#') FIN SENTENCIA PARA PARA variable <-- valorInicial HASTA valorFinal HACER sentencia(s) FIN PARA Esta sentencia es útil para hacer variar el valor de una variable entera, permitiendo su inicialización y la determinación del último valor que puede tomar dentro del ciclo. El ciclo cumple los siguientes pasos : 1) Inicializa el valor de la variable 2) Revisa la condición de término 3) SI se cumple la condición ENTONCES ejecuta la sentencia incrementa la variable Vuelve al paso 2) SINO saltar al paso 4) 4) Fin del ciclo Ejemplo : 1) Imprimir todos los dígitos (0..9) PARA i <-- 0 HASTA 9 HACER imprimir(i) FIN PARA PROBLEMAS RESUELTOS Problema del triángulo Determinar si un triangulo es : equilatero, isóceles o escaleno, conociendo sus tres lados (a,b,c). INICIO leer a,b,c SI (a == b) ENTONCES SI (b == c) ENTONCES imprimir("Triangulo Equilátero" SINO imprimir("Triangulo Isóceles" FIN SI SINO SI (b == c) ENTONCES imprimir("Triangulo Isóceles" SINO imprimir("Triangulo Escaleno" FIN SI FIN SI FIN Problema del fósforo, el ventilador y la vela Def : encender una vela con un fósforo, en función con las siguientes restricciones. Existe un ventilador que se ubica frente al camino del fósforo prendido, el cual genera una corriente de aire, que se interpone a la llegada del fósforo prendido. Se cuenta con una cantidad limitada de fósforos, que se deben gastar completamente si es que no se lográra prender la vela. El ventilador no se puede apagar durante los intentos. Variables n : Número inicial de fósforos. f : número de fósforos quemados. Por cada ensayo fallido, esta variable disminuirá en una unidad. Posibles valores : {n , n - 1 , n -2 , .. , 1 , 0 }. velaApagada : estado lógico {true,false} Métodos intento() : retorna true si la vela fue prendida, retorna false en caso que la vela siga apagada. imprimir() : imprime según los parámetros. Una vez que se prende, mostrar o imprimr la cantidad de fósforos quemados y sin usar. Si no se prende nunca, imprimir el mensaje : "no se pudo prender la vela." INICIO Leer n velaPrendida <-- false f <-- 0 SI (velaPrendida == false) ENTONCES MIENTRAS (n - f > 0) HACER f <-- f + 1 /* aumento en 1, los fosforos usados */ velaPrendida <-- intento() /* la variable puede tomar valor true o false */ SI (velaPrendida == true) imprimir("Cantidad de fosforos quemados :" + f ) imprimir("Cantidad de fosforos sin usar :" + (n - f) ) f <-- n /* se fuerza a salir del ciclo mientras, quebrando su condición */ FIN SI FIN MIENTRAS SINO imprimir("No se pudo prender la vela" FIN SI FIN Problema del reconocimiento de cadena en un proceso de transición de estados Un proceso computacional, lee una cadena constante formada por ceros y unos (terminada en "#" ("0110#" , "11000110#",...) para verificar su reconocimiento o no. El proceso reconoce una cadena, si es que al terminar de leer ésta (leer caracter "#", el proceso se encuentra en el estado c. Especificaciones del proceso 1) El proceso parte en el estado a y lee el primer carácter de la cadena. 2) Si el proceso está en el estado a y es leído un carácter "1" entonces el estado del proceso cambia a b. En caso contrario si es que el carácter leído es un "0", el estado se mantiene en a. 3) Si el proceso está en el estado b y si lee un carácter "1" el proceso se mantiene en el mismo estado. En caso contrario, si el carácter leído es un "0" el estado cambiará a c. 4) Si el proceso está en el estado c y es leído un carácter "1" el proceso cambia al estado a. En caso contrario, si el carácter leído es un "0" el estado se mantiene en c. 5) La cadena no puede comenzar con el carácter "#". Cadenas que dejan el proceso en estado A : {"0#" , "00#" ,.., "101#" , "0101#" , "00101101#" ,...} Cadenas que dejan el proceso en estado B : {"1#" , "01#" ,.., "111#" , "0011#" , "01101011#" ,...} Cadenas que dejan el proceso en estado C : {"10#" , "010#" ,.., "001100#" , "101100110#" , ...} Se pide diseñar un algoritmo que lea una cadena (String) y determine el estado del proceso en función de aquella. Además, si la cadena de entrada deja al proceso en el estado c, ésta se deberá imprimir, en caso contrario se deberá imprimir "cadena no reconocida". Algoritmo INICIO estado <-- a leer cadena c <-- leerCaracter() HACER SELECCION(estado) a : SI (c == 1) ENTONCES estado <-- b FIN SI b : SI (c == 0) ENTONCES estado <-- c FIN SI c : SI (c == 1) ENTONCES estado <-- a FIN SI FIN SELECCION c <-- leerCaracter() MIENTRAS (c != "#" SI (estado == c) ENTONCES imprimir(cadena) SINO imprimir("cadena no reconocida" FIN SI FIN Problema de detención en un semáforo Escribir el algoritmo, que describe las acciones que el conductor realiza ante el estado verde,amarillo o rojo de un semáforo. Tener en cuenta, que ante una luz amarilla, el conductor acelerará si es arriesgado, o desacelerará si es que es prudente. Variables luz : {VERDE , AMARILLA , ROJA} estaDetenido : {true,false} Métodos parte() , pasa() , acelera() , desacelera(), frena(), estaDetenido(), espera() INICIO leer luz SELECCION (luz) VERDE : SI (estaDetenido == false) ENTONCES parte() SINO pasa() FIN SI AMARILLA : SI (conductorEsArriesgado == true) ENTONCES acelerarara() SINO desacelera() frena() FIN SI ROJA : SI (estaDetenido == false) ENTONCES desacelera() frena() SINO espera() FIN SI FIN SELECCION FIN Problema de compra en función de la calidad de un lote de productos Se requiere implementar un algoritmo, que permita registrar la calidad de un lote de productos, para agilizar el proceso de compra. El sistema consiste, en un lector de calidad que va leyendo mediante sensores a un producto dejado a través de una correa transportadora, para transmitir a continuación los datos a un software especial, depositado en un computador, que entrega hacia afuera uno de los siguientes estados numéricos : 0 : Producto MALO 1 : Producto DEFECTUOSO 2 : Producto BUENO Especificaciones a) Los datos que llegan en forma iterativa (mientras no se haya acabado el lote de productos a revisar), son rescatados por el método test(). b) El térnmino de la revisión está determinado cuando el método fin() retorne el valor true. c) El algoritmo debe llevar un conteo de cuántos productos corresponden a cada estado { MALO : 2 , DEFECTUOSO : 5 , BUENO : 43 }, para posteriormente aplicar un cálculo de porcentaje. d) Inicialmente no se sabe la cantidad total de productos del lote, por lo tanto es fundamental que se implemente un contador para los cálculos posteriores. e) El precio original de compra del lote, tiene que ser ingresado por el usuario. Después del análisis, se deberá imprimir según los criterios el precio propuesto de compra. Una vez terminado el proceso de análisis y conteo, se determinará el precio de compra propuesto para el lote en cuestión. Criterios 1) Si el porcentaje de productos malos es superior al 15%, el lote no se compra (precio <-- 0). En caso contrario, pasar al punto 2) 2) Si el porcentaje de productos defectuosos es menor a un 10%, se compra a un 70% del precio original. En caso contrario, pasar al punto 3) 3) Si el porcentaje de productos buenos es mayor o igual a un 70%, el lote se compra al precio original. En caso contrario, se estaría comprando a un 60% del precio original. Algoritmo INICIO N <-- 0 /* cantidad de productos analizados */ contMalos <-- 0 contDefect <-- 0 contBuenos <-- 0 precio <-- 0 /* precio en función del análisis */ leer precioInicial MIENTRAS (fin() != true) HACER calidad <-- test() SELECCION (calidad) 0 : contMalos <-- contMalos + 1 1 : contDefect <-- contDefect + 1 2 : contBuenos <-- contBuenos + 1 FIN SELECCION N <-- N + 1 FIN MIENTRAS SI (contMalos / N > 0.15) ENTONCES precio <-- 0 SINO SI (contDefect / N < 0.1 ) ENTONCES precio <-- precioInicial * 0.7 SINO SI (contBuenos / N >= 0.7 ) ENTONCES precio <-- precioOriginal SINO precio <-- precioOriginal * 0.6 FIN SI FIN SI FIN SI imprimir(precio) FIN Problemas resueltos y una pequeño vistazo al lenguaje Java Problema de los trampolines Se cuenta con dos trampolines olímpicos, para que una persona pueda realizar una serie de saltos, con tal de terminar parado en el segundo trampolín. La distancia vertical entre los trampolines, es de 3 metros. Se sabe que siempre el primer salto es de 60 cm (0,6 mts). Además, se sabe que en cada salto se supera el rendimiento del salto anterior en un 30%. Determinar : cantidad de saltos necesarios para alcanzar el segundo trampolín y la altura máxima que se llega con respecto al primer trampolín. Además se necesita saber la altura alcanzada en cada salto. ejemplo : separación entre trampolines : 3.0 porcentaje de aumento (0..1) : 0.3 cs altura -- ------ 1 0.6 2 0.78 3 1.014 4 1.3182 5 1.7137 6 2.2278 7 2.8961 Cantidad de saltos : 8 Altura maxima alcanzada : 3.765 seguir(1)/salir(0) : 0 Algoritmo INICIO cs <-- 1 /* cantidad de saltos */ h <-- 0.60 /* altura */ MIENTRAS( h < 3.0 ) HACER cs <-- cs + 1 h <-- h * 1.3 FIN MIENTRAS imprimir("Cantidad de saltos : " + cs) imprimir("Altura maxima alcanzada : " + h) FIN Programa en Java import java.io.*; public class Trampolin { public static void main(String[ ] args) throws IOException { int cs = 1; double h = 0.60; int seguir = 1; double sep,aumento; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); do { h = 0.6; cs = 1; System.out.print("\n\nseparacion entre trampolines : "; sep = Double.parseDouble(in.readLine()); System.out.print("porcentaje de aumento (0..1) : "; aumento = Double.parseDouble(in.readLine()); aumento += 1.0; System.out.println("\n\tcs\taltura"; System.out.println("\t--\t------"; while ( h < sep ) { System.out.println("\t" + cs + "\t" + h); cs++; h *= aumento; } System.out.println("\n\tCantidad de saltos : " + cs); System.out.println("\tAltura maxima alcanzada : " + h); System.out.print("\n\t\tseguir(1)/salir(0) : "; seguir = Integer.parseInt(in.readLine()); } while (seguir == 1); } } Bajar archivo Problema del electrón en los anillos a ) Un electrón se mueve en un conjunto de 10 anillos, con una velocidad constante en cada uno de ellos . Una caracteristica de la trayectoria, es que una vez que completa el recorrido en un anillo, cambia de estado pasándose al anillo siguiente o más cercano al centro, con una velocidad 1.12 veces mayor a la anterior. El electrón, después de recorrer el último anillo y llegar teóricamente al centro (k = 0), sale disparado perpendicularmente al radio del anillo, a una velocidad igual al doble de velocidad del radio uno (k = 1) por el último radio al cuadrado. Además, la trayectoria cuenta con la caracteristica que el radio de cada anillo, es un 35% menor con respecto al anterior, siendo el radio inicial de 5.0 nm. Finalmente, se sabe que el electrón tiene una velocidad inicial de 2.0 ns. Datos Para k : 1 , ... , 10 se tiene que radio de cada anillo : radio_k-1 = radio_k * 0.65 Velocidad constante en cada anillo : v_k-1 = 1.12 * v_k Tiempo_k = Distancia_k / Velocidad_k radio inicial = 5.0 velocidad disparo = 2 * v_1 * (1 + radio)^2 Determinar Velocidad, distancia y tiempo en recorrer cada anillo, además del tiempo acumulado para recorrer los 10 anillos y la velocidad de disparo del electrón. El algoritmo debe generar la siguiente salida : ingrese numero de anillos : 10 ingrese radio inicial : 5.0 ingrese velocidad inicial : 2.0 k radio Distancia Velocidad Tiempo --- ----- --------- --------- ------ 10 5.0 31.415 2.0 15.707963267948966 9 3.25 20.42 2.24 9.11622868229181 8 2.112 13.273 2.508 5.2906684316872115 7 1.373 8.627 2.809 3.07047721481847 6 0.892 5.607 3.147 1.781973383600005 5 0.58 3.645 3.524 1.0341809815535743 4 0.377 2.369 3.947 0.6001943196516281 3 0.245 1.54 4.421 0.3483270605121055 2 0.159 1.001 4.951 0.20215409761863268 1 0.103 0.65 5.546 0.11732157451081357 Velocidad disparo : 14.152 tiempo total : 37.26948901419321 Algoritmo INICIO PI <-- 3.14 /* constante */ k <-- 10 radio <-- 5.0 velocidad <-- 2.0 distancia <-- 0 tiempo <-- 0 tiempoAcum <-- 0 imprimir("k radio Distancia Velocidad Tiempo"; imprimir("----------------------------------------------"; MIENTRAS (k > 0) HACER distancia <-- 2 * PI * radio tiempo <-- distancia / velocidad tiempoAcum <-- tiempoAcum + tiempo imprimir(k + " " + radio + " " + distancia + " " + Velocidad" + " " + tiempo) velocidad <-- 1.12 * velocidad radio <-- radio * 0.65 k <-- k - 1 FIN MIENTRAS velocidad <-- 2 * velocidad * (1 + radio) * (1 + radio) imprimir("Velocidad disparo : " + velocidad) imprimir("tiempo total : " + tiempoAcum) FIN b ) Realizar un algoritmo en donde la cantidad de anillos, el radio inicial y la velocidad inicial, sean variables que deben ser leídas. Además, se quiere permitir tener la opción de salir o seguir calculando con nuevos valores. Solución INICIO PI <-- 3.14 /* constante */ distancia <-- 0 tiempo <-- 0 seguir <-- 1 HACER tiempoAcum <-- 0 /* en cada ciclo se debe inicializar en cero */ imprimir("ingrese numero de anillos : " leer k imprimir("ingrese radio inicial" leer radio imprimir("ingrese velocidad inicial" leer velocidad imprimir("k radio Distancia Velocidad Tiempo"; imprimir("----------------------------------------------"; MIENTRAS (k > 0) HACER distancia <-- 2 * PI * radio tiempo <-- distancia / velocidad tiempoAcum <-- tiempoAcum + tiempo imprimir(k + " " + radio + " " + distancia + " " + Velocidad" + " " + tiempo) velocidad <-- 4 * velocidad radio <-- radio * 0.65 k <-- k - 1 FIN MIENTRAS velocidad <-- 2 * velocidad * (1 + radio) * (1 + radio) imprimir("Velocidad disparo : " + velocidad) imprimir("tiempo total : " + tiempoAcum) imprimir("seguir(1)/salir(0) : " leer seguir MIENTRAS (seguir == 1) FIN Programa en Java import java.io.*; public class Anillo { private static double redondear(double num) { double aux = num * 1000; int tmp = (int) aux; return (double) tmp / 1000; } public static void main(String[ ] args) throws IOException { double distancia = 0.0; double tiempo = 0.0; double tiempoAcum = 0.0; double radio; int k; double velocidad; int seguir = 1; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); do { tiempoAcum = 0.0; /* en vcada ciclo se debe inicializar en cero */ System.out.print("\n\ningrese numero de anillos : "; k = Integer.parseInt(in.readLine()); System.out.print("ingrese radio inicial : "; radio = Double.parseDouble(in.readLine()); System.out.print("ingrese velocidad inicial : "; velocidad = Double.parseDouble(in.readLine()); System.out.println("\n\nk\tradio\t\tDistancia\tVelocidad\tTiempo"; System.out.println("---\t-----\t\t---------\t---------\t------"; while (k > 0) { distancia = 2.0 * Math.PI * radio; tiempo = distancia / velocidad; tiempoAcum = tiempoAcum + tiempo; System.out.println(k + "\t" + redondear(radio) + "\t\t" + redondear(distancia) + "\t\t" + redondear(velocidad) + "\t\t " + tiempo); velocidad *= 1.12; radio = radio * 0.65; k--; } velocidad = 2.0 * velocidad * Math.pow(1.0 + radio, 2.0) ; System.out.println("\n\tVelocidad disparo : " + redondear(velocidad)); System.out.println("\n\ttiempo total : " + tiempoAcum); System.out.print("\n\n\tseguir(1)/salir(0) : "; seguir = Integer.parseInt(in.readLine()); } while (seguir == 1); bajate el archivo: http://pjsml.50megs.com/java/fuentes/Anillo.java

15
15
L
Las mejores frases celebres (emocionante)
InfoporAnónimo12/5/2009

Dijo Billy The Kid antes de ser asesinado en un cuarto a oscuras. La curiosidad es que, a pesar de ser el inglés su lengua nativa, sus últimas palabras las dijo en español. A veces estas frases son pensadas y dichas en un contexto adecuado pero muchas veces estas muertes son productos de accidentes trágicos o situaciones shockeantes que no permiten pensarlas tranquilamente. Entre algunas de ellas podemos encontrar las últimas palabras de Jonh Lennon segundos después de haber sido herido de gravedad que desnudan al completo su inocencia e impotencia: “Me dieron”, simplemente alcanzó a decir. Otro John, esta vez John F Kennedy, ante el comentario de la esposa del gobernador de Texas que le dijo: “Sr. Presidente, no puede decir que Dallas no lo ama”, a lo que Kennedy respondió: “Eso es obvio”; segundos antes de ser alcanzado por la primer bala. Otros, como el archiduque Franz Ferdinand, tratan de tranquilizar a su ser más cercano frente a tal acontecimiento: “No es nada. No es nada” le dijo a su mujer, tratando de calmarla, cuando fue herido por un disparo. Más equivocado no podría haber estado. Antonio José de Sucre, mientras cabalgaba en la jungla colombiana, fue sorprendido por un disparo que sentenciaría su muerte. Y, pese a nunca haber maldecido, dijo: “¡Carajo, un balazo!” Otro que fue sorprendido por la mortalidad fue el presidente estadounidense Franklin Roosevelt que dijo : “Tengo un terrible dolor de cabeza”, momentos antes de fallecer a causa de un derrame cerebral. También una de las palabras más celebres minutos antes de morir son las de Julio Cesar que, cuando es abordado por casi todo el senado con el objetivo de asesinarlo dice: “¿Tú también, Brutus?” sorprendido por la traición de su amigo, a quien distingue entre la multitud. Otra figura que murió en un trágico accidente automovilístico fue el actor James Dean que tenía 24 años en ese momento. Mientras iba manejando a altas velocidades en una ruta, cuando vio a un auto viniendo de frente le dijo a su acompañante, demostrando cuan seguro de sí mismo estaba: “Ese tipo tiene que parar... Él nos verá”. Otra figura importante para nuestra historia que murió en la total pobreza, tanto que le pagó a su médico con su reloj, fue Manuel Belgrano que dijo una frase que resume toda su obra y al mismo tiempo su frustración: “¡Ay, Patria Mía!”. El escritor e ideólogo español Ramiro de Maeztu Whitney les dijo a sus verdugos: "Vosotros no sabéis por qué me matáis, pero yo sí sé por lo que muero: Porque vuestros hijos sean mejores que vosotros!." Las últimas palabras públicas de Salvador Allende antes de ser asesinado por la dictadura pinochetista dejaron en claro su posición frente al venidero golpe de Estado: "Estas son mis últimas palabras y tengo la certeza de que mi sacrificio no será en vano, tengo la certeza de que por lo menos será una lección moral que castigará la felonía, la cobardía y la traición". Bolívar con el sueño frustrado de la unificación latinoamericana, murió resignado a meditar lo siguiente: “Los tres mayores necios que ha habido jamás son Cristo, el Quijote y yo". Murió en una hamaca, huésped de un español de Santa Marta, sus últimas palabras fueron: "He arado en el mar". Nerón: ¡Que artista muere conmigo! Director de películas de notorio corte surrealista, como “El perro andaluz”, el español Luis Buñuel, se limitó a decir: “Me muero”. Idénticas palabras dijo Antón Chéjov, aunque muchos aún afirman que el escritor ruso murió exclamando: “¡Champán!”. Honoré de Balzac: Ocho horas con fiebre, ¡me habría dado tiempo a escribir un libro! El escritor Lewis Carroll, autor de “Alicia en el País de las Maravillas”, murió en su casa, enfadado con su enfermera dijo: “Quíteme esta almohada. Ya no la necesito". El 18 de junio de 1936, el escritor soviético Maksim Gorki, poco antes de morir dijo: "…Habrá guerras… Hay que prepararse". A Winston Churchill se le han atribuido numerosas últimas palabras -e infinitas citas -, pero lo más probable es que dijera: “¡Todo es tan aburrido!”. Isabel I de Inglaterra: Todas mis posesiones por un momento de tiempo. Conocido por las insuperables cantidades de alcohol que consumió durante su vida, el actor estadounidense Humphrey Bogart comentó sus últimos instantes con estas palabras: “Nunca debí cambiarme del scotch a los martinis". Lord Byron: Ahora yo me iré a dormir. Buenas noches. Condenada a ser decapitada por presunto adulterio y alta traición, Ana Bolena fue llevada al cadalso, donde le dijo a su verdugo: “No le dará ningún trabajo: tengo el cuello muy fino". Frédéric Chopin: Ahora, estoy en la fuente de la felicidad. En su lecho de muerte, el escritor chileno José Donoso al parecer no dijo nada. Sólo pidió que le leyeran el poema “Altazor”, de Vicente Huidobro. Anna Pavlova: ¡Que esté preparado mi traje de cisne! El poeta chileno Vicente Huidobro, volviendo brevemente de la inconciencia de su agonía, les confesó a sus familiares: “Tengo miedo”. Poco antes, hizo llorar a su fiel amiga Henriette Petit cuando, levantándose levemente de su lecho de muerte, la miró y le dijo: “¡Cara de poto!”. A las 5:07 horas del 29 de agosto de 1947, "Manolete" pronuncia sus últimas palabras ante Giménez Guinea. - "¡Qué disgusto le voy a dar a mi madre!" - "¡Don Luis, que no veo, no veo nada" -“Adiós, amigo mío, sin gestos, sin palabras./ Que no haya dolor ni tristeza en tu frente./ En esta vida, morir no es nada nuevo,/ pero vivir, por supuesto, es menos nuevo aun”, escribió a los 30 años el poeta ruso Serguei Esenin, utilizando como tinta su propia sangre, y luego se colgó de unas cañerías de agua que había en su pieza de un hotel de San Petersburgo. Bela Lugosi: "Yo soy el conde Drácula, el rey de los vampiros, soy inmortal''. El escritor Henry James saludó a la muerte diciendo: “Al fin, esa cosa distinguida”. Ramón María del Valle-Inclán, poco antes de morir dijo: “España no está aquí, está en América, En México está la esencia más pura de España”. El escritor irlandés, James Joyce, preocupado por que la crítica calificó de incomprensible su novela “Finnegans Wake”, preguntó antes de morir: “¿En serio nadie la entiende?”. Alguien dijo: -Ha refrescado esta noche . Más vale que coja usted el abrigo, doctor King. -Esta bien, lo cogeré. Fueron las últimas palabras de Martin Luther King. Sonó un disparo y su cuerpo cayó desplomado el 4 de abril de 1968 en Memphis. Franz Kafka antes de morir dijo a su médico: "Máteme, sino usted es un asesino" Ludwig Wittgenstein: ''Dígales que mi vida ha sido maravillosa". Falleció en Cambridge el 29 de abril de 1951. Jose María Escrivá de Balaguer: "No me encuentro bien". Falleció en Roma el 26 de junio de 1975. Las últimas palabras de Tomás Moro al al subir al patíbulo fueron: “Soy un fiel servidor del Rey, pero primero de Dios”. Albert Einstein: Pronunció sus últimas palabras en el lecho de muerte, pero no sabemos cuales fueron debido a que la enfermera que estuva a su lado no entendía el Alemán. Teresa de Jesús: "Al fin, muero hija de la Iglesia". François Rabelais: ¡Que baje el telón, la farsa terminó! Galileo fue procesado y obligado a renunciar a sus convicciones. Se dice que cuando se hallaba al borde de la muerte, sus últimas palabras fueron: "no importa lo que ellos digan, la tierra gira alrededor del Sol". Las últimas palabras de Cristóbal Colón fueron: "En tus manos, Señor, encomiendo mi espíritu". Winston Churchill: Todo me aburre. Thomas Alva Edison: Es muy bonito todo allá Leonardo Da Vinci: He ofendido a Dios y a la humanidad porque mi trabajo no tuvo la calidad que debía haber tenido. Camilo José Cela: ¡Viva Iria Flavia! Según los escritos budistas las últimas palabras de Buda fueron: "todas las cosas son perecederas. Esforzaos por vuestra salvación". Antes de morir en Weimar Goethe dijo: "Luz más luz". Tras su letal trago de cicuta, al que había sido condenado por impío y corruptor de la juventud, Sócrates dijo: “Critón, le debo un gallo a Asclepio. No te olvides de pagárselo". Ludwig van Beethoven: Que los amigos aplaudan. La comedia se ha acabado. -“¿Quién es?”, dijo Billy the Kid, en una pieza oscura, justo antes de que el sheriff Pat Garrett le disparara un balazo en el corazón. María Antonieta que murió guillotinada el 16 de octubre de 1793 en París, dijo sus últimas palabras al verdugo disculpándose por haberle pisado. El poeta Dylan Thomas, que decía haber bebido su primer whisky a los 4 años, exclamó: “Me he bebido dieciocho vasos bien llenos de whisky. Eso es un record. Eso es todo lo que yo he conseguido en 39 años". A Phineas Taylor Barnum, fundador del legendario Barnum Circus, a la hora de despedirse del mundo sólo le interesó preguntar: “¿Cuánto se recaudó hoy en el Madison Square Garden?”. Las últimas palabras del cantaor flamenco Camarón de la Isla fueron una desesperada llamada a Juana, su madre: Omaíta, ¿qué es lo que tengo?. Napoleón Bonaparte: Josefina... Nostradamus, el profeta del siglo dieciséis, hizo su última predicción: “Mañana, ya no estaré aquí”. Edgar Allan Poe falleció el 7 de octubre de 1849 padeciendo delirium tremens. Sus últimas palabras fueron "Que Dios ayude a mi pobre alma". El poeta estadounidense Walt Whitman, que en sus últimos años buscó algo coherente y glorioso y patriótico que heredarle a la humanidad desde su lecho de muerte, se dio por vencido y, expirando, exclamó: “¡Mierda!”. José Hernández : El 21 de octubre de 1886 murió en su quinta de Belgrano. Sus últimas palabras fueron: "Buenos Aires... Buenos Aires...". La mítica bailarina Mata Hari, condenada en Francia por espionaje a la pena de muerte, le pidió al oficial del pelotón de fusilamiento que le trajera un espejito, se empolvó bien el rostro y dijo: “Gracias, monsieur”. Leopold von Sacher-Masoch muere el 9 de Marzo de 1895 en Lindheim de un ataque al corazón, sus últimas palabras fueron:"...aimez moi...". La escritora estadounidense, Gertrude Stein, se interrogó enigmáticamente a sí misma: “¿Cuál es la respuesta?”. Después de meditarlo un momento, dijo: “Y, en ese caso, ¿cuál es la pregunta?”. El revolucionario mexicano Pancho Villa, fue herido mortalmente en un atentado, pero aún tuvo tiempo de rogarle encarecidamente a un periodista: “¡Escriba usted que he dicho algo!”. Tras la muerte de su esposa y de su hija mayor, Karl Marx perdió todo deseo de vivir y fue presa de numerosas enfermedades. Cuando Friedrich Engels le preguntó si le quedaba algún mensaje que dejarle a la posteridad, Marx, indignado, le contestó: “¡Fuera, desaparece de mi vista! ¡Las últimas palabras son cosa de tontos que no han dicho lo suficiente mientras vivían!”. "Amaos los unos a los otros" George Harrison, primera guitarra de The Beatles "Apaguen la luz" Theodore Roosevelt "Arderé no es sino un hecho. Seguiremos discutiendo en la eternidad" Miguel Servet a sus jueces en Ginebra. "¡Ay, patria mia!" Manuel Belgrano "¡Cara de poto!" (poto = culo ) Vicente Huidobro(Poeta chileno), a la pintora Heriette Petit que lloraba en su lecho de muerte. "¡Carajo, un balazo!" Antonio José de Sucre, tras recibir un disparo mientras cabalgaba en la jungla de Colombia. Se decía que era un caballero educado que nunca había maldecido hasta ese día. "Dejénme ir a la casa del Padre" Nota: Los días inmediatos a la muerte de Juan Pablo II (2 de abril de 2005), se difundió en varios medios de comunicación que "Amén" había sido su última palabra. Días más tarde, desde el Vaticano se declaró que sus últimas palabras habían sido "Déjenme ir a la casa del Padre" en polaco. "Dios mío, Dios mío ¿por qué me has abandonado?" Nota: Palabras de Jesús de Nazaret antes de morir según los evangelios de san Marcos y san Mateo, aunque no serían las últimas, ya que el evangelio recoge más declaraciones de Jesús después de su resurrección. Es una cita del primer versículo de la oración del justo agonizante del Salmo 21 (22). "Dios mío, ¿qué pasó?" Diana Spencer, princesa de Gales. "¡Dispárame en el pecho!" Benito Mussolini "He arado sobre el mar." Simón Bolívar Nota: Al menos, fueron unas de sus últimas palabras. Según otras fuentes, lo último que dijo antes de morir fue "Vámonos de aquí. Esta gente no nos quiere." "Juana de Arco, no" Buster Keaton Nota: Ante su lecho de moribundo, alguien sugirió tocarle los pies para saber si ya había muerto; explicó que los difuntos tienen los pies fríos. Keaton dijo entonces sus últimas palabras, confirmando su genial sentido del humor, y murió. "Licht, mehr Licht! Johann Wolfgang von Goethe Traducción "¡Luz, más luz!" "¡Magallanes, Magallanes...!" Bernardo O'Higgins "Mira en qué paz puede morir un cristiano." Joseph Addison "¡Mozart!" Gustav Mahler "¡Muero con mi patria!" Francisco Solano López "Muero por la libertad de América" José Miguel Carrera "No más." Fréderic Chopin en su agonía por tuberculosis. "¿Por qué no?, despues de todo le pertenece" Charlie Chaplin "Qualis artifex pereo" Nerón Traducción: "¡Qué gran artista perece (conmigo)!" "¡Qué pérdida irreparable!" Augusto Comte "¿Quién anda ahí?" Otra versión: "¿Quién es? ¿Quién es?" Billy "the kid" (bandido) Nota: Aunque el idioma materno de Billy era el inglés, sus últimas palabras fueron en español. "¡Qué pena morir, cuando me queda tanto por leer!" Menéndez Pelayo "Quiero dormir..." George Bernard Shaw "Se abrirán las grandes Alamedas" Salvador Allende "Sé que has venido para matarme. Dispara cobarde, que sólo vas a matar a un hombre." Che Guevara “Señor, ábrele los ojos al rey de Inglaterra”. William Tyndale su oración final, antes de ser estrangulado y quemado en la hoguera por la Inquisición en octubre de 1536 como convicto de herejía. "Señor, ayuda a mi pobre alma" o "Que Dios se apiade de mi pobre alma." Edgar Allan Poe "Tengo un terrible dolor de cabeza" Franklin Delano Roosevelt "'Kai su, teknon?" Julio César Traducción:¿También tú, hijo mío? (Según Suetonio, César no dijo nada mientras moría, pero otros autores le atribuyen estas palabras en griego. "Vete... estoy bien" H. G. Wells "¡Viva Andalucía libre!" Blas Infante "Vosotros no sabéis por qué me matáis, pero yo sí sé por lo que muero." Ramiro de Maeztu "Yo sé en quien he creído" Nota: Palabras de Ellen Gould White en el lecho de muerte, profetisa de la Iglesia Adventista del 7º Dia... Pardonnez-moi, monsieur. (Discúlpeme, señor) María Antonieta Cuando se aproximaba a la guillotina, condenada a ser decapitada por traición, tropezó accidentalmente con el pie del verdugo. Es ist gar nichts... es ist gar nichts... (no es nada... no es nada...) Francisco Fernando Archiduque de Austria El archiduque perdió la consciencia después de ser disparado en Sarajevo, el murió casi inmediatamente después de recuperarla. Das ist absurd! Das ist absurd! (¡Es absurdo!...¡Esto es absurdo!) Sigmund Freud ¡Hay que meter la cortina de la ducha por dentro! Richard Hilton, dueño de la cadena de hoteles Hilton, a uno de sus trabajadores Entonces, firmad la paz. Epaminondas, después de informarle que sus dos posibles sucesores habían muerto, antes que él, en la batalla de Mantinea Crito, le debo un gallo a Asclepio Sócrates, dirigiéndose a sus discípulos después de tomar la cicuta. "No me mataréis como a un cordero, sólo moriré donde yo quiero." Ramiro Ledesma Ramos "¡Un oficial paraguayo no se rinde!" Francisco López, hijo "Que bello es morir por la patria" Iosef Trumpeldor "A moi, ma chère amie!" (A mí, mi querida amiga!) Jean Paul Marat "Ocho horas con fiebre, ¡me habría dado tiempo a escribir un libro!" Honore de Balzac "¡Todo es tan aburrido!" Winston Churchill "Todas mis posesiones por un momento de tiempo" Isabel I de Inglaterra "No le dará ningún trabajo: tengo el cuello muy fino" Ana Bolena, ex-esposa de Enrique VIII, antes de morir decapitada "Francia, el ejército, la cabeza del ejército... ¡Josefina!" Napoleón Bonaparte en Santa Elena ALGUNOS PRESOS ANTES DE SER EJECUTADOS! 1.- Henry Porter (9). Ejecutado el 9 de julio de 1985 a los 44 años. Pasó 9 años en el corredor de la muerte. Un año antes, en 1975, fue condenado a muerte por matar de un disparo al policía Henry Mailloux, quien detuvo a Porter en una investigación por tres robos armados. En sus escritos dejó dicho: “Lo que quiero que la gente sepa es que me llaman asesino a sangre fría porque disparé a un hombre que me disparó primero. Me han condenado sólo porque soy mexicano y él era un oficial de policía. La gente pidió mi cabeza, y la tendrán esta noche. La gente no pidió la cabeza del policía que mató a un chico de 13 años que iba esposado en el asiento de atrás de la patrulla. La gente nunca pedirá la cabeza del policía de Houston que golpeó y estranguló a José Campo Torres. Esta es la justicia igualitaria de América. La vida de un mexicano no vale nada. Cuando un mexicano mata a un policía esto es lo que obtienes. Y por esto me llaman asesino a sangre fría. Yo no puse la soga al cuello a nadie. Yo no inyecté ningún veneno en las venas de nadie desde el otro lado del muro. A eso llamas justicia. Yo llamo a esta sociedad una pandilla de asesinos a sangre fría. No digo esto con amargura o rabia. Lo digo porque es la verdad. Espero que Dios me perdone por todos mis pecados. Espero que Dios tenga tanta piedad por esta sociedad como la ha tenido conmigo. Estoy preparado. Guardián”. 2.- Ignacio Cuevas (39). Ejecutado el 23 de mayo de 1991 a los 59 años. Pasó 7 años en el corredor de la muerte. Según la sentencia, Cuevas, que en momento del crimen tenía 43 años, y dos compinches asesinaron a tiros a sus dos rehenes cuando intentaban escapar. Fue sentenciado a dos penas capitales. Sus únicas palabras escritas antes de morir fueron: “Me marcho a un lugar bonito. OK, guardián, adelante”. 3.- Ramón Montoya (56). Ejecutado el 25 de marzo de 1993 a los 38 años. Fue condenado a muerte por matar a tiros al oficial de policía John Pasco, que había acudido a un vecindario de Dallas, alertado por los vecinos que denunciaron la presencia de un hombre armado. Montoya, que tenía 29 años cuando ocurrió el crimen, dijo en su defensa que se le disparó el arma cuando fue alcanzado e iba a entregarse. Agentes de inmigración añadieron durante el juicio que Montoya fue deportado a México por posesión ilegal de armas, pero entró de nuevo a EU ilegalmente. No quiso dejar ningún testimonio antes de ser ejecutado. 4.- Irineo Montoya (131). Ejecutado el 18 de junio de 1997 a los 29 años. Natural de Tampico, fue condenado en noviembre de 1985 por robo y asesinato de John Edgar Kilhefer, quien le dio un raid a él y a su cómplice, Juan Villavicencio. Montoya le asestó 21 puñaladas en el cuello, espalda y piernas. Fue capturado gracias a la intervención de la policía mexicana, que descubrió la Chevrolet Blazer de la víctima en Matamoros. Su compinche, también mexicano, no fue condenado a muerte y permanece en prisión. Esto dejó escrito: “Adiós. Te espero en el Cielo. Te estaré esperando. Amo a mis padres. Estoy en paz con Dios. Lucha por el bien”. 5.-Javier Medina Suárez (277). Ejecutado el 14 de agosto de 2002 a los 33 años. Natural de Piedras Negras. En 1988 fue declarado culpable de robar y matar al oficial de narcóticos Lawrence Cadena. El agente se reunió con Medina y su compinche, Fernando Fernández, en un estacionamiento para un negocio encubierto de drogas. Cuando el agente recibió un paquete de cocaína después de entregar una suma de dinero, Medina le disparó 7 veces y Fernández trató de robarle la droga. Ambos fueron heridos de arma por un policía oculto. Fernández fue condenado a 60 años de cárcel. Las últimas palabras de Medina: “Antes que nada me gustaría pedir perdón a los miembros de la familia Cadena por el daño y el sufrimiento que les he causado. Nunca tuve antes la oportunidad de expresarme de esta manera. Espero que encuentre en sus corazones la manera de perdonarme. La paz que encontrarán será temporal, la verdadera paz les llegará a través de Cristo. Ruego ante esta ejecución para que encuentren la paz que buscan. Entréguense a Cristo y a través de él encontrarán la paz. He pensado mucho en su amado. Él estará esperándome en el Cielo. Tendré valor para hablarle y pedirle personalmente que me perdone. “A mi familia, gracias, los quiero por apoyarme desde allí. Esto es nada más un trampolín a casa. Lo más duro de todos estos años fueron los del corredor de la muerte. A todos los que me apoyaron, siempre los llevaré en mi corazón, como siempre me llevaron en los suyos. Dios los bendiga. Mantengan sus cabezas en alto, los veré pronto. Perdonen el daño que les causé”. En español escribió esto: “A todo el pueblo de México, me gustaría darles las gracias por la ayuda. También quiero llevar a cada mexicano en mi corazón. Viva México, icen la bandera mexicana con honor. Gracias por todo, los amo”. Y de nuevo en inglés: “A todos los que están en el corredor de la muerte, mantengan sus cabezas en alto, los veré pronto. Estoy realmente arrepentido, perdonen el daño que hice. Dios los bendiga, los amo a todos. Estoy listo para irme a casa”. 6.- Ángel Maturino Reséndiz (368). Ejecutado el 27 de junio de 2006 a los 45 años. Sus últimas palabras fueron: “Quiero preguntar si hay algo de perdón en sus corazones. No tienen obligación. Yo sé que he permitido al diablo que mande en mi corazón. Sólo pido que me perdonen y que le pidan al Señor que me perdone por permitir al diablo que me engañara. Agradezco a Dios que haya sido tan paciente conmigo. No me merezco causarle ninguna molestia. No se merecen esto. Yo me merezco lo que voy a recibir”. George Harris "Alguien tendrá que matar a mi abogado” George Harris, ejecutado en Missouri el 13 de Septiembre de 2000 por el asesinato de Hank Willoughby en una disputa de armas. George siempre alegó defensa propia y echó las culpas a su abogado de su condena. Thomas Grasso “Por favor, contad a la prensa que no me han servido mi ración de Spaguetti, ¡Quiero que toda la prensa lo sepa! Thomas Grasso, ejecutado en Oklahoma el 20 de Marzo de 1995. En la comida anterior a su ejecución no aparecieron los famosos spaguettis de Campbell’s que pidió como última voluntad. Westley Allan Dodd “Una vez me preguntó alguien, no recuerdo quién, si habría alguna manera de detener a los delincuentes sexuales. Le dije que no. Evidentemente me equivoqué” Westley Allan Dodd, ejecutado en Washington el 5 de enero de 1993 por abusar sexualmente y matar a dos niños de 11 años. Westley tenía un dilatado historial de abusos a menores que comenzó cuando tenia sólo 14 años con sus propios primos. Sus fantasías se fueron cargando de violencia conforme se hizo adulto. Michael Richard “Let’s Ride” (Vamos a volar -con la inyección letal-) Michael Richard, ejecutado con inyección letal en Texas el 25 de Septiembre de 2007 por matar, violar y robar a Marguerite Dixon en su propia casa. La ejecución todavía se recuerda debido a problemas de procedimiento, ya que la apelación (propuesta el mismo día de la ejecución) no llegó a tiempo por 20 minutos al tribunal de Texas debido un fallo informático. Richard Wade Cooey II “Vosotros no habéis prestado atención a todo lo que yo he dicho durante los últimos 22 años. ¿Por qué coño vais a prestar atención a lo que tengo que decir ahora?” Richard Wade Cooey II, ejecutado en Ohio el 14 de octubre de 2008 por matar, violar y robar a dos mujeres. Su última comida fue: Un bistec de ternera con salsa, patatas fritas y aros de cebolla. Cuatro huevos duros sobre dos tostadas con mantequilla. Una pinta de Helado, un pastel de ‘garra de oso’ y un Mountain Dew. [...] El papel de la disculpa de los condenados a muerte ha sido estudiado por dos científicos canadienses (Judy Eaton y Anna Theuer) mediante un valoración de los últimos epitafios en el estado de Texas desde 1982. Casi un tercio de los delincuentes ofrecen una disculpa, en general, a la familia de la víctima. Además, estas disculpas se vincularon con otros indicios de remordimiento y sinceridad, como pidiendo perdón y mostrando empatía. La investigación sugiere que tanto las víctimas y los delincuentes pueden beneficiarse psicológicamente cuando el delincuente ofrece una disculpa y muestra cierto remordimiento. Si te condenan a una inyección letal ¿Esterilizan antes las agujas” William Mitchell “Hace algunas hora Wayne Snow (Alcaide) me comentó que no tenía posibilidad de redención alguna. Lo único que quiero decirle ahora a Wayne es que me bese el culo. Hasta siempre”. William Mitchell, ejecutado en Georgia el 1 de septiembre de 1987 por asesinar a un niño de 14 años y herir a su madre en un atraco a una tienda de comestibles. Christina Marie Riggs “No hay palabras para expresar lo que siento por haber quitado la vida a mis hijos. Ahora puedo volver con mis niños como siempre había querido.” Christina Marie Riggs, ejecutada en Arkansas el 3 de Mayo de 2000 por el asesinato de sus dos hijos , mientras dormían, en su casa de Sherwood. David Lawson “Siento de verdad y me arrepiento de haber matado a Wayne Shinn, espero que el estado de Carolina alguna vez se arrepienta de haberme matado a mi también.” David Lawson, ejecutado en Carolina del Norte el 15 de Junio de 1994. David Wayne Woodruff “No estamos aquí para celebrar un evento social. Estamos aquí para contemplar un asesinato” David Wayne Woodruff, ejecutado en Oklahoma el 31 de Enero de 2002. Douglas Roberts “Cuando me muera, enterradme bien profundo, con unos altavoces a mis pies, unos auriculares en mis orejas y ponedme Rock’ Roll. Algún día nos veremos en el cielo.” Douglas Roberts, ejecutado en Texas el 20 de Abril de 2005 por el secuestro, robo y asesinato de un hombre de 40 años de edad. Robert era un consumidor de cocaína desde los 10 años. Convenció a sus abogados para que no presentaran la apelación en derecho como una forma de poner fin a la soledad y aislamiento del ‘ataúd de cemento’ que suponía para él el corredor de la muerte. Jeffery Doughtie “Durante casi nueve años, he estado pensando en la pena de muerte, de si es correcta o incorrecta, y no he encontrado ninguna respuesta coherente. Pero no creo que el mundo sea un lugar más seguro o mejor sin mí. Si me querían castigar deberían haberme matado al día siguiente, en lugar de matarme 9 años después. Ahora no me afecta de la misma manera. He tenido tiempo para prepararme, para decirle adiós a toda mi familia y para dejar mi vida donde necesitaba estar. “ Jeffery Doughtie ejecutado en Texas el 16 de Agosto de 2001 por matar con una tubería de metal a dos ancianos en su tienda de antigüedades porque éstos rehusaron darle dinero para sus drogas. Bobby Ramdass “Los Redskins Jugarán la Super Bowl.” Bobby Ramdass fue ejecutado en Virginia el 10 de Octubre de 2000 por el robo y posterior asesinato del encargado de una tienda Mohammad Kayani. Su pasión por el fútbol americano y los Redskins de Washington le llevaron a pronosticar en su última declaración la participación de su equipo en la siguiente Super Bowl. Se equivocó. Pedro Muñiz “Quiero que sepas que yo no maté a tu hermana. Si quieres saber la verdad, y crees merecer saber la verdad, contrata a tus propios detectives” Pedro Muñiz fue ejecutado en Texas el 19 de Mayo de 1998 por el asesinato de un estudiante de 19 años Janis Bickham de la Universidad de Georgetown. Su última comida fue una clásica hamburguesa con patatas. Ejecutados que eran Inocentes. Es muy complicado saber, a ciencia cierta, el número de condenados y ejecutados que eran realmente inocentes de los casi 2.000 ajusticiados en Estados Unidos hasta la fecha. Muchos acusados han sido víctimas de negligencias judiciales, falsos testimonios e identificaciones erróneas. Los tribunales no suelen entender de las demandas de inocencia cuando el acusado está ya bajo tierra. Según la organización “Death Penalty Project” 124 personas que permanecían en el corredor de la muerte (con sentencia firme) han logrado demostrar su inocencia y evitar su ejecución desde la reinstauración de la pena capital. A continuación dos de los muchos casos que cuentan con suficientes evidencias para exonerar culpas, que no vidas, pues fueron ejecutados antes de encontrarse las pruebas. Carlos De Luna. “Quiero decir que no tengo rencores. No odio a nadie. Amo a mi familia. Que todos los chicos del corredor de la muerte mantengan la fe y no se rindan.” Carlos De Luna fue ejecutado en Texas el 7 de Diciembre de 1989 por el apuñalamiento de Wanda López en 1983. En 2006, una investigación del “Chicago Tribune” encontró nuevas evidencias que demostraron que Carlos no fue el asesino de Wanda López. Lena Baker “Todo lo que hice fue en legítima defensa. No tengo nada en contra de nadie. Estoy preparada para encontrarme con mi Dios.” Lena Baker una Afroamericana madre de tres hijos fue ejecutada en la silla eléctrica el 5 de marzo de 1945 por el asesinato de Ernest Knight, un hombre blanco que la hirió antes en una disputa. Baker fue detenida, juzgada y sentenciada a muerte en apenas unas horas por un jurado compuesto sólo por hombres blancos. 60 años más tarde la Junta de Indultos del estado de Georgia otorgó el perdón a los herederos de su memoria. Las frases mas celebres y emocionantes que encontre.Mi abuela se emociono y lloro. .:.Comentar es agradecer.:.

16
5
Queres jugar a la play 2 en tu monitor?? ENTRA
Queres jugar a la play 2 en tu monitor?? ENTRA
InfoporAnónimo12/4/2009

Seguramente sabes que es, pero para los que no saben gracias a este aparato uno puede conectar algo como la play 2 entre otras cosas al monitor.Una cintonizadora externa es algo como esto. Algo de info: Después de ver tanta gente queriendo conectar su consola un monitor o preguntando si se puede, me decidí en hacer este thread, con el cual voy a tratar de explicar cómo conectar tu consola, ya sea PS2, PS3 o Xbox 360 a un monitor. Cosas a tener en cuenta: 480i ------------> 640x480 Entrelazado -------------> TV de tubo clásica/Monitor de 14” o mas 480p------------> 640x480 Progre/Scan -------------> Tv de tubo clásica/Monitor de 14” o mas 720p------------> 1280x720 Progre/Scan -------------> TV HD Ready/Monitor de 17” o mas 1080i-----------> 1920x1080 Entrelazado------------ > TV Full HD/Monitor 22” (pocos) o mas 1080p----------> 1920x1080 Progre/Scan------------> TV Full HD/Monitor 22” (pocos) o mas RCA/Video Compuesto---------------------------> 480i S-Video-----------------------------------------------> 480i Video Componente-------------------------------> 720p/1080i HDMI-------------------------------------------------> 1080p *Capaz que alguno se pregunta dónde está el 720i. Bueno, sepan que esa categoría no existe, por si encuentran hablando a alguien de ese modo, sepan que les están mandando fruta *En la sección de elementos necesarios, por algo obvio no voy a poner Monitor ni consola, por que se sobreentiende que sin alguna de esas 2 cosas es imposible seguir. *Doy por sabido que antes de empezar a jugar se debe configurar la resolución de video desde la consola, por lo que no lo mencionaré. *¿Qué es el HDCP?: Es un método de seguridad que controla el contenido de audio y vídeo digital que se transmite mediante HDMI o DVI. Los reproductores de Blu-Ray o HD-DVD transmiten contenido con este método, por lo que hay que prestar atención. *Las imágenes son solo ilustrativas, por lo que el tamaño, color, posición de los conectores, etc, puede variar de un componente del mismo tipo a otro. Método A) Sintonizadora Externa Consola: PS2, PS3 o Xbox 360 Entrada de Monitor: VGA Elementos necesarios: Sintonizadora externa con entrada de Video Compuesto/Video componente/S-Video, cable de video de la consola en cuestión (Compuesto o Componente), cable VGA-VGA (generalmente viene con el monitor). Este método, tal vez sea uno de los más caros, ya que una sintonizadora medianamente buena, sale desde 300$ para arriba, pero es una manera sencilla de conectar tu consola a un monitor, y si este tiene 2 entradas, poder “switchear” entre la consola y nuestra PC. También se debe tener en cuenta la resolución máxima de salida de la sintonizadora y el tamaño de nuestro monitor (Ver mas arriba la tabla). En la imagen primer imagen tenemos la sintonizadora con los puertos de entrada (en este caso RCA y S-Video, pero hay también con video componente), y en la otra, la parte de atrás de la sintonizadora, la cual tiene las salidas de esta, con sus respectivos puertos VGA. Lo que hacemos es fácil: conectamos el cable de video de nuestra consola al input de la sintonizadora, y del puerto VGA, conectamos el cable para dicho puerto, y del otro extremo a nuestro monitor. Es un proceso sencillo, asique no les debería dar problema. En cuanto al audio, pueden o conectar los RCA a un equipo de audio o enchufarlos a la sintonizadora y ahí poner algún auricular. Método B) Cable VGA para Xbox 360 Consola: Xbox 360 Entrada de Monitor: VGA Elementos necesarios: Cable VGA de Xbox 360 Este método es sencillo, barato y con resultados excelentes, ya que con ese cable podes llegar a disfrutar de hasta 1080p con el monitor adecuado, aunque analógicamente, por lo que tendrá menos brillos y menos contraste, pero no es muy notorio. No hay mucha explicación, solo enchufar el cable a tu consola, el otro extremo al monitor, y los RCA a algún equipo de audio. Método C) Cable HDMI Consola: Xbox 360 y PS3 Entrada de Monitor: HDMI Elementos necesarios: Cable HDMI Este método es igual de sencillo que el anterior, llegando a los verdaderos 1080p obteniendo la máxima calidad posible. No hay mucha vuelta, solo enchufar un extremo a la consola y el otro a el monitor. En cuanto al audio, el monitor debe tener o parlantes o tener salida de audio. Acá se muestra un monitor con entrada HDMI y con su salida de audio correspondiente. Otra alternativa, es que la salida de audio de la consola sea por cable de fibra óptica a algún Home Theater. En el caso de la PS3, se puede configurar el audio aparte por la salida “Multi-out” de la consola, pudiendo conectarlo a algún equipo de audio. En el caso de la Xbox 360 creo que se puede hacer lo mismo, pero estaría bueno que si algún usuario de Xbox 360 hizo esto nos contara si puede realizarse o no. Método D) Cable DVI Consola: Xbox 360 y PS3 Entrada de Monitor: DVI, con tecnología HDCP. Elementos necesarios: Cable HDMI y adaptador HDMI-DVI Este es uno de los mejores métodos para los que no tienen una tele Full HD, pero si un monitor con entrada DVI, el cual pueden aprovechar para obtener la misma calidad que si fuese directamente con HDMI. El método consiste en conectar un extremo del cable HDMI a la consola, el otro al adaptador HDMI-DVI y este al monitor. Hay que tener en cuenta que si el monitor no posee HDCP, no recibirá ninguna imagen.

10
17
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.