Algoritmos Ingeniería Informática Algoritmos cotidianos Algoritmo: Conjunto ordenado y finito de operaciones que permite hallar la solución de un problema. Constituye un método para resolver un problema mediante una secuencia de pasos a seguir. Grupo finito de operaciones organizadas de manera lógica y ordenada que permite solucionar un determinado problema. Se trata de una serie de instrucciones o reglas establecidas que, por medio de una sucesión de pasos, permiten arribar a un resultado o solución. Radica en mostrar la manera de llevar a cabo procesos y resolver mecánicamente problemas matemáticos o de otro tipo. Nos permite desarrollar problemas, nos obliga a pensar, y eso hace que podemos desarrollar nuestra capacidad como programadores y/o como persona. S E a n li tr d ordenada, finita y Para que un algoritmo a se considere como tal, debe ser una secuencia definida (formalización d de un comportamiento) de instrucciones. a a Características Carácter finito. "Un algoritmo siempre debe terminar después de un número finito de pasos". Precisión. "Cada paso de un algoritmo debe estar precisamente definido; las operaciones a llevar a cabo deben ser especificadas de manera rigurosa y no ambigua para cada caso". 1 Entrada. "Un algoritmo tiene cero o más entradas: cantidades que le son dadas antes de que el algoritmo comience, o dinámicamente mientras el algoritmo corre. Estas entradas son tomadas de conjuntos específicos de objetos". Salida. "Un algoritmo tiene una o más salidas: cantidades que tienen una relación específica con las entradas". Eficacia. "También se espera que un algoritmo sea eficaz, en el sentido de que todas las operaciones a realizar en un algoritmo deben ser suficientemente básicas como para que en principio puedan ser hechas de manera exacta y en un tiempo finito por un hombre usando lápiz y papel”. Tipos de Algoritmos Cualitativos: Son aquellos en los que describen los pasos utilizando palabras. Cuantitativos: Son aquellos en los que se utilizan cálculos numéricos para definir los pasos del proceso. 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. Ejemplo de una receta de cocina. Entrada: Ingredientes y utensilios empleados. Proceso: Elaboración de la receta de cocina. Salida: Terminación del plato. Ahora realiza los siguientes ejercicios Cambiar la llanta de un coche Resolver la suma de dos números 2 Estructura de un algoritmo Cabecera En esta zona debe escribirse el nombre del algoritmo. Bloque de declaraciones Se utiliza para definir las variables que se utilizarán a lo largo del algoritmo. Inicio Marca el comienzo del algoritmo Bloque de instrucciones: Es la parte principal del algoritmo y está definido entre otras cosas por: Entrada Corresponde a los datos necesarios que requiere el proceso para ofrecer los resultados esperados. Proceso Pasos necesarios para obtener la solución del problema o la situación planteada. Salida Resultados arrojados por el proceso como solución. 3 Un algoritmo se puede representar de diferentes formas, entre ellas se encuentran el diagrama de flujo y el pseudocódigo: Simbología del diagrama de flujo y pseudocódigo Significado Diagrama de flujo Pseudocódigo Indica el inicio y el fin del algoritmo Inicio / Fin Indica la entrada de datos Leer Símbolo de proceso y nos indica la asignación de un valor en la memoria y/o la ejecución de una operación aritmética. Símbolo de decisión indica la realización de una comparación de valores que da como resultado un valor lógico. Indica la información. salida de Si (condición) Entonces Acción(es) Si _no Acción(es) Fin_Si Imprimir Conector dentro de página. Representa la continuidad del diagrama dentro de la misma página. 4 Conector fuera de página. Representa la continuidad del diagrama en otra página. Líneas de flujo o dirección. Indican la secuencia en que se realizan las operaciones. Ejemplo: Datos y tipos de datos Entero Real Lógico Caracter Cadena Datos de tipo entero 5 Un dato de tipo entero es aquel que puede tomar por valor un número perteneciente al conjunto de los números enteros (Z), el cual está formado por los números naturales, sus opuestos (números negativos) y el cero. Z = { ..., -3, -2, -1, 0, 1, 2, 3, ... } Ejemplo: La edad de una persona y el año en que nació, son dos datos de tipo entero: edad...: 29 año....: 1976 Datos de tipo real Un dato de tipo real es aquel que puede tomar por valor un número perteneciente al conjunto de los números reales (R), el cual está formado por los números racionales e irracionales. Ejemplo: El peso de una persona (en kilogramos) y su altura (en centímetros), son datos que pueden considerarse de tipo real. peso.....: 75.3 altura...: 172.7 Datos de tipo lógico En programación, un dato de tipo lógico es aquel que puede tomar por valor sólo uno de los dos siguientes: { verdadero o falso }. Los valores "verdadero" y "falso" son contrapuestos, de manera que, un dato de tipo lógico siempre está asociado a que algo se cumpla o no se cumpla. Ejemplo: El estado de una barrera de paso de trenes es un dato que puede considerarse de tipo lógico, por ejemplo, asociando "verdadero" a que esté subida y "falso" a que esté bajada. Estado...: falso (indica que la barrera está bajada) Datos de tipo caracter Es el conjunto de caracteres: letras, cifras, signos de puntuación, etc. {A,B,C,...,Z,a,b,...,z,á,..,Á,...Ú,ç,Ç,..ñ,Ñ,0,1,...,9,=,+,?,*,#,...} Representación interna. 6 Para representar cada caracter, basta con codificarlo con un determinado código binario. Lo importante es que esa codificación sea conocida por las distintas computadoras, lenguajes de programación, sistemas operativos, aplicaciones, etc. y así puedan entenderse, esto es, hay que definir un estándar de codificación que sea aceptado y conocido por todos. Habitualmente, en estos casos, lo que suele ocurrir es que no hay un único estándar. Uno de los más aceptados es el llamado ASCII que asigna a cada caracter un número binario de 7 bits (es decir, un número decimal entre 0 y 127). Mostramos en la siguiente tabla algunos de los caracteres llamados “imprimibles” (los que pueden visualizarse en pantalla o imprimirse). El resto son caracteres de control y otros especiales. En 1991 se definió un nuevo estándar llamado UNICODE el cual asigna un código a más de 50000 símbolos de todos los alfabetos europeos, chinos, japoneses, coreanos y otros más. Los símbolos del 0 al 127 del estándar UNICODE coinciden con los del estándar ASCII. Datos tipo cadena Un dato de tipo cadena es aquel que puede tomar por valor una secuencia de caracteres. En pseudocódigo, el valor de un dato de tipo cadena se puede representar entre comillas simples (') o dobles ("). Ejemplo: El título de un libro y el nombre de su autor, son datos de tipo cadena. Título...: "La Odisea" (cadena de 9 caracteres) Autor....: "Homero" (cadena de 6 caracteres) 7 Obsérvese que, en la cadena "La Odisea", el carácter espacio en blanco también se cuenta. Ejercicio clasificación de datos (indique a qué tipo de dato hacen referencia). El número de botones de una camisa. La altura de una torre. El número de pasajeros de un avión. El resultado de hacer una apuesta (ganar o perder). La capital de Canadá. La letra 'b' escrita en mayúscula. Identificadores Un identificador es el nombre que se le da a una cosa u objeto para diferenciarlo de los demás en base a sus características. En un algoritmo también pueden existir identificadores definidos por el programador al utilizar variables y constantes. Reglas para definir un identificador: Consta de uno o más caracteres. El primer caracter debe ser una letra o el caracter subrayado (_), mientras que, todos los demás pueden ser letras minúsculas o mayúsculas, dígitos o el caracter subrayado (_). No pueden existir dos identificadores iguales, es decir, dos elementos de un algoritmo no pueden nombrarse de la misma forma Un identificador no puede contener caracteres especiales, salvo el caracter subrayado (_). Es importante resaltar que las vocales no pueden llevar tilde ni diéresis. Nota: al definir un identificador se sugiere escribirlo en minúsculas, aunque su uso lo determina el programador. Ejemplo 1: Algunos identificadores válidos que pueden ser definidos por el programador son: numero dia_del_mes pinguino_1 _ciudad z 8 Ejemplo 2: Los siguientes identificadores no son válidos por incumplir la segunda regla: numero123 _dia numero* lugar de nacimiento mes Ejemplo 3: Mes y mes son considerados identificadores distintos. Lo anterior debido a la sensibilidad de algunos lenguajes con respecto al uso de mayúsculas y minúsculas. Por último, hay que decir que, es aconsejable que los identificadores tengan un significado afín a lo que representan. Variables En programación, una variable representa a un espacio de memoria en el cual se puede almacenar un dato. Gráficamente, se puede representar como: El programador, cuando desarrolla un programa (o diseña un algoritmo), debe decidir cuantas son las variables que el programa necesita para realizar las tareas que se le han encomendado. El tipo de dato que puede almacenar cada una de ellas. Durante la ejecución de un programa, el valor que tome el dato almacenado en una variable puede cambiar tantas veces como sea necesario, pero, siempre, tomando valores pertenecientes al tipo de dato que el programador ha decidido que puede almacenar dicha variable, ya que, el tipo de dato de una variable no puede ser cambiado durante la ejecución de un programa. Ejemplo de variables: 9 Para que un programa pueda hacer uso de una o más variables, éstas deben ser declaradas previamente. Todas las variables de un programa se declaran de la misma forma, indicando de cada una de ellas: El tipo de dato que puede almacenar (mediante un identificador). Su nombre (mediante otro identificador). Ejemplo 1: La declaración de una variable para almacenar la edad de una persona se escribe: entero edad Por tanto, en la memoria de la computadora se reservará un espacio para almacenar la edad: Ejemplo 2: Si se desea declarar una variable para almacenar un número entero y que, inicialmente, contenga el valor 35, se debe escribir: entero numero 35 Constante En programación, una constante representa a un valor (dato almacenado en memoria) que no puede cambiar durante la ejecución de un programa. Ejemplo 1: Las siguientes constantes de tipo entero están expresadas por su valor: -5 10 10 Ejemplo 2: De modo que, si se quieren declarar las constantes de tipo entero del ejemplo anterior, asignándoles un identificador, se puede escribir, por ejemplo: TEMPERATURA = -5 MES 10 O también: TEMPERATURA -5, MES 10 Constantes de tipo entero En programación, una constante de tipo entero es aquella que representa a un valor (dato) perteneciente al subconjunto de Z representable por el ordenador. Ejemplo 1: El ordenador puede representar el siguiente conjunto de valores enteros: { -32768, -32767, 1, 0, -1, 32766, 32767 } Algunos ejemplos de constantes de tipo entero son: -32000 ó 000077 (Los ceros a la izquierda no son significativos) Constantes tipo real En programación, una constante de tipo real es aquella que representa a un valor (dato) perteneciente al subconjunto de R representable por el ordenador. Ejemplo 1: Algunos ejemplos son: 8.12 000.333 (Los ceros a la izquierda no son significativos) 1111.809 -3200. (También se puede escribir -3200.0) .56 (También se puede escribir 0.56) 11 Ejemplo 2: Las siguientes constantes de tipo real están expresadas correctamente: -77e-3 +1111e+2 2000E+2 3040e2 Constantes tipo lógico En programación, una constante de tipo lógico es aquella que representa a un valor (dato) perteneciente al conjunto: { verdadero, falso } verdadero y falso son palabras reservadas (identificadores) que, en sí mismas, representan a constantes de tipo lógico. En consecuencia, aunque se pueden definir constantes de tipo lógico, no suele ser habitual declarar constantes de este tipo de dato. Ejemplo: ESTADO verdadero INTERRUPTOR falso Constantes tipo caracter En programación, una constante de tipo caracter es aquella que representa a un valor (dato) perteneciente al conjunto de caracteres que puede representar el ordenador. Ejemplo 1: Las siguientes constantes de tipo caracter están expresadas por su valor: 'a' 'T' '5' 12 '+' '.' Ejemplo 2: Algunos ejemplos de declaración de constantes de tipo caracter son: LETRA 's' NUMERO '9' SIGNO '-' ESPACIO_EN_BLANCO ' ' Constantes tipo cadena Una constante de tipo cadena es aquella que representa a un valor (dato) que representa a una secuencia de caracteres. Ejemplo 1: Las siguientes constantes de tipo cadena están expresadas por su valor: "Alejandro" "Lucerna" "Barcelona 2000" Ejemplo 2: Algunos ejemplos de declaración de constantes de tipo cadena son: NOMBRE "Alejandro" CIUDAD "Lucerna" OLIMPIADAS "Barcelona 2000" Nota: se sugiere que las constantes (identificadores) se escriban en mayúsculas a fin de diferenciarlas más fácilmente de las variables (identificadores). Ejercicios variables y constantes ¿Cuáles de las siguientes declaraciones de constantes y variables son correctas? 1) 2) 3) 4) 5) 6) caracter u vocal i letra j cadena "nombre" entero numero <- 7.0 888.8 13 7) verdadero 8) nueve 9 9) logico CIERTO 10) interruptor falso 11) _123 "un dos tres" 12) 13) 14) 15) 16) real 40.09 barra <- '\' a .9E-2 b 6.e5 caracter v, w, x Respuestas Son correctas las declaraciones: 8) nueve 9 9) logico CIERTO 10) interruptor falso 11) _123 "un dos tres" 14) a .9E-2 15) b 6.e5 16) caracter v, w, x No son correctas: 1) caracter u (caracter no es un identificador de constante válido) 2) vocal i (i no es un valor. Sí sería válido, por ejemplo: 'i') 3) letra j (letra no es un tipo de dato. Sí sería válido, por ejemplo: caracter j) 4) entero numero <- 7.0 (7.0 no es un valor de tipo entero. Sí sería válido: 7) 6) 888.8 (888.8 es valor de tipo real. Pero, ¿qué se ha declarado?) 8) verdadero (verdadero es un valor de tipo lógico. Pero, ¿qué se ha declarado? 13) real 40.09 (No hay variable ni constante declarada) Entrada y salida de datos Entrada: La entrada o lectura consiste en recibir desde un dispositivo de entrada (por ejemplo, el teclado) un valor. Esta operación se representa en un pseudocódigo como sigue: Leer a Donde “a” es la variable que recibirá el valor. 14 Salida: La salida o escritura consiste en mandar por un dispositivo de salida (por ejemplo, el monitor o la impresora) un resultado o mensaje. Este proceso se representa en un pseudocódigo como sigue: Imprimir “El resultado es: ”, r Donde “El resultado es:” es un mensaje que se desea imprimir y r es una variable que contiene un valor. El siguiente es un ejemplo que muestra el uso de entrada y salida, en donde se pretende calcular el 16% de iva al precio de un producto: Algoritmo: Cálculo del iva Inicio Imprimir “Descripción” Leer descripcion Imprimir “Precio” Leer precio iva precio*0.16 total precio+iva Imprimir total Fin Operadores aritméticos, lógicos y relacionales Expresiones: Son combinaciones de constantes, variables, símbolos de operación (operadores), paréntesis y nombre de funciones especiales. Ejemplo a+(b+3) + c Cada expresión toma un valor que se determina tomando los valores de las variables y constantes implicadas y la ejecución de las operaciones indicadas. Una expresión consta de operadores y operandos. Según sea el tipo de datos que manipulan, se clasifican las expresiones en: Aritméticas Relacionales Lógicas 15 Las expresiones aritméticas Son analógicas a las fórmulas matemáticas. Las variable y constantes son numéricas (real o entera) y las operaciones son aritméticas. Las expresiones aritméticas están formadas por operadores y operandos Operadores: Son elementos que relacionan de forma diferente, los valores de una o más variables y/o constantes. Es decir, los operadores nos permiten manipular los valores. Aritméticos Tipos de Operadores Relacionales Lógicos Operadores aritméticos Permiten la realización de operaciones matemáticas con los valores (variables y constantes). Pueden ser utilizados con tipos de datos enteros o reales. Si ambos son enteros, el resultado es entero; si alguno de ellos es real, el resultado es real. Formato Operando (Operador) Operando Valor Ejemplos a + b 5+ 3 Operadores aritméticos + * / Ʌ div mod Suma Resta Multiplicación División Exponenciación División entera Módulo (residuo de la división entera) 16 Ejemplo: Expresión 9/3 15 mod 2 7+5*3 Resultados (de acuerdo a la prioridad) 3 1 22 Propiedad de los operadores aritméticos (Jerarquía) Todas las expresiones entre paréntesis ( ) se evalúan primero. Las expresiones con paréntesis anidados se evalúan de adentro a afuera, el paréntesis más interno se evalúa primero. Dentro de una misma expresión los operadores se evalúan en el siguiente orden: () Ʌ Exponencial *,/ Multiplicación, división mod, div Modulo y división entera +,Suma y resta Ejemplos: Los operadores en una misma expresión con igual nivel de prioridad se evalúan de izquierda a derecha. a) 3+4*5=14 3+20=23 b) 23*2/5=9.2 46/5=9 c) 3+5*(10-(2+4))=23 3+5*(10-6) 3+5*(4)=3+20=23 d) 3.5+5.09-14.0/40=5.09 3.5+5.09-3.5 5.09 e) 2.1*(1.5+3.0*4.1)=28.98 2.1*(1.5+12.3) =2.1*13.8 28.98 17 Expresiones lógicas booleanas Un segundo tipo de expresiones es la expresión booleana, cuyo valor es siempre verdadero o falso (constantes lógicas). Las expresiones lógicas se forman combinando constantes lógicas, variables lógicas y otras expresiones lógicas, utilizando los operadores relacionales y los lógicos. Operadores relacionales Se utilizan para establecer una relación entre dos valores. Compara estos valores entre si y esta comparación produce un resultado de certeza o falsedad (verdadero o falso) Los operadores relacionales comparan valores del mismo tipo (numéricos o cadenas) Tienen el mismo nivel de prioridad en su evaluación. Los operadores relaciónales tienen menor prioridad que los aritméticos. Operadores relacionales > Mayor que < Menor que >= Mayor o igual que <= Menor igual que <> Diferente = Igual Ejemplos: Si a=10 b=20 c=30 a+b > c a-b < c a-b = c a*b <> c Falso Verdadero Falso Verdadero 18 Operadores lógicos Estos operadores se utiliza para establecer relaciones entre valores. Estos valores pueden se resultado de una expresión relacional. Los operadores lógicos o booleanos básicos son: And OR Not Y O Negación Tablas de verdad Operador And Operando1 Operador Operando2 Resultado V And V V V And F F F And V F F And F F Operador Or Operando1 Operador Operando2 Resultado V Or V V V Or F V F Or V V F Or F F 19 Operador Not Operador Operando Resultado Not V F Not F V Ejemplos: 20 Prioridad de los operadores en general 1. ( ) 2. Ʌ 3. *,/, div, mod, Not 4. +, - ,And 5. >, <, >=, <=, <>, =, Or Ejemplo: a=10 b=12 c=13 d=10 Operadores de asignación Es el modo de almacenar valores a una variable. La operación de asignación se representa con el símbolo u operador . Se conoce como instrucción o sentencia de asignación cuando se refiere a un lenguaje de programación. El formato general de una operación de asignación es: Nombre de la variableexpresión, variable o una constante 21 Ejemplos de problemas secuenciales 1) Suponga que un individuo desea invertir su capital en un banco y desea saber cuánto dinero ganará después de un mes si el banco paga a razón de 2% mensual. Antes de resolver el problema es bueno hacer un análisis y hacerse las siguientes preguntas: a) ¿Qué es lo que se quiere obtener?, o sea, ¿cuál será la salida? b) ¿Qué datos se requieren como entrada? c) ¿Qué procesos se aplicarán a los datos de entrada para producir la salida esperada? Para este problema tendríamos: Salida: ganancia Entrada: capital Proceso: ganancia capital * 0.02 El diagrama de flujo y pseudocódigo que representan al algoritmo que da solución al problema sería: 22 Inicio Imprimir “Introduzca el capital invertido: “ Leer capital ganancia capital * 0.02 Imprimir “La ganancia de esta inversión al aplicar el 2% de interés mensual a un capital de $”, capital, “será de $”, ganancia Fin Imagínese que después de traducir el algoritmo en un programa lo ejecutamos, introducimos como capital el valor 2000 y tendríamos en pantalla: 23 2) Hacer un algoritmo que permita convertir kilogramos en gramos. Realizando un análisis, para este problema tendríamos: Salida: gr Entrada: kg Proceso: gr kg * 1000 Inicio Imprimir “Introduzca los kilogramos: “ Leer kg gr ← kg * 1000 Imprimir kg, “ kilogramos equivalen a “, gr, “ gramos” Fin 24 Si introducimos 1.5 como valor para la variable kilogramos, en pantalla se observaría: Para comprobar que comprendieron este tema, los reto a que resuelvan el siguiente problema: 3) Hacer un algoritmo que calcule e imprima el área de un rectángulo (área = base * altura). 25 Estructuras Selectivas. Las estructuras lógicas selectivas se encuentran en la solución algorítmica de casi todo tipo de problemas. Las utilizamos cuando en el desarrollo de la solución de un problema debemos tomar una decisión, para establecer un proceso o señalar un camino alternativo a seguir. Esta toma de decisión (expresada con un rombo) se basa en la evaluación de una o más condiciones que nos señalarán como alternativa o consecuencia, la rama a seguir. Hay situaciones en las que la toma de decisiones se realiza en cascada. Es decir se toma una decisión, se marca la rama correspondiente a seguir, se vuelve a tomar otra decisión y así sucesivamente. Por lo que para alcanzar la solución de este problema o subproblema debemos aplicar prácticamente un árbol de decisión. Las estructuras algorítmicas selectivas que se utilizan para la toma de decisiones lógicas las podemos clasificar de la siguiente forma: 1. Si Entonces 2. SI Entonces Si_no (Estructura selectiva simple) (Estructura selectiva doble) La estructura Si Entonces. La estructura selectiva Si Entonces permite que el flujo del programa siga por un camino específico si se cumple una condición o conjunto de condiciones. Si al evaluar la condición (o condiciones) el resultado es verdadero, entonces se ejecuta(n) ciertas operación(es). Luego se continúa con la secuencia normal del programa. Diagrama de flujo Pseudocódigo Si (condición) Entonces instrucción 1 instrucción 2 ......... instrucción n Fin_Si 26 Ejemplo: Algoritmo: Numero Inicio Leer a Si (a = 5) Entonces Imprimir "Es un 5" Fin_Si Fin La estructura Si Entonces/Si_no. La estructura selectiva Si Entonces/Si_no permite que el flujo del programa pueda ir por dos ramas diferentes en el punto de la toma de decisión(es). Si al evaluar la condición (o condiciones) el resultado es verdadero, entonces se sigue por un camino específico y se ejecuta(n) cierta(s) operación(es). Por otra parte, si el resultado es falso entonces se sigue por otro camino y se ejecuta(n) otra(s) operación(es). En ambos casos, luego de ejecutarse la(s) operación(es) indicada(s), se continúa con la secuencia normal del programa. 27 Diagrama de flujo Algoritmo Si (condición) Entonces instrucción 1 instrucción 2 ................... instrucción n Si_no instrucción a instrucción b ................... instrucción z Fin_Si Ejemplo: Algoritmo: Numero Inicio Leer a Si (a = 5) Entonces Imprimir "Es un 5" Si_no Imprimir "No es un 5" Fin_Si Fin 28 Ejemplo: Hacer un algoritmo en diagrama de flujo y pseudocódigo, que lea el nombre de un estudiante, su calificación de Español y Matemáticas, que calcule el promedio de las dos y que imprima un mensaje de felicitaciones si el promedio es Algoritmo: Promedio Inicio Leer nombre Leer m Leer e p (m+e)/2 Si (p>=70) Entonces Imprimir ‘Felicidades’ Fin_Si Fin mayor o igual a 70 29 Ejemplo: Leer el total de una compra, si es mayor a 5000 hacerle un 10% de descuento e imprimir el total a pagar. Algoritmo: Compra Inicio Leer compra Si (compra>5000) Entonces descto compra*0.10 totalCompra=compra-descto Imprimir ‘El total es ’,totalCompra Fin_Si Fin 30 Ejemplo: Leer el sueldo de un trabajador, si su sueldo es menor a 1000 deberemos aumentarle el 15%, en caso contrario aumentarle el 12%. Imprimir el nuevo sueldo del trabajador Algoritmo: Sueldo Inicio Leer sueldo Si (sueldo<1000) Entonces aumento sueldo*0.15 Si_no aumento sueldo*0.12 Fin_Si totalSueldo sueldo+aumento Imprimir (‘El sueldo total es’,totalSueldo) Fin 31