Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python Jairo Hernando Ramírez Marín Ramírez Marín, Jairo Hernando Fundamentos iniciales de lógica de programación I. Algoritmos en PseInt y Python / Jairo Hernando Ramírez Marín – Envigado: Institución Universitaria de Envigado, 2019. 278 páginas. ISBN - pdf: 978-958-52600-4-7 Programación lógica – 2. Algoritmos – 3. Ingeniería de software 005.1 (SCDD 22 ed.) Fundamentos iniciales de lógica de programación I. Algoritmos en PseInt y Python © Jairo Hernando Ramírez Marín © Institución Universitaria de Envigado Edición: diciembre de 2019 ISBN – pdf: 978-958-52600-4-7 Rectora Blanca Libia Echeverri Londoño Director de Publicaciones Jorge Hernando Restrepo Quirós Coordinadora de Publicaciones Lina Marcela Patiño Olarte Asistente Publicaciones Diana Yaned Marroquín Carmona Diseño y diagramación Leonardo Sánchez Perea Corrección de texto Erika Tatiana Agudelo Editado en Envigado – Antioquia Sello Editorial Fondo Editorial IUE Institución Universitaria de Envigado Carrera 27B #39ª Sur 57 Tel: (+4) 339 10 10 ext. 1524 www.iue.edu.co publicaciones@iue.edu.co El autor es moral y legalmente responsable de la información expresada en este libro, así como del respeto a los derechos de autor. Por lo tanto, no comprometen en ningún sentido a la Institución Universitaria de Envigado. Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-SinObraDe- rivada 4.0 Internacional. Más información: https://creativecommons.org/licenses/by-nc-nd/4.0/ Contenido Agradecimientos 11 Presentación 13 UNIDAD 1. CONCEPTOS BÁSICOS DE LÓGICA DE PROGRAMACIÓN Introducción 15 1. Conceptos básicos de lógica de programación 17 1.1 Operadores usados en lógica 17 1.1.1 Operadores aritméticos 17 1.1.2 Operadores lógicos relacionales y booleanos 18 1.2 Tipos de división en lógica de programación 21 1.2.1 División decimal 22 1.2.2 División entera 22 1.2.3 Operación módulo 23 1.3 Jerarquía de los operadores 25 1.3.1 Ejemplos de jerarquía de los operadores 26 1.3.2 Ejercicios resueltos 27 1.3.3 Ejercicios propuestos 31 1.4 Expresiones algorítmicas 32 1.4.1 Ejemplos de conversión de expresiones algorítmicas 33 1.4.2 Convertir expresiones algorítmicas en matemáticas 34 1.4.3 Ejercicios resueltos 34 1.4.4 Ejercicios propuestos 35 1.5 Lógica de programación y algoritmos 36 1.5.1 Definiciones 36 1.5.2 Características de un algoritmo 37 1.5.3 Partes de un algoritmo 38 1.5.4 Tipos de algoritmos 39 1.5.5 Pasos para solucionar un problema computacional 40 1.5.6 Pasos de elaboración de un algoritmo 42 1.6 Formas de representación de un algoritmo 42 1.6.1 Algoritmo en lenguaje natural 42 1.6.2 Pseudocódigo 43 1.6.3 Diagramación libre 45 1.6.4 Diagramación rectangular 47 1.6.5 Ejemplo de algoritmo cualitativo 48 1.6.6 Ejemplo de algoritmo cuantitativo 50 1.7 Datos manejados en un algoritmo 52 1.7.1 Datos numéricos 52 1.7.2 Datos alfabéticos 53 1.7.3 Datos alfanuméricos 53 1.7.4 Datos lógicos o booleanos 54 1.7.5 Ejercicios propuestos de tipos de datos 55 1.7.6 Ejercicios propuestos de expresiones booleanas 56 1.7.7 Datos variables 57 1.7.8 Datos constantes 57 1.7.9 Condiciones para nombrar variables y constantes 58 1.7.10 Ejercicios propuestos 58 UNIDAD 2. ESTRUCTURA FUNDAMENTAL DE UN ALGORITMO Introducción 60 2. Estructura secuencial de un algoritmo 62 2.1 Estructura secuencial 62 2.2 Asignación de información 66 2.2.1 Asignación interna 66 2.2.2 Asignación externa 66 2.2.3 Actualización 67 2.3 Operaciones básicas en algoritmos 67 2.4 Fórmulas y ecuaciones en algoritmos 72 2.5 Porcentajes en algoritmos 78 2.6 Conversión de unidades 84 2.7 Prueba de escritorio 88 2.8 Ejercicios resueltos 100 2.9 Ejercicios propuestos 116 2.10 Práctica final de algoritmos secuenciales 127 UNIDAD 3. ESTRUCTURAS DE DECISIÓN Y SELECCIÓN MÚLTIPLE Introducción 129 3. Estructuras de decisión y selección 131 3.1 Estructuras de decisión 131 3.2 Tipos de estructuras de decisión 133 3.2.1 Estructura de decisión simple 133 3.2.2 Estructura de decisión compuesta 138 3.2.3 Estructura de decisión múltiple 141 3.2.4 Estructura de decisión anidada 147 3.3 Ejercicios resueltos 158 3.4 Ejercicios propuestos 191 3.5 Práctica final estructuras de decisión 199 3.6 Estructuras de selección múltiple 201 3.7 Ejercicios resueltos 211 3.8 Ejercicios propuestos 220 3.9 Práctica final de estructuras de decisión y selección 230 4. Solución a los ejercicios propuestos 232 Anexos Anexo 1. Fórmulas generales de figuras geométricas. 245 Anexo 2. Fórmulas de conversión de temperaturas. 248 Anexo 3. Equivalencias de longitud. 249 Anexo 4. Equivalencias de masa. 250 Anexo 5. Equivalencias de volumen. 251 Anexo 7. Equivalencias de superficie. 254 Anexo 8. Equivalencias de computación. 255 Anexo 9. Tabla de caracteres ASCII. 256 Referencias 257 Lista de tablas 259 Lista de figuras 261 Glosario 267 Del Autor 275 Agradecimientos El primer agradecimiento siempre será para Dios, por inundarme de bendiciones en todos los aspectos de mi vida. A mi esposa Ledy Yovana Cañaveral Ocampo, por su paciencia y por ser una excelente compañera en este viaje de vida. A mi hijo Miguel Ángel Ramírez Cañaveral, ese ser angelical que es el motor de todo cuanto hago, quien es mi mayor bendición junto con mi esposa, familia y amigos. A mis padres Jairo Antonio Ramírez Quiros y Orfelina María Marín, por enseñarme valores a través del ejemplo. Gracias a ellos pude realizar mis estudios. Mi padre, quien me enseñó a ser responsable y luchador; mi madre, que me heredó su lógica y creatividad. Toda mi admiración y agradecimiento para ellos. No pude haber tenido mejores padres. A mis hermanos John Diego y Lina María, que, a pesar de la distancia, siempre estamos unidos como familia para afrontar los problemas y superarlos; y a mis sobrinos John Fernando, Zorelly, Yoselin y Samuel; que trajeron alegría a nuestra familia con sus llegadas y que esperamos se levanten unidos y con lazos de hermandad. A Oscar Alberto Saavedra Vásquez, Liliana María Loaiza y Samuel Saavedra Loaiza, a Alexander García Berrio, Paula Andrea Cañaveral Ocampo y Samuel García Cañaveral, a Carlos Andrés Cañaveral Ocampo y Marisella Pérez Martínez: unas familias maravillosas que nos han permitido compartir momentos inolvidables. A mis amigos, especialmente a Felipe Bedoya, Wilmar Ocampo, Guelmer Hincapié, Alexander Ospina, Conrado y Enrique Zapata, quienes forman parte del círculo familiar. A mis padrinos Fabiola Montoya y Bernardo Marín, quienes acogieron a unos desconocidos y les brindaron apoyo cuando más lo necesitaban. A mi familia, Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python12 a mis tías: Omaira, Hortencia, Olga y Olivia y a mis primos: Yesender y Yonier García; Bayron, Johana y Nilton Vasquez; Yuri Restrepo; Henry (q. e. p. d.) y Jeison (q. e. p. d.) Marín, que son los únicos familiares con los que hemos contado. A Beatriz Hernández Obando y Sergio Alberto Estrada, quienes me dieron la oportunidad de iniciarme como docente de media técnica en el mejor colegio de todos (Colegio Monseñor Gustavo Calle Giraldo, en Bello). Así mismo, al Mg. Gustavo Adolfo Moreno López, quien me apoyó en el aspecto laboral, me motivó a estudiar la Maestría en software libre y fue un motivador constante para escribir este libro. Al Decano de la Escuela de Ingeniería de la Institución Universitaria Salazar y Herrera (IUSH): Jorge Alonso Monsalve Jaramillo y a la Coordinadora del programa de Ingeniería Industrial: Yenny Alejandra Aguirre, quienes me motivaron a retomar la publicación de este libro y con la oportunidad brindada por Lina Marcela Patiño del Fondo Editorial IUE de la Institución Universitaria de Envigado, tomé un nuevo aire que me permitió culminareste anhelado sueño. A Rafael Quintana, Carlos Monsalve y Alberto Sánchez mis profesores de Lógica, Algoritmos y Programación cuando realicé mi Tecnología en Sistemas. Sin olvidar a los profesores que me aportaron para culminar mis estudios de Ingeniería en Sistemas. A Roberto Flórez Rueda, profesor de la Universidad de Antioquia y experto en algoritmos, y a Hernán Rendón Valencia, Secretario General de la IUSH, quienes hicieron la revisión en el aspecto temático y de estilo, respectivamente. A todos los estudiantes que he tenido en las diferentes instituciones: Colegio Monseñor Gustavo Calle Giraldo, Politécnico Marco Fidel Suárez, Corporación Tecnológica Católica de Occidente y la Institución Universitaria Salazar y Herrera, especialmente a Luisa Fernanda Molina Betancur, Juan Guillermo Martínez Álvarez, Joseph Mateus Raigoza Mesa, quienes me motivaron a terminar este libro y me ayudaron a revisar aspectos del mismo y realizar el testing de los ejercicios. Presentación En la mayoría de los hogares, empresas e instituciones educativas hay com- putadoras para diferentes usos, lo que propició que su manejo pasara de ser una necesidad a ser una obligación. La mejor forma de actualizarse y ofrecer posibles soluciones a los múltiples problemas que se presentan es utilizando óptimamente estas herramientas. Pero luego de operarlas, se es- pera subir a un nivel más avanzado que es el mismo desarrollo del software; pasamos del nivel de ser operarios de los programas a ser los creadores de estos, adecuándolos a las necesidades y exigencias de nuestro entorno sin importar el nivel de complejidad y su área de desempeño. Con este libro se busca brindar la posibilidad de empezar a explorar todo este fantástico mundo de la programación, ampliando la posibilidad la- boral y personal del lector: estudiante, docente de sistemas y de otras áreas o cualquier persona interesada en el tema; puesto que al adquirir los concep- tos fundamentales de lógica de programación y algoritmos se pueden pasar fácilmente de algoritmos, con una sintaxis similar al software PSeInt, a un lenguaje de programación que le permita desarrollar aplicaciones para ce- lulares y páginas web, configurar periféricos e incluso realizar videojuegos con mayor facilidad. La importancia de este libro radica en que está enfocado a personas que apenas inician en este mundo de la programación: estudiantes de media técnica que tienen énfasis en sistemas, estudiantes de los primeros semes- tres de tecnologías e ingenierías de sistemas y programas afines. Es de resaltar que el ‘arte’ de programar no es una tarea fácil, pero se puede llegar a entender y manejar, siempre y cuando se tenga disciplina y dedicación, y al final, esta actividad se puede convertir en un juego lógico y entretenido con resultados muy satisfactorios. Debido a lo anterior se ha to- mado la iniciativa de compartir el conocimiento adquirido durante el proce- so de más de dos décadas de docencia en colegios con énfasis en sistemas, instituciones tecnológicas e instituciones universitarias; y se busca entregar Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python14 estrategias que permitan entender el funcionamiento de los programas y la forma más fácil y acertada de desarrollar algoritmos, como primer paso, antes de ir a un lenguaje de programación. Este libro lleva una secuencia lógica, coherente e incremental, donde se exponen conceptos teóricos, variedad de ejemplos para entender la temática y se termina con una serie de ejercicios prácticos que sirven para evidenciar el manejo del tema. Siempre se busca un avance empezando por el ejercicio más fácil hasta terminar con el más complejo. Se agregan varias solucio- nes a un mismo ejercicio para facilitarle al estudiante la identificación de la forma personal y propia de fortalecer su lógica, y se le motiva a crear nuevas soluciones. Se proponen algoritmos actuales con entorno reales, lo que facilita más el entendimiento del ejercicio planteado (primer paso del desarrollo de algoritmos). En Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python se encuentra la solución de ejercicios de algoritmos a través de pseudocódigos (similar al lenguaje de programación) y se habla super- ficialmente de la técnica de diagramación libre (usada por profesionales de electrónica o industrial). Está distribuido en tres unidades, la solución de al- gunos ejercicios propuestos y un apartado de anexos, en las que se abordan temas fundamentales de lógica de programación: conceptos y estructuras básicas de un algoritmo, estructuras de decisión y de selección. Espero que este material sea de su agrado y le sirva para motivarlo a incursionar en el mundo de la programación, donde su éxito depende del manejo óptimo de la lógica de programación aplicada en el diseño de algo- ritmos y la programación. 15Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python Unidad 1 Conceptos básicos de lógica de programación Introducción En esta unidad se explican los siguientes temas (véase figura 1): • Operadores usados en lógica. • Jerarquía de los operadores. • Expresiones algorítmicas. • Lógica de programación y algoritmos. • Conceptos básicos de algoritmos. • Representación de los algoritmos. • Datos usados en los algoritmos. • Ejercicios resueltos y propuestos. Estos temas facilitan la adquisición de las competencias que se descri- ben a continuación: • Conocer conceptos fundamentales de algoritmos y lógica de programa- ción, como los tipos de algoritmos y sus características primordiales. • Entender las diferentes formas de representar un algoritmo e identificar la mejor al momento de dar solución a un problema. • Convertir cualquier fórmula y operación matemática en una expresión algorítmica válida y entendible para la computadora. • Desarrollar los pasos necesarios para la realización de un algoritmo en la búsqueda de soluciones a problemas planteados. • Reconocer el concepto de dato y su interacción con los diversos proce- sos de entrada y de salida. Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python16 Fi gu ra 1 . U ni da d 1. C on ce pt os b ás ic os . 17Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python 1. Conceptos básicos de lógica de programación 1.1 Operadores usados en lógica Corona y Ancona (2011) enuncian los operadores usados en lógica como símbolos que relacionan valores, variables o constantes dando un resultado determinado según el tipo de dato procesado. Toda expresión manipula unos datos que arrojan resultados dependien- do de su tipo; por ejemplo, al realizar la operación 5 / 2, podría arrojar como resultado 2.5 si se realiza en Python o 2 si es en otro lenguaje como C++ o Java con dos número enteros; así mismo, en la comparación de 2 < 5 arroja un resultado Verdadero (resultado booleano a pesar de hacer operación con dos números enteros).1 1.1.1 Operadores aritméticos Los operadores aritméticos permiten la realización de operaciones matemáticas con variables y constantes. Estos operadores pueden ser utilizados con tipos de datos enteros, reales o cadenas, dependiendo del lenguaje de programación se pueden concatenar con el operador +. A continuación, en la tabla 1, se muestran los operadores aritméticos usados en los lenguajes de programación de computadoras: Tabla 1. Operadores aritméticos Operación Símbolo Nombre Alternativo Suma o adición + Más Resta o diferencia – Menos Multiplicación o producto * Asterisco División o cociente decimal / Slash División o cociente entero \ Backslash Div Operación módulo o de residuo Mod Módulo % Exponenciación o potencia ^ Circunflejo ** 1 En este libro se utilizará el punto (.) como separador de los números decimales puesto que en los lenguajes de programación si se utilizan números separados por coma (,) presentarán error. 18 Fundamentos iniciales de lógicade programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python La división entera solo es usada en algunos lenguajes de programación. Por tal motivo, en este libro que es enfocado a lógica de programación, no se usará con mucha frecuencia. En algunos lenguajes se usan funciones de truncamiento, de redondeo o se soluciona este problema en la declaración de variables de tipo entera, la cual omite los decimales. 1.1.2 Operadores lógicos relacionales y booleanos Los operadores lógicos permiten hacer comparaciones entre variables y/o valores. Estos operadores se dividen en: operadores lógicos relacionales y operadores lógicos booleanos. Se utilizan para establecer una relación entre dos valores por medio de una comparación y produciendo un resultado de Verdadero o Falso. Los operadores relacionales comparan valores del mismo tipo, tienen el mismo nivel de prioridad al evaluarse y tienen menor prioridad que los operadores aritméticos (véase tabla 2). Tabla 2. Operadores relacionales. Comparación Operador Ejemplo Python Mayor que > 50 > 10 > Menor que < 5 < 15 < Mayor o igual que > = 10 >= 10 >= Menor o igual que <= –5 <= 5 <= Igual = 25 = 25 == Diferente < > 8 <> 4 != Los símbolos de los operadores relacionales: mayor igual que (≥), me- nor o igual que (≤) y diferente (≠), son usados en lógica matemática, pero no en lógica de programación. En el lenguaje de programación Python se usa el operador != (no igual) que es equivalente al operador <> (diferente). Los operadores lógicos booleanos se utilizan para establecer relaciones entre valores lógicos, y estos valores pueden ser resultado de una expresión relacional. Al comparar valores de Falso o Verdadero usando los operado- res lógicos booleanos de la tabla 3, se produce un resultado del mismo tipo: Verdadero o Falso. 19Unidad 1. Conceptos básicos de lógica de programación Tabla 3. Operadores booleanos. Operación Símbolo (Nombre) Python Conjunción Λ (Y) And Disyunción V (O) Or Negación ! (NO) Not Como lo dice (EcuRed, 2018), al momento de hacer comparaciones se debe tener en cuenta la tabla de verdad o tabla de valores de verdad vista en matemática o lógica matemática. La tabla 3 muestra el valor de verdad de una proposición compuesta para cada combinación de valores que se pue- dan asignar a sus componentes. Las tablas de verdad fueron desarrolladas por Charles Sanders Peirce en los años de 1880, pero el formato más popu- lar es el que introdujo Ludwig Wittgenstein en 1921. La tabla de los valores de verdad es usada en el ámbito de la lógica, para obtener Verdadero (V) o Falso (F) de una expresión o de una proposición. Estas tablas pueden construirse haciendo una interpretación de los ope- radores lógicos booleanos. En consecuencia, las tablas de verdad consti- tuyen un método de decisión para chequear si una proposición es o no un teorema. Normalmente, empieza con la letra p con valores Verdadero, Ver- dadero, Falso, Falso y una variable q con valores Verdadero, Falso, Verda- dero y Falso, como se muestra en la tabla 4. Tabla 4. Tabla de verdad. P Q Verdadero Verdadero Verdadero Falso Falso Verdadero Falso Falso Al construir tablas de verdad se pueden encontrar alguna negación, la cual es el valor contrario de la proposición, esta se representa con el sím- bolo ~. Por ejemplo, si p = Verdadero, entonces ~p = Falso y si p = Falso, entonces ~p = Verdadero. La tabla de verdad de la negación de p y q se muestra en la tabla 5. 20 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python Tabla 5. Tabla de verdad de la negación. P Q ~p ~q Verdadero Verdadero Falso Falso Verdadero Falso Falso Verdadero Falso Verdadero Verdadero Falso Falso Falso Verdadero Verdadero Por su parte, la conjunción se representa con el símbolo Λ. Se tienen que cumplir las dos condiciones en Verdadero para que el resultado sea Ver- dadero, en los demás casos el resultado es Falso. Por ejemplo, si ponemos la siguiente condición: compro ese libro si tengo dinero (p) y si la tienda está abierta (q). Se pueden dar estos casos: - Si tengo dinero (p = Verdadero) y la tienda está abierta (q = Verdadero) Me compro el libro (Verdadero). Se tienen que cumplir las dos con- diciones para poder comprar el libro. - Si tengo dinero (p = Verdadero) y la tienda no está abierta (~q = Falso) No compro el libro (Falso). Al no estar abierta la tienda no puedo comprar el libro. - Si no tengo dinero (~p = Falso) y la tienda está abierta (q = Verdadero) No compro el libro (Falso). Al no tener dinero, tampoco puedo com- prar el libro. - Si no tengo dinero (~p = Falso) y la tienda no está abierta (~q = Falso) No compro el libro (Falso). Al no tener dinero y la tienda no estar abierta no puedo comprar el libro. En resumen, p = Verdadero y q = Verdadero, entonces p Λ q = Verdade- ro, en los demás casos es Falso (véase tabla 6). Tabla 6. Tabla de verdad de la conjunción. P Q p Λ q Verdadero Verdadero Verdadero Verdadero Falso Falso Falso Verdadero Falso Falso Falso Falso 21Unidad 1. Conceptos básicos de lógica de programación La disyunción se representa con el símbolo V. Da como resultado Falso cuando las dos condiciones son falsas, en los demás casos es Verdadero. Por ejemplo, si ponemos la siguiente condición, me compro un vehículo si me aprueban un préstamo en el banco (p) o si me gano la lotería (q). Se pueden dar estos casos: - Si me aprueban un préstamo en el banco (p = Verdadero) o me gano la lotería (q = Verdadero) Me compro el vehículo (Verdadero). - Si me aprueban un préstamo en el banco (p = Verdadero) o no me gano la lotería (~q = Falso) Me compro el vehículo (Verdadero). - Si no me aprueban un préstamo en el banco (~p = Falso) o me gano la lotería (q = Verdadero) Me compro el vehículo (Verdadero). - Si no me aprueban un préstamo en el banco (~p = Falso) o no me gano la lotería (~q = Falso) No puedo comprar el vehículo (Falso). En resumen, p = Falso y q = Falso, entonces p V q = Falso, en los de- más casos es Verdadero (véase tabla 7). Tabla 7. Tabla de verdad de la disyunción. P q p V q Verdadero Verdadero Verdadero Verdadero Falso Verdadero Falso Verdadero Verdadero Falso Falso Falso 1.2 Tipos de división en lógica de programación Antes de empezar a hacer operaciones con jerarquía de los operadores es fundamental entender los tres tipos de división que existen en lógica y en lenguajes de programación que, a pesar de su similitud, tienen algunas di- ferencias marcadas. 22 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python 1.2.1 División decimal Es la división que se realiza por defecto, es la más usada. Se representa con signo / (slash). Es aquella que da resultados con decimales, en caso de tenerlos. Una calculadora siempre arroja los resultados de esta forma. En este libro se usan dos decimales para dar resultados de forma más precisa y así unificar respuestas en la solución de los ejercicios (tener en cuenta conceptos de redondeo para estas respuestas). Por ejemplo, 51 / 2 = 25.5 no tiene decimales para hacer aproximación y 100 / 3 = 33.3333333, quedaría 33.33 (aproximando o truncando a dos decimales). El resultado se muestra completo con sus decimales. En caso de ser una división cuyo resultado no tenga decimales, este se puede presentar de dos formas, dependiendo del formato de salida: 20 / 5 se puede visualizar como 4 o 4.0 y ambos resultados son válidos. 1.2.2 División entera Se representa con signo \ (backslash). Esta división no tiene en cuenta los decimales del resultado, no importa su valor decimal. Aquí no se puede aproximar o redondear, sino que se aplica el concepto de truncamiento al resultado. Según Ruiz, Llorente, González, Aparicio y Arribas (2019,p.19) “para hacer truncamientos de orden n se eliminan todas las cifras a partir de ese orden”, en nuestros ejemplos se aplica truncamiento de orden 0 quitando los dígitos a la derecha del separador decimal y dejando los dígitos que se encuentra a la izquierda del punto, por ejemplo, al hacer la división entera 59 999 \ 10 000 se obtiene como respuesta 5.9999 y aplicarle el concepto de truncamiento, el resultado sería 5. Existe truncamiento a un número de dígitos, por ejemplo, al truncar el número 3.14159265 a cuatro dígitos significativos a la derecha, el resultado es 3.1415; pero en este caso, usaremos el truncamiento con cero cantidades de dígitos significativos a la derecha, para lo cual se quita los valores ubica- dos después del punto (.) sin importar cual sea ese valor. Ahora aplicando el concepto de división entera a 51 \ 2, el resultado es 25. 23Unidad 1. Conceptos básicos de lógica de programación En la práctica normal, la división entera se aplica declarando variables de este tipo o usando funciones de truncamiento y redondeo. Por ejemplo, si se calcula una operación como Division = 8 / 3, el resultado es 2.666666 si la variable Division es de tipo real; pero si es de tipo entero el resultado es 2. Por lo tanto, se realiza el truncamiento por la declaración de la variable. 1.2.3 Operación módulo Es conocida como división de residuo; debido a que usa el residuo de la división de los dos valores enteros para arrojar un resultado. Por ejemplo, 51 mod 2 es igual a 1. Normalmente se usa el operador % o la palabra mod. Para explicar el resultado véase la figura 2. Figura 2. Ejemplo de operación módulo. Para entender mejor los tipos de división, se realizan las siguientes acla- raciones: - La operación decimal 46 / 7 es igual a 6.57142857, aproximando la respuesta a dos decimales sería 6.57. Este resultado es el que sacamos frecuentemente en las calculadoras, celulares o computadoras. - La operación entera 46 \ 7 es igual a 6, dado que se aplica el trun- camiento al resultado quitando los decimales de la respuesta anterior: 6.57La operación módulo 46 mod 7 es igual a 4; el cual corresponde al residuo luego de ejecutar la división de 46 entre 7 (el 7 en el 46 está 6 veces, al multiplicar 7 por 6 da 42, quedando como residuo 4, que es lo que falta para llegar a 46). Para entender mejor los conceptos, observar los resultados de cada una de las operaciones en la tabla 8. 24 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python Tabla 8. Resultados de los tipos de división. Operación Decimal Entera Módulo 11 dividido 6 1.83333333 ≈ 1.83 1 5 29 dividido 9 3.22222222 ≈ 3.22 3 2 38 dividido 8 4.75 4 6 45 dividido 2 22.50 22 1 52 dividido 9 5.77777778 ≈ 5.78 5 7 64 dividido 7 9.14285714 ≈ 9.14 9 1 80 dividido 8 10.00 10 0 98 dividido 9 10.8888888889 ≈ 10.89 10 8 100 dividido 3 33.3333333 ≈ 33.33 33 1 148 dividido 84 1.7619047619047 ≈ 1.76 1 64 1583 divido 78 20.29487179487 ≈ 20.29 20 23 4562 divido 145 31.46206896551 ≈ 31.46 31 67 7821 divido 23 340.04347826 ≈ 340.04 340 1 Se recomienda tener en cuenta lo siguiente al momento de resolver los diferentes tipos de división: - Cuando una división es exacta en la operación módulo, el resultado siempre es igual a cero, porque no queda ningún residuo. Por ejemplo: al realizar la operación 42 mod 7 (el 7 en el 42 está 6 veces, 7 multiplicado por 6) da como resultado 42 y lo que le faltaría para llegar a 42 es 0. - Cuando la división es exacta, la división decimal y la división entera son iguales. Por ejemplo: 42 / 7 = 6.00 es igual a 42 \ 7 = 6. - Cuando el denominador es mayor que el numerador, el resultado de la división entera es igual 0 y de la operación módulo es igual al nu- merador. Por ejemplo: 7 / 42 = 0.1666 y al realizar el truncamiento de los decimales a la respuesta anterior, el resultado es 0. Y al realizar la operación 7 mod 42 es resultado es igual a 7. Para entender mejor las últimas observaciones, ver los resultados de cada una de las divisiones en la tabla 9. 25Unidad 1. Conceptos básicos de lógica de programación Tabla 9. Resultados de los casos especiales en los tipos de división. Operación Decimal Entera Módulo 8 dividido 16 0.50 0 8 15 dividido 5 3.00 3 0 48 dividido 8 6.00 6 0 14 dividido 24 0.58333333 ≈ 0.58 0 14 78 dividido 13 6.00 6 0 97 dividido 101 0.96039604 ≈ 0.96 0 97 645 dividido 4521 0.142667551 0 645 4335 dividido 255 17.00 17 0 1.3 Jerarquía de los operadores Una computadora, para dar el resultado de una operación matemática, rea- liza cálculos teniendo siempre en cuenta el orden de los operadores que la conforman. Este orden es el que se conoce como jerarquía de los opera- dores, la cual efectúa las operaciones de forma estricta según los niveles mostrados en la tabla 10. Tabla 10. Jerarquía de los operadores de cuatro niveles. Nivel Operación por desarrollar Símbolo 1 Potenciación o exponenciación ^ 2 Multiplicación y división decimal * / 3 División entera y operación módulo \ mod 4 Suma y resta + – Al resolver cualquier expresión matemática, se desarrollan las opera- ciones que están entre paréntesis, y en el interior se van aplicando cada uno de los niveles que se muestran. Es importante tener en cuenta que un parén- tesis desaparece cuando no tenga operaciones para realizar en su interior. Luego, se repasan los niveles de arriba hacia abajo hasta reducir a un solo término. 26 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python 1.3.1 Ejemplos de jerarquía de los operadores Para realizar cualquier operación matemática es necesario utilizar la jerar- quía de los operadores antes mencionada, debido a que esta indica el orden a seguir en el desarrollo de cada una de las operaciones, dependiendo de los operadores aritméticos que la componen. Ejemplo 1. La expresión 2 + 5 * 3 podrá generar duda al momento de evaluar cuál operación se ejecuta primero: ¿multiplicación o suma?, si se suma primero 2 + 5 da como resultado 7 y al multiplicarlo por 3, da como respuesta 21; pero si primero se multiplica 5 * 3 da como resultado 15 y luego de sumarle 2, da como respuesta 17. Entonces, ¿cuál es la respuesta correcta: 21 o 17? Para no tener dudas al momento de resolver una operación mate- mática, se deben seguir las instrucciones de la jerarquía de los operadores, donde se observa que primero se ejecuta la multiplicación y luego la suma, por lo tanto, la respuesta correcta será 17, quedando así: 2 + 5 * 3 2 + 15 17 Ejemplo 2. Para dar el resultado a la expresión 40 / 5 + 8 ̂ 2 * 3, se debe hacer lo siguiente: - 40 / 5 + 8 ^ 2 * 3 Primero se resuelve la potenciación, que es el operador de mayor jerarquía (debido a que no tiene paréntesis), dando como resultado: 40 / 5 + 64 * 3. - 40 / 5 + 64 * 3 En este momento se pasa a dar solución a la división, que está al mismo nivel que la multiplicación, puesto que operaciones del mismo nivel se desarrollan de izquierda a derecha, dando como re- sultado: 8 + 64 * 3. - 8 + 64 * 3 Luego se resuelve la multiplicación, que está por encima de la suma en la jerarquía, dando como resultado: 8 + 192. - 8 + 192 Por último, se realiza la suma dando como resultado 200. 27Unidad 1. Conceptos básicos de lógica de programación 1.3.2 Ejercicios resueltos a. 9 + 2 * 12 / 2 ^ 2 + (5 ^ 3 / (10 + 2.5)) 9 + 2 * 12 / 2 ^ 2 + (5 ^ 3 / 12.5) 9 + 2 * 12 / 2 ^ 2 + (125 / 12.5) 9 + 2 * 12 / 2 ^ 2 + 10 9 + 2 * 12 / 4 + 10 9 + 24 / 4 + 10 9 + 6 + 10 15 + 10 25 Al encontrarse con dos paréntesis se empieza a resolver por el más in- terno, y solo desaparece cuando queda un solo término en medio (en la se- gunda línea desaparece un paréntesis, debido a que al sumar 10 + 2.5 queda un solo termino que es 12.5; mientras que el segundo no desaparece porque aún faltan operacionespor realizar en su interior: potenciación y división. Este desaparece en la cuarta línea). b. 20 / 2 / 4 / 5 + ((41 / 2 / 5 + 2.9) mod 3) 20 / 2 / 4 / 5 + ((20.5 / 5 + 2.9) mod 3) 20 / 2 / 4 / 5 + ((4.1 + 2.9) mod 3) 20 / 2 / 4 / 5 + (7 mod 3) 20 / 2 / 4 / 5 + 1 10 / 4 / 5 + 1 2.5 / 5 + 1 0.5 + 1 1.5 En este ejemplo se presenta una situación similar relacionada con el manejo de paréntesis. En la línea 4 y en la línea 6 desaparecen los paréntesis. c. (10 ^ 3 + 5 * 100 / 5) + 54 – (605 mod 2) * 1150 (1000 + 5 * 100 / 5) + 54 – (605 mod 2) * 1150 (1000 + 500 / 5) + 54 – (605 mod 2) * 1150 28 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python (1000 + 100) + 54 – (605 mod 2) * 1150 1100 + 54 – (605 mod 2) * 1150 1100 + 54 – 1 * 1150 1100 + 54 – 1150 1154 – 1150 4 Cuando un paréntesis desaparece y queda solo un número, al momen- to de destruirlo, se aplica la ley de signos. En el caso del 605 módulo 2 el resultado es positivo: +1, pero al estar precedido de un signo negativo, la respuesta será con signo negativo: –1. d. (12 + 3) * 8 – (9 – 4 ^ 2 – 10) 15 * 8 – (9 – 4 ^ 2 – 10) 15 * 8 – (9 – 16 – 10) 15 * 8 – (–7 – 10) 15 * 8 – (–17) 15 * 8 + 17 120 + 17 137 En este ejercicio se aplican las aclaraciones referentes a cuando dos términos tienen signos iguales, estos se suman y conservan el signo: –7 – 10 es igual a –17; y al desaparecer el paréntesis precedido con signo negativo se cambiaría a positivo: – (–17) es igual a +17. e. –7 * 10 – 50 mod 3 * 4 – 12 * 8 + (–3) ^ 3 – 5 –7 * 10 – 50 mod 3 * 4 – 12 * 8 + (–27) – 5 –7 * 10 – 50 mod 3 * 4 – 12 * 8 – 27 – 5 –70 – 50 mod 3 * 4 – 12 * 8 –27 – 5 –70 – 50 mod 12 – 12 * 8 – 27 – 5 –70 – 50 mod 12 – 96 – 27 – 5 –70 – 2 – 96 – 27 – 5 –72 – 96 – 27 – 5 29Unidad 1. Conceptos básicos de lógica de programación –168 – 27 – 5 –195 – 5 –200 En este ejercicio se aplica la aclaración de cuando un número negativo es elevado a una potencia impar, el resultado es negativo. Por ejemplo, (–3) ^ 3 da como resultado un número con signo negativo –27. Y en la séptima línea, cuando dos términos tienen signos iguales, estos se suman y conser- van el signo: –70 – 2 es igual a –72. Al ejecutar la expresión del literal e en Python, el resultado es –206 (véase la figura 3); pero este resultado es diferente al 200 obtenido al resol- ver el ejemplo anterior. Figura 3. Ejecución de operaciones en Python. La explicación a la diferencia entre las dos respuestas radica en que Python tiene una estructura de jerarquía de operadores de tres niveles, don- de se combinan en uno solo las multiplicaciones y las divisiones (véase tabla 11). Tabla 11. Jerarquía de los operadores de tres niveles. Nivel Operación para desarrollar 1 Potenciación o exponenciación. 2 Multiplicación, división (decimal y entera) y operación módulo. 3 Suma y resta. En la tabla anterior no se agrega la potenciación, porque en algoritmos y en programación no existe esta operación, sino que se usa la potenciación para obtener las raíces. 30 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python f. –7 * 10 – 50 mod 3 * 4 – 12 * 8 + (–3) ^ 3 – 5 –7 * 10 – 50 mod 3 * 4 – 12 * 8 + (–27) – 5 –7 * 10 – 50 mod 3 * 4 – 12 * 8 – 27 – 5 –70 – 50 mod 3 * 4 – 12 * 8 –27 – 5 –70 – 2 * 4 – 12 * 8 – 27 – 5 –70 – 8 – 12 * 8 – 27 – 5 –70 – 8 – 96 – 27 – 5 –78 – 96 – 27 – 5 –174 – 27 – 5 –201 – 5 –206 En la cuarta línea pasa algo sumamente significativo; se realiza primero la operación módulo que las multiplicaciones; y esto pasa en computadoras que manejen un nivel de jerarquía de tan solo tres niveles, donde se combi- nan en uno solo las multiplicaciones y las divisiones (véase tabla 11). g. (17 / 7 * 2) + (4 * 3 / 5 – 2) – (40 / 3 / 2 * 4 – 5) (2.43 * 2) + (4 * 3 / 5 – 2) – (40 / 3 / 2 * 4 – 5) 4.86 + (4 * 3 / 5 – 2) – (40 / 3 / 2 * 4 – 5) 4.86 + (12 / 5 – 2) – (40 / 3 / 2 * 4 – 5) 4.86 + (2.4 – 2) – (40 / 3 / 2 * 4 – 5) 4.86 + 0.4 – (40 / 3 / 2 * 4 – 5) 4.86 + 0.4 – (13.33 / 2 * 4 – 5) 4.86 + 0.4 – (6.67 * 4 – 5) 4.86 + 0.4 – (26.68 – 5) 4.86 + 0.4 – 21.68 5.26 – 21.68 –16.42 Al encontrarse con dos paréntesis se resuelven de izquierda a derecha; por eso se empieza por el primer paréntesis (17 / 7 * 2) y luego con otro (4 * 3 / 5 – 2). 31Unidad 1. Conceptos básicos de lógica de programación h. 5 ^ 2 ^ 2 + 8 * 2 ^ 3 ^ 2 / 2 ^ 3 mod 23 5 ^ 4 + 8 * 2 ^ 3 ^ 2 / 2 ^ 3 mod 23 625 + 8 * 2 ^ 3 ^ 2 / 2 ^ 3 mod 23 625 + 8 * 2 ^ 9 / 2 ^ 3 mod 23 625 + 8 * 512 / 2 ^ 3 mod 23 625 + 8 * 512 / 8 mod 23 625 + 4096 / 8 mod 23 625 + 512 mod 23 625 + 6 631 En otros lenguajes, las potencias sucesivas, se resuelven de derecha a izquierda, como es el caso del lenguaje de programación Python. Recuerde que en la parte de operadores se explicó que la potenciación se puede repre- sentar con el doble asterisco (**). El resultado sería como se puede observar en la figura 4. Figura 4. Ejecución de potencias sucesivas en Python. 1.3.3 Ejercicios propuestos Dar el resultado de las siguientes expresiones. a. 2 + 3 * 4 b. 10 ^ 2 ^ 2 / 7 c. 42 / 2 / 3 / 7 ^ 3 d. 8 + 7 * 3 + 4 * 6 e. 5 ^ 3 + 120 – 3 ^ 5 f. 12 + 3 * 7 + 5 * 4 g. 4 + 5 ^ 2 – 500 + 20 ^ 2 * 10 h. (4 ^ 3 + 2 * 40 – 140) ^ 2 32 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python i. 5 + (25 * 2 + 5 * 8 / 2 – 10) * 2 j. 2 * 25 / 5 + 5 ^ 2 – 5 k. 15 – ((4 *5 + (8 / 2 –5) * 2) + 8 * 10 / 2) l. 2 – 5 * 12 / 2 + 8 m. (8 ^ 2 + 3 * 10 + 5) – (6 ^ 2 – 2 * 5 – 6) n. (33 + 5 * 3 ^ 5 + 11 * 3 + 14) / (3 + 2) o. (2 * 5 * 3 * 4 ^ 2) / (48 / 2 ^ 2 – 20 + 2 ^ 2) / 10 p. 4 ^ 2 + 3 ^ 2 * 2 ^ 2 + 5 ^ 3 – 4 ^ ((7 * 3 mod 9) mod 25) q. (4 – (9 * 8 * 5 mod 3) * 3) / (100 mod 8 mod 3) r. 208 / 4 / (455 * 2 / 5 mod 4 + 50) s. (17 / 7 * 2) + (4 * 3 / 5 – 2) – (40 / 3 / 2 – 5) t. 4 ^ 2 * 5 * 3 – 8 – 152 – (5 ^ 3 * 10 \ 4) mod 2 * 4 u. 8 * (4 – 3 ^ 2) ^ 2 – 9 * (3 ^ 4 – 4 ^ 3) ^ 3 v. (4 + 2 * 9 / 5) – (2 ^ 2 * 8) / 2 ^ 2 w. 8 ^ 2 / 4 ^ 3 mod 10 ^ 2 / 5 + 100 x. (80 / 8) ^ 2 – 4 / 2 + (20 / 4) ^ 3 y. 89 + (66 ^ 2 mod 2011 + 400) ^ (2 mod 8) / 3 ^ (3 + 2) z. 14 – (7 + 4 * 3 – (–2) ^ 2 * 2 – 6) + (2 ^ 2 + 6 – 5 * 3) 1.4 Expresiones algorítmicas Las expresiones algorítmicas son expresiones manejadas dentro de ló- gica de programación que usan una sintaxis que permite ser procesada por la computadora. Estas expresiones son diferentes a las expresiones matemáticas. Para crear expresiones algorítmicas se requiere la aplicación de los ope- radores aritméticos, haciendo reemplazo de los operadores matemáticos por operadores aritméticos. Una expresión matemática como a2 + bx + c, se convierte a expresión algorítmica, quedando de esta forma a ^ 2 + b * x + c. 33Unidad 1. Conceptos básicos de lógica de programación 1.4.1 Ejemplos de conversión de expresiones algorítmicas Ejemplo 1. En la expresión matemática: a2 + 2ab + b2, se puede observar que, tanto la letra a como la letra b, están elevadas al cuadrado, por tal moti- vo se debe utilizar el operador circunflejo (^). De igual forma, los términos 2, a y b, se están multiplicando entre sí, por lo que deben ser separados por el operador de la multiplicación (*). Por último, la suma queda tal cual está ubicada en la expresión. El resultado al realizar la conversión sería: a ^ 2 + 2 * a * b + b ^ 2. Ejemplo 2. La expresión matemática X + 2Y, para ser convertida a ex- presión algorítmica, simplemente se agregar el asterisco (*) al termino 2Y, considerando que el número 2 se está multiplicando con la letra Y dando como resultado X + 2 * Y. Ejemplo 3. La expresión 5a3 + 2b4 – 4c tiene multiplicación, potencia, suma y resta. Dando como resultado: 5 * a ^ 3 + 2 * b ^ 4 – 4 * c. Pero no todas las expresiones son tan fáciles de convertir; aquíse darán cuatro ejemplos donde se empezará a generar un poco más de complejidad, donde varias expresiones matemáticas diferentes, generan la misma expre- sión algorítmica. a. x + y / m * n ^ 3 b. x + y / m * n ^ 3 c. x + y / m * n ^ 3 d. x + y / m * n ^ 3 Para poder solucionar la dificultad anterior, se deben usar paréntesis para empezar a romper la jerarquía y que se hagan unas operaciones antes que otras. Los resultados finales son los siguientes: a. (x + y) / m * n ^ 3 b. (x + y) / (m * n ^ 3) 34 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python c. x + y / (m * n ^ 3) d. x + y / m * n ^ 3 Observe que cada presencia o ausencia de paréntesis diferencia cada expresión algorítmica, de ahí lo fundamental de identificar el lugar donde se van a agregar. 1.4.2 Convertir expresiones algorítmicas en matemáticas Los ejercicios también se pueden convertir en sentido contrario, de una ex- presión algorítmica sacar una expresión matemática, como se muestra en estos ejemplos: a. x * y * z xyz b. a * (x – y) ^ 3 a (x – y)3 c. 40 / 5 + 8 ^ 2 – 3 + 82 – 3 d. x ^ 2 / a ^ 2 + y ^ 2 + y2 e. x ^ 2 / (a ^ 2 + y ^ 2) f. x ^ (a – 2) / (x ^ 2 – 2 + y ^ (2 * n)) 1.4.3 Ejercicios resueltos a. (x + 2 * y) / 2 ^ 3 b. x + x + 2 * y / 2 ^ 3 c. (m ^ 2 + n ^ 2) / (4 * x * y ^ 3) d. (m – n) ^ 2 / (4 * x * (3 * y ^ 3)) (m – n) ^ 2 / (4 * x * 3 * y ^ 3) // Se puede ignorar el paréntesis sin afectar el resultado. 35Unidad 1. Conceptos básicos de lógica de programación El doble slash (//) se usa en el libro para realizar comentarios, así como dentro de los pseudocódigos. e. x + y + x + y + (a ^ 2 + b ^ 2) / 2 f. (x + y + a ^ 2 + b ^ 2) / 2 g. x + y + a2 + x + y + a ^ 2 + b ^ 2 / 2 h. (m + n) / p / ((q – r) / s) i. (m + n / p) / (q – r / s) j. (m + n / p) / ((q – r) / s) 1.4.4 Ejercicios propuestos Convertir las siguientes expresiones matemáticas en expresiones algorítmicas: a. b. y + c. d. e. f. g. h. 36 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python i. j. k. l. Convertir las siguientes expresiones algorítmicas a expresiones mate- máticas: m. 7 * (1 + y) n. a ^ 3 + b ^ 3 o. (x + y) / (u + w / a) p. a ^ 3 + 3 * a ^ 2 * b + 3 * a * b ^ 2 + b ^ 3 q. (a + b) ^ 2 – (a – b ^ 2) r. x – y ^ 2 * (x – y) ^ (2 – n ^ 3) s. (a / b) + (c / a) + c t. a / (b + c) / (a / b + c) 1.5 Lógica de programación y algoritmos La base fundamental al momento de empezar a programar son la lógica y los algritmos. A continuación unas definiciones cortas con unas explicacio- nes de las caracteristicas, partes, tipos y pasos para resolver un algoritmo. 1.5.1 Definiciones El término “lógica (del griego logos) significa estudio o tratado racional y así, el objeto de estudio de esta disciplina es el razonamiento y éste se ex- presa mediante el lenguaje” (García, Ordoñez y Ruiz citados en Guzmán y López, 2019, p. 76). Por lo tanto, lógica es todo aquello relacionado con la razón o el pensamiento. 37Unidad 1. Conceptos básicos de lógica de programación El algoritmo es el conjunto finito de pasos, operaciones o procedimien- tos secuenciales que sirven para obtener una solución a un problema deter- minado a partir de ciertas reglas definidas. El término algoritmo viene, según la traducción de Fibonacci de las palabras Algoritmi dicit, de la obra Quitab Al Jabr Al Mugabala del autor árabe Muhammed ibn Musa al–Khwarizmi (también llamado Al–Jwarizmi o Al–Juarismi), matemático árabe del siglo ix que aparece con un turbante en el famoso libro del Álgebra de Baldor (Niño, Cobos y Mendoza, 2010). La lógica que se aprende en el desarrollo de los temas se aplica en len- guajes de programación, de ahí el concepto de lógica de programación. 1.5.2 Características de un algoritmo Todo algoritmo debe cumplir con las siguientes características: - Ser finito: todo algoritmo debe tener un inicio y en un momento deter- minado debe llegar a su fin. Tiene un número finito de instrucciones. - Ser definido: debe tener un desarrollo claro y coherente. No debe per- mitir dobles interpretaciones. - Ser preciso: un algoritmo solo debe hacer lo solicitado en un orden ló- gico y estricto. Se debe generar un orden estructurado en el desarrollo de la solución. Se puede presentar errores si se hace más o menos de lo pedido, de igual forma cuando se realizan instrucciones en un orden equivocado. - Ser legible: debe estar bien estructurado y organizado para entenderlo fácilmente.2 - Ser eficiente: debe hacer lo solicitado con el mínimo de instrucciones posibles. - Ser general: debe soportar todas las variaciones que sean posible para dar solución a problemas con las mismas especificaciones. - Ser neutral de material: puede ser realizado en papel, pizarras, micro- controladores, simuladores o computadoras. 2 Se recomienda tener en cuenta esta y las siguientes características, aunque no son de tanta riguro- sidad como las anteriores que sí son casi de estricto cumplimiento. 38 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python A pesar de la complejidad que se maneja en los conceptos de algo- ritmos, estos son muy comunes, se encuentran en todo lugar y se aplican constantemente. El ejemplo más claro está en una receta de cocina, que no es otra cosa que un algoritmo, por poco parecido que tenga con un cálculo matemático o un programa informático, cumple con cada una de las caracte- rísticas de un algoritmo. A continuación, una breve explicación, las recetas de cocina son: - Instrucciones paso a paso que sirven para dar solución a un problema, en este caso si se busca una receta es porque se requiere hacer un postre, ensalada o cualquier plato, y se encontrarán unas instrucciones secuen- ciales para su realización. - Finitas porque tienen un proceso que empieza con una serie de ingre- dientes y unas instrucciones que van a finalizar con la realización de un producto esperado. - Definidas porque tienen un mismo procedimiento y un resultado co- rrecto, si se aplica correctamente. - Precisas porque tienen instrucciones claras que se deben realizar de for- ma ordenada. - Legibles porque tienen un desarrollo claro y estructurado. Normalmen- te pueden ser realizadas, sin ningún problema, por cualquier persona. - Eficientes porque se hace el producto con el mínimo de recursos y en el menor tiempo posible. - Generales porque permiten variantes de acuerdo con la experiencia de quien la realiza; pero a pesar de estas el resultado siempre va a ser el mismo. - Son neutrales respecto al material, puesto que pueden estar escritas en un libro de recetas, pueden ser vista en un programa de televisión o simplemente existir en grabaciones. 1.5.3 Partes de un algoritmo a. Entrada: es el lugar donde se relaciona la información que va a ser leída o ingresada. Aquí van todos los datos que se desconocen y se requieren 39Unidad 1. Conceptos básicos de lógica de programación para realizar cálculos, operaciones o procesos. En el pseudocódigo la entrada empieza con palabras como ingresar, obtener, iniciar o leer y se describen las variables necesarias para crear una solución, separa- das por coma (,). Estas variables deben cumplir con ciertas condiciones (condiciones para nombrar variables o constantes), tema ubicado al fi- nalizar esta primera unidad. También se recomienda acompañar estas entradas de mensajes que permitan identificar con mayor facilidad lo que se requiere, entregando instrucciones claras y precisas al usuario de la forma como debe entregar los datos. b. Proceso: es el lugar donde se realizan las operaciones y cálculos nece- sarios para alcanzarel resultado esperado. Cada cálculo se recomien- da almacenarlo en una variable y se le asigna información por medio del signo igual (=) o a con el símbolo (). Se recomienda realizar un cálculo en cada renglón, aunque cada cálculo puede incluir varias ope- raciones matemáticas. En el pseudocódigo el proceso puede calcularse asignando los cálculos o describiendo las acciones a realizar, por ejem- plo, calcular, restar o sumar. c. Salidala cual dará respuesta a los requerimientos o peticiones que te- nía el algoritmo al empezar.” : es el lugar donde se describe la informa- ción que se va a imprimir, la cual dará respuesta a los requerimientos o peticiones que tenía el algoritmo al empezar. En el pseudocódigo la salida empieza con las palabras visualizar, imprimir, escribir o mostrar y se escriben las variables a mostrar separadas por coma (,). También se recomienda acompañar las salidas de mensajes que permitan identificar con mayor facilidad los datos que se quieren mostrar. 1.5.4 Tipos de algoritmos a. Algoritmo cualitativo: “son algoritmos usados generalmente para des- cribir procesos de la vida cotidiana que no incluyen cálculos numé- ricos” (Guerrero, 2016, p.3). También conocido como algoritmo no computacional. Ejemplos claros y cotidianos de algoritmos cualitativos pueden ser: el modo de operar una lavadora, tocar música por medio de partituras, construir un aeroplano, búsqueda de un número en el direc- 40 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python torio telefónico, el montaje de una llanta pinchada, la búsqueda de una dirección, la adquisición de algún producto o incluso hacer trucos de magia, entre otros. b. Algoritmo cuantitativo: “son algoritmos muy objetivos, pues al tener siempre correspondencia con problemas matemáticos, demanda la inclusión de cálculos numéricos para la obtención de los resultados” (Guerrero, 2016, p.4). También conocido como algoritmo computacio- nal. Ejemplos de algoritmos cuantitativos pueden ser: la división para calcular el cociente de dos números, la liquidación de una nómina, la solución a cualquier ecuación o fórmula, el registro de transacciones en un banco o la realización de un determinado estudio estadístico, entre otros. 1.5.5 Pasos para solucionar un problema computacional a. Definición y delimitación del problema: para resolver un problema es fundamental conocerlo por completo, y que esté definido y delimitado. Esta fase está dada por el enunciado del problema, que luego de ser leído cuantas veces sea necesario, se pasará a determinar si está claro o no y si es posible darle una solución. Si no se entiende el enunciado no se podrá continuar con los demás pasos. Se debe tener cuidado con no confundir el enunciado dado que se puede terminar dando solución a otro problema inexistente. b. Análisis del problema: una vez que se ha comprendido completamente qué es lo que se va a desarrollar, es necesario definir los datos de entra- da, los cálculos necesarios para procesar los datos, los datos de salida y las restricciones que pueda tener la solución planteada. c. Diseño del algoritmo: en esta fase se determinan los pasos o instruc- ciones que se llevarán a cabo, el orden lógico de ejecución y la manera como se desarrollará todo el programa para un eficiente funcionamien- to. La forma de representarlo puede ser pseudocódigo, diagramación libre o diagramación rectangular. d. Codificación: consiste en pasar el diseño del algoritmo, en cualquiera de las formas de representación, en un lenguaje comprendido por la 41Unidad 1. Conceptos básicos de lógica de programación computadora llamado lenguaje de programación. Existen varios len- guajes con diferentes características y fabricantes, por ejemplo: Len- guaje C, C++, Java, Python, PHP y todas las herramientas ofrecidas por Microsoft (Visual Basic, Visual Studio C#, Visual Studio C++, J#, ASP .NET, entre otros). e. Compilación: en esta etapa la computadora hace una revisión de las instrucciones digitadas por el programador y muestra los errores que se hayan producido al no cumplir con la sintaxis del lenguaje. Algo impor- tante para resaltar es que ningún compilador detecta los errores lógicos en la realización de una solución, solo los de sintaxis. f. Depuración: consiste en identificar y corregir los errores reportados en el proceso de compilación. Este proceso se repite cuantas veces necesa- rio, hasta dejar el programa sin ningún error. g. Construcción del programa: al no tener ningún tipo de error, el compi- lador construye un programa ejecutable que permitirá verificar el fun- cionamiento de la solución propuesta. Hay que tener en cuenta que, un solo error evitará la creación de este programa ejecutable. h. Ejecución: luego de haber corregido todos los errores y haber compila- do el programa, se pasa a ejecutarlo para ver los resultados obtenidos. En esta etapa se utilizan los dispositivos de entrada y de salida, siendo el teclado y el monitor, respectivamente, los más utilizados. Los resul- tados tienen que ser los esperados, de lo contrario, se tienen que repetir los pasos anteriores para detectar los errores; normalmente, aquí se de- tectan los errores de lógica que no detectan los compiladores. i. Documentación: se divide en documentación interna, que son aquellos comentarios o mensajes que se añaden al código fuente para hacer más claro su entendimiento y el de algunos procesos; y documentación ex- terna la cual es un documento escrito donde se hace descripción paso a paso de la manera cómo se debe usar el programa y se describe todo lo relacionado con este. Las documentaciones externas más comunes son los manuales de usuario y los manuales técnicos. j. Mantenimiento: se lleva a cabo después de terminado el programa cuando se detecta que es necesario hacer algún cambio, ajuste o com- 42 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python plementación para que siga trabajando de manera correcta. Para poder realizar este trabajo se requiere que el programa este correctamente do- cumentado. Luego de todo mantenimiento se recomienda hacer ajustes a los manuales realizados en la parte de documentación. 1.5.6 Pasos de elaboración de un algoritmo a. Leer el enunciado del problema, cuantas veces sea necesario, hasta en- tenderlo completamente. b. Determinar claramente los datos de entrada requeridos para poder dar solución al problema. c. Definir cálculos y comparaciones necesarias para llegar al resultado es- perado. d. Aclarar y determinar los datos de salida, los cuales contienen la infor- mación o resultados que se soliciten. e. Tener en cuenta condiciones y restricciones para la solución del proble- ma. Los cinco pasos anteriores gozan de la misma importancia. La falta de análisis a alguno de estos causará problemas en el transcurso del desarrollo del algoritmo. No se debe continuar con alguno de los pasos hasta tener claridad de cada uno de los anteriores. 1.6 Formas de representación de un algoritmo Al momento de plantear una solución a través de un algoritmo es impor- tante saber que existen varias técnicas para representarlos: lenguaje natural, pseudocódigo, diagramación libre y diagramación rectangular. En este libro se hace un enfoque mayor en el pseudocódigo por ser la representación más cercana al lenguaje de programación. 1.6.1 Algoritmo en lenguaje natural Un algoritmo en lenguaje natural es definido por (Gómez y Moraleda, 2015) como una solución basada en el lenguaje que utilizamos para comunicar- nos, mediante explicaciones más o menos precisas se puede describir una 43Unidad 1. Conceptos básicos de lógica de programación solución a un problema usando palabras del lenguaje común que expresan operaciones, cálculos y procesos sin tener ninguna sintaxis de programa- ción.Un algoritmo que permita calcular la ganancia que puede obtener un comerciante luego de realizar la venta de un producto puede representarse como se hace en la figura 5. Figura 5. Primer ejemplo de un algoritmo en lenguaje natural. 1.6.2 Pseudocódigo Gómez y Moraleda (2015) describen el pseudocódigo como una notación basada en un lenguaje de programación estructurado del que se excluyen todos los aspectos de declaración de constantes, tipos, variables y subpro- gramas; no tiene sintaxis estricta, como sucede con los lenguajes de progra- mación. Por otro lado, Juganaru (2014) lo define como un “lenguaje falso” for- mado por una serie de palabras con un formalismo muy sencillo que descri- be el funcionamiento de un programa; combina frases de lenguaje común e instrucciones de programación. Un pseudocódigo ocupa menos espacio en una hoja de papel, permite representar en forma fácil operaciones repetitivas complejas, es más fácil de realizar su transformación a un lenguaje de programación y se pueden ob- servar claramente los niveles de las operaciones. En ocasiones los pseudo- códigos se enfocan a determinado lenguaje de programación. Por lo anterior es que la mayoría de los desarrolladores profesionales prefieren utilizarlo antes que el diagrama de flujo que es más enfocado a programadores prin- cipiantes o profesionales de otras carreras afines. En este libro usamos el pseudocódigo como principal forma de repre- sentación de un algoritmo, aunque al inicio de cada unidad se brindan solu- ciones combinadas con los diagramas de flujos. 44 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python Se pone como ejemplo el mismo ejercicio de la ganancia obtenida por un comerciante utilizado en el lenguaje natural: un algoritmo que permita calcular las ganancias que puede obtener un comerciante luego de realizar la venta de un producto determinado. Para hacer un pseudocódigo hay que aplicar conceptos que se trataron en las partes que conforman un algoritmo (véase figura 6). Figura 6. Partes de un algoritmo. En la figura 7 se puede visualizar un algoritmo en pseudocódigo, to- mando el ejemplo de la ganancia obtenida sobre la venta de un producto. Figura 7. Primer ejemplo de un algoritmo en pseudocódigo. La solución es casi la misma del lenguaje natural, solo que ya con un poco más estructura y una sintaxis diferente. A medida que se avanza en el libro se observarán las diferencias, similitudes y sobre todo las ventajas de cada una de estas formas de representación. 45Unidad 1. Conceptos básicos de lógica de programación 1.6.3 Diagramación libre La diagramación libre es también conocida como diagramas de flujo, per- mite ilustrar la secuencia de pasos de un algoritmo por medio de símbolos especializados y líneas de flujo. La combinación de símbolos especializados y líneas de flujo describe la lógica para la solución del problema (algorit- mo). Entonces se puede afirmar que “El diagrama de flujo es la represen- tación gráfica de un algoritmo; para ello se utiliza unconjunto de símbolos estándares mundialmente utilizados” (Sauceda, 2019, p. 4). Los símbolos usados en la diagramación libre y sus significados se pre- sentan en la tabla 12.3 Tabla 12. Símbolos de diagramación libre (Microsoft Visio). Símbolo Significado Símbolo de inicio y final: se usa para indicar el Inicio y el Fin del diagrama de flujo. Símbolo de proceso y asignación: se usa para realizar instrucciones, cálculos y operaciones de asignación. Símbolo de decisión: se usa para realizar operaciones de comparación de valores con estructuras de decisión. Símbolo de entrada de datos: se usa para indicar las variables que van a servir de datos de entrada al diagrama. Símbolo de subprogramas: se usa para representar todos los subprogramas o subrutinas (funciones y procedimientos). Símbolo de impresión: se usa para mostrar los datos que serán visualizados en la impresora o en la pantalla de la computadora (siendo este último, el dispositivo de salida más usado). 3 Los símbolos utilizados han sido normalizados por el Instituto Norteamericano de Normalización (ANSI). 46 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python Símbolo Significado Símbolo de estructura repetitiva: se usa para representar ciclos o estructuras repetitivas dentro del diagrama de flujo. Símbolo de línea o conectores: se usa para conectar los diferentes símbolos dentro del diagrama de flujo. En la figura 8 se puede visualizar un algoritmo en diagramación libre a partir del ejemplo de la ganancia obtenida sobre la venta de un producto. Figura 8. Primer ejemplo de un algoritmo en diagramación libre. Para realizar un diagrama de flujo se debe tener en cuenta lo siguiente: - Usar solo flechas horizontales y/o verticales. - Evitar el cruce de líneas. - No dejar líneas de flujo (flechas) sin conectar. - Trazar los símbolos de manera que puedan leerse de arriba a abajo y de izquierda a derecha. - Todo texto dentro de un símbolo tiene que ser escrito claramente. 47Unidad 1. Conceptos básicos de lógica de programación Se puede observar con claridad que a pesar de ser casi idénticos, el dia- grama ocupa más espacio que el pseudocódigo. En el diagrama desaparecen las palabras Leer e Imprimir, porque las figuras tienen su propio significado y es redundante poner el símbolo y la palabra.4 1.6.4 Diagramación rectangular También conocida con el nombre de diagrama estructurado N–S (Nassi– Shneiderman). En esta diagramación se utilizan una serie de rectángulos consecutivos que son de diferentes tipos y representan diferentes partes de un algoritmo. Los símbolos usados y sus significados se presentan en la tabla 13. Tabla 13. Símbolos de diagramación rectangular. Símbolo Significado Símbolo general: se usa para el Inicio y el Fin del diagrama, para leer e imprimir datos y para la realización de cálculos. Si NO Símbolo de decisión: se usa para realizar operaciones de comparación de valores con estructuras de decisión. Símbolo de estructura repetitiva: se usa para representar ciclos o estructuras repetitivas dentro del diagrama de flujo. Símbolo de estructuras caso: se usa para hacer operaciones con estructuras de selección múltiple o caso. En la figura 9 se puede visualizar un algoritmo en diagramación rec- tangular a partir del ejemplo de la ganancia obtenida sobre la venta de un producto. 4 Para profundizar todos los conceptos de diagramación libre y diagramas de flujo (Sauceda, 2019, p. 4). 48 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python Figura 9. Primer ejemplo de algoritmo en diagramación rectangular. 1.6.5 Ejemplo de algoritmo cualitativo a. Problema: diseñar un algoritmo para preparar una limonada para un grupo de varias personas. Tener en cuenta las diferentes formas de re- presentación de un algoritmo y los conceptos vistos hasta ahora. b. Algoritmo en lenguaje natural: en la figura 10 se puede visualizar un algoritmo en lenguaje natural, dando solución al problema de preparar una limonada para un grupo de personas. c. Algoritmo en pseudocódigo: en la figura 11 se puede visualizar un al- goritmo en pseudocódigo, dando solución al problema de preparar una limonada para un grupo de personas. Figura 10. Segundo ejemplo de un algoritmo en lenguaje natural. 49Unidad 1. Conceptos básicos de lógica de programación Figura 11. Segundo ejemplo de un algoritmo en pseudocódigo. a. Algoritmo en diagramación libre: en la figura 12 se puede visualizar un algoritmo en diagramación libre, dando solución al problema de prepa- rar una limonada para un grupo de personas. Figura 12. Segundo ejemplo de un algoritmo en diagramación libre. b. Algoritmo en diagramaciónrectangular: en la figura 13 se puede vi- sualizar un algoritmo en diagramación rectangular, dando solución al problema de preparar una limonada para un grupo de personas: 50 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python Figura 13. Segundo ejemplo de un algoritmo en diagramación rectangular. En el lenguaje natural se pueden omitir algunas consideraciones que se tienen que cumplir en el algoritmo cuantitativo enfocado a pasarse a un len- guaje de programación, por ejemplo, las tildes en las variables al momento de explicar los pasos a realizar. El leguaje natural es muy flexible y se enfoca principalmente en des- glosar y mostrar la solución propuesta de una forma más clara y entendible. Una operación de leer es similar a la obtención de la información en el desarrollo de un algoritmo, mientras que la operación de imprimir es similar a la entrega de resultados requeridos. 1.6.6 Ejemplo de algoritmo cuantitativo a. Problema: diseñar un algoritmo que permita hallar la suma de tres nú- meros enteros. b. Algoritmo en lenguaje natural: en la figura 14 se puede visualizar un algoritmo en lenguaje natural, dando solución al problema de calcular e imprimir la suma de tres números. Figura 14. Tercer ejemplo de un algoritmo en lenguaje natural. 51Unidad 1. Conceptos básicos de lógica de programación c. Algoritmo en pseudocódigo: en la figura 15 se puede visualizar en al- goritmo en pseudocódigo, dando solución al problema de calcular e imprimir la suma de tres números. Figura 15. Tercer ejemplo de un algoritmo en pseudocódigo. d. Algoritmo en diagramación libre: en la figura 16 se puede visualizar en algoritmo en diagramación libre, dando solución al problema de calcu- lar e imprimir la suma de tres números. Figura 16. Tercer ejemplo de un algoritmo en diagramación libre. 52 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python e. Algoritmo en diagramación rectangular: en la figura 17 se puede vi- sualizar en algoritmo en diagramación rectangular, dando solución al problema de calcular e imprimir la suma de tres números. Figura 17. Tercer ejemplo de un algoritmo en diagramación rectangular. Para practicar este tema explique el proceso que se debe realizar paso a paso, en cada una de estas situaciones: cambiar una bombilla fundida; cam- biar un neumático chuzado de un vehículo; realizar una llamada telefónica; funcionamiento de un cajero electrónico al realizar un retiro de dinero; y el funcionamiento de una máquina expendedora de gaseosas. 1.7 Datos manejados en un algoritmo Todos los datos que se manejan dentro de un algoritmo tienen un tipo aso- ciado. Un dato puede ser un simple carácter tal como b, un valor entero tal como 35 o un valor alfanumérico como Calle 42 # 83-60. El tipo de dato de- termina la naturaleza del conjunto de valores que puede tomar una variable. Los tipos de datos más frecuentes son alfabéticos, numéricos, alfanu- méricos y lógicos. Dentro de los lenguajes de programación se encuentran con una gran variedad de tipos de datos para el almacenamiento de variables. A continua- ción, una explicación breve de estos tipos. 1.7.1 Datos numéricos Normalmente se reconocen dos tipos de variables numéricas: 53Unidad 1. Conceptos básicos de lógica de programación - Entera: permite almacenar datos numéricos enteros (sin decimales); por ejemplo, una edad de 20, una cantidad de 5, un número positivo como 60, un número negativos como –58. - Real: permite almacenar datos numéricos que tengan decimales, por ejemplo, una estatura de 1.75, un peso de 70.2 o el valor de una reten- ción de 0.08. Cualquier operación entre números reales da como resultado un núme- ro real. Cualquier operación entre números enteros da un resultado entero, excepto en la división que pueda dar un número real. 1.7.2 Datos alfabéticos Normalmente se reconocen dos tipos de variables alfabéticas: - Carácter: permite almacenar una letra, un número o un símbolo en me- dio de comillas sencillas rectas (‘); por ejemplo, una respuesta ‘S’ o ‘N’, dos valores ‘1’ o ‘5’, o un símbolo como ‘@’. - Cadena: permite almacenar varios caracteres en medio de comillas do- bles rectas (“); por ejemplo, un nombre como “Miguel Ángel”, un ape- llido como “Cañaveral”, una ciudad como “Medellín” o una ocupación como “Docente”. Además, dentro de lógica de programación y los lenguajes de progra- mación, también son clasificadas como alfabéticas aquellas variables que al- macenen números con los cuales no se van a realizar cálculos o no se hacen operaciones matemáticas, por ejemplo, un número de cédula “1.023.245”, un NIT “1023245-3” o un código postal “259”. Lo anterior es fundamental para optimizar el manejo de memoria en una computadora; una vez que una variable numérica ocupa más espacio que una variable de tipo alfabética. 1.7.3 Datos alfanuméricos Los datos alfanuméricos permiten almacenar combinaciones de datos alfabéticos, datos numéricos que serán tratados como alfabéticos en forma de cadena de caracteres, símbolos o caracteres especiales. Los ejemplos más claros son una dirección de una residencia (Carrera 50 # 10-00), una 54 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python dirección de correo electrónico (micorreo_123@servidor.com), una placa de un vehículo (MNU664) o el código de un producto (REF–4560). 1.7.4 Datos lógicos o booleanos Los datos lógicos o booleanos permiten almacenar aquellos datos que ten- gan solo valores de Verdadero o Falso, 1 o 0, F o V, entre otros. Estas va- riables son resultado de una comparación entre otros datos. Por ejemplo, si se tiene: A=1, B=10, C=–5. El resultado de hacer algunas comparaciones se muestra en la tabla 14. Tabla 14. Comparación entre diferentes tipos de datos. Al comparar El resultado sería Explicación A > B Falso A (1) no es mayor que B (10) A != B Verdadero A (1) no es igual B (10) C > A Falso C (–5) no es mayor que A (1) C < A Verdadero C (–5) es menor que A (1) C > 0 Falso C (–5) no es mayor que 0 B > 0 Verdadero B (10) es mayor que 0 B < 0 Falso B (10) no es menor que 0 B = 10 Verdadero B (10) es igual a 10 A = 3 Falso A (1) no es igual a 3 8 <> C Verdadero 8 es diferente de C (–5) Al momento de hacer comparaciones se debe tener en cuenta la tabla de verdad vista en matemáticas básicas. La tabla 15 muestra tablas de verdad para los operadores de negación (~), conjunción (Λ) y disyunción (V).5 Tabla 15. Tabla de verdad de la negación, conjunción y disyunción. p Q NO (~p) NO (~q) Y (p Λ q) O (p V q) Verdadero Verdadero Falso Falso Verdadero Verdadero Verdadero Falso Falso Verdadero Falso Verdadero Falso Verdadero Verdadero Falso Falso Verdadero Falso Falso Verdadero Verdadero Falso Falso 5 Para profundizar en el tema, se recomienda el texto Lógica Matemática para Ingeniería de Sistemas y Computación de Cardona Torres, Hernández Rodríguez y Jaramillo Valbuena (2010). 55Unidad 1. Conceptos básicos de lógica de programación Por ejemplo, 1 < 7 Λ 5 < 10 = Verdadero y 5 > 20 Λ ‘A’ < ‘B’ = Falso (mirar la explicación en la figura 18). Figura 18. Ejemplo de comparaciones con la conjunción. Cuando se evalúa una expresión teniendo el operador de la conjunción (Λ), se tienen que cumplir las dos condiciones para que el resultado sea Ver- dadero; mientras que con el operador de la disyunción (V), basta con que se cumpla una sola para que el resultado sea Verdadero. Mirar, en la figura 19, el mismo ejemplo anterior, pero cambiando el operador de conjunción por el de disyunción. Figura 19. Ejemplo de comparaciones con la disyunción. Cuando se comparan variables alfabéticas teniendo en cuenta que la ‘A’ es menor que la ‘B’, la letra ‘Z’ es mayor que todas las letras. Cuandouna computadora procesa estas letras tiene en cuenta su código ASCII, la letra ‘A’ tiene un código de 65, la letra ‘B’ tiene un código de 66 y la ‘Z’ de 90 (véase anexo 9). 1.7.5 Ejercicios propuestos de tipos de datos Indicar el tipo de dato (si es Numérico-Entero, Numérico-Real, Alfabético- Cadena, Alfabético-Carácter o Lógico) de los siguientes valores: 56 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python a. ‘A’ b. –89 c. “125” d. “–9” e. –5 f. 0 g. 125.00 h. 4.000 i. ‘+’ j. “9.12” k. 325 l. “fin del algoritmo” m. –5698.23 n. V o. 2.333 p. Falso q. 0.0005 r. 30 000 s. “Sí” t. –500.00 1.7.6 Ejercicios propuestos de expresiones booleanas Indique el resultado de las siguientes expresiones (Falso o Verdadero): a. 3 < 6 b. 5 >= 10 c. ‘A’ > ‘Z’ d. ‘8’ > ‘700’ e. 8 <> 8 f. 64 >= 64 57Unidad 1. Conceptos básicos de lógica de programación g. ‘8’ > ‘7’ h. 45 mod 2 = 0 i. 2 ^ 4 <> 84 j. 85.36 = 85.34 V 235 = 114 k. ~ (‘A’ >= ‘Z’ V ‘8’ <= ‘0’) l. 12 <> 15 Λ 111<= 114 m. ~ (17 < 698 Λ ‘J’ <> ‘K’) n. 158 >= 158 Λ 256 <= 256 o. 25 > 12 V 0 > 14 p. 25 > 12 Λ 0 > 14 q. 3 ^ 2 = 36 / 6 + 3 r. 5 * 4 + 2 > 45 mod 13 1.7.7 Datos variables Son espacios de memoria que almacenan valores que pueden cambiar en el transcurso de un algoritmo. Usualmente son introducidas por el usuario. Toda variable consta de un nombre y un tipo. El nombre es un conjunto de letras o caracteres y números, en el cual se almacena la información in- gresada por el usuario o asignada por el programador. El tipo indica la clase de información que almacena la variable, la cual puede ser entera, real, cadena o lógica. Por ejemplo, al declarar una variable llamada Edad de tipo Entero, en memoria quedaría representado así: Edad 20 1.7.8 Datos constantes Son espacios de memoria que no cambian en el transcurso de un algoritmo y cuyos valores son asignados al momento de su declaración. En determi- nados casos se puede presentar que el valor de una variable no cambie en 58 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python el transcurso de un algoritmo; pero por este hecho no puede ser catalogada como constante Una constante es un dato alfabético, numérico, alfanumérico o lógico que no cambia durante la ejecución del programa. Un ejemplo claro de un valor constante es el valor de Π (Pi siempre va a ser igual a 3.14159265358979, y este valor nunca cambia). En memoria quedaría representado así: Pi 3.14159265358979 Cuando en otro lugar del algoritmo se intente cambiar el valor de Pi por 0; el algoritmo lanzaría una alerta indicando que las constantes no pueden ser modificadas o se suspendería su ejecución. 1.7.9 Condiciones para nombrar variables y constantes Para definir el nombre de una variable se deben tener en cuenta las siguien- tes condiciones: - Debe comenzar con una letra, mayúscula o minúscula comprendida en- tre la ‘A’ y la ‘Z’ o la ‘a’ y la ‘z’ (omitiendo la letra ñ que no existe en el idioma inglés y los lenguajes de programación están en ese idioma; ya que se reconoce como un carácter especial). - No debe contener espacios en blanco. - No se pueden utilizar caracteres especiales (´ ¨ ¿ ¡), símbolos (% & # @), operadores aritméticos (+ – * /) o signos ortográficos (, ; . :). - Los dígitos y el carácter de subraya o guion bajo (_) están permitidos después del primer carácter; aunque algunos lenguajes como Java o C++ permiten usarlo al inicio. 1.7.10 Ejercicios propuestos Coloque al frente de cada nombre de variable, si está Correcta o Incorrecta y la explicación de su respuesta, solo cuando esta sea Incorrecta: a. $Sueldo b. A c. cElUlAr 59Unidad 1. Conceptos básicos de lógica de programación d. Dir_casa e. Edad f. Notas g. N-Tel h. SB512 i. Tel j. c@rreo k. Apellido paterno l. Nombre m. 2Salarios n. Pensión o. N1 p. Primera/Nota q. 1Nota r. Año 60 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python Unidad 2 Estructura fundamental de un algoritmo Introducción En esta unidad se explican los siguientes temas (ver el resumen en la figura 20). - Estructura secuencial. - Datos de entrada, proceso y datos de salida. - Asignación interna, asignación externa y actualización. - Operaciones primordiales y básicas. - Porcentajes. - Conversión de medidas. - Prueba de escritorio. - Ejercicios resueltos y propuestos. Estos temas facilitan la obtención de las competencias que se describen a continuación: - Utilizar de forma correcta los diferentes operadores aritméticos y lógi- cos, teniendo en cuenta la jerarquía que indica el orden en que deben ejecutarse las operaciones. - Conocer las principales partes de un algoritmo secuencial, identificando datos de entrada, proceso y datos de salida. - Comprender el funcionamiento de las computadoras y la integración que tiene con la lógica de programación al momento de dar solución a problemas planteados. - Manejar de forma correcta la asignación de información a una variable por medio de la asignación interna, la asignación externa o la actualiza- ción. - Resolver ejercicios que requieran del manejo de operaciones primor- diales y la conversión de fórmulas a expresiones algorítmicas. 61Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python Fi gu ra 2 0. U ni da d 2. E st ru ct ur a fu nd am en ta l d e un a lg or itm o. 62 Fundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y PythonFundamentos iniciales de lógica de programación I. Algoritmos en PSeInt y Python - Calcular porcentajes dentro de algoritmos utilizando las tres fórmulas de acuerdo con el tipo de problema planteado. - Solucionar cualquier ejercicio planteado relacionado con las estructuras secuenciales que componen un algoritmo. 2. Estructura secuencial de un algoritmo Un algoritmo está conformado por varias estructuras fundamentales, cada una con un propósito y uso determinado. Estas estructuras son llamadas estructuras de control. La primera estructura es la secuencial, la cual se trabajará en esta segunda unidad; y la otras son la estructura de decisión y la estructura de selección múltiple (caso), que se trabajarán en la unidad 3. 2.1 Estructura secuencial Es la estructura más simple dentro de los algoritmos, donde una ac- ción o instrucción sigue a otra en secuencia hasta llegar al fin del algorit- mo. Esta estructura consta de tres partes primordiales: los datos de entra- da, el proceso y los datos de salida, temas tratados en el numeral 1.5.3 de la primera unidad. Tomando como base la representación de una computadora en su unidad central de proceso (Joyanes, 2008), se plantea la siguiente relación (figura 21). 63Unidad 2. Estructura fundamental de un algoritmo Figura 21. Organización física de una computadora. Fuente: Edukativos (2013). Todo programador debería tener presente la relación entre la compu- tadora y estructuras secuenciales (Edukativos, 2013). Los datos de entrada son los que se ingresan a la computadora por medio de los dispositivos de entrada (teclado, mouse, cámara, entre otros); en nuestro caso se usa- rá únicamente el teclado para ingresar la información. El proceso son los cálculos y operaciones de un algoritmo que se realizan en la unidad central de proceso, estas se almacenan en variables (creadas anteriormente) y des- pués se convierten en los datos de salida, los cuales se muestran a través de los diferentes dispositivos de salida (pantalla, impresora, parlantes, entre otros); en nuestro caso se usará únicamente la pantalla para visualizar los resultados. De esta forma, todo lo que se haga en un algoritmo se enfoca a lo in- gresado por el usuario, el proceso que se realiza y su respectiva salida. En 64 Fundamentos
Compartir