Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Este libro, que trata sobre el aprendizaje en el desarrollo con JavaScript, se dirige a los lectores que deseen adquirir las habilidades necesarias para dominar esta área, fundamental en los desarrollos Web. Es completamente esencial dominar el software existente que permite adquirir el conocimiento del lenguaje JavaScript, si desea conseguir el conocimiento suficiente dentro del sector específico relacionado con las tecnologías de la Web 2.0. Partiendo de la base de que el lector solo tiene conocimientos básicos de programación, el autor comenzia recordando y aportando conocimiento sobre algoritmia. A continuación, explica los conceptos principales del lenguaje JavaScript. Los diferentes conceptos, principios o funcionalidades, se descubren a través de ejemplos concretos, fácilmente reutilizables en otros desarrollos. En la medida en que el lenguaje JavaScript se integra con otras tecnologías Web (o lenguajes), como el inevitable HTML, las hojas de estilo CSS, los lenguajes orientados a la programación del lado servidor como PHP u otras herramientas como Ajax, este libro también le permitirá dar sus primeros pasos, adentrándose en estas diferentes tecnologías. El autor se apoya en ejemplos que siguen una progresión lógica a lo largo de los capítulos. Tiene a su disposición elementos adicionales que se pueden descargar desde esta página. Los capítulos del libro: Presentación del lenguaje JavaScript – Desarrollo a partir de algoritmos – Conceptos principales del lenguaje JavaScript – Procesamiento condicionado – Procesamiento iterativo bucles – Tablas – Procedimientos y funciones – Enfoque orientado a objetos en JavaScript – Principales objetos en JavaScript – Utilizar formularios para introducir datos – Modelo DOM – Exploración del flujo XML via DOM – Gestión de las cookies en JavaScript – Almacenamiento local de datos – Almacenamiento remoto: formato XML – Almacenamiento remoto: formato JSON – Geolocalización – Diseño HTML 5 CANVAS – Gráficos de gestión – Creación de documentos PDF – Creación de códigos QR Aprender a desarrollar con JavaScript Christian VIGOUROUX Christian VIGOUROUX es Doctor en la universidad de Rennes 1, en el área de componentes de gestión (IAE Instituto de Gestión de Rennes). Ahí enseña desde hace casi de 30 años informática de gestión, encargado principalmente de la enseñanza en Técnicas de Internet, Ingeniería de software e Informática decisional en el máster de Sistemas de información y control de gestión, que él dirige. Adicionalmente, desarrolla actividades de consultoría en grandes empresas, para la implantación de soluciones decisionales y la implantación de arquitecturas de software. - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5Mjdj4fPctWJ61IgLAA==-enidentnumber JavaScript, término que nos encontraremos muy a menudo en este libro con las siglas JS, es un lenguaje inventado por Brendan Eich en 1995, que sirve principalmente para programar procesamientos del lado "cliente" en los desarrollos Web. La primera versión de este lenguaje fue bautizado por LiveScript. El objetivo era proporcionar un lenguaje de script al navegador (browser) Netscape Navigator 2. Rápidamente, LiveScript fue renombrado por JavaScript, y una organización, el ECMA, se hizo responsable de los aspectos relativos a la estandarización. En paralelo, Microsoft desarrolló su propia solución de scripting para su navegador Internet Explorer. La programación del lado "cliente" de JavaScript permite añadir una cierta interactividad a las páginas Web. En particular, las páginas podrán reaccionar a las acciones del usuario, como la selección en una lista desplegable, la selección de una casilla de selección o un clic en un botón de un formulario. El código JavaScript, almacenado como archivos en un servidor Web, es accesible, a través del protocolo HTTP, por el navegador del puesto "cliente", usando una llamada del usuario a través de la introducción de una URL o con un clic en un enlace de hipertexto. El código JavaScript es no compilado y se interpreta por un motor dedicado, incorporado al navegador. El lenguaje JavaScript ha sufrido muchas evoluciones a lo largo del tiempo y se soporta prácticamente por todos los principales navegadores (Microsoft Internet Explorer, Mozilla Firefox, Opera, Safari, Google Chrome...), que están en los ordenadores, independientemente de su sistema operativo (diferentes versiones de Microsoft Windows, Unix, Linux, Mac OS X...). JavaScript se dejó de lado durante mucho tiempo porque tenía la reputación de ser difícil de depurar y tener comportamientos muy diferentes entre un navegador y otro. Se han añadido muchas mejoras a lo largo de las versiones (JavaScript 2.0 actualmente). Puede encontrar la descripción completa de las novedades de JavaScript en el sitio web de Mozilla (https://developer.mozilla.org/es/docs/Web/JavaScript). Para terminar, JavaScript ha recuperado su esplendor con la aparición de muchas librerías de calidad y frameworks (Ajax, jQuery, Dojo...). Por tanto, JavaScript es una piedra angular en los desarrollos de la "Web 2.0". También mencionamos la confusión de los desarrolladores principiantes entre JavaScript y Java. No hay que confundir Java y JavaScript. JavaScript es un lenguaje de programación de scripts desarrollado por Netscape Communications, mientras que Java es un lenguaje de programación informático orientado a objetos, creado por James Gosling y Patrick Naughton, empleados de Sun Microsystems. La sintaxis de los dos lenguajes es parecida, porque derivan los dos del C++. Comparativo Java/JavaScript: Definición e histórico rápido Java JavaScript Autor Desarrollado por Sun Microsystems Desarrollado por Netscape Communications Formato Compilado como de bytecode Interpretado Almacenamiento Applet descargado como un elemento de la página Web Código insertado en la página Web Uso Se usa para desarrollar todo tipo de aplicaciones Se usa únicamente para "dinamizar" las páginas Web Ejecución Se ejecuta en la JVM (Java Virtual Machine) del navegador Se ejecuta por el navegador - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5Mjdj4ad3wWJ61IgLAA==-enidentnumber https://developer.mozilla.org/es/docs/Web/JavaScript Programación orientada a objetos (POO) Orientado a objetos Manipula objetos pero no permite definirlos Tipado Fuertemente tipado Sin control de tipo - 2 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5Mjdj4ad3wWJ61IgLAA==-enidentnumber Muy a menudo, JavaScript se considera como un lenguaje muy accesible desde el punto de vista técnico. Evidentemente, en desarrollos sencillos los principiantes podrán hacer sus intentos demanera fácil. Además, existe una documentación importante sobre el tema (libros, sitios de Internet, foros, vídeos...). Por el contrario, para aplicaciones profesionales, ya no será posible conformarse con descargar scripts y adaptarlos para integrarlos en sus propias páginas HTML. Se deberá hacer una inversión real en formación y son necesarias competencias mínimas en desarrollo de software. De manera ideal, para controlar JavaScript en las mejores condiciones, hay que tener algunos conocimientos de algoritmia, haber desarrollado previamente en un lenguaje de scripting o incluso, mejor, en un lenguaje evolucionado como C++ o Java. Este libro, accesible para los principiantes en desarrollo Web y en JavaScript en particular, repasará muchos requisitos previos indispensables, en concreto de algoritmia (enfoque procedimental inicial) y del lenguaje HTML (sin hacer un estudio exhaustivo), antes de abordar realmente JavaScript. Requisitos previos para un aprendizaje sencillo del lenguaje - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5Mjdj/TByxmJ61IgLAA==-enidentnumber Es frecuente oír que "el desarrollo Web no necesita muchas herramientas". En un primer enfoque, es cierto que para desarrollar páginas Web con lenguajes HTML y JavaScript es posible utilizar herramientas sencillas (y gratuitas). Un editor de texto como Notepad y un navegador pueden ser suficientes. Incluso no es obligatoria una conexión a Internet. Por el contrario, para desarrollos importantes, puede ser útil tener piezas de software más evolucionadas (gratuitas o de pago). Para elaborar sus scripts, puede utilizar editores de texto (gratuitos), que ofrecen prestaciones más completas (coloración sintáctica, gestión multiarchivo, completar automáticamente el código, acceso FTP integrado, soporte de múltiples lenguajes Web...). Por ejemplo, Notepad++ (http://notepadplusplus.org/) o Aptana Studio (http://www.aptana.com/products/studio3/download) pueden sustituir a Notepad. Kompozer (http://kompozer.net/) también es un software gratuito y puede ser una alternativa interesante. Se trata de un software clasificado dentro de la categoría de IDE (Integrated Development Environment). También existen muchos generadores de código o IDE gratuitos o de pago. El más conocido es Adobe Dreamweaver. Para que sirva de orientación, muchos ejemplos utilizados en este libro se han desarrollado con Aptana Studio 3.4.1. Herramientas necesarias Los principales ejemplos de este libro se pueden descargar libremente desde la página Información. Para facilitarle su uso, estos scripts están clasificados por capítulos. Se ha hecho un esfuerzo particular a nivel de la calidad de estos scripts (comentarios, indentación, nomenclatura de variables...) para facilitar su reutilización. - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjYejP1WJ61IgLAA==-enidentnumber http://notepad-plus-plus.org/ http://www.aptana.com/products/studio3/download http://kompozer.net/ Ubicamos también rápidamente el lenguaje JavaScript respecto a otros lenguajes o tecnologías habituales en los proyectos de desarrollo Web. Sepa que el código JavaScript se utiliza de manera aislada muy raramente. Las secuencias de código JavaScript son, la mayor parte de las veces, para animar los scripts HTML (HyperText Markup Language). Para decir las cosas de una manera más sencilla, en la visualización de páginas Web, el lenguaje HTML describe principalmente el contenido, mientras que el JavaScript, como se ha comentado anteriormente, gestiona la interactividad. Muy a menudo, el formateo de la información mostrada (secuencias de texto, tablas, imágenes...) no se asegura directamente con directivas (etiquetas) del lenguaje HTML, sino usando una tecnología adicional (sin duda, es exagerado hablar de lenguaje), el CSS (Cascading Style Sheets), también llamado "hojas de estilo en cascada". También es muy importante entender que el lenguaje JavaScript está orientado al lado "cliente". Por lo tanto, es inútil pedirle actuar en el lado "servidor". No puede acceder a las bases de datos almacenadas en el servidor y buscar datos almacenados en las tablas. Hay lenguajes adicionales, muy utilizados en los proyectos Web, como PHP, Microsoft ASP.NET e incluso Java, que tendrán precisamente este papel. Estos lenguajes, usando consultas SQL, preguntan a las bases de datos y un intérprete (software de lado "servidor") genera sobre la marcha el código HTML, que contiene la información leída de las tablas. Posteriormente se envía al navegador del puesto "cliente", usando el protocolo HTTP. Solo queda que el navegador descodifique (descifre) el código HTML (y JavaScript si es necesario) para conseguir una visualización sencilla consultable por un usuario humano. Posicionamiento de JavaScript respecto a otras tecnologías de desarrollo Web (HTML, CSS, PHP...) - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjwTXh2mJ61IgLAA==-enidentnumber Un algoritmo es la descripción de las operaciones necesarias para obtener un resultado a partir de valores de entrada: los "datos". Un programa es un algoritmo escrito en un lenguaje concreto. Volveremos sobre esto más adelante. Una receta de cocina se puede considerar como un algoritmo. Para que sirva de ejemplo, la fabricación de un pastel se basa en ingredientes (leche, mantequilla, harina, azúcar...) y se aplicará un procedimiento metódico (receta de la abuela) para utilizar estos ingredientes (mezcla, tiempo de cocción...). Habrá comprobado en su día a día que utilizamos algoritmos sin darnos cuenta realmente (recetas, noticias, planos de diseño, plantillas...). Volvamos sobre nuestro ejemplo de la receta de cocina. En su ausencia, es posible conseguir el plato con una sucesión de intentos (ensayos, tiempo de cocción aproximado). Evidentemente, esta forma de proceder (incluso si para algunos es satisfactoria) no es eficaz (se pierde tiempo y es un lío de ingredientes). La programación va a ser el medio de definir y especificar al ordenador el conjunto de operaciones necesarias para resolver un problema. Se trata de la traducción a un lenguaje comprensible por la máquina de las secuencias de acciones que se deben aplicar a los datos, en el marco de un procesamiento informático. Aquí también es posible hacer una comparación con los idiomas; un mismo ordenador puede entender (ejecutar) varios lenguajes informáticos (Pascal, C, C++, Java, ObjectiveC, JavaScript...). A partir de un algoritmo idéntico (una especie de modelo lógico), será posible traducirlo de varias maneras programáticas. En resumen, en el procesamiento de un problema, hay que distinguir dos fases principales: En este capítulo se exponen los principiosgenerales de la algoritmia y se pone el acento en la formulación de algoritmos en lenguaje descriptivo, en detrimento del lenguaje JavaScript, que se verá en detalle en los siguientes capítulos. Presentación de la noción de algoritmo l La búsqueda y redacción de una solución; un algoritmo (análisis del problema). l La expresión del algoritmo en un lenguaje de programación para su explotación en el ordenador (codificación). Para que sirva de ejemplo, esto es lo que dice la enciclopedia Wikipedia sobre este asunto: un algoritmo (del griego y latín, dixit algorithmus, y este a su vez del matemático persa AlJuarismi), es un conjunto prescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos, que no generen dudas a quien deba realizar dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos, se llega a un estado final y se obtiene una solución. Los algoritmos son el objeto de estudio de la algoritmia. - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjwU084GJ61IgLAA==-enidentnumber Un algoritmo manipula objetos sobre los que puede realizar acciones. Los objetos simples son: Para poder manipular estos objetos, hay operaciones disponibles. Estos objetos, así como las operaciones asociadas, se deben definir perfectamente. Analicemos los tres ejemplos siguientes, que son situaciones de intercambio entre un cliente y un vendedor. Ejemplo 1: Ejemplo 2: Ejemplo 3: En estos ejemplos, comprobamos la necesidad de: Se llama tipo a la asociación: Hay cuatro tipos básicos: entero, real, booleano y carácter. El tipo entero: Noción de variable 1. Presentación de las nociones de variable y tipo l números (3.14159, 1980, 9...), l caracteres ("A", "9"...) y cadenas de caracteres ("PAULINA"...), l valores booleanos o lógicos (verdadero o falso). l "Buenos días, quisiera 1 kg y 1 kg." l "??" l "Buenos días, señor, quisiera 1 kg de arroz y 1 kg de vino." l "Aquí está su kilo de arroz y ¿qué más quería?" l "Buenos días señor, quisiera 1 kg de arroz y 1 litro de vino." l "Le he puesto todo en esta bolsa." l citar la naturaleza de los objetos que vamos a manipular (arroz, vino...), l no utilizar estos objetos de cualquier manera (el arroz se pesa, el vino se bebe...) es decir, para cada naturaleza de objeto, hay operaciones particulares. l de una naturaleza de objeto (arroz, vino, o incluso enteros, reales...), l y las operaciones asociadas (pesar, lavar, cocinar el arroz, sumar, multiplicar enteros...). 2. Tipos básicos y operaciones asociadas - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIdKs5WJ61IgLAA==-enidentnumber El tipo real: El tipo booleano: Recordemos el funcionamiento de los operadores lógicos No, Y y O, con esta tabla resumen: En resumen: l Los valores son números enteros. l Notación: se utiliza la notación decimal (ejemplos: 365, 15). l Operaciones: adición, sustración, multiplicación, división entera, módulo (resto de la división entera), etc. l Los valores son números reales. l Notación: el punto anglosajón se sustituye por la coma (ej.: 124.89, 0.136, 1986). l Operaciones: las que se usan habitualmente con los números reales en aritmética. l Solo hay dos valores booleanos: verdadero o falso. l Notación: Verdadero y Falso. l Operaciones: se utilizan los operadores lógicos usuales (No, O e Y). A No A Verdadero Falso Falso Verdadero A B A O B Verdadero Falso Verdadero Falso Verdadero Verdadero Falso Falso Falso Verdadero Verdadero Verdadero A B A Y B Verdadero Falso Falso Falso Verdadero Falso Falso Falso Falso Verdadero Verdadero Verdadero l El contrario de Falso es Verdadero e inversamente (cf. tabla de No). l Con el O lógico, es suficiente con que uno de los operandos (A, B) sea Verdadero para que el resultado A O B sea Verdadero (cf. tabla de O). l Con el Y lógico, los dos operandos (A, B) deben ser simultáneamente Verdadero para que el resultado A Y B sea Verdadero (cf. tabla del Y). 3. Interés de los tipos - 2 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIdKs5WJ61IgLAA==-enidentnumber Hagamos aquí un pequeño esfuerzo de abstracción, imaginando un lenguaje (de comunicación) basado exclusivamente en dos tipos. La definición de estos tipos (naturaleza de los objetos y operaciones asociadas) es cercana a la "vida real". Este lenguaje permitirá manipular los objetos de tipo "Sólido" y de tipo "Líquido". Caractericemos estos dos tipos como sigue: Sólido: Líquido: y escribimos un primer algoritmo: Hay dos ventajas que se perciben con el uso de tipos en nuestro "lenguaje": Sin realizar las acciones descritas en este algoritmo, vemos que la operación fundir vino es errónea, porque el vino es un objeto declarado de tipo Líquido y la operación fundir no está asociada a este tipo. La operación comer caucho es correcta, aunque el caucho sea indigesto. Beber sidra no es posible, porque la sidra no se ha citado como elemento de tipo Líquido. Para terminar, es inútil declarar el agua y el refresco, porque no se usan. La manera más habitual de manipular los objetos es hacerlos intervenir en cálculos. Para esto, se utilizan los operadores elementales sobre un operando (operadores unarios) o sobre dos operandos (operadores binarios). Una expresión es la asociación de operadores y operandos. Las reglas gobiernan el orden de evaluación de los diferentes términos de una expresión: l Naturaleza: materia con forma propia l Operaciones: fundir, comer l Naturaleza: materia que tiende a fluir l Operaciones: hervir, beber, vaciar Inicio Sólido: mantequilla, queso, caucho Líquido: aceite, agua, vino, refresco Beber aceite, fundir mantequilla, fundir vino, comer caucho, beber sidra, cocinar caucho Fin l Para describir objetos de la misma naturaleza, que admiten las mismas operaciones, es suficiente con describir el tipo una vez para todos y anunciar que tal o cual objeto es de tal o cual tipo. Las repeticiones se evitan. l El tipado (uso de tipos) proporciona un medio para detectar un determinado número de errores sin ejecutar el algoritmo, simplemente examinando las operaciones respecto al tipo anunciado. 4. Uso de variables en las expresiones l Una operación se evalúa inicialmente si su prioridad es más fuerte que la de las operaciones adyacentes (ejemplo: el - 3 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIdKs5WJ61IgLAA==-enidentnumberLa siguiente tabla lista los operadores que se usan en algoritmia, así como la prioridad existente entre estos operadores durante la evaluación de expresiones. Resulta evidente que prácticamente siempre estos operadores se encontrarán (con las mismas notaciones) en los lenguajes de programación. Volveremos más tarde en este libro sobre ellos, aplicados a JavaScript. El orden de los caracteres se rige por la tabla ASCII. En esta tabla, cada carácter ocupa una posición numérica; el 65 para la letra "A", el 97 para la letra "a", lo que hace pensar que "a" es más grande que "A". cálculo de 3+5/2 empieza por 5/2). l En caso de igualdad de prioridad, la evaluación tiene lugar de izquierda a derecha (ejemplo: 3+25 se evalúa empezando por 3+2). l Siempre podemos utilizar paréntesis para forzar el orden de evaluación (ejemplo: 3*(25) se evalúa empezando por 25). 5. Tabla resumen de los operadores Operador Notación Tipo de operandos Tipo de resultado + y unario Negación lógico + No Entero o Real Booleano El del operando Booleano Potencia ** Entero o Real Entero o Real Multiplicación División de reales Cociente de enteros Resta (módulo) * / Div Mod Entero o Real Real Entero Entero Entero o Real Real Entero Entero Adición Sustración + Entero o Real Entero o Real Entero o Real Entero o Real Comparaciones >, <, >=, <=, =, <> Cualquier tipo Booleano Y lógico Y Booleano Booleano O lógico O Booleano Booleano Los operadores se clasifican por orden de prioridad decreciente en esta tabla (el No es, por ejemplo, prioritario respecto al O). - 4 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIdKs5WJ61IgLAA==-enidentnumber Durante el análisis de un problema, a menudo tenemos que descomponer este en subproblemas, que se deben resolver en un orden secuencial concreto. Cada subproblema genera resultados que se pueden utilizar en los subproblemas que siguen. Por tanto, para poder manipular estos resultados, conviene asignarles un nombre. Esta nomenclatura se hace a través de un identificador. También se habla muy a menudo de variable en memoria. A cada variable en memoria, se le asocia las siguientes características: Estas características se precisan durante la declaración de la variable en memoria. Sintaxis de la declaración: Ejemplos: En lo sucesivo, se ha elegido nombrar a las variables en memoria en mayúsculas, para mejorar su legibilidad. Debe saber que hay muchos lenguajes de programación que son sensibles a la diferencia entre mayúsculas y minúsculas de las variables en memoria (una variable CANTIDAD es diferente de una variable Cantidad). Evidentemente, en programación (JavaScript en nuestro caso), se pueden proponer diferentes convenciones de nomenclatura. En JavaScript, para las variables en memoria (y las funciones), la convención comúnmente aceptada es el "camelCaps", es decir, que los nombres deben empezar sistemáticamente por una minúscula y después se insertan mayúsculas al inicio de cada palabra que aparece en el nombre de la variable. Por ejemplo, una variable como ACUMULADO_ANUAL (la convención en esta presentación de la algoritmia) se codificará como acumuladoAnual en JavaScript. Manipulación de las variables 1. Nomenclatura de las variables l su denominación, que se debe hacer con sentido (dos resultados diferentes se designan por identificadores diferentes), l su tipo (conjunto al que pertenece el valor que designa). Tipo IDENTIFICADOR Tipo es el tipo e IDENTIFICADOR es la denominación de la variable en memoria. Real PI Car SEPARADOR Bool TEST Ent NBMESES, NBDIAS Una vez que se define una variable en memoria, no se puede cambiar su tipo. Cualquier variable en memoria utilizada en un algoritmo se debe haber declarado con antelación. - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIbpnBmN61IgLAA==-enidentnumber La asignación consiste en almacenar e incluso imputar una expresión a una variable en memoria. La sintaxis que se mantiene en esta presentación de la algoritmia es: La asignación se representa con el símbolo "<" (y no con "=", que sirve para hacer comparaciones de igualdad). La expresión debe ser del mismo tipo que los valores designados por el identificador. Esta expresión se convierte en el nuevo valor, designado por IDENTIFICADOR. Para ilustrar las diferentes nociones descritas, en adelante se presentan ejemplos en este libro. Esto le permitirá descubrir los mecanismos de la algoritmia en cada situación. Después puede (también es el objetivo de esta presentación) escribir sus propios algoritmos para procesamientos que usted codificará finalmente en JavaScript. Enunciado Se le pide invertir el contenido de dos variables en memoria de tipo entero. La primera variable se llamará, por ejemplo, A y la segunda B. El valor inicial de A será, por ejemplo, 5, mientras que el de B será 3. Utilizando un algoritmo debe invertir los contenidos para que al final A contenga 3 y B, 5. Para que sirva de ejemplo, el contenido de las variables en memoria a lo largo del desarrollo del algoritmo será: Puede observar que, en este libro, muchos scripts JavaScript no usan la convención camelCaps. La elección ha sido no modificar los nombres de las variables en memoria de los algoritmos subyacentes. 2. Asignación IDENTIFICADOR < expresión Las convenciones que se mantienen aquí pueden ser diferentes de las que se usan en determinados lenguajes de programación. Para JavaScript, la asignación se representa con "=", mientras que la comparación en igualdad es "==". Lo ha entendido con este pequeño ejemplo, pero es necesario estar muy atento durante la codificación en programación. Tendremos la ocasión de volver sobre esta dificultad varias veces a lo largo de este libro. 3. Ejercicio n.°1: Inversión del contenido de dos variables en memoria Inicio Ent A, B, C A < 5 B < 3 C < A A < B B < C Fin l A < 5 (A contiene 5, B está vacío) l B < 3 (A contiene 5, B contiene 3) l C < A (A contiene 5, B contiene 3, C contiene 5) l A < B (A contiene 3, B contiene 3, C contiene 5) - 2 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIbpnBmN61IgLAA==-enidentnumber Terminamos con algunas reglas generales de formato y sintaxis: En el ejercicio anterior, la inversión del contenido de las dos variables A y B se hace sin dificultad. Por el contrario, el contenido de estas dos variables no se ha presentado en la pantalla (o en el visor). Es útil mostrar en pantalla el resultado de los procesamientos, al menos el resultado final. Esta visualización (o escritura) de los resultados se debe solicitar explícitamente. A nivel de algoritmia, se va a considerar que la escriturase hace después en una sucesión de líneas, sin indicación particular del formato de visualización (negrita, cursiva, fuente de caracteres específica...). El orden de escritura se realiza por la instrucción Escribir(e1, e2, ..., ei, ..., en), donde las "ei" pueden representar: Ejemplo n.°1: Ejemplo n.°2: Ejemplo n.°3: l B < C (A contiene 3, B contiene 5, C contiene 5) l Puede prever una línea en blanco (interlineado) entre las secciones principales de su algoritmo (declaraciones, inicializaciones, cálculos, visualización de resultados...) e incluso, por qué no, justo después de Inicio y antes de Fin. l Prevea un trazo vertical para relacionar la palabra clave Inicio con la palabra clave Fin. l Observe que las palabras clave aparecen en Negrita/Cursiva en las correcciones (inicial únicamente en mayúscula). l Los nombres de las variables estarán completamente en MAYÚSCULAS (contrario a las convenciones habituales en JavaScript). 4. Visualización de los resultados l una expresión, l una cadena de caracteres representada entre comillas, l el orden Alineación, que hace empezar la impresión en la línea siguiente. Escribir("El cuadrado de 4 es ", 4 * 4) provoca la impresión de: El cuadrado de 4 es 16 Escribir("La nota en español es ", 10 + 4, Alineación, "La nota en informática es ", (18 + 12) / 2) provoca la impresión de: La nota en español es 14 La nota en informática es 15 Escribir("La nota en español es ", 10 + 4) Escribir("La nota en informática es ", (18 + 12) / 2) provoca la impresión de: La nota en español es 14 La nota en informática es 15 - 3 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIbpnBmN61IgLAA==-enidentnumber Ejemplo n.°4: Ejemplo n.°5: Ejemplo n.°6: Enunciado Calcular (y mostrar en pantalla) la superficie de dos círculos de radios predeterminados (5,5 metros y 3,5 metros, por ejemplo), así como la diferencia entre estas dos superficies Corrección Real MAT, INFO MAT < 15 INFO < 13 Escribir("La media es ", (MAT + INFO) / 2) provoca la impresión de: La media es 14 Real MAT, INFO, MED MAT < 15 INFO < 13 MED < (MAT + INFO) / 2 Escribir("La media es ", MED) provoca la impresión de: La media es 14 En la gran mayoría de los lenguajes de programación, la instrucción de visualización de mensajes en pantalla no permite la presentación simultánea de una información alfanumérica y numérica. Por tanto, también convendría en la algoritmia integra esta restricción, usando la función Numero_a_cadena. En la mayor parte de las correcciones de ejercicios propuestos en este capítulo esta función no se ha utilizado. Real MAT, INFO MAT < 15 INFO < 13 Escribir("La media es ", Número_a_cadena((MAT + INFO) / 2)) provoca la impresión de: La media es 14 5. Ejercicio n.°2: Superficies de círculos Inicio Real RADIO1, RADIO2, PI, SUPERFICIE1, SUPERFICIE2, DIFERENCIA RADIO1 < 5.5 RADIO2 < 3.5 PI < 3.14 SUPERFICIE1 < PI * RADIO1 * RADIO1 SUPERFICIE2 < PI * RADIO2 * RADIO2 DIFERENCIA < SUPERFICIE1 SUPERFICIE2 - 4 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIbpnBmN61IgLAA==-enidentnumber Los algoritmos no tienen un interés general si, durante cada ejecución, proporcionan siempre el mismo resultado. Para acceder a los datos que el usuario ha introducido por el teclado (o se han leído de un archivo), a nivel de algoritmia tendremos una instrucción dedicada. La entrada de datos en el periférico de entrada se hará a través de la instrucción Leer. La entrada de datos por Leer se asignará a una variable en memoria (declarada con antelación). La instrucción Leer se deberá preceder obligatoriamente de un mensaje explicativo (Escribir("Su entrada de datos:") por ejemplo) para indicar al usuario la entrada de datos esperada. Ejemplo: NB: Co significa inicio de comentario Fco significa fin de comentario Enunciado Calcular y mostrar la superficie y el volumen de una esfera, cuyo valor del radio se introducirá por el teclado Corrección Escribir("Superficie 1 = ", SUPERFICIE1, Alineación, "Superficie 2 = ", SUPERFICIE2, Alineación, "Diferencia = ", DIFERENCIA) Fin 6. Introducción por el teclado Inicio Co Declaraciones Fco Car NOMBRE, APELLIDO Co Introducción del nombre por el teclado Fco Escribir("Nombre: ") NOMBRE < Leer Co Introducción del apellido por el teclado Fco Escribir("Apellido: ") APELLIDO < Leer Co Visualización de la pantalla para control Fco Escribir("La identidad es ", NOMBRE, " ", APELLIDO) Fin Los comentarios situados en un algoritmo (y en un programa informático) no juegan un papel efectivo. En el caso de un lenguaje de programación como JavaScript, serán ignorados por la máquina durante la ejecución del programa. Sin embargo, son necesarios, porque permiten al programador (o a terceras personas que deban intervenir posteriormente en el algoritmo o programa) entender más fácilmente el razonamiento codificado. Los comentarios se sitúan, como mínimo, al inicio de cada porción de código específico. 7. Ejercicio n.°3: Superficie y volumen de una esfera - 5 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIbpnBmN61IgLAA==-enidentnumber Inicio Co Declaraciones Fco Real PI, RADIO, SUPERFICIE, VOLUMEN Co Introducción del radio por el teclado Fco Escribir("Radio: ") RADIO < Leer Co Cálculos Fco PI < 3.14 SUPERFICIE < 4 * PI * RADIO * RADIO VOLUMEN < SUPERFICIE * RADIO / 3 Co Visualización de los resultados Fco Escribir("Radio de la esfera = ", RADIO, Alineación, "Superficie = ", SUPERFICIE, Alineación, "Volumen = ", VOLUMEN) Fin - 6 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIbpnBmN61IgLAA==-enidentnumber Una función predefinida es un "microprograma" autónomo, al que es posible pedir un procesamiento (un cálculo en general), pasando uno o varios argumentos. Una vez que el cálculo está asegurado, la función restituye un valor de retorno (la respuesta) al solicitante (secuencia de código que llama a la función). Esta noción seguramente le es familiar si, por ejemplo, ha utilizado funciones nativas en Microsoft Excel (SUMA, BUSCAR...). Veremos más tarde en esta presentación de la algoritmia (y también, sobre todo, en JavaScript) cómo desarrollar sus propias funciones. El objetivo aquí no es enumerar la lista de funciones habituales en algoritmia (además pueden variar de un autor a otro), sino mostrarle cómo se pueden usar. Se utilizará una presentación a través de ejemplos o ejercicios. EnunciadoEscribir un algoritmo que permita introducir por el teclado un nombre para mostrar el número de caracteres Complemento del ejercicio: Una función Longitud(variable_cadena) predefinida se utilizará para determinar el número de caracteres de la palabra. Correcciones E incluso: Funciones predefinidas 1. Ejercicio n.°4: Visualización de la longitud de un nombre Inicio Co Declaraciones Fco Car NOMBRE Co Introducción del nombre por el teclado Fco Escribir("Nombre:") NOMBRE < Leer Co Visualización del resultado Fco Escribir(NOMBRE, " contiene " , Longitud(NOMBRE), " carácter(es)") Fin Inicio Co Declaraciones Fco Car NOMBRE Ent NB_CAR Co Introducción del nombre por el teclado Fco Escribir("Nombre: ") NOMBRE < Leer Co Visualización del resultado Fco NB_CAR < Longitud(NOMBRE) Escribir(NOMBRE, " contiene " , NB_CAR, " carácter(es)") Fin 2. Ejercicio n.°5: Determinación de iniciales - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjkKhnFmN61IgLAA==-enidentnumber Enunciado Escribir un algoritmo que permita la extracción de las iniciales de una persona, cuyo apellido y nombre se introducirán por el teclado (ejemplo: AS para Ángel Sánchez) Complemento: se utilizará una función Sub_cadena(CADENA, POSICION_INICIO, [POSICION_FIN]) predefinida. En muchos lenguajes de programación, este tercer argumento (aquí POSICION_FIN) es, en realidad, un número de caracteres que se ha de extraer a partir de la posición POSICION_INICIO). En lo sucesivo, encontrará ejemplos concretos de la aplicación de la función Sub_cadena, así como de funciones adicionales (Izquierda, Derecha, Concatenar...). Corrección Un argumento de función que no es sistemáticamente necesario se indica por convención entre corchetes. En caso de la función Sub_cadena, si el tercer argumento no está, la extracción se hará a partir del carácter en posición POSICION_INICIO, hasta el final de la cadena de caracteres. Car NOMBRE, APELLIDO, INICIALES NOMBRE < "Ángel" Sub_cadena(NOMBRE, 1, 3) vale ”Áng" Izquierda(NOMBRE, 4) vale ”Ánge" Sub_cadena(NOMBRE, 3, 2) vale ”el" Sub_cadena(NOMBRE, 3) vale ”el" Sub_cadena(NOMBRE, Longitud(NOMBRE), Longitud(NOMBRE)) vale ”l" Sub_cadena(NOMBRE, Longitud(NOMBRE)) vale ”l" Sub_cadena(NOMBRE, Longitud(NOMBRE)1, Longitud(NOMBRE)) vale ”el" Derecha(NOMBRE, 2) vale ”gel" Izquierda(APELLIDO, 1) & Izquierda(NOMBRE, 1) vale ”SA" APELLIDO < "Sánchez" INICIALES < Sub_cadena(APELLIDO, 1, 1) & Sub_cadena(NOMBRE, 1, 1) vale ”SA" INICIALES < Concatenar(Sub_cadena(NOMBRE, 1, 1), Sub_cadena(APELLIDO, 1, 1)) vale ”AS" El ampersand (&) sirve para concatenar dos elementos de tipo carácter. Inicio Co Declaraciones Fco Car APELLIDO, NOMBRE, INICIAL_APELLIDO, INICIAL_NOMBRE Co Introducción del apellido Fco Escribir("Apellido: ") APELLIDO < Leer Co Introducción del nombre Fco Escribir("Nombre: ") NOMBRE < Leer Co Determinación de las iniciales Fco INICIAL_APELLIDO < Sub_cadena(APELLIDO, 1, 1) INICIAL_NOMBRE < Sub_cadena(NOMBRE, 1, 1) - 2 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjkKhnFmN61IgLAA==-enidentnumber E incluso: Co Visualización de las iniciales Fco Escribir(APELLIDO, " ", NOMBRE, " tiene como iniciales: ", INICIAL_APELLIDO, INICIAL_NOMBRE) Fin Inicio Co Declaraciones Fco Car APELLIDO, NOMBRE, INICIALES Co Introducción del apellido Fco Escribir("Apellido: ") APELLIDO < Leer Co Introducción del nombre Fco Escribir("Nombre: ") NOMBRE < Leer Co Visualización de las iniciales Fco INICIALES < Izquierda(APELLIDO, 1) & Izquierda(NOMBRE, 1) Escribir(APELLIDO, " ", NOMBRE, " tiene como iniciales: ", INICIALES) Fin - 3 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjkKhnFmN61IgLAA==-enidentnumber En muchas situaciones, las acciones solo se realizan si se cumplen determinadas condiciones: Cada una de estas opciones está condicionada por una expresión booleana que, mientras sea verdadera, implica la ejecución del procesamiento asociado. La sintaxis de la algoritmia para programar los procesamientos condicionados es sencilla: Algunas observaciones sobre esta estructura tan intuitiva: El organigrama de flujo correspondiente a esta estructura es el siguiente: Procesamientos condicionados l Una ecuación de segundo grado tiene 0, 1 o 2 soluciones reales, según sea el discriminante negativo, nulo o positivo. l Si una cantidad de artículos en stock baja de un determinado umbral, hay que hacer un pedido. l Si hace bueno, entonces vamos a la playa. En caso contrario hacemos algoritmia juntos. l Si no hace bueno, entonces hacemos algoritmia juntos. Si Condición Entonces T1 [En caso contrario T2] Finsi l Condición es una expresión con resultado booleano (Verdadero o Falso). l T1 y T2 son los procesamientos. l Finsi significa el fin del si. l Existe una forma simplificada, sin alternativa (sin En caso contrario T2). l Comprobar la condición se hace en una hipótesis de condición verdadera. l Dibujar un trazo vertical (a la izquierda) entre Si y Finsi será un medio mnemotécnico para no olvidar el Finsi. l Piense en indentar los procesamientos T1 y T2. - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5Mjdju4DmG2N61IgLAA==-enidentnumber En el ejemplo que se presenta a continuación, a una variable NBLU se le asigna un valor numérico introducido por el teclado y el algoritmo indica si se trata de un valor par o impar: Enunciado Calcular las raíces de un polinomio de segundo grado Ax2+Bx+C (con A<>0 aunque esta prueba no se hará aquí). Los valores A, B y C se introducirán por el teclado. Corrección Inicio Co Declaraciones Fco Ent NBLU Co Introducción por el teclado Fco Escribir("Número: ") NBLU < Leer Co Determinación de la parte Fco Si NBLU Mod2 = 0 Entonces Escribir(NBLU, " es par") En caso contrario Escribir(NBLU, " es impar") Finsi Fin 1. Ejercicio n.°6: Polinomio de segundo grado Inicio Co Declaraciones Fco Real A, B, C, DELTA - 2 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5Mjdju4DmG2N61IgLAA==-enidentnumber El interés de este ejercicio, además de que revise un poco las matemáticas, es mostrar que es posible anidar estructuras condicionales.La aplicación no es difícil, pero implica un mínimo de rigor, fundamentalmente no olvidar cerrar sus estructuras con un Finsi y también indentar (añadir un nivel de desplazamiento) los procesamientos, incluidos después de los Entonces y En caso contrario. Enunciado Imprimir en letras el mes correspondiente a un número dado por el teclado (comprendido entre 1 y 12). El control de la entrada de datos no se prevé. Corrección Co Introducción de los argumentos Fco Escribir("A: ") A < Leer Escribir("B: ") B < Leer Escribir("C: ") C < Leer Co Cálculo del discriminante Fco DELTA < (B * B) (4 * A * C) Co Determinación del número de raíces Fco Si DELTA < 0 Entonces Escribir("Sin soluciones") En caso contrario Si DELTA = 0 Entonces Escribir("Solución única = ", B / (2 * A)) En caso contrario Escribir("Dos raíces: ", (B+DELTA**0.5)/(2*A), " y ", (BDELTA**0.5)/(2*A)) Finsi Finsi Fin 2. Ejercicio n.°7: Etiqueta del mes sin cifrar Inicio Co Declaraciones Fco Ent MESES Co Introducción del número del mes Fco Escribir("Número del mes (1 a 12): ") MESES < Leer Co Visualización del resultado Fco Si MESES=1 Entonces Escribir("Enero") En caso contrario - 3 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5Mjdju4DmG2N61IgLAA==-enidentnumber Evidentemente, la solución propuesta es opuesta a su nivel de elaboración, pero desde el punto de vista técnico es óptima. Por ejemplo, la entrada de datos de la cifra 2 provocará la visualización correcta ("Febrero"). También habría sido posible "superponer" 12 pruebas sucesivas, como se indica a continuación. Esta solución es poco satisfactoria porque, independientemente del valor introducido por el teclado, se ejecutan las 12 pruebas. La estructura de control Siguiente ... Finsiguiente es una solución elegante para gestionar este tipo de problemática. La sintaxis es la siguiente: Si MESES=2 Entonces Escribir("Febrero") En caso contrario … Finsi Fin Inicio Co Declaraciones Fco Ent MESES Co Introducción del número del mes Fco Escribir("Número del mes (1 a 12): ") MESES < Leer Co Visualización del resultado Fco Si MESES=1 Entonces Escribir("Enero") Finsi Si MESES=2 Entonces Escribir("Febrero") Finsi … Si MESES=12 Entonces Escribir("Diciembre") Finsi Fin Siguiente VARIABLE/EXPRESION Valor_1: Accion_1 … Valor_n: Accion_n [Otrocaso: Acción por defecto] Finsiguiente - 4 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5Mjdju4DmG2N61IgLAA==-enidentnumber En el caso donde la variable VARIABLE (o la expresión EXPRESION) sea igual a Valor_1, el procesamiento Accion_1 se disparará (igual para Valor_2 con, en este caso, la ejecución de Accion_2 y así sucesivamente). En este ejercicio se muestra un mensaje de error dentro de Otrocaso. En contrapartida, será necesario que el usuario del algoritmo (o del programa) lo ejecute de nuevo porque, de momento, no se ha previsto ningún dispositivo para que se haga una nueva entrada de datos. En determinados lenguajes de programación, la implementación de la estructura Siguiente ... Finsiguiente es un poco particular. Después de detectar la condición verdadera, todas las acciones asociadas a las condiciones siguientes se ejecutan, ya sean estas condiciones verdaderas o falsas. En estos lenguajes, hay que prever la adición de una palabra clave particular que provoque la salida hacia Finsiguiente. La estructura Siguiente ... Finsiguiente (o su equivalente) no está implementada en todos los lenguajes de programación. 3. Ejercicio n.°8: Etiqueta del mes sin cifrar (Siguiente ... Finsiguiente) Inicio Co Declaraciones Fco Ent MESES Co Introducción del número del mes Fco Escribir("Número del mes (1 a 12): ") MESES < Leer Co Visualización del resultado Fco Siguiente MESES 1: Escribir("Enero") 2: Escribir("Febrero") ... 12: Escribir("Diciembre") Otrocaso: Escribir("Error de entrada de datos del n.° de mes") Finsiguiente Fin - 5 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5Mjdju4DmG2N61IgLAA==-enidentnumber En la mayor parte de los problemas, determinadas acciones se deben ejecutar varias veces. Cuando el número de repeticiones es grande, resulta pesado rescribir n veces la misma secuencia de código. Esta rescritura es imposible en el caso en que el número de repeticiones (iteraciones) es desconocido a priori (trazar un conjunto de datos hasta que no haya más). Es necesario poder expresar la repetición de una acción que, una vez inicializada, continuará hasta que se produzca un determinado evento. Este evento de parada se especificará en el algoritmo con una condición. Vamos a estudiar cuatro tipos de iteraciones (bucles), que tendrán su equivalente en los principales lenguajes de programación. Bucle "Mientras" con una comprobación inicial de iteración: Bucle "Hasta que" con una comprobación inicial de iteración: Bucle "Mientras" con una comprobación final de iteración: Bucle "Hasta que" con una comprobación final de iteración: Estos cuatro bucles tienen un determinado número de puntos en común: Estructuras iterativas 1. Concepto de iteraciones 2. Estructuras iterativas básicas Mientras Condición Hacer Acciones Volverhacer Hastaque Condición Hacer Acciones Volverhacer Hacer Acciones Mientras Condición Volverhacer Hacer Acciones Hastaque Condición Volverhacer l Hastaque es una abreviación para Hasta que l Mientras es una abreviación para Mientras - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjCdYpIWN61IgLAA==-enidentnumber Con las dos últimas iteraciones para las que se hace la comprobación del final de bucle, las Acciones se realizan al menos una vez. Los bucles "Mientras" y "Hasta que" tienen un funcionamiento muy parecido, en la medida en que es suficiente con invertir la condición para pasar de una sintaxis a otra. Por ejemplo, CONTADOR > 10 en el caso de un bucle "Mientras" se convertirá en CONTADOR <= 10 en caso de un bucle "Hasta que". El siguiente diagrama de flujo corresponde a las estructuras "Mientras" y "Hasta que" (con una comprobación inicial de iteración): En caso de un bucle Hastaque: En caso de un bucle Mientras: Enunciado Calcular y mostrar la media de 10 números que se introducirán por el teclado l Condición, es una expresión booleana de resultado Verdadero o Falso l Acciones representa una secuencia de acciones l la flecha que une "Condición" a "Acciones" corresponde al estado Falso de la Condición, l la flechaque une "Condición" a "Acciones siguientes" corresponde al estado Verdadero de la Condición. l la flecha que une "Condición" a "Acciones" corresponde al estado Verdadero de la Condición, l la flecha que une "Condición" a "Acciones siguientes" corresponde al estado Falso de la Condición. 3. Ejercicio n.°9: Media de 10 números - 2 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjCdYpIWN61IgLAA==-enidentnumber Corrección Enunciado Calcular y mostrar la media de n números reales que se introducirán por el teclado (lista terminada con un cero) Aprovechamos este enunciado un poco más complejo para mostrar que una misma problemática se puede resolver utilizando múltiples algoritmos. Corrección n.°1 Inicio Co Cálculo de la media de 10 números que se introducirán por el teclado Fco Co Declaraciones Fco Real NBLU, CPT, SUMA, MEDIA Co Inicializaciones Fco CPT < 1 SUMA < 0 Co Iteración Fco Mientras CPT < 11 Hacer Escribir("Número n.° ", CPT, ": ") NBLU < Leer SUMA < SUMA + NBLU CPT < CPT + 1 Volverhacer Co Visualización del resultado Fco MEDIA < SUMA / 10 Escribir("Media: ", MEDIA) Fin 4. Ejercicio n.°10: Media de una serie de n números Inicio Co Declaraciones Fco Real NBLU, CPT, SUMA, MEDIA Co Inicializaciones Fco CPT < 0 SUMA < 0 NBLU < 1 Co Para permitir pasar por la iteración, al menos una vez Fco Co Bucle de lectura Fco Hastaque NBLU = 0 Hacer Escribir("Número (0 para terminar): ") NBLU < Leer CPT < CPT +1 SUMA < SUMA + NBLU Volverhacer Co Visualización del resultado Fco MEDIA < SUMA / (CPT1) Escribir("Media de los ", CPT 1, "números = ", MEDIA) - 3 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjCdYpIWN61IgLAA==-enidentnumber En esta corrección, la entrada del número cero no provoca la salida inmediata del bucle. Por tanto, es necesario reducir el valor de la variable CPT (contador de la cantidad de números que se introducen por el teclado) en el cálculo de la media. También es necesario pensar en asignar un valor inicial a la variable NBLU (aquí 1) antes de la iteración, para que se pueda iniciar. Para terminar, con esta versión de corrección, se produciría un problema (división por cero) si el primer número introducido por el teclado es un 0. Corrección n.°2 En esta corrección, se ha utilizado un bucle Mientras con una comprobación final de bucle. Aquí no es necesario asignar un valor ficticio a la variable NBLU antes del bucle. Además, una estructura condicional después de la iteración permite evitar una posible división por 0. Corrección n.°3 Fin Inicio Co Declaraciones Fco Real NBLU, CPT, SUMA, MEDIA Co Inicializaciones Fco CPT < 0 SUMA < 0 Co Bucle de lectura Fco Hacer Escribir("Número (0 para terminar): ") NBLU < Leer CPT < CPT +1 SUMA < SUMA + NBLU Mientras NBLU <> 0 Volverhacer Co Visualización del resultado Fco Si CPT1=0 Entonces Escribir("No se ha introducido ninguna cifra ") En caso contrario MEDIA < SUMA / (CPT1) Escribir("Media de los ", CPT 1, "números = ", MEDIA) Finsi Fin Inicio Co Declaraciones Fco Real NBLU, CPT, SUMA, MEDIA Co Inicializaciones Fco CPT < 0 SUMA < 0 Co primera entrada de datos Fco Escribir("Número (0 para terminar): ") NBLU < Leer Co Bucle de lectura Fco - 4 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjCdYpIWN61IgLAA==-enidentnumber En esta corrección, se ha mantenido un bucle Mientras con una comprobación inicial de este. La particularidad es que se hace una primera entrada de datos por el teclado (variable NBLU) antes de la iteración, lo que obliga a continuación a prever la entrada de los números siguientes de la secuencia, al final de la iteración. El interés de esta solución es que el cero final no se tiene en cuenta en la variable CPT. Enunciado Calcular el MCD de dos números enteros leídos por el teclado (método de la división) El desarrollo del cálculo es la siguiente: Aprovechamos este enunciado para destacar que los bucles Mientras y Hastaque se pueden utilizar indistintamente en la resolución de los problemas iterativos; basta con invertir lógicamente la condición verificada. Es necesario observar que el bucle Mientras es sistemáticamente implementado en los lenguajes de programación (en general llamado While o Do While). El bucle Hastaque (que se traduciría por un Until o Do Until) no es, por el contrario, sistemáticamente implementado. Corrección n.°1 Mientras NBLU <> 0 Hacer CPT < CPT +1 SUMA < SUMA + NBLU Escribir("Número (0 para terminar): ") NBLU < Leer Volverhacer Co Visualización del resultado Fco Si CPT=0 Entonces Escribir("No se ha introducido ninguna cifra") En caso contrario MEDIA < SUMA / CPT Escribir("Media de los ", CPT, "números = ", MEDIA) Finsi Fin 5. Ejercicio n.°11: El común divisor más grande, por el método de las divisiones sucesivas l Introducir los números A y B por el teclado l Calcular el RESTO de la división entera de A por B l Cuando este RESTO es nulo, B es el MCD buscado l Sustituir A por B l Sustituir B por este RESTO l Empezar de nuevo a nivel del cálculo del RESTO Inicio Co Declaraciones Fco Ent A, B, RESTO - 5 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjCdYpIWN61IgLAA==-enidentnumber Corrección n.°2 Las estructuras iterativas Hastaque Hacer … Volverhacer y Mientras Hacer … Volverhacer se pueden sustituir por la estructura iterativa Para Hacer … Volverhacer cuando el número de iteraciones es conocido antes del inicio de la estructura y solo en este caso. Esta iteración, un poco confusa al inicio, tiene la particularidad de presentar un determinado automatismo respecto a la gestión del contador de iteraciones realizadas. Su sintaxis general es: Co Introducción de los dos números Fco Escribir("Primer número: ") A < Leer Escribir("Segundo número: ") B < Leer Co Bucle de procesamiento Fco RESTO < A Mod B Mientras RESTO <> 0 Hacer A < B B < RESTO RESTO < A Mod B Volverhacer Co Fin de procesamiento Fco Escribir("MCD = ", B) Fin Inicio Co Declaraciones Fco Ent A, B, RESTO Co Introducción de los dos números Fco Escribir("Primer número: ") A < Leer Escribir("Segundo número: ") B < Leer Co Bucle de procesamiento Fco RESTO < A Mod B Hastaque RESTO = 0 Hacer A < B B < RESTO RESTO < A Mod B Volverhacer Co Fin de procesamiento Fco Escribir("MCD = ", B) Fin 6. Estructura iterativa Para Para VARIABLE De EXPRESION_INICIO A EXPRESION_FIN [No EXPRESION_NO]Hacer - 6 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjCdYpIWN61IgLAA==-enidentnumber Veamos sus particularidades: Enunciado Calcular la media de 10 números que se introducirán por el teclado, con un bucle Para Corrección Acciones Volverhacer l VARIABLE es una variable entera, que se debe declarar al inicio del algoritmo. l EXPRESION_INICIO es una constante entera (por ejemplo, 1) o una variable entera, que se debe declarar al inicio del algoritmo e inicializar antes de la estructura iterativa. l EXPRESION_FIN es una constante entera (por ejemplo, 10) o una variable entera, que se debe declarar al inicio del algoritmo e inicializar antes de la estructura iterativa. l EXPRESION_NO es una constante entera (por ejemplo, 2) o una variable entera, que se debe declarar al inicio del algoritmo e inicializar antes de la estructura iterativa. Lo más habitual es que No EXPRESION_NO no se prevea en este tipo de iteración. l EXPRESION_NO puede ser negativo. En este caso, EXPRESION_INICIO debe ser > (o eventualmente =) a EXPRESION_FIN. l La estructura Para gestiona el incremento del contador del bucle (VARIABLE). Por tanto, no es conveniente intervenir sobre este contador en las Acciones, aunque no está prohibido. l En informática, un argumento opcional se representa como sigue: [argumento]. Cuando el argumento es obligatorio, los [] no se ponen. 7. Ejercicio n.°12: Cálculo de la media de 10 números Inicio Co Cálculo de la media de 10 números que se introducirán por el teclado Fco Co Declaraciones Fco Ent CPT Real NBLU, SUMA, MEDIA Co Inicializaciones Fco SUMA < 0 Co Iteración Fco Para CPT De 1 A 10 Hacer Escribir("Número n° ", CPT, ": ") NBLU < Leer SUMA < SUMA + NBLU Co NB: sobre todo, no hay que modificar el valor de la variable CPT en el bucle Fco Volverhacer Co Visualización del resultado Fco MEDIA < SUMA / 10 Escribir("Media: ", MEDIA) Co NB: Es necesario evitar dividir aquí la SUMA por CPT Fco Co en la medida en que en determinados lenguajes Fco Co CPT valdrá 11 en salida Fco - 7 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjCdYpIWN61IgLAA==-enidentnumber Como se indica en los comentarios en el algoritmo anterior, es mejor no utilizar directamente el valor de la variable CPT (que ha servido para contar los números que se introducen por el teclado) porque, según las variantes de implementación de los lenguajes de programación, CPT podría valer 10 u 11. Enunciado Contar el número de vocales de una palabra introducida por el teclado Recordatorio: se utilizará una función Longitud(CADENA) para determinar el número de caracteres de la palabra introducida. La función Sub_cadena(CADENA, POSICION_INICIO, [POSICION_FIN]) también será necesaria. Corrección Por la primera vez, vemos una estructura condicional (Siguiente ... Finsiguiente) integrada en una estructura iterativa (Para). Evidentemente, esta estructura condicional habría podido estar basada en un Si ... Finsi. Fin 8. Ejercicio n.°13: Deducir el número de vocales de una palabra Inicio Co Declaraciones Fco Car PALABRA Ent NB_VOCALES, CONTADOR Co Introducción de la palabra por el teclado Fco Escribir("Palabra: ") PALABRA < Leer Co Poner en mayúsculas la palabra Fco PALABRA < Mayúsculas(PALABRA) Co Inicialización de las variables Fco NB_VOCALES < 0 Co Determinación del número de vocales Fco Para CONTADOR De 1 ALongitud(PALABRA) Hacer Co Analizar la letra actual Fco Siguiente Sub_cadena (PALABRA, CONTADOR, CONTADOR) "A": NB_VOCALES < NB_VOCALES + 1 "E": NB_VOCALES < NB_VOCALES + 1 "I": NB_VOCALES < NB_VOCALES + 1 "O": NB_VOCALES < NB_VOCALES + 1 "U": NB_VOCALES < NB_VOCALES + 1 Finsiguiente Volverhacer Co Visualización del resultado Fco Escribir(PALABRA, "contiene: ", NB_VOCALES, " vocal(es)") Fin En función de la problemática que se ha de resolver, habrá comprobado que es necesario combinar lo mejor posible las estructuras condicionales (Si ... Finsi o Siguiente ... Finsiguiente) con las diferentes variantes de bucles (Mientras, Hastaque y Para) anidándolas, utilizándolas secuencialmente, etc. - 8 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjCdYpIWN61IgLAA==-enidentnumber - 9 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjCdYpIWN61IgLAA==-enidentnumber Una tabla agrupa varios valores del mismo tipo. Globalmente, podemos nombrar todos los valores o designar de manera precisa uno de ellos con una operación de scripting. Por ejemplo, consideremos ALFABETO como el conjunto de letras del alfabeto. En este caso: En un algoritmo, como sucede con las variables (simples) vistas hasta ahora, las tablas se deben declarar antes de poder utilizarlas. La sintaxis de declaración es: Observe que a nivel de esta declaración: La tabla ALFABETO mencionada anteriormente se podría declarar como sigue: Veamos ahora cómo utilizar este tipo de tabla (asignación de valores a las diferentes "celdas" y lectura de estos valores a continuación). La sintaxis es intuitiva: Observe a nivel del uso de las tablas: Tabla de dimensión única l ALFABETO designa una tabla que podrá servir para almacenar el conjunto de letras del alfabeto. l ALFABETO(14) podría representar la letra "N". l El entero 14 se llama índice. Tipo IDENTIFICADOR(INF: SUP) l IDENTIFICADOR es el nombre global de la tabla (nombre libremente elegido por el programador, en mayúsculas si es posible). l Tipo indica el tipo de los elementos de la tabla, y todos los elementos de la tabla tienen el mismo tipo (Entero, Real, Bool, Carácter). l INF y SUP son, respectivamente, los extremos inferior y superior del intervalo de variación del índice de la tabla. Una tabla como esta tiene N elementos, donde N = SUP INF + 1. l INF y SUP son constantes definidas con antelación (sin dimensionamiento "dinámico", aunque determinados lenguajes de programación lo permiten). l En determinados lenguajes de programación, el valor INF no se puede expresar. En este caso, el valor INF se considera implícitamente como 1 (algunas veces también 0). Cuando es posible, es mejor evitar el uso del índice con valor cero. Car ALFABETO(1:26) Car ALFABETO(0:25) > es un poco particular pero también muy usual. IDENTIFICADOR(ÍNDICE) l IDENTIFICADOR es el nombre de la tabla. l ÍNDICE es una expresión entera, cuyo valor debe pertenecer al intervalo (INF: SUP). l La notación IDENTIFICADOR(ÍNDICE) designa a un elemento de la tabla, identificado por su índice en la tabla. 1. Ejercicion.°14: Contar los números pares en una tabla - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjcFZXKmN61IgLAA==-enidentnumber Enunciado Determinación de la cantidad de números pares en una tabla (entrada de datos inicial a través del teclado). Corrección En el procesamiento de las tablas, es preferible el bucle Para porque el conjunto de las celdas se utiliza a menudo o se analiza. Inicio Co Determinación de la cantidad de números pares en una tabla Fco Co Declaraciones Fco Ent TB(1: 10) Ent NB_PARES Ent IND Co Inicializaciones Fco NB_PARES < 0 Co Carga de la tabla Fco Para IND De 1 A 10 Hacer Escribir("TB(", IND, "): ") TB(IND) < Leer Volverhacer Co Determinación de la cantidad de números pares Fco Para IND De 1 A 10 Hacer Si TB(IND) Mod 2 = 0 Entonces NB_PARES < NB_PARES + 1 Finsi Volverhacer Escribir("Cantidad de números pares de la tabla = ", NB_PARES) Fin - 2 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjcFZXKmN61IgLAA==-enidentnumber Cuando los elementos de una tabla son ellos mismos tablas, se habla de tabla de varias dimensiones. A nivel de la declaración de este tipo de tabla, hay que declarar los límites del índice para cada una de las dimensiones, lo que no es ya una sorpresa: Tipo IDENTIFICADOR(INF1: SUP1, ..., INFi: SUPi, ..., INFn: SUPn) Para acceder a las diferentes celdas de una tabla de varias dimensiones, hay que indicar un valor de índice para cada una de ellas. A modo de ejemplo, para una tabla de dos dimensiones (tabla de líneas divididas en columnas como una matriz 2D en Microsoft Excel), el primer índice normalmente designa el número de la línea y el segundo el número de la columna de la celda a la que se hace referencia. Por tanto, la sintaxis es: IDENTIFICADOR(ÍNDICE1, ..., ÍNDICEi, ..., ÍNDICEn) Enunciado Sea la tabla TB de dos dimensiones con cuatro líneas y cinco columnas. Realizar los siguientes procesamientos: Corrección Tabla con dimensiones múltiples 1. Ejercicio n.°15: Minihoja de cálculo l introducir por el teclado valores en las tres primeras líneas y las cuatro primeras columnas (se conserva la última línea y la última columna libres, para los totalizadores de líneas y columnas), l añadir las columnas de última línea y las líneas en última columna. Inicio Co Declaraciones de las variables Fco Ent TB(1: 4, 1: 5) Ent LÍNEA, COLUMNA Co Inicialización de la tabla TB con ceros Fco Para LÍNEA De 1 A 4 Hacer Para COLUMNA De 1 A 5 Hacer TB(LÍNEA, COLUMNA) < 0 Volverhacer Volverhacer Co Inicialización de la tabla TB con los valores leídos Fco Para LÍNEA De 1 A 3 Hacer Para COLUMNA De 1 A 4 Hacer Escribir("TB(", LÍNEA, ",", COLUMNA, ")=") TB(LÍNEA, COLUMNA) < Leer Volverhacer Volverhacer Co Añadir en columna 5 y línea 4 Fco Para LÍNEA De 1 A 3 Hacer Para COLUMNA De 1 A 4 Hacer - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIZXlNGN61IgLAA==-enidentnumber TB(LÍNEA, 5) < TB(LÍNEA, 5) + TB(LÍNEA, COLUMNA) TB(4, COLUMNA) < TB(4, COLUMNA) + TB(LÍNEA, COLUMNA) Volverhacer Volverhacer Fin La inicialización de las celdas de la tabla a cero al inicio del procesamiento puede ser útil en determinados lenguajes de programación porque los valores iniciales, de la línea 4 y de la columna 5 en nuestro ejemplo, pueden ser no nulos. - 2 - © Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjIZXlNGN61IgLAA==-enidentnumber Estos nuevos mecanismos permiten al programador tratar un problema sin preocuparse, inicialmente, de las reglas detalladas de los subproblemas. Se trata de herramientas muy similares a las funciones matemáticas. En programación, un procedimiento o una función, representa un algoritmo que opera con argumentos o argumentos formales (valores ficticios de alguna manera). La ejecución de este algoritmo se genera con la llamada del procedimiento o de la función. Los datos de este algoritmo llamado son los argumentos efectivos (que provienen del algoritmo que llama). El interés metodológico de estos mecanismos en una primera etapa consiste principalmente en convertir los subproblemas en procedimientos (o en funciones) y tratar el problema general (o principal) como si estos subproblemas estuvieran solucionados. En una segunda etapa, se describen estos procedimientos o funciones. Otro interés consiste en el hecho de que, si el mismo subproblema se debe resolver varias veces con argumentos efectivos diferentes, el uso de un procedimiento o función permite una mejor legibilidad del algoritmo. Comencemos el estudio de este mecanismo con la sintaxis de la declaración: En esta declaración: La llamada de un procedimiento desde otro o desde el algoritmo principal se hace respetando el siguiente esquema: con: Enunciado Procedimientos, funciones y paso de argumentos 1. Los objetivos 2. Los procedimientos Procedimiento NOMBRE_PROCEDIMIENTO([Tipo1 IDFO1, ..., Tipoi IDFOi]) Cuerpo del procedimiento Fin_procedimiento l NOMBRE_PROCEDIMIENTO es un nombre elegido libremente por el programador. l IDFOi es el nombre del enésimo argumento formal del procedimiento. l Tipoi es el tipo del enésimo argumento formal del procedimiento. l El procedimiento no devuelve valores a menos que intervenga sobre las variables (accesibilidad) globales. l Procedimiento y Fin_procedimiento son palabras reservadas. NOMBRE_PROCEDIMIENTO(IDEF1, IDEFi, ..., IDEFn) l NOMBRE_PROCEDIMIENTO es un nombre elegido libremente por el programador, l IDEFi es el nombre del enésimo argumento efectivo. 3. Ejercicio n.°16: Llamada de un procedimiento con paso de argumentos - 1 -© Editions ENI – Tous droits réservés – Copie personnelle de Jack Jack enidentnumber-AAEAAAD/////AQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwSmFjayBKYWNrIC0gMjkzZWU4YTMtMGVmNS00N2M2LWFkNjEtNjBjMGRiZmM5MjdjQRO6OmN61IgLAA==-enidentnumber Llamar a un procedimiento que muestra el doble de los valores efectivos pasados como argumento (los dos valores pasados como argumento se introducen por el teclado). Corrección En la corrección que se presenta, en realidad se introducirán dos duplas de números por el teclado (A y B y después C y D), para mostrar la reutilización del procedimiento DOBLE. Las variables A y B (después C y D) son cualificadas con argumentos efectivos. Durante la llamada del procedimiento DOBLE, al
Compartir