Fundamentos Informáticos para la Ingeniería Grados en Ingeniería en Organización Industrial PDF
Document Details
Uploaded by CheerfulGrossular358
Universidad Internacional de Valencia
Varios autores
Tags
Related
- Lógica Secuencial Apuntes 2023 S2 PDF
- Fundamentos y Aplicaciones de los Contratos Informáticos PDF
- Fundamentos de Ingeniería Industrial y Comercial Sesión 4 PDF
- Apuntes UT1 PDF - Formación profesional en grado superior
- Diseño de Elementos de Hormigón Armado TEORICO EH PDF
- Introduccion a la Ciberseguridad para Ingenieros Informaticos PDF
Summary
Este documento cubre los fundamentos de la informática y la programación para la ingeniería. Se centra en la introducción a la programación y a las bases de datos, incluyendo ejemplos de algoritmos y el lenguaje Python. El material es específico del grado en Ingeniería en Organización Industrial en la Universidad Internacional de Valencia.
Full Transcript
FUNDAMENTOS INFORMÁTICOS PARA LA INGENIERÍA Varios autores GRADO EN INGENIERÍA EN ORGANIZACIÓN INDUSTRIAL Módulo de Formación básica Este material es de uso exclusivo para los alumnos de la Universidad Internacional de Valencia. No está permitida la reproducción total o parcial de su contenido ni...
FUNDAMENTOS INFORMÁTICOS PARA LA INGENIERÍA Varios autores GRADO EN INGENIERÍA EN ORGANIZACIÓN INDUSTRIAL Módulo de Formación básica Este material es de uso exclusivo para los alumnos de la Universidad Internacional de Valencia. No está permitida la reproducción total o parcial de su contenido ni su tratamiento por cualquier mé- todo por aquellas personas que no acrediten su relación con la Universidad Internacional de Va- lencia, sin autorización expresa de la misma. Edita Universidad Internacional de Valencia Grado en Ingeniería en Organización Industrial Fundamentos informáticos para la ingeniería Módulo de Formación básica 6 ECTS Varios autores Leyendas Enlace de interés Ejemplo Descarga de archivo Los términos resaltados a lo largo del contenido en color naranja se recogen en el apartado GLOSARIO. Índice CAPÍTULO 1. FUNDAMENTOS DE LA INFORMÁTICA Y LOS COMPUTADORES..................................... 7 1.1. Aspectos históricos..................................................................................... 8 1.2. Estructura funcional..................................................................................... 10 1.3. Introducción a los sistemas digitales..................................................................... 11 1.4. Codificación de información en computadores.......................................................... 13 1.4.1. Sistema de numeración decimal.................................................................. 14 1.4.2. Sistema de numeración binario................................................................... 14 1.4.3. Sistemas de numeración. potencias de 2: octal y hexadecimal..................................... 16 1.3.4. Representación de texto.......................................................................... 18 1.5. Algoritmos, programas y lenguajes...................................................................... 19 1.5.1. Lenguajes compilados e interpretados............................................................ 20 1.5.2. Lenguaje Python................................................................................. 20 1.5.3. Ejemplos clásicos de algoritmos.................................................................. 23 CAPÍTULO 2. INTRODUCCIÓN A LA PROGRAMACIÓN........................................................... 25 2.1. Tipos de datos simples, expresiones y operaciones elementales.......................................... 25 2.1.1. Tipos de datos.................................................................................... 25 2.1.2. Variables y acción de asignación................................................................. 30 2.1.3. Expresiones e instrucciones...................................................................... 34 2.1.4. Operadores...................................................................................... 35 2.1.5. Acciones elementales............................................................................ 41 2.2. Estructuras algorítmicas................................................................................. 45 2.2.1. Estructura secuencial............................................................................ 46 2.2.2. Estructuras alternativas........................................................................... 48 2.2.3. Estructuras iterativas............................................................................. 52 2.3. Tipos de datos estructurados: homogéneos y heterogéneos, dinámicos y estáticos...................... 64 2.3.1. Datos estructurados inmutables (estáticos)....................................................... 65 2.3.2. Datos estructurados mutables (dinámicos)........................................................ 74 2.4. Programación orientada a objetos....................................................................... 87 2.4.1. Encapsulamiento................................................................................. 88 2.4.2. Programación OO................................................................................ 88 CAPÍTULO 3. BASES DE DATOS................................................................................... 93 3.1. Introducción a las bases de datos....................................................................... 93 3.1.1. Sistemas de gestión de bases de datos........................................................... 93 5 Índice 3.1.2. Características de una base de datos............................................................. 94 3.1.3. Modelo entidad-relación......................................................................... 94 3.1.4. Diseño de una base de datos..................................................................... 98 3.1.5. Tipos de datos.................................................................................... 99 3.1.6. Creación de una base de datos................................................................... 99 3.1.7. Creación de una tabla............................................................................ 99 3.2. Normalización de la base de datos....................................................................... 100 3.2.1. Primera forma de normalización (1NF)............................................................. 102 3.2.2. Segunda forma de normalización (2NF)........................................................... 103 3.2.3. Tercera forma de normalización (3NF)............................................................ 104 3.2.4. Creación de un modelo de datos relacional...................................................... 104 3.2.5. Jupyter Notebook como herramienta de familiarización con el lenguaje SQL...................... 106 3.3. Manipulación de datos con lenguaje SQL................................................................ 107 3.3.1. Lenguaje de definición de datos (DDL)............................................................ 107 3.3.2. Lenguaje de manipulación de datos (DML)........................................................ 110 3.3.3. Lenguaje de control de datos (DCL).............................................................. 113 3.3.4. Expresiones de búsquedas selectivas, agrupación y orden........................................ 114 3.3.5. Expresiones avanzadas SQL...................................................................... 118 APÉNDICES....................................................................................................... 127 Anexo A Tabla ASCII (codificación con 7 bits) y ASCII extendido (8 bits)................................. 127 Anexo B Tabla ASCII extendido (código de página 347)................................................. 129 GLOSARIO........................................................................................................ 130 ENLACES DE INTERÉS............................................................................................ 135 BIBLIOGRAFÍA.................................................................................................... 136 6 Capítulo 1 Fundamentos de la informática y los computadores La informática es el área del conocimiento que estudia todo lo que hace referencia a la obtención y el procesamiento de información por medios automatizados, a partir de unos datos determinados. El origen del término proviene de información automática, es decir, procesamiento automático de la información por medio de computadoras. En España, principalmente, se ha utilizado el nombre de informática, aunque en América se utiliza el término computación. En lengua inglesa prevalecen los términos computing, computation y computer science. Según la Real Academia de la Lengua (2014), la informática es el “Conjunto de conocimientos científicos y técnicas que hacen posible el tratamiento automático de la información por medio de computadoras”. De forma equivalente, en inglés, computer science se encarga del estudio de los procesos de información. Aunque las computadoras analógicas fueron utilizadas en el siglo pasado para realizar cálculos matemáticos con bastante éxito, desde mediados de siglo se impuso el uso de tecnología digital en el diseño de computa- dores. Los términos computador o computadora (del latín: computare, calcular) popularmente usados son válidos ambos, según la Real Academia de la Lengua (2014). En España, desde los años 1960 se difundió más el nombre de ordenador, probablemente por influencia del francés ordenatour (del latín: ordinator), aunque actualmente se usan de manera equivalente ordenador y computador. 7 Capítulo 1. Fundamentos de la informática y los computadores 1.1. Aspectos históricos Desde sus orígenes, el ser humano desarrolló herramientas para aumentar su fuerza física (palancas, mecanismos, ruedas, etc.), así como para aumentar sus habilidades intelectuales. El lenguaje como forma de comunicación y la escritura para trasmitir la información en el tiempo y la distancia fueron las primeras formas de mejorar sus habilidades intelectuales. Luego, el cálculo para construir edificaciones, evaluar los movimientos de los cuerpos celestes, etc., fue un nuevo hito en el desarrollo del ser humano. Así, el hombre buscó herramientas que puedan incrementar su poder de cálculo. El ábaco, que se estima apareció sobre el 2400 aC en Babilonia, fue usado por muchas civilizaciones (India, China, Egipto, Grecia) para realizar cálculos aritméticos. El nombre actual proviene del griego abax: tabla o rectángulo. Wilhelm Schickard en el siglo xvii construyó la primera máquina de calcular (con imperfecciones) ba- sada en engranajes de relojería. Blaise Pascal, matemático francés, construyó a los pocos años una segunda máquina mecánica capaz de sumar, restar y hacer cálculos aritméticos. Se le llamó máquina aritmética o pascalina, y es considerada antepasado de los computadores analógicos. En 1671, Gottfried Wilhelm Leibniz, matemático alemán, extendió las ideas de Pascal y desarrolló una máquina (stepped reckoner o máquina de Leibniz) que incorporaba la posibilidad de multiplicar, dividir y sacar raíz cuadrada. Leibniz también describió el sistema numérico binario para realizar cálculos, antecesor de la lógica binaria y álgebra de Boole, en la que se basa la computación actual. En 1820 Charles X. Thomas patentó y produjo una máquina mecánica para calcular que tuvo un gran éxito comercial. Usada hasta principios del siglo xx en agencias gubernamentales, bancos y empresas aseguradoras, precede a las cajas registradoras de las tiendas que se usaron hasta comienzos de 1970. Durante el siglo xix se desarrollaron cintas de papel y tarjetas perforadas portadoras de información que se usaron en pianos automáticos y, en el siglo xx, en control numérico de máquinas. Luego, en las primeras épocas de la programación de computadores digitales, se usaron como medio de introducir el código y datos de programa al equipo. Las reglas de cálculo (side rule, slipstick) fueron otro de los hitos de las herramientas de cálculo, con- sideradas como computadores analógicos. Las reglas de cálculo (hoy en día piezas de museo) pue- den realizar operaciones aritméticas, logaritmos y funciones trigonométricas. A diferencia de los cálculos con tecnología digital, donde la información está discretizada, las técnicas de cálculo analógicas utilizan información o variables continuas en el tiempo y amplitud. Durante el siglo xx, hasta la década de 1970, tuvieron un amplio uso las computadoras analógicas electrónicas. Estas pueden realizar cálculo aritmético o resolver ecuaciones diferenciales a través de circuitos elec- trónicos, que realizan operaciones aritméticas, derivadas e integrales sobre señales de voltaje conti- nuas en tiempo y amplitud (analógicas). Estos computadores y máquinas de cálculo descritos fueron, de hecho, computadores de programas fijos, pues resuelven un número limitado de problemas para los que fueron diseñados. La idea de funcionamiento de los computadores modernos se atribuye a Charles Babbage (entre 1822 y 1837), ingeniero británico, quien desarrolló un computador mecánico que incluía los conceptos de unidad aritmética, control de flujo, ramifi- caciones condicionales, bucles y una memoria integrada. Babbage es considerado uno de los padres de la computación. 8 Fundamentos informáticos para la ingeniería Alan Turing, matemático inglés, fue quizás el primer teórico de la informática y propuso forma- lismos científicos a los procesos algorítmicos. En 1936 Turing desarrolló un hipotético computador (un modelo matemático) que contenía una memoria ilimitada sobre una cinta y un conjunto de pocas instrucciones para grabar y leer ceros y unos sobre la cinta, y moverse sobre ella. La tesis de Turing afirma que, si una función es calculable, la máquina de Turing puede programarse para hacerlo. Alan Turing sentó las bases de los computadores de propósitos generales, con programas alma- cenados, en una publicación en 1936. En 1945 Turing trabajó en el desarrollo de un computador digital con programas almacenados usando tecnología electrónica, y publicó sus resultados ese mismo año. Figura 1. Memorial a Alan Turing Memorial, Sackville Park, Manchester, Inglaterra. Simultáneamente, John von Neumann (físico húngaro-americano), que conocía el trabajo teórico de Turing, propuso en 1945 un diseño de arquitectura de computador que, aunque similar en ciertas ideas al diseño de Turing, se dio a conocer como la arquitectura de von Neumann (Copeland, 2008). 9 Capítulo 1. Fundamentos de la informática y los computadores El primer computador moderno se considera el Manchester Ferranti Mark 1, que usaba la arquitectura actual atribuida a von Newman y en cuyo desarrollo de programas participó Turing. Este computador con programas almacenados ejecutó su primer código programado en 1949. Así, en la arquitectura de von Newman y los ordenadores actuales, se almacenan las instrucciones y datos de la misma manera, utilizando la unidad de memoria principal (véase más adelante la Figura 2). La unidad de procesamiento central (CPU) contiene una unidad aritmética y lógica (ALU), registros del procesador, una unidad de control que contiene un registro de instrucciones, un contador de programa y mecanismos de entrada y salida. 1.2. Estructura funcional La informática se encarga de los procesos de información, y las máquinas electrónicas que hoy en día se encargan de estos procesos son los computadores digitales (ordenadores)1. Cuando un computador realiza los diferentes pasos de un trabajo dado, se dice que está realizando un proceso. Los procesos informáticos comprenden básicamente tres fases: 1. La entrada de datos. 2. El procesamiento, en el que se tratan los datos mediante una secuencia de acciones preestablecidas por un determinado programa. 3. La salida de datos. Así, podemos definir un computador como una máquina que: 1. Acepta entradas. Las entradas pueden ser introducidas por un humano a través de un teclado, ser re- cibidas de una red o ser proporcionadas de forma automática por medio de sensores conectados a la computadora. 2. Ejecuta un procedimiento automático, es decir, un procedimiento en el que cada paso puede ser eje- cutado sin ninguna acción manual de un humano. 3. Produce salidas. Las salidas pueden ser datos que se muestran a una persona, pero también podría ser cualquier cosa que afecta al mundo fuera del ordenador, como señales eléctricas que controlan el funcionamiento de un dispositivo. Funcionalmente, la estructura de los ordenadores actuales, basada en la de von Newman, permite procesar la información y realizar operaciones matemáticas y lógicas gobernadas por un programa informático utili- zando su gran capacidad de memoria. En el modelo de arquitectura básica de una computadora descrito en la Figura 2, se observa la memoria como el lugar en el que se almacena la información. 1 Usaremos indistintamente los términos computador u ordenador. 10 Fundamentos informáticos para la ingeniería Después de ser codificada la información en forma binaria, la memoria almacena instrucciones de programas y datos de cualquier tipo. La memoria suele incluir una parte de solo lectura de las instrucciones básicas (memoria ROM, de read-only memory), que permanecen grabadas, y otra memoria de acceso alea- torio para escribir y leer datos e instrucciones de programas (memoria RAM, de random access memory), que se borra al cerrar el programa o el ordenador. Adicionalmente se añade una memoria externa al proce- sador central en medios magnéticos, como discos duros o electrónicos de estado sólido, como las memo- rias flash de los teléfonos móviles modernos. La unidad aritmética y lógica (ALU) realiza operaciones matemáticas elementales y lógicas, y produce nuevos datos. La unidad de control se encarga de trasladar la información a la ALU y devolver los resul- tados a la memoria. Estas unidades de control y ALU en conjunto forman la unidad de procesamiento central (conocida por sus siglas CPU, del inglés central processing unit). Memoria Unidad aritmética y lógica Unidad de control Reloj (ALU) Acumulador Salida Entrada Figura 2. Diagrama de la arquitectura de von Newman. La información que se almacena en la memoria y se procesa en la computadora está codificada en forma binaria (unos y ceros; cierto o falso). La unidad primaria de la información en computación es el bit (combi- nación de binary digit). Una pregunta binaria tendrá solo dos respuestas: cierto o falso. En informática se representan usualmente estos dos estados como 1 y 0. Electrónicamente, los ceros y unos se realizan mediante cambios de estado de corte a saturación de los componentes electrónicos básicos o cambios de un voltaje a otro (por ejemplo, 0 V a 5 V). 1.3. Introducción a los sistemas digitales Un sistema digital es un dispositivo diseñado para la generación, la transmisión, el procesamiento o el alma- cenamiento de señales digitales. También se puede decir que es una combinación de dispositivos dise- ñados para manipular cantidades físicas o información que estén representadas en forma digital, es decir, que solo puedan tomar valores discretos. 11 Capítulo 1. Fundamentos de la informática y los computadores A continuación se muestra la inserción de un sistema digital dentro de un sistema más complejo, conformado también por componentes que manejan señales de entrada y salida analógicas. Números Señal Señal acústica 4568 3456 acústica Señal eléctrica 4098 3087 A/D D/A Conversor Sistema digital: Conversor analógico- – almacena digital- digital – transporta analógico – recupera – manipula Figura 3. Sistema digital incorporado dentro de un sistema mixto (analógico digital). Adaptado de “Sistemas digitales”, 2012, Electrónica 2. Recuperado de https://electronicados.wordpress.com/2012/11/20/sistemas-digitales Las señales digitales, a diferencia de las analógicas, no varían de forma continua, sino que cambian en pasos o en incrementos discretos. La mayor parte de las señales digitales utilizan códigos binarios o de dos estados. Para obtener las señales digitales, se realiza un proceso de conversión a partir de las señales analó- gicas aplicando los siguientes pasos: Muestreo. Consiste en tomar muestras periódicas de la amplitud de la onda analógica. La velocidad con la que se toman las muestras, es decir, el número de muestras por segundo, se conoce como fre- cuencia de muestreo. Cuantificación. Consiste en medir el nivel de voltaje de cada una de las muestras y asignar un único nivel de salida. Codificación. Consiste en traducir los niveles de salidas asignados durante la cuantificación al siste- ma binario. También existen otros sistemas de codificación que pueden ser utilizados. A continuación se muestran gráficamente los tres pasos empleados en la conversión de las señales digitales: Conversor A/D x0(t) x(n) xq(n) 1001011... Muestreador Cuantificador Codificador Señal Señal en Señal Señal analógica tiempo discreto cuantificada digital Figura 4. Conversión de una señal analógica en digital. Dominio público. Adaptado de https://es.wikipedia.org/wiki/ Conversor_de_señal_analógica_a_digital#/media/Archivo:Conversor_AD.svg 12 Fundamentos informáticos para la ingeniería Los sistemas digitales se clasifican en dos tipos: Sistemas combinacionales. Son aquellos en los que la salida del sistema solo depende de la entrada actual, sin tener en cuenta estados anteriores de la entrada o la salida. Por lo tanto, no necesita con- tener módulos de memoria. Estos sistemas están compuestos únicamente por compuertas lógicas interconectadas entre sí, siguiendo una función lógica que emplea las operaciones básicas del álge- bra de Boole, por lo que también se conoce como función booleana. Entre los circuitos combinacionales clásicos, tenemos los siguientes: –– Lógicos (generador y detector de paridad, multiplexor y demultiplexor, codificador y decodificador, conversor de código, comparador). –– Aritméticos (sumador, restador). –– Una combinación de ambos (unidad aritmético lógica). Sistemas secuenciales. En este tipo de sistemas, la salida depende de la entrada actual y de las ante- riores. Este tipo de sistemas necesitan elementos de memoria que almacenen la información pasada del sistema. Los sistemas secuenciales más simple son los biestables (dos estados posibles), de los cuales los del tipo D son los más utilizados. En este tipo de circuitos entra en juego un elemento importante: el factor tiempo, el cual no se había considerado en los circuitos combinacionales. Según como se maneje el factor tiempo en los circuitos secuenciales, estos se pueden clasificar en: –– Circuitos secuenciales síncronos. Solo permiten un cambio de estado en los instantes marcados o autorizados por una señal de sincronismo de tipo oscilatorio, denominada reloj (un cristal o un circuito capaz de producir una serie de pulsos regulares en el tiempo), lo cual soluciona los proble- mas que tienen los circuitos asíncronos debidos a los cambios de estado no uniformes dentro del sistema o circuito. –– Circuitos secuenciales asíncronos. En este caso, los cambios de estados ocurren al ritmo natural impuesto por las propias compuertas lógicas utilizadas en su implementación, lo que produce retar- dos en cascadas entre los diferentes elementos del circuito. Esto puede ocasionar algunos proble- mas de funcionamiento, ya que estos retardos no están bajo el control del diseñador y, además, no son idénticos para cada compuerta lógica utilizada. 1.4. Codificación de información en computadores Todo tipo de información que se quiera procesar en una computadora, al final, se representa de forma numé- rica para luego codificarla en forma binaria, usando bits como unidad básica. La forma numérica conocida de números naturales, enteros, reales y complejos, así como el texto de cualquier lenguaje (castellano, inglés, etc.), se representa finalmente en formato binario para que la procese el CPU del computador. Resumimos a continuación los tipos más usados de representación numérica, y los caracteres alfabéticos y otros signos de puntuación. 13 Capítulo 1. Fundamentos de la informática y los computadores 1.4.1. Sistema de numeración decimal El sistema universal de representación numérica es el decimal, de base 10, que utiliza los números indio-ará- bigos introducidos a Europa desde la India a través de la región persa y del actual mundo árabe, y probable- mente influenciados por un sistema en base 10 de China. Se considera al matemático persa Al-Khwarizmi o Al-Juarismi el primero en utilizar la numeración india decimal para los métodos de cálculo, en sus publica- ciones del siglo ix, como el famoso tratado de álgebra. Base: 10 Conjunto de símbolos: {0, 1, 2, 3, 4, 5, 6, 7, 8 ,9} Ejemplo El valor del número entero 2435 (2 es el dígito más significativo y 5 el menos significativo) es: 2 · 103 + 4 · 102 + 3 · 101 + 5 · 100 = 2435 El valor del número real 1428.35 es: 1 · 103 + 4 · 102 + 2 · 101 + 8 · 100 + 3 · 10–1 + 5 ·10–2 = 1428.35 En general, cualquier número N puede representarse mediante un polinomio de potencias de una base cual- quiera b (decimal: b = 10; binario: b = 2, etc.), es decir: N(b = an · bn + an–1 · bn–1 + … + a1 · b1 + a0 · b0 + a–1 · b–1 + … + a–m · b–m En la fórmula anterior, b es la base del sistema de numeración, ak es un número perteneciente a ese sistema de numeración y ak pertenece al conjunto [0, b – 1]. Los números enteros, es decir, los números naturales más sus negativos y el cero, son valores discretos y se pueden ordenar. Sin embargo, los valores continuos, como los números reales, en general no se pueden representar con exactitud y solo se pueden aproximar en las computadoras digitales. Sin embargo, si se incrementa suficientemente el número de bits para representarlos, la aproximación puede ser tan buena como se quiera. La codificación de los reales sigue unos estándares en los diversos lenguajes. 1.4.2. Sistema de numeración binario El sistema de numeración en base 2 (binario) es el empleado en la tecnología actual de las computadoras digitales. 14 Fundamentos informáticos para la ingeniería Base: 2 Conjunto de símbolos: {0, 1} Ejemplo El número 11011 en base 2 (binaria) tiene el valor 27 en base decimal, donde el primer 1 es el bit más significativo y el último 1 el menos significativo: Número: 11011)2 Valor en base 10: 1 · 24 + 1 · 23 + 0 · 22 + 1 · 21 + 1 · 20 = 16 + 8 + 2 + 1 = 27)10 La conversión de binario a decimal o, simplemente, el valor equivalente del número binario en decimal se calcula siguiendo la ecuación 1, donde el número que hay que convertir es de base 2. A continuación un ejemplo con parte fraccionaria en base dos: Ejemplo Número: 110.11)2 Valor en base 10: 1 · 22 + 1 · 21 + 0 · 20 + 0 · 2–1 + 1 · 2–2 = 4 + 2 + 0.25 = 6.25)10 La conversión de base decimal a binaria se realiza del siguiente modo. Se divide el número N entre 2 y el cociente se vuelve dividir entre 2, y así sucesivamente. El último cociente y los restos forman el número binario. Ejemplo Si queremos representar el número decimal 25 en binario: 25 2 1 12 2 11001 0 6 2 0 3 2 1 1 >>> 15 Capítulo 1. Fundamentos de la informática y los computadores >>> El número decimal 12.25 se representa en binario de esta forma: 12 2 0 6 2 0.25 0.50 0 6 2 # 2 #2 1100.01 1 1 0.50 1.00 1100 01 La información que se almacena y se procesa en las computadoras es agrupada en palabras de 8 bits que forman las unidades de información usadas hoy en día. Estas unidades de 8 bits se denominan byte. Con un byte podemos representar 256 números diferentes (28), usualmente los números naturales en el rango [0, 255]. Por ejemplo, el byte 10010111 representa el número decimal 151: Binario 1 0 0 1 0 1 1 1 Peso 27 26 25 24 23 22 21 20 Decimal 128 16 4 2 1 Suma = 151 1.4.3. Sistemas de numeración. potencias de 2: octal y hexadecimal La representación numérica en base 8 (octal) y 16 (hexadecimal) tiene mucha utilidad en informática, sobre todo en el uso de instrucciones cuando se programa directamente sobre la máquina, por la facilidad de agrupar números binarios. Al ser potencias de 2, el sistema octal agrupa 3 bits de información (23) y el hexa- decimal 4 bits (24). Sistema de numeración octal Base: 8 Conjunto de símbolos: {0, 1, 2, 3, 4, 5, 6, 7} Ejemplo El número 325 en base 8 (325)8) equivale a 213 en base 10. En base 2 se puede expresar cada dígito en formato binario. 3 equivale a 011, 2 equivale a 010 y 5 equivale a 101. Así, queda 011010101 en base 2. Su valor en base 10 corresponde al 213: Valor en base 10: 3 · 82 + 2 · 81 +5 · 80 = 192 + 16 + 5 = 213)10 Valor en base 2: 011010101 16 Fundamentos informáticos para la ingeniería Sistema de numeración hexadecimal Base: 16 Conjunto de símbolos: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F} A tiene un peso de 10, B tiene un peso de 11, y así sucesivamente hasta F, que tiene un peso de 15. Ejemplo El número 35A)16 equivale en decimal al 858. Fácilmente se puede convertir a formato binario remplazando cada dígito hexadecimal por los 4 bits equivalentes del conjunto de símbolos (véase la Tabla 1). Valor en base 10: 3 · 162 + 5 · 161 + A · 160 = 768 + 80 + 10 = 858)10 Valor en base 2: 001101011010 La siguiente tabla muestra las equivalencias entre los sistemas de numeración descritos: Tabla 1 Equivalencia entre sistemas de numeración Decimal Binario Octal Hexadecimal 0 0000 0 0 1 0001 1 1 2 0010 2 2 3 0011 3 3 4 0100 4 4 5 0101 5 5 6 0110 6 6 7 0111 7 7 8 1000 10 8 9 1001 11 9 10 1010 12 A 11 1011 13 B 12 1100 14 C 13 1101 15 D 14 1110 16 E 15 1111 17 F 16 10000 20 10 17 Capítulo 1. Fundamentos de la informática y los computadores 1.3.4. Representación de texto La representación de texto en informática se realiza con una codificación numérica de palabras de 7 u 8 bits, siguiendo comúnmente el código ASCII (American Standard Code for Information Interchange). El código ASCII original utiliza 7 bits para representar 128 (27) caracteres alfanuméricos y de puntuación. En este estándar, por ejemplo, la letra e (minúscula) es el binario 1100101 (número decimal 101, o el hexa- decimal 65). La E (mayúscula) se representa por el binario 0101100, equivalente decimal 69 (hexade- cimal 45). En los anexos A y B se muestran la tabla de caracteres ASCII y una extensión ASCII que utiliza un bit adicional para definir 128 caracteres adicionales y así poder representar otros signos, por ejemplo, vocales acentuadas, la ñ, la ç, etc. La é se representa por el binario 10000010, equivalente al decimal 130 (hexade- cimal 82). IBM desarrolló a principio de los años 1980 este código extendido a 8 bits (se llamó código de página 347) y lo incorporó en los primeros sistemas operativos de los computadores personales (PC, del inglés personal computer) de la época: el PC-DOS y el MS-DOS. Actualmente, en los sistemas operativos Windows aún se puede generar estos caracteres extendidos. Sobre cualquier editor de texto hay que mantener pulsada la tecla Alt y simultáneamente teclear un número del teclado numérico2 (keypad). Por ejemplo, Alt + 164 escribe la ñ y Alt + 241 escribe el símbolo matemático ±. Pero hay que resaltar también que existen muchas otras variantes de código de página ASCII extendida, como el ISO-8859-1 (Latin1), ISO-8859-15 (Latin9, que incorpora el símbolo del euro), etc. Aun así, con 8 bits, la codificación de las tablas ASCII y ASCII extendida no es suficiente para representar la gran cantidad de caracteres y símbolos de todos los alfabetos del mundo. Con el uso extendido de internet y el diseño de páginas web, se han desarrollado formatos de codificación de caracteres más universales, como el Unicode, estándar de codificación de caracteres para múltiples lenguas, así como el UTF-8 (8-bit Unicode Transformation Format) o el UTF-16. Enlaces de interés Puedes encontrar la lista de caracteres Unicode en su página web: http://unicode-table.com/es También puede resultarte útil la entrada en Wikipedia sobre la lista de caracteres Unicode: https://en.wikipedia.org/wiki/List_of_Unicode_characters Adicionalmente, la información más compleja que se procesa en una computadora, como imágenes, graba- ciones de audio y video, se codifica también con secuencias de bits en distintos formatos, por ejemplo, imágenes en formatos BMP, JPEG, GIF, TIFF, PNG o DICOM en imágenes médicas; audio en WAV, MP3 o OGG; y vídeo en AVI, MOV, MP4, WMV o FLV. 2 En los primeros computadores personales que llegaban a Latinoamérica a finales de los años 1980, los teclados estaban configurados en inglés. Era normal escribir las vocales acentuadas y la ñ de esta manera, por ejemplo, á con ALT+160. 18 Fundamentos informáticos para la ingeniería 1.5. Algoritmos, programas y lenguajes Se entiende por algoritmo la sucesión ordenada de acciones elementales que se han de realizar para conseguir la solución correcta de un problema en un tiempo finito, a partir de unos datos dados. Codificar un algoritmo es escribirlo en un lenguaje que el computador pueda entender y ejecutar, es decir, realizar un programa. Los algoritmos son los métodos generales para la resolución de problemas o la realización de tareas, para lo cual puede seguirse un guion o instrucciones. La palabra algoritmo proviene de las primeras traducciones al latín de las obras del matemático Al-Juarismi, que usó el sistema decimal proveniente de la India en sus métodos de cálculo. El uso del nombre actual algoritmo proviene de este vocablo, aunque el concepto de algoritmo es mucho más antiguo. Hay evidencias de que lo antiguos babilonios utilizaban una serie de opera- ciones iterativas para aproximar la raíz cuadrada de un número. También Euclides en el siglo iii aC describió en su obra Elementos una metodología para hallar el mayor divisor común a dos números enteros mayores que cero. Un programa informático es una secuencia de instrucciones que detalla cómo realizar un cálculo. El cálculo puede ser matemático, como hallar las raíces de un polinomio o el valor medio de una secuencia de datos, pero también pueden ser cálculos para tareas de todo tipo, como buscar y reemplazar texto en un docu- mento, procesar una señal física o extraer contornos de una imagen debidamente digitalizada. Para escribir la secuencia de instrucciones de un programa, se requiere un lenguaje de programa- ción. El lenguaje básico que entiende el CPU de un ordenador es el conjunto de instrucciones que se usa para programar el microprocesador (µP), llamado normalmente lenguaje de máquina. Como en el µP se programa en formato binario (ceros y unos), cada µP comercial tiene asociado un conjunto de instrucciones mnemotécnicas que traducen la instrucción a formato hexadecimal y binario, llamado lenguaje ensam- blador (assembler en inglés). Actualmente los µP de las computadoras manejan las instrucciones y los datos en formato de 32 bits (4 bytes) o 64 bits (8 bytes) y cada fabricante (Intel, AMD, IBM Power PC, etc.) tiene su juego de instrucciones para su µP. Por ejemplo, los µP de la familia Intel han usado el lenguaje ensamblador x86, aunque reciente- mente con el uso de µP de 64 bits de Intel y AMD, se utiliza el lenguaje x86-64 o x64 (Lomont, 2012) para desarrollar sistemas operativos o lenguajes de programación, como Python, C++ o Java. Los lenguajes ensamblador o de máquina se conocen también como lenguajes de bajo nivel, pues están al nivel del µP o la máquina, frente a los de alto nivel, que están cercanos al usuario. Los sistemas operativos (OS, del inglés operating systems) de las computadoras, tabletas o teléfonos móviles inteligentes son también programas más complejos que sirven para relacionar la CPU (el µP) con otros programas y el usuario. Están diseñados sobre los µP de los dispositivos, utilizando sus respectivos lenguajes de máquina o ensambladores. De esta forma, el usuario puede desconocer qué tipo de µP tiene su PC o teléfono móvil. Sin embargo, interacciona en un ambiente de trabajo de la misma forma al trabajar sobre el sistema operativo Windows, OS X de Mac o Linux en su ordenador, o sobre el sistema operativo Android o iOS en su teléfono móvil inteligente. 19 Capítulo 1. Fundamentos de la informática y los computadores Los lenguajes de programación de alto nivel son, entonces, los que están más cercanos al lenguaje natural de un humano, de modo que para él no importa sobre qué máquina o sistema operativo está trabajando. Por ejemplo, Python, MATLAB, C++ y Java son lenguajes de alto nivel. Así como los lenguajes naturales (español, inglés, etc.), los lenguajes de alto nivel tienen su vocabulario, sintaxis y semántica. El vocabulario está formado por todos los elementos propios del lenguaje, como los signos de operaciones aritméticas, lógicas y de relaciones, las palabras propias del lenguaje para definir estructuras algorítmicas, como if, for, while, etc. La sintaxis define la forma como se pueden combinar los elementos del lenguaje. Por ejemplo, “x = 3 + 2” tiene una sintaxis correcta, pero “x = 3 2 +” no la tiene. La semántica se refiere a que expresiones sintác- ticamente correctas tengan un resultado correcto. Por ejemplo, “x = 7/5” es correcto sintáctica y semán- ticamente, pero en “x = 7 / hola”, aunque la sintaxis permita asignar a x el resultado de una división, semánticamente sería incorrecto dividir números entre texto. También una semántica correcta incluye que el programa no se cuelgue (quede en un bucle infinito) ni dé errores lógicos o de ejecución. Este último sería, por ejemplo, dividir entre una variable a la que el programa asigne el valor 0. 1.5.1. Lenguajes compilados e interpretados Los programas que escribimos en lenguaje de alto nivel se escriben en un editor de texto y se llaman código fuente. Al ejecutar (run) el código o programa, dependiendo del tipo de lenguaje, se traduce a lenguaje de máquina mediante dos formas diferentes: a través de un compilador o de un intérprete. Un compilador lee el código fuente y lo traduce completamente al lenguaje de máquina creando un programa ejecutable. Tiene la ventaja de que el programa ejecutable se puede usar las veces que se quiera sin tener que traducir el programa original. Además, se ejecuta más rápido. Los lenguajes de programación clásicos, como Fortran, Pascal o C++, son compilados. Un intérprete, sin embargo, es un programa que lee una a una las instrucciones (sentences en inglés) del código fuente y las traduce a las apropiadas del lenguaje de máquina. Va traduciendo y ejecutando las instrucciones del programa a medida que las encuentra. Esto los hace más flexibles y fáciles de depurar, pero se pierde velocidad respecto a los programas compilados. Entre los lenguajes de programación interpre- tados destacan Python, Matlab y Ruby. 1.5.2. Lenguaje Python Python es un lenguaje de programación de alto nivel, considerado de muy alto nivel, y de propósitos generales, que es ejecutado por un intérprete. Es muy compacto y ayuda a los que se inician a la progra- mación a escribir estructuras algorítmicas con un código claro. El lenguaje fue creado por Guido van Rossum a finales de la década de 1980 en Holanda y su primera versión se publicó a comienzos de la década de 1990. Actualmente es el lenguaje de programación más usado en los cursos de introducción a la programación o ciencias de la computación en las principales Universidades de Estados Unidos (Guo, 2014). Python es también uno de los lenguajes más utilizados por los desarrolladores de programas en todo el mundo, según el ranking IEEE Spectrum 2016 (Diakopoulos y Cass, 2016). 20 Fundamentos informáticos para la ingeniería La Python Software Foundation administra el lenguaje Python y su licencia de código abierto. Los deta- lles de instalación y uso del ambiente de desarrollo de programas de Python escapan al objetivo de este manual, pero sí resumimos sus características para empezar a trabajar en este lenguaje. La página web para descargar el programa es https://www.python.org y en la sección de descargas se puede encontrar el sistema operativo (Microsoft Windows, Mac OS X, Linux, etc.) y el tipo de máquina en el que se puede instalar. Es de acceso libre. Usaremos la versión 3.x en lugar de la 2.x. El ambiente de desarrollo integrado de programas (IDLE3, de integrated development enviroment) de Python permite escribir códigos fuente para que luego los ejecute el intérprete. Las instrucciones se ejecutan sobre una ventana o consola llamada Shell. Sobre el Shell se puede ejecutar en modo de línea de comando o en modo inmediato una expresión como si fuera una calculadora. Al abrir el IDLE, aparecerá una ventana similar a la que se muestra a continuación y, siguiendo la tradición en programación, escribiremos nuestro primer código de introducción al mundo de la programación con un saludo: Python 3.6.0a3 (v3.6.0a3:f3edf13dc339, Jul 11 2016, 21:40:24) Type "copyright", "credits" or "license()" for more information. >>> print('Hola mundo!') Hola mundo! A continuación puede verse una muestra del Shell en la versión 3.6.0 y el cálculo de dos expresiones aritmé- ticas: Figura 5. Captura del Shell de Python y cálculo de expresiones aritméticas con el intérprete. El símbolo >>> es el llamado prompt (en español entrada o apunte, aunque en informática se suele usar el nombre inglés) de Python. 3 El nombre de Python proviene de la comedia británica de la pandilla de amigos de Monty Python, y parece que el uso de IDLE en lugar de las siglas IDE se debe al personaje Eric Idle. 21 Capítulo 1. Fundamentos de la informática y los computadores En la Figura 6 se muestra el código fuente de un programa simple que calcula el área de un triángulo rectán- gulo de catetos c1 y c2, por ejemplo, c1 = 3 y c2 = 4. Se escribe el código en un editor, creado de la pestaña (tab) File " New File y se guarda desde esa ventana con Save as (por ejemplo: areaTriang.py). Luego se ejecuta desde la pestaña Run " Run module F5 (o simplemente teclear F5). El resultado aparecerá en el Shell de Python (véase la Figura 7). Figura 6. Captura del editor de Python con ejemplo de código fuente del programa areaTriang.py. Figura 7. Captura del Shell de Python mostrando el resultado del programa areaTriang.py. La función print de Python escribe el resultado en el Shell del lenguaje de programación, de modo que no se debe confundir con la acción Print Windows de la pestaña File, que envía todo el contenido a la impresora. Como se muestra en la Figura 8, el programa áreaTriang.py sería más eficiente si pudiese generalizarse para calcular el área de cualquier triángulo rectángulo. La función input permite leer del Shell un dato del teclado, que será en formato texto, y luego la función int convierte este dato de texto a número entero. Figura 8. Captura del editor de Python del programa areaTriang.py modifi- cado pidiendo datos de entrada. 22 Fundamentos informáticos para la ingeniería El Shell de Python muestra el mensaje de texto de la función input y espera que el usuario introduzca el número, en este caso 3, que, al ser introducido en el teclado, se interpreta como un carácter ASCII. La función int lo convierte a un número entero: Figura 9. Captura del Shell de Python mostrando resultado del programa areaTriang.py Enlaces de interés En esta sección del sitio web de Python se encuentran los archivos de descarga del programa para los distintos sistemas operativos: https://www.python.org/downloads/ Aquí se puede encontrar información sobre la Python Software Foundation: https://www.python.org/psf/ 1.5.3. Ejemplos clásicos de algoritmos Entre los primeros métodos para resolver problemas con una secuencia de instrucciones y toma de deci- siones lógicas para repetir los cálculos de forma iterativa o de bucles, se encuentra el algoritmo de Euclides para hallar el máximo común divisor de dos números naturales y la aproximación a la raíz cuadrada de cual- quier número real. El método propuesto por Euclides (siglo iii aC) para hallar el máximo común divisor (MCD) de dos números naturales, conocido como algoritmo de Euclides, propone lo siguiente: Dados 2 números naturales, a y b, hay que comprobar primero si son iguales. Si lo son entonces a es el MCD. Si no son iguales, entonces hay que probar si a es mayor que b y, si lo es, restar a a el valor de b. Sin embargo, si a es menor que b, entonces hay que restar a b el valor de a. Hay que repetir el procedimiento con los nuevos valores de a y b. Herón de Alejandría (destacado matemático e inventor griego, siglo i dC) describió un método para aproximar la raíz cuadrada de un número (se cree que el método ya era conocido en la antigua Babilonia) por aproximaciones sucesivas. Es decir, la raíz cuadrada de x es un número y que satisface y2 = x. Isaac Newton (siglo xvii) propuso posteriormente un método general para hallar las raíces de una función no lineal, f(x) = 0. 23 Capítulo 1. Fundamentos de la informática y los computadores El método de Herón para hallar la raíz cuadrada de x consiste en lo siguiente: 1. Se propone un número candidato cualquiera g (podemos, por ejemplo, comenzar con x/2). 2. Si g*g = x, o lo suficientemente aproximado de acuerdo con la precisión que queramos, paramos y g es la solución. (A partir de ahora, usaremos el operador * para la multiplicación en programas infor- máticos, en lugar de × o ·, usados en matemáticas). 3. Si no, se realiza una nueva búsqueda de la raíz de x promediando el valor de g y x/g. Es decir, (g + x/g)/2. Este valor lo llamamos también g. 4. Volvemos al paso 2 hasta conseguir que g*g sea igual o lo suficiente aproximado a x. Si denominamos el valor inicial propuesto de g como g0 y los siguientes valores gn, donde n = 1, 2…, entonces las propuestas de raíz de x, gn, en la iteración n es función de las propuestas previas gn–1 y el número x: x gn – 1 + gn – 1 gn = 2 Estos algoritmos clásicos los realizaremos en lenguaje de programación Python al introducir las estructuras algorítmicas condicionales y alternativas. 24 Capítulo 2 Introducción a la programación 2.1. Tipos de datos simples, expresiones y operaciones elementales En este tema presentaremos algunos conceptos y elementos básicos usados en los lenguajes de programa- ción en general, aunque se especificarán las características particulares del lenguaje Python. Trataremos los siguientes conceptos: tipos de datos simples y compuestos, variables, identificadores, acciones elementales como asignaciones (o referencias a objetos en Python) y lectura y escritura a través de funciones internas básicas de los lenguajes. 2.1.1. Tipos de datos La información que se procesa en los programas informáticos se representa de diversas formas. Si tratamos con información numérica, usaremos valores o datos simples de tipo enteros o reales. Si traba- jamos con expresiones lógicas con resultado cierto o falso, utilizaremos datos lógicos o booleanos. Si, en cambio, manipulamos texto, haremos uso de datos de tipo carácter o cadena de caracteres (string en inglés). Para representar información numérica (o incluso lógica o de texto) donde se agrupen los datos en forma de tablas, como los vectores y matrices, o estructuras más complejas, se emplearán tipos de datos compuestos. 25 Capítulo 2. Introducción a la programación Los tipos de datos usados en los principales lenguajes de programación se muestran a continuación: Entero, int Real, float Simple Booleano, bool Carácter, char * Tipo de dato Tablas, arrays, string ** estructura, record ** Compuesto Tupla, string Py (estático, inmutable) Lista, diccionario, set (dinámico, mutable) Py ** El tipo de dato carácter no existe en Python, un carácter simple se representa como cadena de caracteres (string). ** Estructuras compuestas de lenguajes como C, FORTRAN, Pascal, Matlab, etc. Py: Estructuras compuestas en Python Figura 10. Tipos de datos. Datos simples Los datos elementales son los datos simples, o bien escalares, por ser objetos indivisibles. Los datos simples se caracterizan por tener asociado un solo valor y son de tipo entero, real o de coma o punto flotante (float), booleano y carácter. En Python no existe el tipo de dato simple carácter. Aunque el dato conste de solo una letra o carácter, en ASCII se representa como un dato compuesto de cadena de caracteres (string). 1. Enteros En matemáticas, los números enteros (integer) son los números naturales, sus negativos y el cero. Ejemplos de enteros: 5, –20, 0, –104. Los números con parte decimal no se incluyen entre los enteros, como el 3.4. Los enteros, en la mayoría de lenguajes de programación, incluyendo Python, se definen con la palabra int. Python dispone de una función interna type que devuelve el tipo de dato dado: >>> type(7) >>> a = 45 >>> type(a) 26 Fundamentos informáticos para la ingeniería En C++ o Pascal se usan 4 bytes (32 bits, y se reserva un bit para el signo, signed 32-bit) para enteros estándar (int, integer), representándose en el rango de números: –2147483648 … 2147483647 Para mayor rango en estos lenguajes se utilizan 8 bytes (signed 64-bit), declarándolos como long o int64: –263 … 263–1 A diferencia del C++ o Pascal, en Python los datos de tipo entero se almacenan con precisión arbi- traria, es decir, se utiliza el número de bytes necesarios para representar el número entero. Por ejemplo, los números 5 (binario: 101) y 200 (27 + 26 + 23, binario: 11001000) se representan de esta forma: >>> bin(5) '0b101' >>> bin(200) '0b11001000' La función interna de Python bin(N) convierte un número entero a string con el binario equivalente (0b + binario). Para comprobar el amplio rango de valores en Python, probemos un valor mayor que 263, como 2220: >>> 2**220 1684996666696914987166688442938726917102321526408785780068975640576 2. Reales A diferencia de los enteros, que son valores discretos de un número natural a otro, los números de valores continuos del conjunto de los números reales, en matemáticas, son los números reales o de coma o punto flotante1, o simplemente float. No todos los números reales se pueden representar de forma exacta en informática, debido a que muchos tienen infinitas cifras decimales. Sin embargo, según el nivel de precisión que deseemos, se pueden aproximar lo suficientemente bien estos números. Desde hace varias décadas, se ha convenido el uso de la norma IEEE 754 para representar los números reales o de punto flotante, usando la notación científica. Esta notación permite representar los números con una mantisa (dígitos significativos) y un expo- nente separados por la letra e o E. Por ejemplo, el número 4000 se representa por la mantisa 4 y el exponente 3, es decir: 4e3. Se lee “4 veces 10 elevado a 3”. El número 0.25 se representa también como 25e-2. También se permite omitir el cero inicial,.25 y el número real 4.0 se puede introducir como 4 (sin el cero después del punto). 1 Aunque en español tradicionalmente se usaba la coma como separador de la parte entera y la fraccionaria, la Real Academia de la Lengua ya recomienda el punto para este valor, de modo que utilizaremos el punto como separador decimal. 27 Capítulo 2. Introducción a la programación La representación en computadores de los números reales o de punto flotante, siguiendo la norma IEEE 754, usa la notación científica con base binaria. Python usa esta norma en doble precisión (binary64), con 8 bytes (64 bits): Signo Exponente Mantisa 1 bit 11 bits 52 bits Valor = (–1)signo * 1.mantisa * 2(exponente-1023) Así, con 64 bits se pueden representar los números (decimales) del ±5.0*10-324 (precisión) hasta ±1.7*10308 (rango). La norma IEEE 754 actualizada en 2008 incorpora el formato decimal64, que utiliza la base decimal para mejorar los errores de representación binaria (IEEE Computer Society, 2008). Python incorpora la función Decimal del módulo decimal con este fin. A continuación se muestran varios ejemplos de números reales, el tipo real (float) y un error típico con representación de punto flotante con base binaria, en el caso del valor 0.1. >>> 25e-2 0.25 >>> 4e3 4000.0 >>> type(4.) >>>.2e2 20.0 >>> 1.1 + 2.2 # se representa con error en punto flotante binario 3.3000000000000003 3. Booleanos El tipo de dato para representar valores lógicos o booleanos en Python es bool. En Pascal y C++ se definen como boolean y bool, respectivamente. Los datos booleanos toman el valor True (1 lógico) o False (0 lógico). El nombre booleano se usa por George Boole, matemático inglés que en el siglo xix propuso un sistema algebraico basado en estos dos valores lógicos y tres operaciones lógicas: y lógico, o lógico y la negación. A continuación se muestran algunos ejemplos: >>> a = 3 > 2 >>> a True >>> type(a) >>> 4 > 5 False 28 Fundamentos informáticos para la ingeniería 4. Carácter El tipo de dato carácter, usado en varios lenguajes de programación es el elemento escalar o indi- visible de los textos usados en informática. Los textos son cadenas de caracteres (strings). Los caracteres están ordenados según la tabla ASCII, presentada en los anexos A y B. Por ejemplo, los caracteres ASCII ordenados del valor decimal 20 al 127 son: ! “ # $ % & ‘ ( ) * +, -. / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ El orden en el que se representan sirve para evaluar cuál es mayor que otro, según el valor numérico en el que figuran en el código ASCII. Por ejemplo, b es mayor que a. El tipo carácter no está definido en Python. Los caracteres simples se definen igual que un texto con una sola letra, es decir, como una cadena de caracteres (string). >>> type('a') Se puede observar que el carácter ‘a’ en Python es de tipo string (str), aunque en otros lenguajes como Pascal sería de tipo carácter (char). Datos compuestos o estructurados Los datos compuestos o estructurados comprenden aquellos datos con elementos de valores de un mismo tipo o de diferentes tipos, que se representan unificados para ser guardados o procesados. El tipo de dato string es la estructura básica para manejar texto, que incluye caracteres alfanuméricos y demás caracteres de la codificación ASCII o UTF-8. Los strings en Python se definen entre comillas simples (‘ ‘) o dobles (“ “). También se pueden definir entre comillas triples (‘’’ ‘’’) cuando se tengan múltiples líneas. Por ejemplo: >>> 'Hola' 'Hola' >>> b = "Casa de madera" >>> type(b) >>> type(15) >>> type('15') 29 Capítulo 2. Introducción a la programación Los textos ‘Hola’ o “Casa de madera” son de tipo string en general en todos los lenguajes. El valor 15 es un número de tipo entero (int). Sin embargo, el valor ‘15’ es un string (str). El hecho de incluir comillas dobles (“) o simples (‘) dentro de un string puede dar resultados erróneos cuando estos caracteres se usan para delimitar el string. Se puede emplear dentro del texto aquel carácter que no se ha usado de delimitador: >>> 'Ella dijo "Qué lindo"' 'Ella dijo "Qué lindo"' >>> "He doesn't know" "He doesn't know" Sin embargo, en estos casos también se puede usar el carácter de la barra invertida (\), que sirve de escape para agregar comillas u otras acciones dentro del string: >>> print('He doesn\'t know I \"will come\"') He doesn't know I "will come" El carácter de la barra invertida (o carácter de escape) seguido de n (\n) indica salto a nueva línea. Se pueden incluir múltiples líneas en un string usando triples comillas (‘’’ ‘’’). En este caso, los fines de línea están incluidos. Los saltos a nueva línea se aprecian cuando se presentan en pantalla con la función interna print( ): >>> print('Cambiamos de línea \nNueva línea') Cambiamos de línea Nueva línea >>> """ Programa: Autor: Fecha: """ '\n Programa:\n Autor:\n Fecha:\n ' 2.1.2. Variables y acción de asignación En matemáticas, las variables se usan para representar valores numéricos. Se utiliza un carácter o texto para representarlas. En cálculo matemático, una función del tipo y = f(x) involucra dos variables, x e y. 30 Fundamentos informáticos para la ingeniería En los lenguajes de programación, se requiere normalmente recordar o guardar los valores numé- ricos, booleanos o de texto para ser usados una o múltiples veces en el programa. Las variables tienen este cometido. En los lenguajes como FORTRAN, C/C++ o Pascal, una variable se consi- dera un contenedor o lugar dentro de la memoria RAM del computador, con un nombre asociado (identificador), donde se guarda un valor de un tipo determinado. Al usar programas informáticos, podemos quedarnos con este concepto. Sin embargo, en Python el concepto es algo diferente, pues las variables no son un lugar de memoria que contienen un valor sino que se asocian, o refieren, a un lugar de memoria que contiene ese valor. Los valores pueden ser enteros, reales, booleanos o compuestos. La acción de asignación se usa para darle a una variable un valor determinado. En Python la acción de asig- nación de valores a una variable quiere decir que la variable con su nombre determinado se va a asociar al valor de la derecha de la asignación: >>> a = 7 El símbolo = indica que el valor 7 se asigna a la variable a. El mismo símbolo se usa en C/C++ o FORTRAN, pero en Pascal se usa ‘:=’ como asignación. Sin embargo, lenguajes como R utilizan el signo ‘> id(7) 1449917120 >>> a = 7 >>> id(a) 1449917120 >>> b = 7 >>> id(b) 1449917120 >>> c = a >>> id(c) 1449917120 Así pues, 7, a, b y c son el mismo objeto y ocupan una posición única de memoria. En este caso, la posición 14499171202. La variable b, al asignarle el mismo valor (y objeto) 7, referenciará a la misma posición. Sucede lo mismo si le asignamos a la variable c la variable a; c referenciará a la misma posición de 7. Esto hace que Python maneje más eficientemente la memoria, pues en otros lenguajes se triplicaría el uso de esta, al tener tres varia- bles con el mismo valor. Pero ¿qué pasa si usamos el valor 7.0 en lugar de 7? >>> x = 7.0 >>> id(x) 1722264 >>> type(x) La variable x estará asociada al objeto 7.0, con identidad 1722264, de tipo float y valor 7.0. Así, los objetos de Python tienen tres características: valor, tipo e identidad. Como se ha comprobado, las variables no nece- sitan que sea declarado su tipo antes de ser usadas, como en Pascal o C. Pueden incluso cambiar de tipo a lo largo del programa. Para apreciar mejor el concepto de asignación en programación y diferenciarlo de la simetría del símbolo = en matemáticas, probemos: >>> 7.0 = x SyntaxError >>> x = x + 3 >>> x 10.0 2 Este valor es arbitrario. Se puede obtener cualquier otra posición de memoria. 32 Fundamentos informáticos para la ingeniería La instrucción “7.0 = x” es un error de sintaxis en programación, aunque es válida en matemáticas. En cambio, “x = x + 3” sería absurdo en matemáticas, pero en lenguajes de programación significa sumarle a la variable x el valor 3, y luego asignar el resultado de esa expresión a la misma variable x. Python permite asignaciones múltiples del tipo: >>> x, y, z = 7, 8.2, 9 La variable y es real de valor 8.2, x es entera de valor 7 y z es entera de valor 9. A la derecha de la asignación se ha escrito un dato compuesto, una tupla en Python, que se asigna a la tupla formada por las tres variables. Las tuplas y este tipo de asignación se verán con más detalle en la sección “2.3.1. Datos estructurados inmu- tables”. Identificadores y palabras reservadas El nombre de una variable se llama identificador. Sin embargo, los nombres de otros elementos de los programas, como funciones, clases, librerías también son identificadores. Los identificadores en programa- ción pueden contener letras y números, pero deben empezar siempre con una letra o el carácter de guion bajo (_). Aunque los matemáticos suelen usar nombres con una sola letra para las variables, en programación muchas veces es preferible utilizar identificadores con nombres que se asocien con su significado, como, area, volumen, lead_III, lado2. Hay que destacar también que en la mayoría de los lenguajes, incluyendo Python, los identificadores son sensibles al tipo de letra minúscula o mayúscula3. Es decir, n y N son variables diferentes. En los lenguajes de programación hay un grupo de palabras reservadas de operaciones, instrucciones y funciones internas que no pueden usarse como identificadores. Se puede imprimir desde el Shell de Python la lista de palabras reservadas en este lenguaje, llamadas keywords: >>> help("keywords") False def if raise None del import return True elif in try and else is while as except lambda with assert finally nonlocal yield break for not class from or continue global pass 3 Python permite identificadores con vocales acentuadas, como área. De todos modos, esta práctica no es recomendable por si se cambia de lenguaje de programación. 33 Capítulo 2. Introducción a la programación Hay que tener cuidado también con las funciones internas o predefinidas del lenguaje (built-in functions). Si identificamos una variable con el nombre de una función predefinida, esta luego no podrá ser llamada, pues su identificador se ha sobrescrito con la variable. Por ejemplo, hemos usado las funciones type para saber el tipo de dato usado. Si identificamos una variable con el nombre type, perdemos esta función en el programa: >>> type(15) >>> type = "Hola" >>> type(15) Traceback (most recent call last): File "", line 1, in type(15) TypeError: 'str' object is not callable Enlace de interés La lista actual de funciones internas puede consultarse en la siguiente página web: https://docs.python.org/3.3/library/functions.html 2.1.3. Expresiones e instrucciones Las expresiones son el mecanismo para hacer cálculos. Se componen de combinaciones de valores e identificadores con operadores. Pueden incluir variables, datos, operadores, paréntesis y funciones que devuelven resultados. Toda expresión tiene un valor, que es el resultado de evaluarla de izquierda a derecha, tomando en cuenta las precedencias. Ejemplos de expresiones: >>> 1.5*3/2 2.25 >>> 1.2*x + 3 # El valor de x del ejemplo anterior es 10.0 15.0 >>> 3 > (3.1 + 2)/3 True Las instrucciones son las unidades básicas de los programas (llamados también, en el argot de los progra- madores, códigos) que produce una acción, como asignar un valor a una variable, mostrar un resultado, etc. El intérprete de Python ejecuta cada instrucción produciendo la acción dada: >>> y = x/2 + 3 >>> 1.5*3/2 >>> print(y) 2.25 8.0 >>> print(_) 2.25 34 Fundamentos informáticos para la ingeniería La primera instrucción del cuadro de la izquierda calcula la expresión “x/2 + 3”, y asigna el resultado a la variable y. La segunda instrucción muestra el valor de y. Sin embargo, el resultado de la expresión del cuadro de la derecha, “1.5*3/2”, cuyo cálculo no es asignado a ninguna variable, se guarda asociado a una variable llamada ‘_’. 2.1.4. Operadores Los operadores son los símbolos que representan las acciones de cálculo. Además de las operaciones clásicas matemáticas, en programación se utilizan operadores lógicos y de relación o comparación. Los operadores se pueden clasificar en 3 tipos: operadores aritméticos, operadores lógicos o booleanos y operadores relacionales. Operadores aritméticos En Python estos son los operadores de cálculo matemático: Tabla 3 Operadores aritméticos en Python Operación Operador Expresión Resultado tipo Suma + a+b Entero si a y b enteros; real si alguno es real. Resta - a-b Entero si a y b enteros; real si alguno es real. Multiplicación * a*b Entero si a y b enteros; real si alguno es real. División, a÷b (real) / a/b Siempre es real. División (entera) // a // b Devuelve la parte entera del cociente a : b. Módulo (resto) % a%b Devuelve el resto de la división a : b. Exponenciación, ab ** a**b Entero si a y b enteros; real si alguno es real. Veamos algunos ejemplos: >>> 14/4 # División real 3.5 >>> 14//4 # División, devuelve parte entera de dividir 14 entre 4 3 >>> 14%4 # Módulo, devuelve el resto de dividir 14 entre 4 2 Se pueden incluir entre los operadores aritméticos los que operan sobre un solo operando, llamados unarios: operador cambio de signo (–) y operador identidad (+). Por ejemplo, –4, +4, y --4 equivalen a 4. 35 Capítulo 2. Introducción a la programación Operadores aritméticos con asignaciones La acción de incrementar el valor de una variable es muy común en programas informáticos. Por ejemplo, en un contador de eventos, el contador c se incrementa en 1. >>> c = c + 1 # la variable c se incrementa en 1 >>> d = d - 1 # la variable d se decrementa en 1 Python incluye instrucciones que compactan el operador de asignación con cualquier operador aritmético. En los casos de incremento o decremento de una variable tenemos: >>> c += 1 # equivale a: c = c + 1 >>> x += 0.01 # equivale a: x = x + 0.01 >>> d -= 2 # equivale a: d = d – 2 Los demás operadores aritméticos (*, /, //, %, **) también pueden usarse en esta forma compactada. Pueden incluirse también expresiones como incremento u otra operación. Por ejemplo: >>> y *= d+1 # equivale a: y = y * (d+1) >>> n = 7 >>> n //= 2 # equivale a: n = n // 2 >>> n 3 >>> n **= 2 # equivale a: n = n**2 >>> n 9 Operadores lógicos Los operadores lógicos o booleanos operan sobre tipos de datos booleanos. Estas operaciones son y lógico o conjunción, o lógico o disyunción sobre dos operandos, y la negación, que es un operador unario. En Python las palabras reservadas para estas operaciones son and, or y not, respectivamente. Recordamos que los valores lógicos en Python son True y False para los valores cierto (1 lógico) y falso (0 lógico), respec- tivamente. 36 Fundamentos informáticos para la ingeniería En la siguiente tabla de verdad se muestra el resultado de las operaciones lógicas (True equivale a 1, False a 0): Tabla 4 Tablas de verdad con operadores lógicos. Izquierda: con valores lógicos en Python. Derecha: con valores lógicos 0 (falso) o 1 (cierto) A B A or B A and B not A A B A or B A and B not A False False False False True 0 0 0 0 1 False True True False True equivale a 0 1 1 0 1 True False True False False 1 0 1 0 0 True True True True False 1 1 1 1 0 Veamos un ejemplo: >>> A = True >>> type(A) >>> B = False >>> A or B True En el siguiente cuadro se resumen algunas leyes lógicas de utilidad para tratar expresiones booleanas. Se pueden demostrar usando la tabla de verdad de cada lado de la igualdad. not not A = A A and True = A A and False = False A or False = A A or True = True not (not A and not B) = AoB not (not A or not b) = AyB Python y otros lenguajes como C++ incluyen operadores lógicos sobre números binarios, realizados bit a bit. Estos operadores de bits (bitwise operators en inglés) realizan las operaciones lógicas sobre los bits del número binario equivalente al número decimal introducido. 37 Capítulo 2. Introducción a la programación Por ejemplo, 5)10 equivale a 101 y 6)10 es 110. Si realizamos un y lógico bit a bit, tendremos el binario 100, que equivale a 4)10. A nivel de lenguaje de máquina, se usa también el operador or exclusivo (xor), que devuelve 1 cuando solo uno de los operandos es 1. En Python, como en C++, los operadores de bits son los siguientes: Tabla 5 Operadores lógicos bit a bit sobre números binarios Operación de bits Operador Expresión Resultado y lógico, and & 5&6 101 and 110 -> 100, 4 decimal. o lógico, or | 5|6 101 or 110 -> 111, 7 decimal. o exclusivo, xor ^ 5^6 101 xor 110 -> 011, 3 decimal. Cambia 0 por 1 y 1 por 0. Complemento, not ~ ~x Equivale a “-x -1”. Devuelve x con los bits desplazados Desplazamiento izquierda x >> n n lugares a la derecha. Equivale a derecha “x//2**n”. Enlace de interés Para más información sobre los bitwise operators, recomendamos consultar este enlace: https://wiki.python.org/moin/BitwiseOperators Operadores relacionales Se usan para comparar dos expresiones o valores. El resultado es siempre cierto o falso, es decir, booleano. Tabla 6 Operadores relacionales (de comparación) en matemáticas y su equivalencia en Python Operadores Relacionales Matemáticas En Python Significado Ejemplo Resultado = == Igual a 'a ' == ' b ' False ≠ != Distinto a ' b ' != ' B ' True < < Menor que 7 > Mayor que 7>3 True ≤ = 3 True ≥ >= Mayor o igual que 7 >> temp = 38 # temperatura medida >>> (temp >= 37) and (temp = 37) and (temp >> car = 'q' >>> (car >= 'a') and (car = 'A') and (car >> # Equivale a >>> 'a' >> 'a' > True > False True 39 Capítulo 2. Introducción a la programación Orden de las operaciones Para resolver expresiones con múltiples operadores, incluyendo diferentes tipos de operadores, aritmético, booleano o relacional, se debe seguir un orden de prioridad para realizar primero una operación y luego otra. En caso de duda, o para mejorar la legibilidad del programa, es recomendable que se usen paréntesis. El orden de prioridad o precedencias es diferente según el tipo de lenguaje de programación. En Python las precedencias son similares a C++ y Matlab. La máxima prioridad la tiene la realización de las expresiones entre paréntesis. Luego, vienen la exponencia- ción y las operaciones unarias. Después siguen las operaciones aritméticas, tras las cuales va la convención matemática, en la que se priorizan la multiplicación y la división sobre la suma y la resta. Se suele usar el acrónimo PEMDAS (paréntesis, exponenciación, multiplicación y división, adición y sustracción). Después de las aritméticas siguen las operaciones relacionales y, por último, las booleanas, pero con prioridad para la negación, luego and y, por último, or. Los operadores exponenciación y unarios (identidad, cambio de signo y negación lógica) se asocian con el operando de la derecha. El resto de operadores se asocian primero con el operando de la izquierda. Las expresiones con operadores de igual precedencia se ejecutan de izquierda a derecha, exceptuando la expo- nenciación, que va de derecha a izquierda. Por ejemplo, para la expresión “7/2*3”, se calcula primero la división 7 entre 2, cuyo resultado se multiplica por 3. El resultado es 10.5. Si se quiere dividir entre el producto 2*3, hay que encerrarlos entre paréntesis: “7/ (2*3)”. La asociación por la derecha de la exponenciación se puede ver en la siguiente expresión: “2**4**2 y (2**4)**2”. >>> 2**4**2 65536 >>> (2**4)**2 256 La tabla siguiente muestra el orden de precedencia en Python: Tabla 7 Precedencia o prioridad de las operaciones en Python Operador Precedencia () Mayor ** | +x, -x (identidad, cambio de signo) | *, /, //, % | +, - | ==, !=, , = | not | and v or Menor 40 Fundamentos informáticos para la ingeniería Operaciones con texto (strings) Los textos o cadena de caracteres (strings) no pueden operarse matemáticamente. Sin embargo, el operador ‘+’ sí que realiza la interesante acción de concatenar dos strings. Esta acción será útil para guardar información numérica en un string, convirtiendo previamente los números enteros o reales a string. Luego, el string puede ser escrito en pantalla o simplemente guardado en una variable. También el operador ‘*’ realiza la repetición del string tantas veces como el número dado. Veamos varios ejemplos: >>> '40' + '8' '408' >>> Name = 'Luis' >>> Apellido = 'Garcia' >>> Name + ' ' + Apellido 'Luis Garcia' >>> 'Ven'*4 # equivale a 'Ven'+'Ven'+'Ven'+'Ven' 'VenVenVenVen' >>> 10*'-' '----------' 2.1.5. Acciones elementales Los procesos en los programas informáticos incluyen acciones de entrada de información, de cálculo o procesamiento de información y, finalmente, de salida de datos. Hemos introducido ya una de las acciones elementales de los procesos informáticos, la asignación de valores a las variables. Las otras acciones elementales incluyen la lectura de información para ser procesada a través de variables por el programa y la escritura de datos en pantalla para mostrar los resultados de estos procesos. Otras formas de entrada y salida de datos se hacen a través de lectura y escritura de ficheros que se guardan en memoria externa al procesador central, ya sea en medios magnéticos, como discos duros o electrónicos de estado sólido, como las memorias flash. Lectura de datos La lectura de información numérica booleana o de texto se realiza desde el teclado del ordenador a través de funciones internas de los lenguajes de programación. En Pascal y C se usan las funciones read y scanf, respectivamente. En Python se utiliza la función interna input(). Esta función utiliza un mensaje de texto para indicar al usuario del programa qué tiene que introducir. Lo que se teclea y se introduce al programa, que se suele asignar a una variable, es un valor de tipo string. Así pues, hay que tener en cuenta que, si los datos son numéricos, habrá que convertirlos de string a enteros (int) o a reales (float). Asimismo, si el valor es booleano, habrá que convertirlo a tipo de dato booleano (bool). 41 Capítulo 2. Introducción a la programación Veamos varios ejemplos de distintos tipos de información, leídos del teclado a través del Shell de Python: >>> Nombre = input('Cómo te llamas? ') Cómo te llamas? José >>> type(Nombre) >>> Edad = int(input('Introduce tu edad: ')) Introduce tu edad: 21 >>> type(Edad) >>> Altura = float(input('Cuánto mides? ')) Cuánto mides? 1.78 >>> type(Altura) Como se puede ver, las entradas de datos con la función input( ) hay que convertirlas a los tipos de datos numéricos adecuados en caso de que se requiera. Conversión entre tipos de datos Así como la función interna type( ) devuelve el tipo de dato del valor o variable introducida, se pueden convertir datos de un tipo a otro, aunque con ciertas restricciones. La función interna float( ) devuelve el número real del dato en formato string o entero que entre a la función. Veamos algunos ejemplos: >>> float('123') 123.0 >>> float(Edad) # Variable Edad de tipo int del ejemplo anterior 21.0 >>> float('abc') Traceback (most recent call last): File "", line 1, in float('abc') ValueError: could not convert string to float: 'abc' 42 Fundamentos informáticos para la ingeniería La función int() convierte un string (que sea un número en formato texto) o un real a entero. En caso de un real, la función lo redondea a 0. Veamos algunos ejemplos: >>> int('123') 123 >>> int(27.8) 27 >>> int(-24.9) -24 La función bin( ) representa (en un string) un entero a su equivalente en binario. La función str() convierte un número a formato string. Veamos algunos ejemplos: >>> bin(255) '0b11111111' >>> bin(256) '0b100000000' >>> str(254) '254' >>> str(1/3) '0.3333333333333333' Escritura de datos La escritura consiste en mostrar valores de texto, numéricos o booleanos, así como resultados de expre- siones o de variables al usuario del programa. Así como en Pascal o C se usan funciones internas llamadas write, writeln o printf, en Python la función interna es print, que ya ha sido utilizada en varios ejemplos ante- riores. La función print( ) permite mostrar valores de variables (de cualquier tipo) o expresiones, texto en formato string o combinaciones de todas ellas. Alternativamente, en un string se pueden concatenar datos numé- ricos luego de ser convertidos a string con la función interna str( ). Por ejemplo: >>> a = 3.5 >>> b = 15 >>> print('El producto de', a , 'por', b , 'es', a*b) El producto de 3.5 por 15 es 52.5 >>> print('El producto de '+str(a)+' por '+str(b)+' es '+str(a*b)) El producto de 3.5 por 15 es 52.5 43 Capítulo 2. Introducción a la programación La función print escribe como string todo su argumento (entrada), que puede ser una secuencia de expre- siones separadas por coma. En el primer print del ejemplo anterior se separa (por omisión) cada elemento entre las comas por un espacio en blanco. Se puede advertir que se combinan strings enteros y reales, pero todo es convertido a una representación de texto. Al finalizar el print, se avanza a una nueva línea. De hecho, se puede usar print() como avance a nueva línea. Existen parámetros de la función print( ) que indican cómo terminar la escritura (end) y cómo separar (sep) los elementos del argumento de la función. Cuando se quiera terminar la función print sin que salte a una nueva línea, y un nuevo print continúe en la misma línea, se agrega al final el argumento end=’’ (comillas simples sin espacio entre ellas). Cuando no se usa el end, se utiliza el valor por omisión de salto a nueva línea, que sería end=›\n’. En lugar de separar las secuencias por espacios en blanco, se puede omitir la separa- ción (sep=’’) o colocar el string que se quiera como símbolo separador. El ejemplo de la Figura 11 muestra un programa en su código fuente con diversas opciones del uso de print. Figura 11. Captura de pantalla del editor de Python con varias opciones de la función print(). A continuación se muestra un panel con el resultado de las instrucciones print() de la Figura 11 sobre el Shell: Qué! A B C A,B,C ABC 10:27:59 10----27----59 >>> El formateo clásico de strings usado en muchos lenguajes, como el printf, para mostrar, por ejemplo, datos numéricos con un número de decimales especificados o un ancho determinado, se puede hacer en Python con el viejo estilo de printf dentro del print( ) o con el método de str.format( ). La descripción de este formato escapa al alcance de este manual. El lector interesado puede consultar a Klein (2016). 44 Fundamentos informáticos para la ingeniería Comentarios El lector habrá observado el uso del símbolo # para comentar instrucciones o partes del programa. Los programas largos o incluso cualquier programa realizado algún tiempo atrás pueden ser complicados de seguir. Es una buena opción comentar en lenguaje natural lo que las instrucciones del programa están haciendo. """ Created on Mon Jan 4 23:59:52 2016 @author: gomis """ # Cálculo de la frecuencia cardíaca RR = 0.875 # Intervalo R-R en segundos freq = 1/RR*60 # Frecuencia en pulsaciones por minuto Figura 12. Captura de pantalla del editor de Python usando comentarios. En el ejemplo de la Figura 12 se ha incluido un string con comillas triples como encabezado del programa. Algunos entornos de desarrollo de programas en Python, como el Spyder de Winpython (http://winpython. github.io/), incluyen de manera automática este encabezado de inicio en el editor de programas. Enlace de interés Para más información sobre el Spyder de Winpython, recomendamos consultar su página web: http://winpython.github.io 2.2. Estructuras algorítmicas Desde la introducción de los primeros computadores digitales con programas almacenados, siguiendo las ideas pioneras de Turing y la arquitectura de Von Newman, se desarrollaron programas muy complejos para cálculo en ingeniería o para aplicaciones administrativas, que eran difíciles de seguir o depurar. Muchos lenguajes de programación incluían la acción go to, que llevaba la secuencia de ejecución del programa de un punto a otro, adelante y atrás, lo cual hacía difícil su seguimiento. A finales de la década de 1960 surgió el paradigma de la programación estructurada, basado en las ideas de Böhm y Jacopini (1966) y las notas publicadas por Dijkstra (1968 y 1969). La programación estructurada contempla el uso de estructuras o composiciones secuenciales, de selec- ción o alternativas e iterativas, con las que se puede resolver cualquier función computable, es decir, siguiendo la tesis de Turing, cualquier función o algoritmo que pueda ser calculado por un computador. La programación estructurada produce códigos o programas más fáciles de leer, depurar y actualizar. También propicia el uso de módulos y subprogramas reutilizables y que el programa sea más manejable. 45 Capítulo 2. Introducción a la programación Los subprogramas se refieren a las funciones en los diversos lenguajes de programación, incluyendo Python. Hay funciones internas, como algunas de las ya usadas, o diseñadas por el programador. En otros lenguajes de programación, como Pascal y ADA, también incorporan los procedimientos (procedures) como un subprograma que no devuelve resultado, sino que realiza una acción. El conjunto de instrucciones de las acciones elementales descritas previamente (asignación de valores o expresiones a variables, input, print, etc.) forman parte del código de los programas o subprogramas. Además, se añaden las estructuras o composiciones algorítmicas que comprenden secuencias, alternativas e iteraciones o bucles. 2.2.1. Estructura secuencial La estructura secuencial, llamada también composición secuencial, es la más simple en programación, pues se trata de una serie de accione