INDICE Pág. INDICE 1 RESUMEN 5 INTRODUCCION 6 MARCO TEORICO 9 MATERIALES Y METODOS 11 RESULTADOS 12 CAPÍTULO I 1. HARDWARE Y SOFTWARE. 13 1.1 Hardware 13 1.2 Software. 33 1.3 Conceptos Básicos 41 1.4 Relación de Ejercicios 42 CAPÍTULO II 2. HERRAMIENTAS DE PROGRAMACIÓN. 47 2.1 Análisis del problema 47 2.2 Diseño del algoritmo 48 2.3 Diagramas de Flujo 48 2.3 Pseudocódigo. 51 2.4 Relación de ejercicios 52 1 CAPITULO III 3. PROGRAMACIÓN ESTRUCTURADA. 54 3.1 Secuenciales 54 3.2 Selectivas 55 3.3 Repetitivas. 58 3.4 Relación de ejercicios 62 CAPÍTULO IV 4. ESTRUCTURA DE DATOS. 65 4.1 Tipos de datos 65 4.2 Estructura de datos 68 4.2.1Estaticas. 68 4.2.2 Dinámicas 102 4.3 Relación de Ejercicios. 133 CAPITULO V 5. TEORÍA DE GRAFOS. 136 5.1 Conceptos Básicos. 136 5.2 Representación de grafos. 139 5.3 Exploración de grafos. 143 5.4 Relación de ejercicios. 145 CAPÍTULO VI 6. ORDENAMIENTO Y BÚSQUEDA DE DATOS. 147 6.1 Ordenamiento de datos. 147 6.2 Búsqueda de datos. 158 6.3 Relación de ejercicios. 166 2 CAPÍTULO VII 7. SOFTWARE DE PROGRAMACIÓN MATLAB. 168 7.1 Introducción. 168 7.2 Operadores 169 7.3 Variables. 171 7.4 Expresiones. 171 7.5 Matlab y el algebra lineal. 172 7.6 Comandos de programación. 192 7.7 Gráficos 2-D. 199 7.8 Gráficos 3-D. 204 7.9 Relación de ejercicios. 212 CAPÍTULO VIII 8. LENGUAJE DE PROGRAMACIÓN C++. 220 8.1 Introducción. 220 8.2 Operadores. 221 8.3 Tipos de datos. 223 8.4 Constantes. 224 8.5 Variables. 225 8.6 Entrada y salida de datos. 226 8.7 Instrucciones de control. 227 8.8 Funciones. 241 8.9 Librería de funciones creadas por el usuario. 246 8.10 Arreglos. 246 8.11 Estructuras en C++. 258 8.12 Archivos en C++. 264 3 8.13 Cadenas de caracteres en C++. 278 8.14 Gráficos en C++. 282 8.15 Relación de ejercicios. 287 DISCUSION 297 REFERENCIAS BIBLIOGRAFICAS 298 APENDICE 300 Diagrama de las estructuras de datos 300 4 RESUMEN En este trabajo de investigación se ha elaborado un texto de naturaleza teórico-práctico que expone de forma sistemática y detallada, las definiciones y ejemplos más importantes de las Estructuras de datos, Herramientas de programación, Ordenamiento y búsqueda de datos, Software Matlab y el Lenguaje de programación C++, permitiendo el dictado de la asignatura de programación de computadoras correspondiente al cuarto ciclo académico del currículo de estudios de la Escuela profesional de Matemática de la Facultad de Ciencias Naturales y Matemática de la Universidad Nacional del Callao. El texto “Programación de computadoras y sus aplicaciones” procura hacer comprender la asignatura en referencia y así mismo pretende preparar al estudiante para que emprenda con éxito el estudio de asignaturas de ciclos posteriores, tales como: Investigación Operativa I y II, Matemática Computacional I, II y III, Métodos matemáticos y los Cursos de seminario I y II de la Línea del Análisis Numérico y Matemática Computacional. El texto está basado, en su plan general y en algunas extensiones de su contenido, en los textos mencionados en los referenciales; sin embargo, la diferencia es que aquí hemos recopilado lo necesario para el desarrollo de la asignatura de programación de computadoras y además tenemos ejercicios de aplicación para cada uno de los capítulos a un nivel adecuado, lo que le da un carácter integral y funcional a la obra. El resultado muestra que, en comparación con los textos elaborados por otros autores mencionados en la referencia bibliográfica, el texto “PROGRAMACION DE COMPUTADORAS Y SUS APLICACIONES” hace más dinámico y fácil el proceso de enseñanza y aprendizaje de esta asignatura. 5 INTRODUCCION Con el avance de la ciencia y la tecnología nos enfrentamos a una manera diferente de enseñar las matemáticas y sus aplicaciones. La asignatura de programación de computadoras proporciona las herramientas necesarias para la utilización de la computadora como un complemento para el estudio de las ciencias e ingeniería. No podemos estar al margen del avance de la tecnología informática que se ha convertido en una herramienta de investigación para la resolución de complejos problemas planteados en la realización y aplicación de modelos matemáticos de Ingeniería u otras disciplinas. Por tanto es necesario contar con un texto que nos permita utilizar de forma eficiente sus aplicaciones a la matemática e ingeniería. Es muy limitado la bibliografía, especialmente en textos que logren compilar y tratar todos los temas relacionados con la asignatura de programación de computadoras, encontramos en la literatura mayormente que ponen énfasis a ciertos temas. Se requiere un texto donde podamos relacionar conocimientos teóricos y aplicaciones prácticas, experiencias de aplicaciones en diferentes ramas de la ciencia e ingenierías. Por lo que es importante recopilar toda información posible, que se encuentra dispersa, ordenándola en forma sencilla y razonada, dando origen a la creación del Texto: “Programación de computadoras y sus aplicaciones.” En este sentido el problema de la investigación consistió en elaborar un texto de naturaleza teórico-práctico que oriente adecuadamente el desarrollo sistemático y concreto de la asignatura de “PROGRAMACION DE COMPUTADORAS” fundamentales para estudiantes de ciencias e ingeniería. 6 con aplicaciones El presente trabajo constituye una investigación de gabinete (búsqueda, recopilación, ordenación y centralización de material bibliográfico). Es necesario indicar que con el presente texto no se pretende agotar un tema bastante extenso, complejo y que guarda relación con otras áreas tanto en ciencia e ingenierías, por el contrario se desea exponer de manera pragmática y accesible los temas contenidos en el syllabus de “Programación de Computadoras” para que sirva de guía y referencia preferencialmente para los estudiantes universitarios de la especialidad matemática y afines. OBJETIVO GENERAL Desarrollar - preparar, redactar y editar - un texto de “Programación de Computadoras y sus aplicaciones” en el que se compile información técnica y científica existente, que sirva de guía y referencia bibliográfica para los estudiantes de ciencias e ingenierías principalmente de la Universidad Nacional del Callao. OBJETIVOS ESPECÍFICOS Complementar y afianzar los conocimientos impartidos en la asignatura de Programación de computadoras. Presentar al lector conceptos y aplicaciones sobre temas específicos tales como: hardware y software, herramientas de programación, programación estructurada, estructuras de datos, teoría de grafos, ordenamiento y búsqueda de datos, lenguajes de programación matlab y C++. El texto: “Programación de Computadoras y sus aplicaciones” permitirá que el usuario lector, sea estudiante o no, tenga un material de consulta de primera mano a su disposición, en donde se centralizará la información científica y técnica existente, relacionadas con las herramientas básicas de programación y sus aplicaciones a las ciencias e ingeniería. 7 La información que se recopilará, está frecuentemente dispersa en libros, revistas y manuales, entre otros, de procedencia nacional e internacional. Se compilará después de una exhaustiva revisión y análisis del material utilizado, es allí donde radica la importancia del presente trabajo, porque permitirá generar una fuente bibliográfica de constante consulta de los estudiantes de matemática y ramas afines. El Texto: “Programación de computadoras y sus aplicaciones” permitirá cubrir parte de la brecha existente por la falta de bibliografía aplicada, donde se incluyan los nuevos avances de la tecnología informática. 8 MARCO TEORICO Existen pocos textos que logren compilar y tratar todos los temas relacionados con la programación académica del curso de programación de computadoras, se encuentra bibliografía que ponen énfasis en algunos temas y en otros no. Todos los capítulos en su integridad contienen material aprovechable (teoría-practica) para los estudiantes de ciencias e ingenierías. Los temas más importantes acorde con la programación académica y que se trataran en este texto son los siguientes: PROGRAMACION ESTRUCTURADA La programación estructurada es una forma de escribir programas de ordenador de forma clara. Para ello utiliza únicamente tres estructuras: secuencia, selección e iteración; siendo innecesario el uso de la instrucción o instrucciones de transferencia incondicional (GOTO, EXIT FUNCTION, EXIT SUB o múltiples RETURN). Hoy en día las aplicaciones informáticas son mucho más ambiciosas que las necesidades de programación existentes en los años 1960, principalmente debido a las aplicaciones gráficas, por lo que las técnicas de programación estructurada no son suficientes. Ello ha llevado al desarrollo de nuevas técnicas, tales como la programación orientada a objetos y el desarrollo de entornos de programación que facilitan la programación de grandes aplicaciones (Joyanes Aguilar, Fernandez Azuela & Rodriguez Baena, 1998). ESTRUCTURA DE DATOS La estructura de datos es una forma de organizar un conjunto de datos elementales con el objetivo de facilitar su manipulación. Un dato elemental es la mínima información que se tiene en un sistema (Joyanes Aguilar & Zahonero Martinez,1998). 9 TEORIA DE GRAFOS La teoría de grafos estudia las propiedades de los grafos (también llamadas gráficas). Un grafo es un conjunto, no vacío, de objetos llamados vértices (o nodos) y una selección de pares de vértices, llamados aristas que pueden ser orientados o no. Típicamente, un grafo se representa mediante una serie de puntos (los vértices) conectados por líneas (las aristas). SOFTWARE MATLAB MATLAB es un software desarrollado en un ambiente de algoritmo de interacción, visualización y análisis de datos.Con esta herramienta se puede resolver problemas computacionales técnicos más rápido que con los tradicionales lenguajes de programación, tales como: C, C++ y Fortran. Es usado para una gran variedad de cálculos científicos y de ingeniería, especialmente para control automático y diseño de procesos además de otra variedad de aplicaciones tales como: procesamiento de señal e imágenes, comunicaciones y modelamiento financiero (Nakamura, 2000). LENGUAJE DE PROGRAMACION C++ El Lenguaje de Programación C++ fue creado por Bjarne Stroustrup en 1985 como una extensión del Lenguaje C, el mismo que es más consistente y conocido que otros lenguajes de programación científicos. El Lenguaje de Programación C++ es de propósito general porque ofrece control de flujo, estructuras sencillas y un buen conjunto de operadores. Se puede utilizar en varios tipos de aplicación (Stroustrup, 2002). 10 MATERIALES Y MÉTODOS MATERIALES El texto “PROGRAMACION DE COMPUTADORAS Y SUS APLICACIONES” no está sujeto a experimento de laboratorio, sin embargo se ha desarrollado sobre la base de textos, que se propone en la referencia: Nakamura Choichiro(2000), Stroustrup Bjarne(2002), Delores Etter(1998), software especializado y experiencias propias en el dictado de la asignatura Programación de Computadoras. Además también se ha usado material de tipo técnico en el diseño e impresión de informes trimestrales y final. Toda la información ha sido procesada en una computadora personal, usando Microsoft Word y en concordancia con las directivas vigentes, mediante el cual se han editado y elaborado los esquemas y dibujos relacionados a los diversos temas desarrollados. MÉTODOS Luego de realizar la recolección de datos necesarios para la investigación. Los métodos usados en la discusión de los temas de cada capítulo son clasificados en: Inductivo, deductivo e inductivo-deductivo. El método deductivo es conciso y lógico que permite desarrollar la asignatura de Programación de Computadoras en forma concreta y ordenada. El método inductivo-deductivo ha hecho posible mostrar el desarrollo de los programas codificados en el lenguaje de programación C++ y que describen la solución de problemas concretos de los estudiantes de ciencias e ingenierías así como también, el análisis de las soluciones para los ejercicios presentados. Estos métodos han permitido que el trabajo tenga contenido y mayor calidad 11 RESULTADOS El resultado del presente trabajo de investigación es el texto: “PROGRAMACION DE COMPUTADORAS Y SUS APLICACIONES” cuyo contenido se expone en ocho capítulos distribuidos en el orden señalado en el índice y que se presenta en las paginas siguientes. En cada capítulo se exponen, en forma clara y directa, los conceptos y leyes asociados a los temas tratados, a fin de que el estudiante pueda tener una buena referencia para comprender la solución de los problemas que se presentan al final del capítulo. Por otro se han elaborado algunas figuras de diagramas de flujo con el fin de facilitar la comprensión de los programas desarrollados y luego poder codificarlo en el Lenguaje de programación C++. Adicionalmente se diseñaron por cada capítulo una relación de ejercicios que fueron propuestos para ser resueltos con los temas enseñados. El uso del texto: “PROGRAMACION DE COMPUTADORAS Y SUS APLICACIONES” permite unificar los conceptos teóricos con los prácticos, lo cual favorece el proceso enseñanza-aprendizaje de la asignatura de Programación de computadora de acuerdo a la propuesta silábica para su dictado. Además permite afianzar en el estudiante los conceptos informáticos básicos y aplicarlos en diferentes áreas. 12 CAPITULO I HARDWARE Y SOFTWARE 1.1 HARDWARE ¿QUÉ ES UNA COMPUTADORA? Figura 1.1 Computadora Definición 1.1 Persona o Dispositivo mecánico o electrónico que realiza cómputos, o sea, que cuenta o calcula aritméticamente. Su función fundamental es sumar y restar. La diferencia entre una computadora y una calculadora es que ésta no solo cuenta, además realiza cálculos mucho más complejos como manejo de exponentes, raíz cuadrada, etc. La comúnmente denominada COMPUTADORA realiza funciones mucho más complejas que contar y calcular, además de trabajar con números también efectúa funciones lógicas, trabaja con información concreta: palabras, imágenes, sonidos. Por la tanto la Real Academia de la Lengua la ha titulado como ORDENADOR. 13 Lic. Elmer Alberto León Zárate Definición 1.2 El ordenador es una máquina de propósito general que gracias a su velocidad recibe todo tipo de información, la procesa o sea la ordena y una vez procesada la emite ya digerida para su interpretación. Definición 1.3 El ordenador es un conjunto de circuitos electrónicos comprimidos en una pastilla de silicio (llamada Chip), siendo su función fundamental la de encausar las señales electromagnéticas de un dispositivo a otro. Definición 1.4 El ordenador es en realidad el MICROPROCESADOR, o sea un conmutador, es el cerebro y razón de ser del ente denominado computadora. Todo lo demás que le rodea y se le es conectado no es más que dispositivos mediante los cuales el cerebro se alimenta de energía e interactúa con el medio ambiente y por lo tanto con nosotros los usuarios. COMPONENTES BÁSICOS DE HARDWARE Al conjunto físico de todos los dispositivos y elementos internos y externos de una computadora suele denominarse el HARDWARE. Esto es, Equipo Duro. Dichos elementos son entre los más importantes los siguientes: 1.1.1 UNIDAD CENTRAL DE PROCESO Definición 1.5 Es en sí en cerebro, el cual se compone a su vez de Unidad Aritmética, Lógica y de control. Esta unidad trabaja en base a un reloj maestro que coordina la ejecución de todas las operaciones que realiza el microprocesador. 14 CAPITULO I: Hardware y Software La unidad fundamental de trabajo de este reloj es la cantidad de instrucciones que el microprocesador puede ejecutar en un segundo. Así uno de 12 Mhz. Puede realizar 12 millones de ciclos por segundo. Figura 1.2 Unidad Central de proceso La rapidez y poder de ejecución de tareas esta determinado completamente por el microprocesador el cual subdivide a las computadoras en diferentes tipos, entre ellos algunas ya obsoletas como son: las llamadas 8086 XT, 80286, 80386, 80486 y Pentium (80586), bautizadas así por la compañía fabricante INTEL la cual ha proveído desde las primeras PC’s y hasta hoy a la mayoría de maquiladoras de computadoras con sus modelos de cerebro. Sin embargo Intel no es ya el único fabricante de microprocesadores para las Computadoras Personales, compiten también en el mercado compañías como Cyrix, AMD, Power Pc, Digital Equipment, etc. Sin embargo, aunque en competencia la mayoría de esas compañías ofrecen microprocesadores equivalentes a los estándares ofrecido serie por serie por Intel Corporation. El modelo de un microprocesador nos indica sobre todo el PODER o sea el potencial de tareas que un microprocesador puede ejecutar a la vez y su reloj nos indica su 15 Lic. Elmer Alberto León Zárate VELOCIDAD de sincronización con la cual éstas son realizadas. Así entre una computadora 286 y una 486 hay una notable diferencia de poder y velocidad incomparable ya que a la primera no podremos agregarle u ordenarle tantas cosas como a la segunda; y por otro lado entre una 486 de 25 Mhz y una 486 de 50 Mhz estamos hablando que las dos tienen el mismo poder, pero la segunda dobla la velocidad a la primera. 1.1.2 TARJETA PRINCIPAL Definición 1.6 También llamada Tarjeta Madre o Motherboard es donde se encuentran las conexiones básicas para todos los componentes de la computadora, los cuales giran en torno al microprocesador. Es básicamente la que permite o no el futuro crecimiento de las habilidades de cualquier computadora, una tarjeta con una arquitectura muy cerrada terminará con la vida de todo el equipo en el momento que ésta requiera una reparación o mejora, éste fue el caso de la mayoría de las computadoras que existieron en el pasado, como por mencionar algunas: Comodore 64, Tandy 1000 e incluso todas las XT´s y algunas 286 de IBM. Estas se pueden clasificar en la actualidad en: - Arquitectura de 8 bits: Primeras XT - Arquitectura ISA 8 -16 bits. La mayoría de las actuales clones - Arquitectura EISA o MCA de 32 bits. compatibles de marca de calidad que se venden actualmente. 16 La mayoría de las de IBM o CAPITULO I: Hardware y Software Figura 1.3 Tarjeta principal 1.1.3 EL COPROCESADOR MATEMÁTICO O NUMÉRICO Definición 1.7 Es un microprocesador de instalación opcional, también denominado Unidad de punto flotante que auxilia al microprocesador en el uso eficiente de programas de graficación, cálculos matemáticos complejos y diseño entre tantos, lo cual al especializarse dichas funciones acelera la velocidad con que una computadora puede responder a necesidades tan sofisticadas. En la actualidad ya vienen incluidos en todas las computadoras nuevas, ya que el poder que exigen no puede descartar la falta de éste microprocesador. Si usted desea saber si su computadora cuenta con uno de ellos, sólo vea, si en el modelo tiene agregada el par de letras DX en el caso contrario, usted necesitará en el futuro inmediato su instalación. Sobre todo no queda duda si su maquina en lugar de este par de letras presenta otras como SX, como por ejemplo: 486 SX de 25 Mhz. En caso que usted necesite la instalación de uno de ellos, debe asegurarse primero lo siguiente: 17 Lic. Elmer Alberto León Zárate Que su motherboard cuente con un slot disponible específico para el coprocesador matemático. Que el que le venden sea de la misma marca que el Microprocesador Principal de su computadora Que trabaje a la misma velocidad que lo hace el Microprocesador Principal de su computadora. Esto es, si usted cuenta con una computadora 486 SX de 25 Mhz, el coprocesador debe ser un 487 SX de 25 Mhz. Como puede usted observar el coprocesador es algo así como la mitad del microprocesador completo. Figura 1.4 Coprocesador matemático 1.1.4 LA MEMORIA Definición 1.8 Es la capacidad de almacenar información, la cual se realiza en bancos separados de la UCP. Su unidad de almacenamiento es el BYTE que es la capacidad de almacenar un carácter: una letra, número o cualquier símbolo como #, $, &, etc. 18 CAPITULO I: Hardware y Software Figura 1.5 Memorias TIPOS DE MEMORIAS: a) MEMORIA ROM Definición 1.9 Esta memoria es sólo de lectura, y sirve para almacenar el programa básico de iniciación, instalado desde fábrica. Este programa entra en función en cuanto es encendida la computadora y su primera función es la de reconocer los dispositivos, (incluyendo memoria de trabajo), dispositivos. b) MEMORIA RAM Definición 1.10 Esta es la denominada memoria de acceso aleatorio o sea, como puede leerse también puede escribirse en ella, tiene la característica de ser volátil, esto es, que sólo opera mientras esté encendida la computadora. En ella son almacenadas tanto las instrucciones que necesita ejecutar el microprocesador como los datos que introducimos y deseamos procesar, así como los resultados obtenidos de esto. 19 Lic. Elmer Alberto León Zárate Por lo tanto, programa que se desea ejecutar en la computadora, programa que máximo debe ser del mismo tamaño que la capacidad de dicha memoria, de lo contrario se verá imposibilitada de ejecutarlo. Observación 1.1 Cuando se vea en la necesidad de adquirir un programa de cómputo, independientemente de cual o para que sea, lea muy bien las instrucciones antes de pagarlo, puesto que en ellas debe especificar claramente la cantidad recursos mínimos necesarios que debe tener su equipo para trabajar con éste. Búsquelos con el título, Observación 1.2 Como puede usted ver, si al momento de apagar nuestra computadora se volatilizan nuestros datos almacenados en la memoria RAM, requerimos por lo tanto, de medios que almacenamiento por tiempo indefinido que nos garanticen la seguridad y confiabilidad de nuestros datos, o sea, otro tipo de memorias. 1.1.5 MEMORIAS AUXILIARES Por las características propias del uso de la memoria ROM y el manejo de la RAM, existen varios medios de almacenamiento de información, entre los más comunes se encuentran: 20 CAPITULO I: Hardware y Software a) EL DISQUETE, FLOPPY O DISCO FLEXIBLE Definición 1.11 Es un medio o soporte de almacenamiento de datos formado por una pieza circular de material magnético, fina y flexible encerrada en una cubierta de plástico cuadrada o rectangular. Esta tecnología actualmente muy poco se utiliza. b) CINTA DE RESPALDO Definición 1.12 Son como las cintas de cassette de audio y pueden almacenar desde 20 Mbytes hasta 2 Gigabytes o más. Son medios de almacenamiento muy económicos y sobre todo muy rápidos, ya que pueden almacenar todo un disco duro en un pequeño cassette en unos cuantos minutos. Figura 1.6 Cintas de respaldo c) DISCO DURO Definición 1.13 El Cuál se instala fijo dentro de la computadora, son más rápidos y seguros que las unidades de lectura de disquete y cuyas capacidades de almacenamiento van desde los 40 Gigabytes hasta 500 Gigabytes. Los más rápidos andan por debajo de los 15 milisegundos de acceso de la información. En la actualidad evite comprar discos con capacidades menores a 40 Gb. En poco tiempo no le servirán prácticamente para nada. 21 Lic. Elmer Alberto León Zárate Figura 1.7 Disco duro d) CD-ROM o DISCO COMPACTO Definición 1.14 Son de mayor capacidad ya que mínimo son de 720 Mbytes y pueden llegar a almacenar en el futuro alrededor de algunos Terabytes. Se recomienda ir comprando equipo que contengan éste dispositivo, ya que gracias a las grandes cantidades de información tan variada que pueden soportar éste tipo de almacenamiento, ya se comienza a construir las grandes bases de información en un sólo disco: Enciclopedias, Cursos, Viajes turísticos, los periódicos y revistas del futuro que tenemos frente a nosotros. Figura 1.8 Disco compacto 22 CAPITULO I: Hardware y Software 1.1.6 FUENTE DE PODER Definición 1.15 Una fuente de poder o alimentación es un dispositivo que convierte la tensión alterna de la red de suministro, en una o varias tensiones, prácticamente continuas, que alimentan los distintos circuitos del ordenador al que se conecta. Tanto el microprocesador como todos los circuitos que forman los dispositivos se alimentan de cantidades muy pequeñas de energía necesitan de una fuente que les suministre y regule la cantidad necesaria. Ya que cualquier variación en el voltaje podría ser suficiente para quemar dichos circuitos. Figura 1.9 Fuente de poder 1.1.7 DISPOSITIVOS DE CRECIMIENTO Definición 1.16 Son las puertas que están listas para recibir la conexión de cualquier otro aparato o tarjeta que permita ampliar las capacidades de trabajo de una computadora, y son el punto más importante para asegurarnos haber hecho una buena inversión. Estos son las Ranuras de Expansión y los puertos. Los puertos son los puntos de conexión que ya vienen con la computadora y que permiten la instalación rápida de los dispositivos más comunes, como lo son el teclado, la impresora, el monitor, etc. 23 Lic. Elmer Alberto León Zárate 1.1.8 DISPOSITIVOS DE ENTRADA DE INFORMACIÓN Son todos aquellos que permiten al microprocesador la obtención de la información e instrucciones a seguir en determinado momento. Gracias a ellos, nosotros podemos comunicarnos con la computadora. Entre los más utilizados se encuentran: a) EL TECLADO Definición 1.17 Es un periférico de entrada o dispositivo, en parte inspirado en el teclado de las máquinas de escribir, que utiliza una disposición de botones o teclas, para que actúen como palancas mecánicas o interruptores electrónicos que envían información a la computadora. Después de las tarjetas perforadas y las cintas de papel, la interacción a través de los teclados al estilo teletipo se convirtió en el principal medio de entrada para las computadoras. El teclado tiene entre 99 y 127 teclas aproximadamente. Figura 1.10 Teclado b) El MOUSE Definición 1.18 Este dispositivo permite simular el señalamiento de pequeños dibujos o localidades como si fuera hecho con el dedo índice, gracias a que los programas que lo aprovechan presentan sobre la pantalla una flecha que al momento de deslizar el dispositivo 24 CAPITULO I: Hardware y Software sobre una superficie plana mueve la flecha en la dirección que se haga sobre la pantalla. Una vez señalado, permite escoger objetos e incluso tomarlos y cambiarlos de lugar. Figura 1.11 Mouse c) LOS RASTREADORES ÓPTICOS O ESCANNERS Definición 1.19 Son prácticamente pequeñas copiadoras, que mediante haces de luz digitalizan punto por punto una imagen y la transfieren a la memoria de la computadora en forma de archivo, el tipo de información que pueden rastrear se las da su tipo, incluso los hay que rastrean a colores. Figura 1.12 Scanner La calidad de éstos está representada por la resolución máxima a la que pueden rastrear una imagen, los hay desde 300 dpi hasta 2400, aunque a la hora de comprarlos se debe tomar en cuenta por un lado la máxima calidad de salida de su impresora y la cantidad 25 Lic. Elmer Alberto León Zárate de espacio disponible en su disco duro, así como el tamaño de la memoria RAM de su máquina, ya que de no coincidir nunca podrá usar su rastreador más allá de las capacidades de su equipo. Una de las funciones más sobresalientes de los rastreadores de imágenes son las de permitir que programas inteligentes de reconocimiento de caracteres conviertan la imagen del documento rastreado en texto libre que puede, una vez convertido ser modificable incluso letra por letra. 1.- Escáner manual: Se parece al ratón y a medida que se desplaza por una superficie lisa va convirtiendo la imagen en archivo, son muy lentos y requieren de mucha precisión para evitar errores en la imagen obtenida. 2.- Escáner de cama: Son básicamente pequeñas copiadoras que al igual qué éstas, rastrean el documento depositado en su pantalla. Son muy rápidos, precisos y cada vez más baratos. 3.- Lápiz óptico: También se le conoce como pantalla rastreadora de código de barras, muy conocidos por nosotros en los grandes supermercados, los cuales interpretan información codificada mediante un sistema de barras. 4.- Micrófonos mediante tarjetas de audio: Comenzamos a ver a nuestro alrededor sistemas de cómputo basados en el reconocimiento de voz que puede efectuar una computadora mediante una tarjeta instalada específicamente para convertir la voz en bits y viceversa, así ya comenzamos a ver aparatos controlados por voz, como algunos que nos contestan por teléfono cuando llamamos a algún banco para pedir nuestro saldo. 26 CAPITULO I: Hardware y Software 1.1.9 DISPOSITIVOS DE SALIDA DE INFORMACIÓN Son todos aquellos que nos permiten obtener la información procesada por la computadora, y entre los más comunes se encuentran: a) EL MONITOR Definición 1.20 Es un aparato de los llamados CTR (Tubo de rayos Catódicos) en los cuales se pueden representar los datos de tipo texto o gráficos procesados por la computadora. El estándar en vídeo de las modernas computadoras se basa en el sistema VGA, el cual le da al usuario la capacidad de poder representar en la pantalla no sólo imágenes de mejor calidad sino que incluso se pueden apreciar en calidad normal fotografías auténticas, dicha capacidad no la tenía ninguno de los sistemas de vídeo anteriores a éste. Figura 1.13 Monitor Al momento de escoger una computadora es muy importante que nos hagan saber de su calidad, marca y garantía individual, ya que este aparato por si sólo es el que: puede contaminar más, a menor calidad cansará y deteriorará más nuestra vista, consume mucha energía, se calienta más que todo el equipo, etc. 27 Lic. Elmer Alberto León Zárate Por si fuera poco si no fuera de la calidad que necesitamos no nos va a servir en el momento de usar programas que generen represente imágenes detalladas, realísticas o precisas. Esto deben tomarlo en cuenta sobre todo aquellas personas que requieren equipo de cómputo para prestar servicios de Diseño Gráfico, Arquitectura, Edición de Vídeo, Imprentas, etc. A la capacidad de generar imágenes de calidad de un monitor se le llama resolución y se determina por la cantidad de puntos o “pixeles” que contenga la pantalla. Así un monitor de 640x480 (El estándar en VGA) representará con menor calidad y cantidad de colores las imágenes realísticas que uno de 1024x768 comúnmente denominado SuperVGA. También los hay intermedios de 800x600 puntos. Además un monitor de sistema VGA normal puede representar imágenes máximo hasta 256 tonalidades diferentes en cambio uno mejor podrá manejar hasta 16 millones de tonos en color, aquí reside la razón de su resolución y rapidez. Tanto la calidad de imagen, precisión y rapidez están soportadas por la llamada Tarjeta de Vídeo, la cual toma la información de la memoria principal, la almacena en la memoria propia y le ordena al monitor el orden y acomodo de la información punto por punto. Todo lo anterior significa que si usted cambia de tipo de monitor así también deberá cambiar el tipo de Tarjeta de vídeo. b) LA IMPRESORA Estas actúan como máquinas de escribir, es decir, vacían la información contenida en la memoria principal en papel. Y se clasifican en cuatro tipos principales: 28 CAPITULO I: Hardware y Software 1.- MATRICIAL DE PUNTOS Definición 1.21 Son las más rápidas y vendidas, buenas para el trabajo común de oficina, aunque ruidosas son las más económicas por hoja impresa y baratas en el mercado. También se denominan así porque su sistema de impresión esta basado en el mismo de la maquina de escribir, esto es, un rodillo, papel normal, una cinta entintada, pero en lugar de una cuña con el tipo de letra aquí se substituye por una cabeza de agujas, las cuales salen en secuencia vertical punzando los puntos indicados para formar la letra. Esto lo hacen línea vertical por línea vertical por letra por palabra por renglón. Como puede usted observar en cualquier momento, esto lo hacen tan rápido que apenas alcanzamos a apreciar como se va dibujando el renglón de letras dejando atrás ese típico ruido de oficina computarizada. La medida de rapidez y calidad es la cantidad de caracteres que pueden imprimir por segundo, entre las medianas de precio y de buena velocidad de encuentran de 260 y 350 CPS. Estas características hacen de las impresoras de agujas las impresoras más útiles y económicas en el trabajo cotidiano de una oficina o empresa. Figura 1.14 Impresora matricial 29 Lic. Elmer Alberto León Zárate 2.- INYECCION DE TINTA Definición 1.22 Estas funcionan muy parecido a las de matriz de puntos, solo que en vez de agujas tienen pequeñísimos microtubos decenas de veces más delgados que un cabello humano por donde arrojan pequeños chorros o gotas de tinta que al tocar el papel se dispersan y forman una imagen del texto de muy buen calidad, aunque son baratas son por lo general más lentas que la de agujas, pero tiene la gran ventaja de manejar alta calidad, incluso las de colores son las más populares sobre todo en uso profesional, estudiantil y doméstico. Por un precio razonable se pueden encontrar impresoras de calidad tal a colores que pueden representar con un muy buen porcentaje de fidelidad una fotografía real a 720x720 DPI (puntos por pulgada). Figura 1.15 Impresora inyección de tinta 3.-IMPRESORA LASER Definición 1.23 El sistema es totalmente distinto al de las demás y es más bien parecido al de una copiadora tradicional, o sea, papel magnetizado con un polvo-tinta muy fino que al ser fundido con un haz láser crean un documento de calidad inigualable que llega alcanzar hasta los 600 DPI. 30 CAPITULO I: Hardware y Software Aunque siguen bajando rápidamente de precio, son las más caras por hoja impresa, sin embargo son las únicas con calidad de imprenta, son la herramienta imprescindible para una imprenta, edición fotográfica o negocio de diseño gráfico. La velocidad de éstas como de las de inyección de tinta se mide en Hojas por minuto. Figura 1.16 Impresora laser 4.-LOS PLOTTERS Definición 1.24 Son grandes impresoras basadas en plumillas de colores que permiten a los Arquitectos o Ingenieros convertir un plano o trazo de líneas contenido en la memoria de su computadora en un auténtico gran plano listo para su envió, ahorrando mediante éstos sofisticados implementos tanto el diseño a mano de los planos como la heliografía necesaria para su reproducción. Figura 1.17 Plotter 31 Lic. Elmer Alberto León Zárate 1.1.10 DISPOSITIVOS DE ENTRADA Y SALIDA DE INFORMACIÓN Son aquellos mediante los cuales podemos tanto accesar como introducir información o instrucciones al microprocesador. Entre los más comunes: a) UNIDADES DE LECTURA/ESCRITURA DE DISQUETES Definición 1.25 Estas se especializan en leer la información almacenada en los disquetes, así como escribir en estos los datos a ser almacenados. Según su densidad de escritura será el tipo de disquete que podrán leer o escribir. b) MONITORES ITERATIVOS Definición 1.26 Existen monitores especiales que presentan información como cualquier monitor lo hace, permitiendo además introducir información señalando con nuestro dedo sobre ellos, aunque más caros que el simple hecho de comprar un ratón, son muy útiles en áreas abiertas donde es preciso rapidez y aguante en el uso del dispositivo, como lo es el hecho de hacer reservaciones en aeropuertos. c) DISPOSITIVO DE MODEM O FAX-MODEM Cuando nosotros hablamos por teléfono enviamos por cable señales análogas que al llegar al otro aparato se convierten en voz nuevamente, sin embargo las computadoras no son aparatos que generen esas señales u ondas, muy por el contrario una computadora internamente esta todo el tiempo generando interrupciones en forma de 1´s y 0´s o sea bits, también llamada frecuencia digital. Definición 1.27 El Módem es un aparato que una vez conectado uno por computadora por un lado modula la señal binaria en ondas o señales análogas permitiendo de ésta manera 32 CAPITULO I: Hardware y Software aprovechar la infraestructura telefónica existente en nuestro mundo para enviar por la misma vía, voz, datos, imágenes y una vez del otro lado demodula dichas señales convirtiéndolas de nuevo en bits que al ser interpretados reproducen en la computadora la información recibida desde el otro lado del mundo. Aunada a ésta capacidad las nuevas computadoras vienen con una tarjeta de módem con fax combinado, al cual le llaman fax-módem lo cual significa que además de poder conectarse con cualquier computadora sincronizada con nosotros en cualquier parte del mundo, también podemos conectarnos con otras personas, empresas o instituciones que aunque no tengan computadora si tengan un fax convencional como el que ya es imprescindible en cualquier empresa. Si observamos detenidamente un fax convencional encontraremos qué éste dispositivo es 3 aparatos en uno, o sea: Tiene rastreador que fotocopia el documento a ser enviado Es módem, porque modula de ida y demodula al recibir la imagen rastreada Es impresora porque vacía en papel la información recibida. 1.2 SOFTWARE Dentro de los componentes básicos, el SOFTWARE o Equipo Blando, es la otra mitad de la computadora, el alma o la materia gris, ya que las necesidades de crecimiento y de capacidad han surgido para hacer realidad toda la creatividad, ingenio y desempeño humano. Definición 1.28 El Software son todas las instrucciones y datos que corren en mayor o menor medida dentro del ordenador, es decir, la información misma, la razón del ser del Hardware. En nuestros tiempos a medida que la magia de la electrónica ponen al alcance de todos estas prodigiosas maquinas verdaderas prótesis mentales, mediante el abaratamiento de 33 Lic. Elmer Alberto León Zárate la tecnología y por tanto de los costos, en dirección completamente opuesta aumenta la inversión de los servicios y programas necesarios para optimizar dichos equipos. En sus orígenes la programación de los ordenadores era hecho sólo, para y por los mismos científicos que las construían para propósitos muy específicos. El cálculo de la trayectoria de los proyectiles usados en la II Guerra Mundial, y posteriormente usos muy parecidos, hasta que mucho después que fue utilizada en el Censo de los Estados Unidos fue reconociéndose su valor en el campo administrativo donde estuvo hasta hace 2 décadas, cuando gracias a la Computadora Personal pasaron al dominio público donde con tantas necesidades fueron surgiendo las aplicaciones diversas para cada oficio. 1.2.1 LOS SISTEMAS OPERATIVOS Para que una maquina basada completamente en electrónica y un ser humano, ser con miles de años de evolución obviamente no ha sido fácil la comunicación entre ambos. Desde sus orígenes los primeros diseñadores y creadores de éstas se dieron cuenta que necesitaban algo más que permitiera la fácil interpretación de las instrucciones así como de los resultados obtenidos, para lo cuál crearon un Programa básico que toda computadora debe cargar primero en su memoria para poderse comunicar y comprender con un ser humano. Definición 1.29 El Sistema Operativo es programa básico que se carga al momento de encender la máquina y sirve de intérprete entre el frío lenguaje de la maquina electrónica y el complejo idioma humano, el Sistema operativo es pues, el gobierno interno de la máquina. En la actualidad existen varios sistemas operativos para diferentes necesidades y tipos de computadoras, entre los más conocidos y utilizados actualmente se encuentran los siguientes: 34 CAPITULO I: Hardware y Software Definición 1.30 El MS-DOS Microsoft (Disk Operative System) es un sistema operativo con cual de una u otra forma hemos estado más familiarizados desde la aparición de las Computadoras Personales y sobre el cuál trabajan la mayoría de los programas usados tanto en la pequeña, mediana y grande empresa, así como en Industrias, Instituciones y hogares por millones de gentes alrededor del mundo. Su versión más nueva a la fecha es la 6.22 Definición 1.31 El OS/2 WARP Diseñado por IBM es el competidor más cercano de MSDOS sobre todo por sus grandes capacidades de interconexión de equipos y facilidad de uso bajo ambiente gráfico. Definición 1.32 El Netware diseñado por Novell, líder mundial en sistemas operativos para redes de computadoras que ha conquistado al mundo de la informática por el poder y versatilidad de sus funciones, así como su extremada capacidad de interconectar computadoras y recursos de tan variadas capacidades y marcas. Definición 1.33 El Unix es un sistema operativo de alto rendimiento utilizado actualmente en grandes proyectos y para necesidades de intercomunicación a nivel internacional y de gran volumen de operaciones diarias. En resumen, podemos afirmar que ninguna computadora obedecerá las instrucciones de ningún programa independientemente de su utilidad sin haber cargado en su memoria dicho intérprete al momento de encenderse, ya que de esto dependerá su funcionamiento y eficiencia. APLICACIONES MÁS POPULARES EN EL MUNDO DE LA INFORMÁTICA A diferencia de algunos años atrás, hoy existe una infinidad de aplicaciones para satisfacer desde diversiones o entretenimiento de niños hasta sofisticados programas de investigación científica; más sin embargo, para las necesidades de la mayoría de los mortales 35 Lic. Elmer Alberto León Zárate que trabajamos en Instituciones o Empresas y aún para los particulares existe un número preciso de aplicaciones, que como herramientas no deben faltar en ninguna computadora de uso personal. 1.2.2 PROCESADORES DE TEXTO Definición 1.34 También llamados Procesadores de palabras, fueron los primeros en servir de atracción en la adquisición de una computadora, ya que sustituyen absolutamente el trabajo de una tradicional maquina de escribir, a nuestras fechas han evolucionado tanto que ya sólo les falta tomar dictado, - y no les falta mucho para hacerlo pero dentro de las necesidades de escritura actuales en la mayoría de ellos podemos encontrar las siguientes funciones: Escribir de corrido y una sola vez todo nuestro documento Permiten con suma rapidez y flexibilidad hacer modificaciones al contenido, como: mover párrafos o bloques de texto completo de una hoja a otra, entre documentos e incluso entre programas. Cambiar en un instante palabras o frases repetidas por sinónimos sin importar la cantidad de ellas Permiten modificar en la marcha el escrito sin desperdiciar papel, ni tiempo. Se puede cambiar de opinión una vez impreso el documento y en unos segundos cambiar completamente el estilo, diseño, formato e incluso el tipo y tamaño de la letra deseada. Podemos verificar la ortográfica del documento e incluso de ciertas áreas, así como también buscar sinónimos relacionados con ciertas palabras o frases dudosas. 36 CAPITULO I: Hardware y Software Se pueden crear cartas o documentos de tipo constante, ya sea para circulares o formatos específicos incluso de facturación y manipularlos rápidamente. Analizar el documento desde distintos ángulos sin necesidad de imprimirlo. Permitir que el programa corrija automáticamente nuestra ortografía o incluso nos ayude a escribir más pronto mediante palabras que va aprendiendo. Crear Documentos estilo periodístico a base de columnas, con gráficos, imágenes o fotografías e incluso en formato cuadricular. Cuentan palabras, deshacen los cambios, imprimen partes, etc. COMPAÑÍA QUE LO PRODUCE NOMBRE Y VERSIÓN Microsoft Notepad, WordPad, Word para Windows Novell Wordperfect para DOS y Windows Software Libre OpenOffice, Latex IBM Lotus SmartSuite – Word Pro 1.2.3 HOJAS ELECTRÓNICAS Definición 1.35 También denominadas Hojas de cálculo, casi junto con los procesadores de texto han invadido toda la administración con sus bondades, es una de las herramientas imprescindibles en cualquier empresa, ya que gracias a ella, la mayor parte del trabajo rutinario de arrastrar el lápiz se convierte en un proceso tranquilo y sistemático para cualquier tarea que involucra complejas fórmulas y procesos basados en análisis, proyecciones, presupuestos, amortizaciones, cálculos básicos pero repetidos en cantidades, etc. Entre las capacidades de las modernas hojas de cálculo, encontramos las siguientes: Diseño basado en la hoja tabular a base de renglones y columnas Rápida escritura de fórmulas autocalculables 37 Lic. Elmer Alberto León Zárate Inmensa cantidad de funciones automáticas para necesidades financieras, científicas, matemáticas, lógicas, de texto, etc. Diseño y formato fácil de corregir y ampliar Estilo, tipo y tamaño de letra fácilmente modificables Manipulación de hojas en libros de trabajo Implementación avanzada de varios gráficos estadísticos Incrustación de texto e imágenes de diseño gráfico Impresión inteligente fácilmente controlable Poder en la manipulación de grandes cantidades de registros de información Diseño, Generación e Impresión rápida de reportes y listados. Herramientas flexibles de proyección y análisis para la planeación y la oportuna toma de decisiones Facilidad de uso y aprendizaje entre otras. COMPAÑÍA QUE LA PRODUCE NOMBRE Y VERSIÓN Microsoft Excel para Windows IBM Lotus SmartSuite – Lotus 123 Software Libre Open Office 1.2.4 ADMINISTRADORES DE BASES DE DATOS Definición 1.36 Cuándo las necesidades de manejo de información dentro de la empresa crecen desorbitadamente, no hay mejor herramienta que los programas de administración de Bases de Datos, los cuáles gracias a la facilidad de sus procesos nos permiten rápidamente crear, trabajar y modificar conjuntos específicos de registros con los cuales es su momento es muy práctico consultar datos precisos, obtener listados ordenados y extracciones directas de 38 CAPITULO I: Hardware y Software registros basadas en criterios de búsqueda que satisfagan la necesidad inmediata del jefe del departamento diciendo .... !!Quiero un listado de todos los clientes de la zona norte del país, que sean del sexo masculino, con edad mayor a 40 años, que tengan saldo menor a N$100,000 y ventas anuales promedio, etc. Entre sus funciones principales tenemos las siguientes: Permiten crear fácilmente cualquier estructura de registro y comenzar a capturar la información deseada Mediante sofisticados pero sencillos lenguajes o procedimientos facilitan la programación de sistemas específicos Sus consultas son muy rápidas Permiten ordenar grandes cantidades de información en poco tiempo. Son muy útiles para las listas y reportes basados en condiciones de búsqueda. Son los únicos capaces de manipular grandes cantidades de registros al mismo tiempo. Tienen la capacidad de relacionar y manipular varias bases de datos creadas para distinto propósito y en tiempos distintos. Los hay tanto para usuarios finales como para Programadores expertos COMPAÑÍA QUE LO PRODUCE NOMBRE Y VERSIÓN Microsoft Access, SQL Server Microsoft Fox Pro 2.6 para Windows / DOS Software Libre Mysql IBM DB2, Informix Oracle Oracle 39 Lic. Elmer Alberto León Zárate 1.2.5 OTRAS APLICACIONES POPULARES EN LAS EMPRESAS NOMBRE COMPAÑÍA QUE LO PRODUCE ÁREA DE APLICACIÓN Autocad 2011 Autodesk Diseño Arquitectónico 3D Bancos Apemex, Compaq, Microsip Control de Bancos y conciliaciones Caja Apemex Sistema de punto de venta Contpaq Computación en Acción Sistema de Contabilidad Integral Coreldraw Corel Diseño Gráfico Publicitario MegaPak Computación en Acción Facturación, Inventarios, CxC y CxP Money 2.0 Microsoft Administración de finanzas personales Nómina Microsip Sistema de Nómina Organizer Lotus Organizador diario Page Maker 4 Aldus Edición Tipográfica Photoshop Adobe Edición fotográfica y Diseño Ilustrator Adobe Edición de Gráficos e Imágenes Premiere Adobe Edición de Videos Power Point Microsoft Presentaciones Gráficas Project 2.0 Microsoft Administración de Proyectos 40 CAPITULO I: Hardware y Software 1.3 CONCEPTOS BASICOS 1.3.1 INFORMÁTICA Definición 1.37 Ciencia que se encarga de la organización y mantenimiento de la información haciendo uso de las sistemas integrados de Cómputo. 1.3.2 COMPUTACIÓN Definición 1.38 Conjunto de métodos y técnicas que permiten administrar, manipular y controlar en forma automática y correcta la información utilizando para ello la ayuda de un Computador 1.3.3 SECUENCIA PARA EL PROCESAMIENTO DE DATOS Ilustración 1.1 Procesamiento de datos 1.3.4 LENGUAJE DE PROGRAMACION Definición 1.39 Es un conjunto de palabras adaptadas y/o modificadas a partir de un Lenguaje humano y que permiten comunicarnos con el computador, a través de las cuales le indicamos a la computadora los procesos a llevar a cabo. 1.3.5 ALGORITMO Definición 1.40 Un Algoritmo se puede definir como un conjunto de reglas, procedimientos y/o instrucciones lógicas que se deben ejecutar en un orden especifico para resolver el problema. 41 Lic. Elmer Alberto León Zárate El uso de los algoritmos tiene un gran valor estratégico en las computadoras, ya que ellas pueden resolver un determinado problema después de que se le ha dicho como resolverlo. Todo algoritmo debe cumplir las siguientes características fundamentales: Un algoritmo debe ser preciso e indicar el orden de realización de cada paso. Un algoritmo debe estar bien definido. Si se elabora varios algoritmos todos deben dar el mismo resultado. Un algoritmo debe ser finito. Todo algoritmo tiene que terminar en algún momento, es decir tiene un número determinado de pasos. 1.3.6 PROGRAMA Definición 1.41 Es el conjunto de instrucciones escritas en un orden lógico y codificados en un determinado Lenguaje de Programación, las cuales permiten llevar a cabo un determinado proceso previamente establecido. Un programa en la PC es un conjunto de instrucciones, ordenes dadas a la maquina que producirán la ejecución de una determinada tarea. También es un medio para conseguir un fin. 1.4 RELACION DE EJERCICIOS: Seleccionar la alternativa correcta en las siguientes preguntas: 1. Las computadoras son máquinas de procesamiento de información diseñadas para transformar información. a) Verdadero. b) Falso. 2. ¿Cuál de las siguientes no es una clasificación de las computadoras? a) Computadoras portátiles. b) Computadoras incorporadas y de propósito especial. 42 CAPITULO I: Hardware y Software c) Calculadoras. d) Microcomputadoras y minicomputadoras. 3. Tienen un poder similar al de la minicomputadora, pero representan solo una fracción de su costo. a) Macrocomputadora. b) Estación de trabajo. c) Computadoras de propósito especial. d) Ninguna de las anteriores. 4. Son utilizadas comúnmente por bancos y aerolíneas. a) Estación de trabajo. b) Computadoras de propósito especial. c) Macrocomputadoras. d) Ninguna de las anteriores. 5. El hardware se refiere a la parte física de una computadora. a) Verdadero. b) Falso. 6. Las computadoras lleva acabo operaciones aritméticas o lógicas con la información, esta tarea se realiza en el CPU y es propia de: a) Recibir entradas. b) Producir salidas. c) Almacenar información. d) Procesar información. 7. Proporciona un conjunto de teclas alfabéticas, numéricas, de puntuación, de símbolos y de control. a) Ratón. 43 Lic. Elmer Alberto León Zárate b) Monitor. c) Teclado. d) CPU. 8. Consiste en presionar rápidamente dos veces el botón primario del ratón. a) Clic sostenido. b) Clic. c) Clic arrastrado. d) Ninguna de las anteriores. 9. Consiste en mantener presionado el botón primario del ratón y mover el ratón para desplazar algún elemento en la pantalla. a) Clic. b) Clic arrastrado. c) Clic sostenido. d) Ninguna de las anteriores. 10. El software es: a) El equipo físico de las computadoras. b) El conjunto de instrucciones que las computadoras emplean para manipular datos. c) Los componentes de entrada de la computadora. d) El teclado y el ratón. 11. No es una categoría de software: a) Sistemas operativos. b) Lenguajes de programación. c) Dispositivos de entrada. d) Software de aplicación. 44 CAPITULO I: Hardware y Software 12. algunas de las funciones del sistema operativo son: a) Proporcionar una interfaz con el usuario. b) Administrar los dispositivos de hardware en la computadora. c) Administrar y mantener los sistemas de archivo de disco. d) Todas las anteriores. 13. ¿Cuál de los siguientes no es un tipo de sistema operativo de interfaz gráfica? a) MS-DOS. b) Windows 2000. c) Windows XP. d) Macintosh. 14. Es un programa que traduce un lenguaje de alto nivel a lenguaje máquina y genera un archivo programa o ejecutable. a) Suite de aplicaciones. b) Sistema operativo. c) Windows 98. d) Compilador. 15. La unidad de disco es un vínculo con cualquier elemento al que puede tener acceso desde una computadora, como un programa, archivo, carpeta, unidad de disco, impresora u otra computadora. a) Verdadero. b) Falso 16. Una carpeta es una zona o división lógica de almacenamiento. a) Verdadero b) Falso 45 Lic. Elmer Alberto León Zárate 17. Un archivo es un símbolo en pantalla que representa un programa, un archivo de datos u otra entidad o función de la computadora. a) Verdadero. b) Falso. 18. Un acceso directo es un vínculo con cualquier elemento al que puede tener acceso desde una computadora, como un programa, archivo, carpeta, unidad de disco, impresora u otra computadora. a) Verdadero. b) Falso. 19. Una ventana es un símbolo en pantalla que presenta la ubicación actual del ratón. a) Verdadero. b) Falso. 20. Un menú es una representación en pantalla que enlista las opciones de tareas disponibles dentro de un programa. a) Verdadero. b) Falso. 46 CAPITULO II HERRAMIENTAS DE PROGRAMACION 2.1 ANALISIS DEL PROBLEMA Requisitos: Comprensión de la Naturaleza del problema. El Problema debe estar bien definido. Las especificaciones de Entrada y Salida de los datos sean descritas con detalle. Deberá responder a las siguientes preguntas: a) ¿Que información debe proporcionar la resolución del problema? La respuesta que obtenga aquí indicara los resultados deseados o las salidas del Problema. b) ¿Que datos se necesitan para resolver el problema? Aquí indicara que datos se proporcionaran o las entradas del Problema. Ejemplo 2.1 Leer el radio de un círculo y calcular su superficie y la longitud de la circunferencia. ANALISIS: Los Datos de Entrada Las Datos Salida : Superficie del Circulo – Circunferencia del : Radio del Circulo (Tipo de Datos REAL) Circulo Variables : RADIO, AREA, CIRCUNFERENCIA (Tipo REAL) 47 Lic. Elmer Alberto León Zárate 2.2 DISEÑO DEL ALGORITMO La información o dato proporcionada al algoritmo constituye su entrada y la información producida por el algoritmo constituye su Salida. Ejemplo 2.2 Leer el radio de un círculo y calcular su superficie y la longitud de la circunferencia. Inicio Ingresar valor de la Radio del círculo Calcular Superficie Superficie 3.141592 * Radio ^ 2 Calcular Circunferencia Circunferencia 3.141592 * Radio * 2 Imprimir el Valor de la Superficie Imprimir el Valor de la Longitud de la Circunferencia Fin 2.3 DIAGRAMA DE FLUJO (FLOWCHART) Definición 2.1 Un DF es un Diagrama que utiliza los símbolos (cajas) y que tiene los pasos del Algoritmo escritos en esas cajas unidas por una flecha denominadas líneas de flujo que indican la secuencia en que se deben ejecutar. 48 CAPITULO II: Herramientas de programación SÍMBOLOS PRINCIPALES DE UN DIAGRAMA DE FLUJO SIMBOLO DESCRIPCION TERMINAL: Representa el inicio y el Final de un programa ENTRADA/SALIDA: Todo tipo de Introducción de Datos en la memoria desde entrada (Leer) o Salida (imprimir) de información. PROCESO: Cualquier tipo de operación que pueda originar cambio de valor almacenada en la memoria, operaciones aritméticas, etc. DECISIÓN: Indica operaciones Lógicas o de acuerdo a la Comparación entre los datos. DECISIÓN MULTIPLE: de comparación que se tenga resultara una función. CONECTOR: enlaza 2 o más partes del organigrama. LINEA DE FLUJO: indica el sentido de ejecución de las operaciones. LINEA CONECTORA: símbolos. Sirve para unir dos LLAMADA A LA SUBRUTINA: Es un modulo independiente del programa principal, realiza una tarea determinada y retorna al programa principal. 49 Lic. Elmer Alberto León Zárate Ejemplo 2.3 Realizar el Diagrama de Flujo de la Suma de todos los números pares entre 2 y 100. Ilustración 2.1 Diagrama de flujo de suma de pares 50 CAPITULO II: Herramientas de programación 2.4 PSEUDOCODIGO Definición 2.2 Es un lenguaje de descripción del algoritmo, esto es la traducción de un problema a un lenguaje de Programación escogido por el usuario. La ventaja de un Pseudocódigo es que al usarlo en la planificación de un programa, el programador se puede concentrar en la Lógica y en las estructuras de control y no preocuparse de las reglas de un Lenguaje de Programación. Todo algoritmo empieza con la palabra Inicio y termina con la Palabra Fin. Entre estas palabras se escriben las instrucciones o acciones por línea. Ejemplo 2.4 Pseudocódigo para determinar e imprimir el mayor valor de DOS números ingresados. Inicio Leer A, B SI el valor A es mayor que el valor de B HACER Establecer MAYOR con el valor A DE LO CONTRARIO Establecer MAYOR con el valor B FIN_SI Visualizar MAYOR Fin Ejemplo 2.5 Pseudocódigo para calcular la suma de 1+2+3+....100 Inicio Establecer CONTADOR a 1 Establecer SUMA a 0 51 Lic. Elmer Alberto León Zárate Mientras CONTADOR <= 100 hacer Sumar CONTADOR a SUMA Incrementar CONTADOR en 1 Fin de Mientras Visualizar SUMA Fin 2.5 RELACION DE EJERCICIOS: Realizar él ANALISIS DIAGRAMA DE FLUJO PSEUDOCODIGO Para los siguientes Problemas: 1. Definir un algoritmo para hallar la suma de los números menores de 50 elevados al cuadrado. 2. Definir el algoritmo para que encuentre la media Aritmética de un conjunto de números hasta 100. 3. Definir el Algoritmo para contar los pares e impares hay en una relación de 10 números enteros ingresados. 4. Definir un Algoritmo para promediar la entrada de 5 Notas ingresadas eliminando la Nota mas baja que tenga el Alumno. 5. Definir un Algoritmo para encontrar el Promedio de 4 Notas ingresadas aumentado un Nota cualquiera ingresada después de las 4 notas. 52 CAPITULO II: Herramientas de programación 6. Definir un Algoritmo para escribir un programa que pida el ingreso de N números que calcule su promedio. 7. Definir un Algoritmo que ingrese las edades de tres personas y contar cuantos son mayores y menores de Edad. 8. Definir un Algoritmo que ingrese un monto por capital a una cuenta, si el Capital se excede en 1000 Soles aumentar en 5% al Capital de lo Contrario reducir el 2% al Capital. 9. Definir el Algoritmo para hallar el elevado enésimo de un número cualquiera. 10. Definir el algoritmo para ordenar ascendentemente el ingreso de 20 números enteros positivos. 53 CAPITULO III PROGRAMACION ESTRUCTURADA La programación estructurada hace los programas más fáciles de escribir, verificar, leer y mantener. Los programas deben estar dotados de una estructura que puede ser: Secuenciales Selectivas Repetitivas 3.1 ESTRUCTURAS SECUENCIALES Definición 3.1 Es aquella en la que la una instrucción sigue a otra en secuencia. Las tareas se suceden de tal modo que la salida de una es la entrada de la siguiente y así sucesivamente hasta el final del proceso. Ilustración 3.1 Estructura Secuencial INICIO < INSTRUCCIÓN 1 > < INSTRUCCIÓN 2 > .................................. < INSTRUCCIÓN n > FIN 54 CAPITULO III: Programación estructurada 3.2 ESTRUCTURAS SELECTIVAS Definición 3.2 En las estructuras selectivas se evalúa una condición y en función del resultado de la misma se realiza una opción u otra. Las condiciones se especifican usando expresiones lógicas. Las estructuras selectivas pueden ser: Simples Dobles Múltiples 3.2.1 ESTRUCTURA SIMPLE (SI-ENTONCES) Ejecuta una determinada acción cuando se cumple una condición. Tener en cuenta: Si la condición es verdadera, entonces ejecuta la acción o acciones. Si la condición es Falsa, entonces no hacer nada. Ilustración 3.2 Estructura Selectiva Simple 55 Lic. Elmer Alberto León Zárate PSEUDOCODIGO SI CONDICION ENTONCES ACCION 1 ACCION 2 FIN_SI PSEUDOCODIGO EN INGLES IF CONDICION THEN ACCION 1 ACCION 2 ENDIF 3.2.2 ESTRUCTURA DOBLE (SI ENTONCES SINO) La alternativa doble necesita una estructura que permita elegir entre dos opciones o alternativas posibles en función de cómo se cumpla la condición dada. Ilustración 3.3 Estructura Selectiva Simple 56 CAPITULO III: Programación estructurada PSEUDOCODIGO SI CONDICION ENTONCES ACCION VERDADERAS SINO ACCIONES FALSAS FIN_SI PSEUDOCODIGO EN INGLES IF CONDICION THEN ACCION VERDADERAS ELSE ACCIONES FALSAS ENDIF 3.2.3 ESTRUCTURA MULTIPLE (SEGÚN SEA-CASO DE) La estructura de decisión múltiple evaluara una expresión que podrá tomar N valores distintos 1, 2, 3,4,..n. Según se escoja uno de estos valores en la condición, se realizara una de las acciones. PSEUDOCODIGO SEGÚN SEA CONDICION HACER Expresión 1 : Acción 1 Expresión 2 : Acción 2 Expresión 3 : Acción 3 SINO : Acción FIN_SEGÚN 57 Lic. Elmer Alberto León Zárate PSEUDOCODIGO EN INGLES CASE CONDICION OF Expresión 1 : Acción 1 Expresión 2 : Acción 2 Expresión 3 : Acción 3 OTHERWISE // ELSE Action END_CASE OBSERVACIONES DE LA ALTERNATIVA MULTIPLE - Algunos lenguajes de programación delimitan las acciones para las instrucciones compuestas con las palabras Inicio Fin (pascal Begin End). - Los valores que toman las expresiones no siempre serán consecutivos o únicos, también se pueden considerar rangos de constantes numéricas o de caracteres. Según sea expresión hacer 2, 4, 6,8: escribir números pares 1, 2, 3, 5,7: escribir números impares Fin_segun 3.3 ESTRUCTURAS REPETITIVAS Definición 3.3 Son las estructuras que repiten una secuencia de instrucciones un número determinado de veces y se denominan Bucles. Repite la misma secuencia de acciones un número determinado de veces. 58 CAPITULO III: Programación estructurada 3.3.1 ESTRUCTURA MIENTRAS-HACER (WHILE - DO) Permite al programa llevar a cabo la ejecución secuencial de un proceso mientras la condición establecida se cumpla o sea verdad. Ilustración 3.4 Estructura Repetitiva Mientras-Hacer PSEUDOCODIGO MIENTRAS <CONDICION> HACER INSTRUCCIONES VERDADERAS FIN_MIENTRAS PSEUDOCODIGO EN INGLES WHILE <CONDICION> DO INSTRUCCIONES VERDADERAS ENDWHILE DO WHILE <CONDICION> INSTRUCCIONES VERDADERAS ENDDO 59 Lic. Elmer Alberto León Zárate 3.3.2 ESTRUCTURA REPETIR – HASTA (REPEAT - UNTIL) Permite al programa llevar a cabo la ejecución secuencial de un proceso mientras que la condición establecida no se cumpla. Cuando la condición se cumpla se continuara la ejecución del programa después de HASTA. Ilustración 3.5 Estructura Repetitiva Repetir - Hasta ACCIONES O INSTRUCCIONES FALSO CONDICION VERDADERO PSEUDOCODIGO REPETIR INSTRUCCIONES HASTA <CONDICION> PSEUDOCODIGO EN INGLES REPEAT INSTRUCCIONES UNTIL <CONDICION> 60 CAPITULO III: Programación estructurada 3.3.3 ESTRUCTURA DESDE–HACER O PARA–HACER (FOR.TO.DO) Permite ejecutar un bloque de instrucciones un numero especifico de veces, luego se continuara la ejecución del programa de FIN_PARA. Ilustración 3.6 Estructura Repetitiva Para - Hacer PSEUDOCODIGO PARA VARIABLE = VALOR INICIAL HASTA VALOR FINAL HACER INSTRUCCIONES FIN_PARA PSEUDOCODIGO EN INGLES FOR I = 1 TO VALOR FINAL DO INSTRUCCIONES ENDFOR 61 Lic. Elmer Alberto León Zárate 3.4 RELACION DE EJERCICIOS: 1. Realizar el ingreso de 4 notas para un alumno y promediarlos. 2. Calcular el factorial de un numero N 3. Ingrese un número entero y genere la tabla de multiplicar de dicho número. 4. Calcular: 1 x x2 n 2! n! 5. Calcular la suma de los N números enteros positivos y terminar con número negativo. 6. Sumar los números enteros de 100 a 200 mediante a) Estructura Repetir b) Estructura Mientras c) Estructura Desde 7. Se desea leer las calificaciones de una clase y contar él número total de aprobados. 8. Representar las siguientes condiciones en forma de alternativa simple, en pseucodigo y diagrama de flujo: Colocar un mensaje a cada uno. para los mayores de edad para los menores de edad para los mayores de edad dentro de 2 años para los desaprobado en su promedio para los aprobados en su 4 nota para numero par para un numero impar para los mayores de 30 años por su fecha de nacimiento 9. Representar las siguientes condiciones en forma de alternativa compuesta en pseucodigo y diagrama de flujo: 62 CAPITULO III: Programación estructurada Colocar un mensaje a cada uno. para los mayores y menores de edad para los aprobados y desaprobados en su promedio para numero par e impar para los mayores y menores de 30 años 10. Hacer su diagrama de flujo y pseudocódigo para la suma de los N primeros números enteros cuadrados 12+22+32...n2 11. Hacer su diagrama de flujo y pseudocódigo para calcular la planilla de una empresa, se ingresa el número de los empleados y para cada uno de ellos se ingresa el número de horas y el salario por hora, se calcula el pago y se acumula para el total de la planilla. 12. Hacer su diagrama de flujo y pseudocódigo para un restaurant ofrece un descuento del 10% para consumos de hasta 30 nuevos soles, un descuento de 20% para consumos mayores y para ambos casos aplica un impuesto del 15%. Determinar el importe a pagar por lo consumido. 13. Hacer su diagrama de flujo y pseudocódigo para determinar el mayor valor ingresado de 5 números enteros. 14. Hacer su diagrama de flujo y pseudocódigo para leer 100 números ingresados. Determinar la media de los números positivos y la media de los números negativos. 15. Pseudocódigo que pida el ingreso de un número para el día de la semana e indique a que día se refiere. 16. Se desea convertir las calificaciones A,B,C,D,E a calificaciones numéricas 14,13,12,11,10 respectivamente 17. Pseudocódigo que nos indique si un numero entero considerar los negativos. 63 tiene 1, 2,3 o más dígitos Lic. Elmer Alberto León Zárate 18. Realizar un Pseudocódigo que solo permita el ingreso de números enteros y cuando ingrese un impar se termina el ingreso. 19. Desarrollar un Pseudocódigo que permita ingresar los datos de N alumnos. Para cada alumno se ingresara su nombre y 6 notas. Calcular el promedio para cada uno de estos alumnos. El proceso terminara cuando se ingrese la palabra FIN como un nombre de un alumno. Al final mostrara el promedio general de todos los alumnos. 20. Realizar un Pseudocódigo que permita el ingreso de una clave de acceso, si la clave ingresada es correcta, entonces mostrar el mensaje “BIENVENIDO AL SISTEMA”, en caso contrario “CLAVE INCORRECTA”, se debe permitir máximo 3 intentos. 64 CAPITULO IV ESTRUCTURAS DE DATOS 4.1TIPOS DE DATOS Definición 4.1 El Tipo de Datos de una variable es el conjunto de valores que dicha variable puede asumir Todos lo Lenguajes de Programación de alto nivel tienen incorporados Tipos de Datos básicos tales como enteros, reales, caracteres y lógicos. El tipo de Datos de una variable en un programa para un lenguaje de alto nivel requiere de una Declaración de Tipo la cual tiene 2 objetivos: 1. Separar el espacio de memoria que los valores de la variable requieran. 2. Interpretar correctamente el contenido de la memoria a la que la variable acceda. Es decir si el tipo de datos separado en memoria es entero todos los datos que se almacenen serán enteros. 4.1.1 DATOS NUMERICOS Definición 4.2 Es el conjunto de los valores numéricos. Estos pueden representarse en dos formas distintas: TIPO NUMERICO ENTERO (INTEGER ) TIPO NUMERICO REAL (REAL) 65 Lic. Elmer Alberto León Zárate A) ENTEROS Definición 4.3 El tipo entero es un subconjunto finito de los números enteros. Los enteros son números completos, no tienen componentes fraccionarios o decimales y pueden ser negativos o positivos. Ejm: 5, -5 Los números enteros máximos y mínimos de una computadora suelen ser –32768 a +32767, los números enteros fuera de este rango no se suelen representar como números enteros, sino como reales, en algunos lenguajes de Programación hay excepciones. B) REALES Definición 4.4 El tipo real consiste en un subconjunto de los números reales. Los números reales siempre tienen un punto decimal y pueden ser positivos o negativos. Un número real consta de un entero y una parte decimal. Ejm: 0.08 3739.41 0.09 –52.321 En aplicaciones científicas se requiere una representación especial para manejar números muy grandes, como la masa de la tierra o muy pequeños como la masa del electrón. Una PC solo puede representar un número fijo de dígitos. Este numero puede variar de una maquina con otra, siendo ocho dígitos un numero típico. Este límite provocara problemas para representar algunos números como: 9876543210 0.00000000387 Existe un tipo de representación denominado Notación exponencial o científica y que se utiliza para números muy grandes o muy pequeños. Así: 66 CAPITULO IV: Estructuras de datos Ejemplo 4.1 Si el numero fuera 123456700000000000000 (14) Descomponer en Cifras 123 456 700 000 000 000 000 Y luego en forma de potencia de 10 1.234567 * 1020 Ejemplo 4.2 Si el número fuera 0.0000000000123456 Y luego en forma de potencia de 10 1.23456 * 10-11 4.1.2. DATOS LOGICOS (BOOLEANOS) Definición 4.5 El tipo Lógico es aquel que solo puede tomar uno de dos valores. Verdadero (TRUE) False (FALSE) Este tipo de datos se utiliza para representar las alternativas (SI/NO) a determinadas condiciones. Por ejemplo cuando se pide determinar si el valor es par la respuesta será Verdadera y Falsa según sea el valor del número. 4.1.3 DATOS TIPO CARÁCTER Definición 4.6 Es el conjunto finito y ordenado de valores de caracteres que la computadora reconoce, un dato tipo carácter contiene un solo carácter. Los caracteres que reconocen las diferentes computadoras no son estándar, sin embargo, la mayoría reconoce los siguientes caracteres alfabéticos y numéricos: CARACTERES ALFABETICOS: (A..... Z) (a..... z) CARACTERES NUMERICOS: (1, 2, 3.... 9, 0) 67 Lic. Elmer Alberto León Zárate CARACTERES ESPECIALES: (+ - * / ^, < > $...) 4.2 ESTRUCTURA DE DATOS Definición 4.7 Es una colección de datos que pueden ser caracterizados por su organización y las operaciones que se definan en ella. Estáticos: arreglos, registro, archivo, conjunto, cadena. Dinámicos: Listas, Pilas, Colas, Listas enlazadas, árboles. 4.2.1 ESTRUCTURA DE DATOS ESTATICAS A) ARREGLOS Definición 4.8 Es una estructura de Datos utilizado para almacenar datos de un mismo tipo.Un arreglo se define como el conjunto de datos finito, ordenado y homogéneo. 1.- ARREGLO UNIDIMENSIONAL Definición 4.9 Un arreglo unidimensional es una secuencia de datos finitos, que todos sus elementos son del mismo tipo. Los elementos del arreglo se determinan a través de un conjunto de índices. Nombre [1] Nombre [2] Nombre [3] ... Nombre [n] Ejemplo de Arreglo Unidimensional de N elementos Notación: Nombre (1), nombre (2)... Nombre [1], nombre [2]... 68 CAPITULO IV: Estructuras de datos Observación 4.1 El arreglo unidimensional tiene un solo nombre de variable que representa a todos los elementos. Observación 4.2 En algunos casos el índice del arreglo empieza en 0 ó 1 Observación 4.3 El índice indica la posición ordenada de cómo se ingresan los datos Observación 4.4 El número de elementos de un vector se denomina RANGO DEL VECTOR Los vectores se almacenan en memoria central de la Computadora: MEMORIA NUMERO [1] DIRECCION N NUMERO [2] DIRECCION N+1 NUMERO [3] DIRECCION N+2 NUMERO [50] DIRECCION N+49 69 Lic. Elmer Alberto León Zárate El valor mínimo permitido de un vector se denomina LIMITE INFERIOR del vector y el valor máximo permitido se denomina LIMITE SUPERIOR. Cada elemento de un vector se puede procesar como si fuese una variable simple al ocupar una posición de memoria. NUMERO [10] 100 NUMERO [20] ‘DIEZ’ La salida seria ESCRIBIR (NUMERO [10]) NOTACIONES ALGORITMICAS PARA VECTORES UNIDIMENSIONALES EN ALGORITMOS Ejemplo 4.3 En pascal: VAR NOMBRE_DE_LA_VARIABLE: ARRAY [1...10] OF TIPO DE DATOS; Ejemplo 4.4 En Visual Basic: DIM NOMBRE_DE_LA_VARIABLE (NUMERO) AS TIPO DE DATOS DIM NOMBRE (VALOR INICIAL TO VALOR FINAL) AS TIPO DE DATOS Ejemplo 4.5 Dim contadores (5) as integer Dim contadores (1 to 5) as string 70 CAPITULO IV: Estructuras de datos Dim sumas (100 to 200) as long // (entero largo) OPERACIONES BASICAS CON VECTORES O ARREGLOS ESCRIBIR (NUMERO [10]) Visualiza el valor Numero con índice 10 NUMERO [4] 50 Almacena el valor 50 en NUMERO [4] SUMANUMERO [1]+NUMERO[5] Almacena la suma de NUMERO[1] y NUMERO[2] en la variable SUMA. SUMASUMA+NUMERO[5] Añade en la variable SUMA el valor de NUMERO[5] X[5] X[5] + 3.5 Suma 3.5 a X[5] X[11] X[2] + X[4] Almacena la suma de X[2] y X[4] Observacion 4.5 Los Arreglos pueden tener por índice: x[1], x[2], x[3]... x[n] empieza en 1 x[0], x[1], x[2] ... x[n-1] empieza en cero x[-3], x[-2], x[-1], x[+0], x[+1], x[+2], x[+3] limite –3 y +3 OPERACIONES CON VECTORES (ARREGLOS) Las operaciones que se puede realizar con vectores durante el proceso de resolución de un problema son: a) ASIGNACION La asignación tiene la siguiente forma: NOTAS [ 14 ] 20 Asigna El Valor 20 Al Elemento 14 Del Arreglo 71 Lic. Elmer Alberto León Zárate Pero si se desea asignar elementos a un vector, se debe utilizar estructuras Repetitivas (desde, mientras o repetir) o selectivas como él (Si entonces) Ejemplo 4.6 Si se introducen los valores 10,11,10 mediante asignaciones A[1] 10 A(1) 10 A[2] 11 A(2) 11 A[3] 10 A(3) 10 b) LECTURA Y ESCRITURA Normalmente la Lectura y escritura se realizan con estructuras repetitivas como el FOR (para o desde), las instrucciones simples se representan así: Leer ( A [1] ) Ingrese un valor para la posición 1 del arreglo A Escribir ( A [2] )Imprimir el valor de la posición 2 del arreglo A I=19 Leer ( A [i] ) Ingrese un valor para la posición 19 i=1, i=2, i=3 Escribir (A[i]) Imprime 3 valores si tuviera una Función Repetitiva. c) RECORRIDO Se puede acceder a los elementos de un Vector o Arreglo para introducir Datos (leer) o imprimir su contenido (escribir). A la operación de efectuar una acción general sobre todos los elementos del arreglo se la denomina RECORRIDO DEL VECTOR. 72 CAPITULO IV: Estructuras de datos Ejemplo 4.7 Pseudocódigo para permitir el INGRESO de 5 números Inicio PARA índice=1 HASTA 5 HACER LEER números [índice] FIN_PARA Fin Ejemplo 4.8 Pseudocódigo para IMPRIMIR los 5 números ingresados anteriormente Inicio PARA índice 1 HASTA 5 HACER ESCRIBIR números[indice] FIN_PARA Fin Ejemplo 4.9 Pseudocódigo para ingresar 20 números utilizando MIENTRAS O REPETIR, CONTADORES. INICIO Índice 1 MIENTRAS Índice < 21 hacer LEER número[ índice ] 73 Lic. Elmer Alberto León Zárate Índice índice + 1 FIN_MIENTRAS FIN d) AÑADIR Un arreglo llamado PROMEDIO se ha dimensionado a seis elementos pero solo han sido llenados cuatro valores, se podrán añadir dos elementos más con una simple operación de asignación. PROM [1] PROM [2] PROM [3] PROM [4] 10 11 20 11 PROM [5] PROM [6] En la realización del Pseudocódigo: PROM [5] 20 PROM [6] 10 e) INSERTAR Coloca uno o más elementos en una determinada posición del arreglo. Ejemplo 4.10 Pseudocódigo para el arreglo llamado LETRAS de 8 elementos, Agregar el elemento CC en la posición LETRAS[3] LETRAS[1] LETRAS[2] LETRAS[3] LETRAS[4] LETRAS[5] AA BB DD EE FF INICIO //ALGORITMO DE INGRESO DE DATOS MAXIMO HASTA 6 ELEMENTOS POSICION 3 74 CAPITULO IV: Estructuras de datos INDICE CANTIDAD DE ELEMENTOS LLENOS // INDICE = 6 MIENTRAS INDICE > = POSICION HACER LETRAS [INDICE + 1] LETRAS [INDICE] INDICE INDICE – 1 FIN_MIENTRAS LEER LETRAS [INDICE] FIN f) BORRAR La operación de borrar provoca el movimiento hacia arriba de los elementos inferiores. 2.- ARREGLO DE VARIAS DIMENSIONES Los Arreglos no Unidimensionales se dividen en 2 grupos: ARREGLOS BIDIMENSIONALES ARREGLOS MULTIDIMENSIONALES a) ARREGLOS BIDIMENSIONALES: Definición 4.10 Se considera como un vector de vectores, es un conjunto de elementos todos del mismo tipo el cual el orden de los elementos es significativo y en el que se necesita especificar los subíndices para poder identificar cada uno de los elementos del arreglo. FILA 1 10 10 10 10 FILA 2 11 11 11 11 FILA 3 12 12 12 12 FILA 4 13 13 13 13 COLUMNA 1 COLUMNA 1 COLUMNA 3 COLUMNA 4 75 Lic. Elmer Alberto León Zárate Nombre del Arreglo : NOTAS Cantidad de Filas : 4 Cantidad de Columnas : 5 Total de elementos : 20 Los elementos de un Arreglo Bidimensional tienen la siguiente referencia: NOMBRE_DE_LA_MATRIZ [ I , J ] Donde: I es el elemento que representa a las filas y J representa la Columnas. En Notación Algorítmica se Representa: NOMBRE_DE_LA_MATRIZ[ I..N,J..N] NOTACIONES ALGORITMICAS PARA VECTORES BIDIMENSIONALES En pascal : VAR NOMBRE_DE_LA_VARIABLE: ARRAY [1..10,1..5] OF TIPO DE DATOS; ALGORITMO DE LLENADO DE DATOS DEL ARREGLO BIDIMENSIONAL INICIO PARA INDICE_FILA NUMERO INICIAL HASTA NUMERO FINAL HACER PARA INDICE_COLUMNA NUMERO INICIAL HASTA NUMERO FINAL HACER LEERDATOENNOMBRE_DEL_ARREGLO[INDICE_FILA,INDICE_COLUMNA] FIN_PARA FIN_PARA FIN 76 CAPITULO IV: Estructuras de datos b) ARREGLOS MULTIDIMENSIONALES Puede ser definido de tres, cuatro o más dimensiones. Ejemplo 4.11 Un arreglo de tres dimensiones puede tener: - 5 Cursos de un alumno - Tipo de sexo - 6 ciclos años B) REGISTROS Definición 4.11 Es una colección de información, normalmente relativa a una entidad particular. Un registro es una colección de campos lógicamente relacionado, que pueden ser tratados como una unidad por algún programa. Observación 4.6 Este tipo de arreglos se caracterizan por tener un solo índice. Observación 4.7 A los espacios reservados para cada numeración se les conoce con el nombre de CAMPOS y a la disposición consecutiva de campos se denomina REGISTRO. Observación 4.8 El acceso a los datos individuales de un elemento se realiza de dos formas: PRIMERO : Utilizando un punto antes del campo A [1].código abc0001 77 Lic. Elmer Alberto León Zárate A [1].Nombre Oscar Ibáñez A [1].Promedio 17.4 A [1].Edad 29 Ingresar 5 datos al registro declarado: PARA INDICE 1 HASTA 5 HACER INICIO LEER A[INDICE].CODIGO LEER A[INDICE].NOMBRE LEER A[INDICE].PROMEDIO LEER A[INDICE].EDAD FIN FIN_PARA SEGUNDO : Utilizando la palabra CON (WITH) CON REGISTRO A[3] HACER INICIO ESCRIBIR CODIGO ESCRIBIR NOMBRE ESCRIBIR PROMEDIO ESCRIBIR EDAD FIN Ingresar 5 datos al registro declarado: PARA INDICE 1 HASTA 5 HACER CON REGISTRO A[INDICE] HACER 78 CAPITULO IV: Estructuras de datos INICIO LEER CODIGO LEER NOMBRE LEER PROMEDIO LEER EDAD FIN_CON FIN_PARA DECLARACION DE UN REGISTRO DE DATOS EN UN PSEUDOCODIGO // DEFINIR ESTRUCTURA DE REGISTROS CAMPO 1 : TIPO DE DATOS CAMPO 2 : TIPO DE DATOS CAMPO 3 : TIPO DE DATOS CAMPO 4 : TIPO DE DATOS // DEFINIR EL ARREGLO DE REGISTROS VARIABLE_ARREGLO[ 1 . . NUMERO_MAXIMO] DE REGISTRO DECLARADO // EN LAS VARIABLES NOMBRE_VARIABLE : VARIABLE_ARREGLO C) ARCHIVOS Definición 4.12 Un archivo es un conjunto ordenado de datos que tienen entre sí una relación lógica y están almacenados en un soporte de información adecuado para la comunicación con el computador. En un archivo se almacena información referente a un mismo tema de una forma estructurada con el fin de manipular los datos de una manera individual. Un archivo está formado por estructuras de datos más simples denominados 79 Lic. Elmer Alberto León Zárate registros. Todos los registros de un archivo son del mismo tipo, es decir, un archivo está formado por un conjunto de registros homogéneos. Cada registro está formado por campos que contienen información referente a un elemento o característica en particular dentro del archivo. Además un registro puede tener un campo clave cuyo valor sirve para identificar de forma única el registro, y por tanto, dicho valor no puede aparecer repetido en otro registro diferente. CLASIFICACIÓN DE LOS ARCHIVOS SEGÚN SU USO Archivos permanentes.- Contienen información que varía poco a lo largo del tiempo. Archivos de movimientos.- En ellos se almacena la información que se utilizará para actualizar los archivos maestros. Sus registros denominados movimientos son de tres clases: altas, bajas y cambios. Archivos de maniobra o trabajo.- Tienen una vida limitada, normalmente igual a la duración de la ejecución de un programa y se utilizan como auxiliares de las anteriores. ORGANIZACIÓN DE ARCHIVOS Al diseñar un archivo, dependiendo del uso que se va a hacer del mismo y del soporte utilizado, se pueden elegir diferentes maneras de organizar sus registros, siendo las principales organizaciones las siguientes: - Secuencial - Directa o aleatoria - Secuencial indexada 80 CAPITULO IV: Estructuras de datos 1. ORGANIZACIÓN SECUENCIAL Definición 4.13 Es aquélla en la cual los registros ocupan posiciones consecutivas de memoria, y sólo se puede acceder a ellos de uno en uno a partir del primero. En un archivo secuencial no se pueden hacer operaciones de escritura cuando se está leyendo, ni operaciones de lectura cuando se está escribiendo. Por otro lado, para actualizarlos es preciso crear nuevos archivos donde se copien los registros que vayan a permanecer, modificados o no, junto con los nuevos. Acceso secuencial Registro 1 Registro 2 Registro 3 Registro 4 Registro 5 2. ORGANIZACIÓN DIRECTA O ALEATORIA Definición 4.14 En un archivo con esta organización, también denominada relativa, las informaciones se colocan y se acceden aleatoriamente mediante su posición, es decir, indicando el lugar relativo que ocupan dentro del conjunto de posiciones posibles. En esta organización se pueden leer y escribir registros, en cualquier orden y en cualquier lugar. Presenta el inconveniente de que es tarea del programador establecer la relación entre la posición que ocupa un registro y su contenido; además puede desaprovecharse parte del espacio destinado al archivo ya que pueden quedar huecos libres entre unos registros y otros. Su principal ventaja es la rapidez de acceso a un registro cualquiera, ya que para ello no es preciso pasar por los anteriores. 81 Lic. Elmer Alberto León Zárate Acceso directo Registro 2 Posición 1 Registro 1 Registro 5 Posición 3 Posición 4 Posición 2 Posición 5 3. ORGANIZACIÓN SECUENCIAL INDEXADA Un archivo con esta organización consta de 3 áreas: Área de índices Área primaria Área de excedentes (overflow) Definición 4.15 El área primaria contendrá los registros de datos, clasificados en orden ascendente por su campo clave. Definición 4.16 El área de índices es un archivo secuencial creado por el sistema, en el que cada registro establece una división (segmento) en el área primaria y contiene la dirección de comienzo del segmento y la clave más alta del mismo. De esta manera, el sistema accede de forma directa a un segmento del área primaria a partir del área de índices, de forma similar a la búsqueda de un capítulo de un libro a partir de su índice. Definición 4.17 El área de excedentes para añadir nuevos registros que no pueden ser colocados en el área primaria cuando se produce una actualización del archivo. Presenta la ventaja de un rápido acceso por medio de la clave del registro y además el sistema se encarga de relacionar la posición de cada registro con su contenido por medio del área de índices. 82 CAPITULO IV: Estructuras de datos Los inconvenientes que presenta son la necesidad de espacio adicional para el área de índices y el desaprovechamiento de espacio que resulta de quedar huecos intermedios libres después de sucesivas actualizaciones. Área de índices 01 04 AC 06 CH GF Área primaria AA - AB - AC 01 02 03 - BC 04 - CH - 05 FA - GF - 06 Área de excedentes FM - AN - OPERACIONES SOBRE ARCHIVOS CREACIÓN Definición 4.18 Consiste en la escritura o grabación en un medio de almacenamiento de todos los registros que van a formar el archivo COPIA Definición 4.19 Consiste en crear un nuevo archivo como duplicación de otro existente. CONSULTA Definición 4.20 Se realiza para obtener el contenido de uno o varios registros. En muchos casos irá precedida por la búsqueda de los mismos. 83 Lic. Elmer Alberto León Zárate CLASIFICACIÓN Definición 4.21 Es la operación consistente en reubicar los registros de tal forma que queden ordenados con respecto a los valores de un campo que denominamos clave de ordenación. CONCATENACIÓN Definición 4.22 Dados dos archivos con registros de igual estructura, se trata de obtener uno solo en que figuren todos los registros del primero y a continuación todos los del segundo. INTERSECCIÓN Definición 4.23 Dados dos archivos de igual estructura se trata de obtener otro en el que figuren lo registros comunes a ambos. FUSIÓN O MEZCLA Definición 4.24 A partir de dos archivos de igual estructura clasificados por un mismo campo, se obtiene como resultado un archivo que contiene los registros de ambos y que mantiene la ordenación. PARTICIÓN Definición 4.25 Consiste en descomponer un archivo en dos, atendiendo a alguna característica de sus registros. 84 CAPITULO IV: Estructuras de datos ACTUALIZACIÓN Definición 4.26 Es la operación de modificar un archivo por medio de un archivo de movimientos, conteniendo altas, bajas y modificaciones que hay que realizar sobre el archivo maestro. REORGANIZACIÓN Definición 4.27 Reubica los registros de un archivo que ha sufrido actualizaciones, para ocupar los posibles huecos libres intermedios resultantes de bajas de registros para optimizar la ocupación de la memoria, liberando la que no estaba aprovechada. BORRADO Definición 4.28 Eliminación total del archivo, cuando ya no se necesite, dejando libre la memoria del dispositivo de almacenamiento utilizado. D) CONJUNTOS (SET) Supongamos que debemos construir un programa Pascal que cuente el número de vocales no acentuadas que aparecen en un texto. Se nos podría ocurrir inmediatamente, ir tomando el texto carácter a carácter, aplicarle la función UPCASE y decidir si se trata de alguno de los caracteres 'A', 'E', 'I', 'O','U'. En este caso, incrementaríamos un contador y pasaríamos a analizar el siguiente carácter; en caso contrario, pasaríamos directamente al siguiente carácter. Ejemplo 4.12 Codificacion en Pascal FOR C:=1 TO LENGTH (Texto) DO 85 Lic. Elmer Alberto León Zárate BEGIN CH: =UPCASE (Texto[C]); IF (CH='A') OR (CH='E') OR (CH='I') OR (CH='O') OR (CH='U') THEN CONTADOR:=CONTADOR +1; END; Sin embargo, sería más cómodo aislar el conjunto de caracteres 'A', 'E', 'I', 'O' y 'U' y, para cada carácter del texto, decidir si pertenece o no al conjunto de vocales: Ejemplo 4.13 Para cada carácter Texto[C] .... Si UPCASE (Texto[C]) pertenece a VOCALES, entonces .. Incrementar contador de vocales, En caso contrario, no realizar ninguna acción. ¿ Se puede hacer esto en Turbo Pascal ? La respuesta es sí, mediante el tipo de dato estructurado CONJUNTO (SET en inglés). CONSTANTES Y VARIABLES DE TIPO SET Podemos definir CONJUNTOS particulares de elementos de cualquiera de los siguientes tipos base: BYTE CHAR BOOLEAN Abstractos (de 1 byte) Es decir, podemos aislar conjuntos de elementos a partir de cualquier tipo ordinal de tamaño 1 byte. 86 CAPITULO IV: Estructuras de datos Para definir una constante de tipo CONJUNTO, después de la palabra CONST, el identificador de la constante y el signo igual, se escriben todos los elementos del tipo base que queremos que constituyan el conjunto, separados por comas y encerrados entre corchetes. Ejemplo 4.14 Conjuntos constantes (constantes de tipo SET) válidos serían: CONST VOCALES = ['A','E','I','O','U']; PARES = [2,4,6,8,0]; De esta manera, con el identificador VOCALES hemos aislado un conjunto de elementos del tipo base CHAR, y con el identificador PARES lo hemos hecho del tipo base BYTE. Se obtendría el mismo resultado si la especificación de los elementos constituyentes se realizase en distinto orden; Ejemplo 4.15 CONST VOCALES = ['U','E','O','A','I']; PARES = [0,2,4,6,8]; Si en la definición de un conjunto, los elementos, o algunos de los elementos constituyentes son consecutivos, se puede utilizar una notación similar a la de los subrangos. Ejemplo 4.16 CONST HEXADIG = ['A'..'F','0'..'9']; NUMEROS = [0..100,125]; HEXADIG define un conjunto de 16 elementos del tipo base CHAR y NUMEROS uno de 102 elementos del tipo BYTE. 87 Lic. Elmer Alberto León Zárate Para declarar variables de tipo CONJUNTO, después de la palabra VAR, el identificador de la variable y los dos puntos, se escriben las palabras reservadas SET OF seguidas del identificador del tipo base o subrango del mismo. Así, VAR LETRAS : SET OF CHAR; NUMERO: SET OF BYTE; MAYUS : SET OF 'A'....’Z'; DECEN : SET OF 10...99; BOOLE : SET OF BOOLEAN; Serían declaraciones válidas de variables de tipo SET. LETRAS es una variable que podrá contener cualquier conjunto de caracteres; NUMERO podrá contener cualquier conjunto de números que pertenezcan al rango 0..255; MAYUS podrá contener cualquier conjunto de caracteres pertenecientes al rango 'A'..'Z', DECEN cualquier conjunto de números pertenecientes al rango 10..99 y BOOLE cualquier subconjunto del conjunto {FALSE,TRUE}. Como ocurre con todas las variables en Pascal, cuando se declaran las variables de tipo SET no contienen ningún conjunto concreto: podemos decir que están vacías. Declarar en un programa una variable de tipo SET OF CHAR, por ejemplo, significa disponer de una estructura de datos capaz de contener cualquier subconjunto del tipo CHAR; desde el conjunto vacío (empty set, en inglés) hasta el conjunto completo. La carga con un conjunto concreto de elementos de una variable de tipo SET, se realiza con la instrucción de asignación. Así, las variables declaradas anteriormente se podrían cargar Ejemplo 4.17 LETRAS := ['A','E','I','O','U']; NUMERO := [1..50,75,91]; 88 CAPITULO IV: Estructuras de datos MAYUS DECEN := ['A','B','S']; := [10,20,30,40,50,60,70,80,90]; BOOLE := []; { conjunto vacío } Como hemos dicho, el tipo base no puede tener más de 256 valores posibles y los valores ordinales de los valores menor y mayor del tipo base deben estar en el rango 0..255. Por esta razón el tipo base de un SET no puede ser de los tipos SHORTINT, INTEGER, LONGINT ni WORD. Igualmente no puede serlo el subrango -100..100, por ejemplo, así como algún tipo abs-tracto con más de 256 valores enumerados. Ya sabemos definir constantes y declarar variables de tipo SET. También es posible, como para otros tipos de datos, definir tipos SET, con TYPE: TYPE NOMBRE = STRING [15]; CALEN = SET OF 1...31; VAR NAME : NOMBRE; MES : CALEN; Por último, podemos también definir constantes con tipo (o variables inicializadas) de tipo SET, de la forma habitual. Ejemplo 4.18 TYPE DIGITOS = SET OF 0..9; CONST DIGIPARES : DIGITOS = [0,2,4,6,8]; VOCALES: SET OF 'A'....’Z' = ['A','E','I','O','U']; CIENTOS : SET OF BYTE = [100,200]; Un gran inconveniente de los datos tipo SET es que no se pueden leer por teclado con READLN ni escribir en pantalla con WRITE/LN. 89 Lic. Elmer Alberto León Zárate OPERADORES RELACIONALES PARA EL TIPO SET Con el tipo SET se pueden utilizar los siguientes operadores binarios de comparación (que por tanto, dan resultado BOOLEAN), con los siguientes significados: OPERADOR OPERACION TIPO DE OPERANDOS = Igualdad de Conjuntos Tipos Set compatibles <> Desigualdad de Conjuntos Tipos Set compatibles <= Subconjunto de Tipos Set compatibles >= Superconjunto de Tipos Set compatibles IN Pertenencia a Operador izd.: cualquier tipo ordinal T Operador der.: Set cuyo tipo base sea compatible con T. Tipos SET compatibles son aquellos que tienen el mismo tipo base o tipos base compatible. Por ejemplo, SET OF CHAR es compatible con SET OF 'A'..'Z', y viceversa, si todos los elementos del primero se encuentran en el rango del segundo. Sin embargo SET OF CHAR no es compatible con SET OF BYTE. Si A y B son SET's compatibles, y T es un valor ordinal de su tipo base, sus comparaciones producen los siguientes resultados: i) A = B : es TRUE si y sólo si A y B contienen exactamente los mismos elementos; en caso contrario resulta FALSE. ii) A <> B : es TRUE si y sólo si A y B no contienen exactamente los mismos elementos; en caso contrario resulta FALSE. iii) A <= B : es TRUE si y sólo si cada miembro de A lo es también de B; i.e., si A está incluí-do en B (A es subconjunto de B). 90 CAPITULO IV: Estructuras de datos iv) A >= B : es TRUE si y sólo si cada miembro de B lo es también de A; i.e., si A incluye a B (A es superconjunto de B). v) T IN A : retorna TRUE cuando el valor del operando de tipo ordinal, T, es un miembro del operando de tipo SET, A; en caso contrario devuelve FALSE. Ejemplos 4.19 Si A = ['a','e','i','o','u']; B = ['a','i','u']; T = 'o', entonces: WRITE (A = B); {FALSE} WRITE (A <> B); {TRUE} WRITE (A <= B); {FALSE} WRITE (A >= B); {TRUE} WRITE (T IN A); {TRUE} WRITE (T IN B); {FALSE} Podemos ya codificar en Pascal el programa, del que hablamos al principio del tema, que cuenta las vocales de un texto, utilizando el tipo SET y el operador IN; por ejemplo, de la siguiente manera: Si TXT es una variable de tipo STRING que hemos cargado por teclado; VO-WELS es la constante tipo SET formada por ['A','E','I','O','U'] y CONT es una variable BYTE que utilizaremos para contar las vocales del texto, tendríamos: FOR K: =1 TO LENGTH (TXT) DO IF UPCASE (TXT [K]) IN VOWELS THEN CONT:=CONT+1; OTROS OPERADORES PARA EL TIPO SET Existen tres operadores binarios, con los símbolos +, - y *, de los operadores aritméticos, que aplicados a operandos de tipos SET compatibles adquieren los siguientes significados: 91 Lic. Elmer Alberto León Zárate OPERADOR OPERACION TIPO DE OPERANDOS + Unión de Conjuntos Tipos Set compatibles - Diferencia de Conjuntos Tipos Set compatibles * Intersección de Conjuntos Tipos Set compatibles El resultado de estas operaciones sigue las reglas de la lógica de conjuntos: si A y B son SET's compatibles, entonces: i) A + B : resulta un conjunto formado por los elementos que están en A, en B o en ambos conjuntos. ii) A - B : resulta un conjunto formado por los elementos que están en A y no están en B. iii) A * B : resulta un conjunto formado por los elementos que están simultáneamente en A y B. Ejemplos 4.20 Si A = ['a','e','i','o','u'] y B = ['a','i','u'], entonces: A + B = ['a','e','i','o','u'] A - B = ['e','o'] A * B = ['a','i','u'] Corresponden a las conocidas UNION, DIFERENCIA e INTERSECCION de conjuntos. E) CADENAS Definición 4.29 Una cadena de caracteres es una secuencia de cero o más símbolos, que incluyen letras del alfabeto, dígitos y caracteres especiales. 92 CAPITULO IV: Estructuras de datos El juego de caracteres: Los Lenguajes de Programación utilizan juego de caracteres para comunicarse con las computadoras. Los códigos de comunicación con las PC son 2: ASCII (American Standard Code for Information Interchange) El código Ascii básico utiliza 7 bits para cada carácter a representar que supone a 128 caracteres distintos, el código Ascii ampliado utiliza 8 bits y en este caso consta de 256 caracteres. El código ASCII se compone de los siguientes tipos de caracteres: Alfabéticos (a,b,c...z, A,B,C...Z) Numéricos (0,1,2,3,4,5,6,7,8,9) Especiales (+,-,*, /, {,}, [,], <,>...) CARACTERES ASCII PRINCIPALES O MÁS USADOS VALOR ASCII CARÁCTER TECLA VALOR ASCII CARÁCTER TECLA 13 ENTER 41 ) 27 ESCAPE 42 * 32 Barra Espaciadora 43 + 33 ! 44 , 34 “ 45 - 35 # 46 . 36 $ 47 / 37 % 48 0 38 & 49 1 39 ‘ 50 2 40 ( 51 3 93 Lic. Elmer Alberto León Zárate 52 4 123 { 53 5 124 ¦ 54 6 125 } 55 7 126 ~ 56 8 127 • 57 9 128 ç 58 : 129 ü 59 ; 130 é 60 < 154 ü 61 = 160 á 62 > 161 í 63 ? 162 ó 64 @ 163 ú 65 A 164 ñ *********** *********** 165 Ñ 90 Z 166 ª 91 [ 167 º 92 \ 168 ¿ 93 ] 169 ® 94 ^ 170 ¬ 95 _ 171 ½ 96 ` 172 ¼ 97 A 173 ¡ *********** *********** 174 « 122 z 175 » EBCDIC (Extended Binary Coded Decimal Interchange Change) 94 CAPITULO IV: Estructuras de datos Utiliza 8 bits por carácter y también consta de 256 caracteres, solo es utilizado por la firma IBM y sus componentes. Nota: En general, un carácter de cualquier tipo ocupara un byte de almacenamiento de memoria. 1. CADENAS DE LONGITUD FIJA Definición 4.30 Son cadenas con longitud declarada al inicio de la Programación en la cual cuenta blancos a la izquierda o derecha o en la separación de letras. V V I I S 1 1 2 S U 2 3 U A 3 4 A L B L 4 5 B 5 6 6 A 7 7 8 A S 8 9 S I 9 I C C 1 V 1 1 V I 1 1 I 1 1 1 1 1 10 11 12 13 14 15 16 17 18 19 20 Dimensión de la Cadena: 20 2. CADENAS DE LONGITUD VARIABLE CON UN MAXIMO Definición 4.31 Son aquellas que cuentan con dos campos uno contiene la Longitud de la cadena y otro la longitud actual. 1 17 15 1 V V I I S S U U A A L L B B A DONDE: 17 es la longitud máxima 95 A S S I I C C V V I I 2 Lic. Elmer Alberto León Zárate 15 es la longitud actual del Arreglo 3. CADENAS DE LONGITUD INDEFINIDA Definición 4.32 Son aquellas que se unen a través de un puntero estas listas contienen caracteres empaquetados de la forma (2/elemento carácter). 6 6 V V I I S S U U A A L L DONDE 6 es la Longitud Actual OPERACIONES CON CADENAS Las operaciones más usadas son: CALCULO DE LA LONGITUD COMPARACION CONCATENACION EXTRACCION DE SUBCADENAS BUSQUEDA DE INFORMACION CONVERTIR CADENAS EN NUMEROS Y VICEVERSA INSERTAR CADENAS BORRAR CADENAS CAMBIAR CADENAS a) CALCULO DE LA LONGITUD DE UNA CADENA Definición 4.33 La Longitud de la cadena es el número de caracteres de la cadena. 96 CAPITULO IV: Estructuras de datos Ejemplo 4.21 ‘M i c r o s o f t V i s u a l S t u d i o‘tiene 23 caracteres La operación de determina la longitud de la cadena se representara por la función cuyo formato es: LONGITUD (Cadena de Caracteres) Dicha formula tiene acceso a datos tipo carácter pero el resultado será numérico. Ejemplos: LONGITUD (‘MICROSOFT VISUAL STUDIO') 23 caracteres LONGITUD (‘ ') 3 caracteres LONGITUD (‘ ESTRUCTURA DE DATOS’) 21 caracteres (19 letras) y (3 espacios) Observación 4.9 En consecuencia el resultado de la longitud de una cadena de caracteres es Entero se pueden realizar expresiones Aritméticas con el. Ejemplo 4.22 10 + 15 + longitud (‘ ESTRUCTURA DE DATOS ’) 4 + 5 * 2 + longitud (‘visual basic’) + longitud (‘ ‘) b) COMPARACION Definición 4.34 Los criterios de comparación de cadenas se basan en el orden numérico del código ASCII como código de referencia: 97 Lic. Elmer Alberto León Zárate Ejemplo 4.23 ‘A’ > ‘B’ ‘A’ = ‘a’ COMPARACION DE IGUALDAD: Utilizar el Signo Igual ‘AREVALO’ = ‘AREVALO’ verdadero ‘AREVALO’ = ‘Arévalo’ falso ‘AREVALO’ = ‘Arévalo ’ falso Ejemplo 4.24 COMPARACION DE DESIGUALDAD: Utilizar <> ‘Arévalo’ < ‘AREVALO’ ‘Cáceres’ > ‘Arévalo’ ‘AREVALO’ > ‘Arévalo’ c) CONCATENACION Definición 4.35 Es la operación que reúne varias cadenas de caracteres en una sola, pero conservando el orden en que se les llame o invoque. Mayormente los símbolos más usados son: & + // o ‘MICROSOFT’ + ‘VISUAL’ + ‘BASIC’ ‘MICROSOFTVISUALBASIC’ ‘MICROSOFT’ & ‘VISUAL’ &‘BASIC’ ‘MICROSOFT VISUAL BASIC’ Si: A = ‘Microsoft’ B=’Visual’ D=A+’ ‘+B+’ ‘+C 98 C=’Basic’ CAPITULO IV: Estructuras de datos d) EXTRACCION DE SUBCADENAS Definición 4.36 Es aquella que permite la extracción de una parte específica de una cadena llamándose así Subcadena. Utilizar la siguiente función: SUBCADENA (‘Cadena ‘, Posición Inicial, longitud de la subcadena) En este caso la Subcadena estará compuesta por la cantidad de caracteres que extraiga desde la posición actual y la longitud de la misma. SUBCADENA (‘Cadena ‘, Posición Inicial) En este caso la Subcadena estará formado por caracteres de la cadena desde la posición inicial hacia al final de la misma. Ejemplo 4.25 Subcadena (‘abcdefg’, 2,4) bcde e) BUSQUEDA DE INFORMACION Definición 4.37 Localiza si una subcadena forma parte de la cadena, devolviendo para este caso la posición exacta del primer encuentro de izquierda a derecha POSICION (CADENA1, CADENA2) Supongamos que la Cadena es C=’ESTRUCTURA DE LA INFORMACION’ POSICION(C, ‘DE’) Resultado 12 f) CONVERTIR CADENAS EN NUMEROS O VICEVERSA Definición 4.38 Se declara una variable del tipo a cambiar y en la programación se iguala a la variable cuyo valor es lo contrario. 99 Lic. Elmer Alberto León Zárate Función: Cadena = Función Cambiante a cadena (valor numérico) Numero = Función cambiante a numero (Valor de texto) EN C: <STDLIB.H> ATOI (CADENA) ITOA, FCVT EN BASIC: - VAL: Devuelve los números contenidos en una cadena. VAL (cadena) - STR: Devuelve la representación de cadena en números. STR (numero) g) INSERTAR CADENAS Definición 4.39 Inserta una subcadena dentro de una cadena más larga = y en determinada posición. Sintaxis: INSERTAR (Cadena, posición, Subcadena) Idea: Si el texto es: ABCD El nuevo texto sera: ABXXCD Algoritmo para insertar cadenas: Inicio Devolver (Subcadena (Cadena, 1, posición-1) + “cadena a insertar” + Subcadena (cadena, posicion, longitud (cadena)-Posicion+1)) Fin 100 CAPITULO IV: Estructuras de datos Ejemplo 4.26 CADENA= E S T R U C T U R A I N F O R M A C I O N, debemos agregar las letras que faltan para que la nueva cadena sea ESTRUCTURA DE LA INFORMACIÓN Subcadena (cadena, 1, (12-1)) ESTRUCTURA_ Cadena a insertar DE LA_ Subcadena (cadena, 12, (22-12+1) INFORMACION h) BORRAR CADENAS Definición 4.40 Elimina determinados caracteres de cuerdo a una posición y la cantidad de caracteres a borrar. Sintaxis: BORRAR (Cadena, posición, Longitud a eliminar) Idea: Si el texto es: ABCD El nuevo texto será: AD Algoritmo para BORRAR cadenas: Inicio Devolver (Subcadena (Cadena, 1, posición - 1) + Subcadena (cadena, posicion+longitud, Longitud (cadena) –posición–longitud+1)) Fin Ejemplo 4.27 CADENA= I N F O R M A C I O N, debemos borrar las letras “FORMA” de tal manera que la nueva cadena será “INCION” Subcadena (cadena, 1, (3-1)) IN Subcadena (cadena, 3+5,11-3-5+1) CION 101 Lic. Elmer Alberto León Zárate i) CAMBIAR CADENAS Sustituye un texto por otro. Sintaxis: CAMBIAR (Cadena, Subcadena a sustituir, Subcadena nueva) Idea: Si el texto es: ABCD El nuevo texto será: AXYD CAMBIAR (“ABCDEF”,”BC”,”XY”) AXYDEF Algoritmo para CAMBIAR cadenas: Inicio A POSICION (cadena, Subcadena) Entero B BORRAR (cadena, A, LONGITUD (CADENA)) string DEVOLVER (INSERTAR (cadena, A, Subcadena) string Fin 4.2.2 ESTRUCTURA DE DATOS DINAMICAS A) LISTAS Definición 4.41 Una lista se define como una serie de N elementos E1, E2,..., EN, ordenados de manera consecutiva, es decir, el elemento Ek (que se denomina elemento k-ésimo) es previo al elemento Ek+1. Si la lista contiene 0 elementos se denomina como lista vacía. Las operaciones que se pueden realizar en la lista son: insertar un elemento en la posición k, borrar el k-ésimo elemento, buscar un elemento dentro de la lista y preguntar si la lista esta vacía. 102 CAPITULO IV: Estructuras de datos Una manera simple de implementar una lista es utilizando un arreglo. Sin embargo, las operaciones de inserción y borrado de elementos en arreglos son ineficientes, puesto que para insertar un elemento en la parte media del arreglo es necesario mover todos los elementos que se encuentren delante de él, para hacer espacio, y al borrar un elemento es necesario mover todos los elementos para ocupar el espacio desocupado. Una implementación más eficiente del TDA se logra utilizando listas enlazadas. A continuación se presenta una implementación en Java del TDA utilizando listas enlazadas y sus operaciones asociadas: estaVacia (): devuelve verdadero si la lista esta vacía, falso en caso contrario. insertar(x, k): inserta el elemento x en la k-ésima posición de la lista. buscar(x): devuelve la posición en la lista del elemento x. buscarK (k): devuelve el k-ésimo elemento de la lista. eliminar(x): elimina de la lista el elemento x. En la implementación con listas enlazadas es necesario tener en cuenta algunos detalles importantes: si solamente se dispone de la referencia al primer elemento, el añadir o remover en la primera posición es un caso especial, puesto que la referencia a la lista enlazada debe modificarse según la operación realizada. Además, para eliminar un elemento en particular es necesario conocer el elemento que lo antecede, y en este caso, ¿qué pasa con el primer elemento, que no tiene un predecesor? Para solucionar estos inconvenientes se utiliza la implementación de lista enlazada con nodo cabecera. Con esto, todos los elementos de la lista tendrán un elemento previo, puesto 103 Lic. Elmer Alberto León Zárate que el previo del primer elemento es la cabecera. Una lista vacía corresponde, en este caso, a una cabecera cuya referencia siguiente es null. Ilustración 4.1 Esquema de una lista Los archivos NodoLista.java, IteradorLista.java y Lista.java contienen una implementación completa del TDA lista. La clase NodoLista implementa los nodos de la lista enlazada, la clase Lista implementa las operaciones de la lista propiamente tal, y la clase IteradorLista implementa objetos que permiten recorrer la lista y posee la siguiente interfaz: Avanzar (): avanza el iterador al siguiente nodo de la lista. Obtener (): retorna el elemento del nodo en donde se encuentra el iterador. Costo de las operaciones en tiempo: Insertar/eliminar elemento en k-ésima posición:O(k).Se puede hacer en O(1)? Buscar elemento x: O(N) (promedio). B) PILAS Definición 4.42 Una pila (stack o pushdown en inglés) es una lista de elementos de la cual sólo se puede extraer el último elemento insertado. La posición en donde se encuentra dicho elemento se denomina tope de la pila. También se conoce a las pilas como listas LIFO (LAST IN - FIRST OUT: el último que entra es el primero que sale). 104 CAPITULO IV: Estructuras de datos Ilustración 4.2 Esquema de una pila La interfaz de este TDA provee las siguientes operaciones: apilar(x): inserta el elemento x en el tope de la pila (push en inglés). desapilar (): retorna el elemento que se encuentre en el tope de la pila y lo elimina de ésta (pop en inglés). tope (): retorna el elemento que se encuentre en el tope de la pila, pero sin eliminarlo de ésta (top en inglés). estaVacia (): retorna verdadero si la pila no contiene elementos, falso en caso contrario (isEmpty en inglés). Observación 4.10 Algunos autores definen desapilar como sacar el elemento del tope de la pila sin retornarlo. 105 Lic. Elmer Alberto León Zárate IMPLEMENTACIÓN DEL TDA PILA A continuación se muestran dos maneras de implementar una pila: utilizando un arreglo y utilizando una lista enlazada. En ambos casos el costo de las operaciones es de O (1). 1.- IMPLEMENTACIÓN UTILIZANDO ARREGLOS Para implementar una pila utilizando un arreglo, basta con definir el arreglo del tipo de dato que se almacenará en la pila. Una variable de instancia indicará la posición del tope de la pila, lo cual permitirá realizar las operaciones de inserción y borrado, y también permitirá saber si la pila esta vacía, definiendo que dicha variable vale -1 cuando no hay elementos en el arreglo. class PilaArreglo { private Object[] arreglo; private int tope; private int MAX_ELEM=100; /máximo numero de elemento en la pila public PilaArreglo() { arreglo=new Object[MAX_ELEM]; tope=-1; // inicialmente la pila esta vacía } public void apilar(Object x) { 106 CAPITULO IV: Estructuras de datos if (tope+1<MAX_ELEM) // si esta llena se produce OVERFLOW { tope++; arreglo[tope]=x; } } public Object desapilar() { if (!estaVacia()) // si esta vacia se produce UNDERFLOW { Object x=arreglo[tope]; tope--; return x; } } public Object tope() { if (!estaVacia()) // si esta vacia es un error { Object x=arreglo[tope]; return x; } } public boolean estaVacia() 107 Lic. Elmer Alberto León Zárate { if (tope==-1) { return true; } else { return false; } } } El inconveniente de esta implementación es que es necesario fijar de antemano el número máximo de elementos que puede contener la pila, MAX_ELEM, y por lo tanto al apilar un elemento es necesario controlar que no se inserte un elemento si la pila esta llena. Sin embargo, en Java es posible solucionar este problema creando un nuevo arreglo más grande que el anterior, el doble por ejemplo, y copiando los elementos de un arreglo a otro: public void apilar(Object x) { if (tope+1<MAX_ELEM) // si esta llena se produce OVERFLOW { tope++; arreglo[tope]=x; } 108 CAPITULO IV: Estructuras de datos else { MAX_ELEM=MAX_ELEM*2; Object[] nuevo_arreglo=new Object[MAX_ELEM]; for (int i=0; i<arreglo.length; i++) { nuevo_arreglo[i]=arreglo[i]; } tope++; nuevo_arreglo[tope]=x; arreglo=nuevo_arreglo; } } 2.- IMPLEMENTACIÓN UTILIZANDO LISTAS ENLAZADAS En este caso no existe el problema de tener que fijar el tamaño máximo de la pila (aunque siempre se está acotado por la cantidad de memoria disponible!). La implementación es bastante simple: los elementos siempre se insertan al principio de la lista (apilar) y siempre se extrae el primer elemento de la lista (desapilar y tope), por lo que basta con tener una referencia al principio de la lista enlazada. Si dicha referencia es null, entonces la pila esta vacía. class PilaLista { 109 Lic. Elmer Alberto León Zárate private NodoLista lista; public PilaLista() { lista=null; } public void apilar(Object x) { lista=new NodoLista(x, lista); } public Object desapilar() //si esta vacia se produce UNDERFLOW { if (!estaVacia()) { Object x=lista.elemento; lista=lista.siguiente; return x; } } public Object tope() { if (!estaVacia()) // si esta vacia es un error { Object x=lista.elemento; return x; 110 CAPITULO IV: Estructuras de datos } } public boolean estaVacia() { return lista==null; } } Dependiendo de la aplicación que se le de a la pila es necesario definir que acción realizar en caso de que ocurra overflow (rebalse de la pila) o underflow (intentar desapilar cuando la pila esta vacía). Java posee un mecanismo denominado excepciones, que permite realizar acciones cuando se producen ciertos eventos específicos (como por ejemplo overflow o underflow en una pila). En ambas implementaciones el costo de las operaciones que provee el TDA tiene costo O (1). Ejemplo 4.28 Para eliminar la recursividad suponer que una función F realiza un llamado recursivo dentro de su código, lo que se ilustra en el siguiente esquema: 111 Lic. Elmer Alberto León Zárate Ilustración 4.3 Esquema de recursividad Si la llamada recursiva es lo último que hace la función F, entonces dicha llamada se puede substituir por un ciclo while. Este caso es conocido como tail recursion y en lo posible hay que evitarlo en la programación, ya que cada llamada recursiva ocupa espacio en la memoria del computador, y en el caso del tail recursion es muy simple eliminarla. void imprimir(int[] a, int j) // versión recursiva { if (j<a.length) { System.out.println(a[j]); imprimir(a, j+1); // tail recursión } } void imprimir(int[] a, int j) // versión iterativa { while (j<a.length) { System.out.println(a[j]); 112 CAPITULO IV: Estructuras de datos j=j+1; } } En el caso general, cuando el llamado recursivo se realiza en medio de la función F, la recursión se puede eliminar utilizando una pila. Ejemplo 4.29 Recorrido en preorden de un árbol binario. // "raiz" es la referencia a la raiz del arbol // Llamado inicial: preorden(raiz) // Versión recursiva void preorden(Nodo nodo) { if (nodo!=null) { System.out.print(nodo.elemento); preorden(nodo.izq); preorden(nodo.der); } } // Primera versión iterativa void preorden(Nodo nodo) { 113 Lic. Elmer Alberto León Zárate Nodo aux; Pila pila=new Pila(); // pila de nodos pila.apilar(nodo); while(!pila.estaVacia()) // mientras la pila no este vacia { aux=pila.desapilar(); if (aux!=null) { System.out.print(aux.elemento); // Primero se apila el nodo derecho y luego el izquierdo // Para mantener el orden correcto del recorrido // Al desapilar los nodos pila.apilar(aux.der); pila.apilar(aux.izq); } } } // Segunda versión iterativa // Dado que siempre el ultimo nodo apilado dentro del bloque if es // aux.izq podemos asignarlo directamente a aux hasta que éste sea // null, es decir, el bloque if se convierte en un bloque while // Y se cambia el segundo apilar por una asignacion de la referencia void preorden(Nodo nodo) { 114 CAPITULO IV: Estructuras de datos Nodo aux; Pila pila=new Pila(); // pila de nodos pila.apilar(nodo); while(!pila.estaVacia()) // mientras la pila no este vacia { aux=pila.desapilar(); while (aux!=null) { System.out.print(aux.elemento); pila.apilar(aux.der); aux=aux.izq; } } } Si bien los programas no recursivos son más eficientes que los recursivos, la eliminación de recursividad (excepto en el caso de tail recursion) le quita claridad al código del programa. Por lo tanto: A menudo es conveniente eliminar el tail recursion. Un método recursivo es menos eficiente que uno no recursivo, pero sólo en pocas oportunidades vale la pena eliminar la recursión. 115 Lic. Elmer Alberto León Zárate C) COLAS Definición 4.43 Una cola (queue en inglés) es una lista de elementos en donde siempre se insertan nuevos elementos al final de la lista y se extraen elementos desde el inicio de la lista. También se conoce a las colas como listas FIFO (FIRST IN - FIRST OUT: el primero que entra es el primero que sale). Ilustración 4.4 Esquema de cola Las operaciones básicas en una cola son: encolar(x): inserta el elemento x al final de la cola (enqueue en inglés). sacar (): retorna el elemento que se ubica al inicio de la cola (dequeue en inglés). estaVacia (): retorna verdadero si la cola esta vacía, falso en caso contrario. Al igual que con el TDA pila, una cola se puede implementar tanto con arreglos como con listas enlazadas. A continuación se verá la implementación usando un arreglo. Las variables de instancia necesarias en la implementación son: primero: indica el índice de la posición del primer elemento de la cola, es decir, la posición el elemento a retornar cuando se invoque sacar. 116 CAPITULO IV: Estructuras de datos ultimo: indica el índice de la posición de último elemento de la cola. Si se invoca encolar, el elemento debe ser insertado en el casillero siguiente al que indica la variable. numElem: indica cuántos elementos posee la cola. Definiendo MAX_ELEM como el tamaño máximo del arreglo, y por lo tanto de la cola, entonces la cola esta vacía si numElem==0 y está llena si numElem==MAX_ELEM. Ilustración 4.5 Esquema de elementos en una cola Un detalle faltante es el siguiente: ¿qué pasa si la variable ultimo sobrepasa el rango de índices del arreglo? Esto se soluciona definiendo que si después de insertar un elemento el índice ultimo == MAX_ELEM, entonces se asigna ultimo = 0, y los siguientes elementos serán insertados al comienzo del arreglo. Esto no produce ningún efecto en la lógica de las operaciones del TDA, pues siempre se saca el elemento referenciado por el índice primero, aunque en valor absoluto primero > ultimo. Este enfoque es conocido como implementación con arreglo circular, y la forma más fácil de implementarlo es haciendo la aritmética de subíndices módulo MAX_ELEM. 117 Lic. Elmer Alberto León Zárate Ilustración 4.6 Esquema de elementos en una cola para implementar con arreglo circular class ColaArreglo { private Object[] arreglo; private int primero, ultimo, numElem; private int MAX_ELEM=100; /maximo numero de elemento en la cola public ColaArreglo() { arreglo=new Object[MAX_ELEM]; primero=0; ultimo=MAX_ELEM-1; numElem=0; } public void encolar(Object x) { if (numElem<MAX_ELEM) // si esta llena se produce OVERFLOW { ultimo= (ultimo+1) %MAX_ELEM; 118 CAPITULO IV: Estructuras de datos arreglo[ultimo]=x; numElem++; } } public Object sacar() { if (!estaVacia()) // si esta vacia se produce UNDERFLOW { Object x=arreglo[primero]; primero= (primero+1) %MAX_ELEM; numElem--; return x; } } public boolean estaVacia() { return numElem==0; } } Nuevamente en este caso, dependiendo de la aplicación, se debe definir qué hacer en caso de producirse OVERFLOW o UNDERFLOW. Con esta implementación, todas las operaciones del TDA cola tienen costo O (1). 119 Lic. Elmer Alberto León Zárate D) LISTAS ENLAZADAS Definición 4.44 En Ciencias de la Computación, una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias (punteros) al nodo anterior y/o posterior. El principal beneficio de las listas enlazadas respecto a los arreglos convencionales es que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento. Una lista enlazada es un tipo de dato auto-referenciado porque contienen un puntero o link a otro dato del mismo tipo. Las listas enlazadas permiten inserciones y eliminación de nodos en cualquier punto de la lista en tiempo constante (suponiendo que dicho punto está previamente identificado o localizado), pero no permiten un acceso aleatorio. Existen diferentes tipos de listas enlazadas: Lista Enlazadas Simples, Listas Doblemente Enlazadas, Listas Enlazadas Circulares y Listas Enlazadas Doblemente Circulares. Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales como Lisp y Scheme tiene estructuras de datos ya construidas, junto con operaciones para acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales como C o C++ y Java, respectivamente, disponen de referencias para crear listas enlazadas. 120 CAPITULO IV: Estructuras de datos TIPOS DE LISTAS ENLAZADAS 1.-LISTAS SIMPLES ENLAZADAS Definición 4.45 La lista enlazada básica es la lista enlazada simple la cual tiene un enlace por nodo. Este enlace apunta al siguiente nodo en la lista, o al valor NULL o a la lista vacía, si es el último nodo. Ilustración 4.7 Esquema de lista enlazada simple Una lista enlazada simple contiene dos valores: el valor actual del nodo y un enlace al siguiente nodo 2.- LISTA DOBLEMENTE ENLAZADA Definición 4.46 Un tipo de lista enlazada más sofisticado es la lista doblemente enlazada o lista enlazadas de dos vías. Cada nodo tiene dos enlaces: uno apunta al nodo anterior, o apunta al valor NULL o a la lista vacía si es el primer nodo; y otro que apunta al siguiente nodo siguiente, o apunta al valor NULL o a la lista vacía si es el último nodo. Ilustración 4.8 Esquema de lista doblemente enlazada Una lista doblemente enlazada contiene tres valores: el valor, el link al nodo siguiente, y el link al anterior 121 Lic. Elmer Alberto León Zárate En algún lenguaje de muy bajo nivel, XOR-Linking ofrece una vía para implementar listas doblemente enlazadas, usando una sola palabra para ambos enlaces, aunque el uso de esta técnica no se suele utilizar. 3.- LISTAS ENLAZADAS CIRCULARES Definición 4.47 En una lista enlazada circular, el primer y el último nodo están unidos juntos. Esto se puede hacer tanto para listas enlazadas simples como para las doblemente enlazadas. Para recorrer un lista enlazada circular podemos empezar por cualquier nodo y seguir la lista en cualquier dirección hasta que se regrese hasta el nodo original. Desde otro punto de vista, las listas enlazadas circulares pueden ser vistas como listas sin comienzo ni fin. Este tipo de listas es el más usado para dirigir buffers para “ingerir” datos, y para visitar todos los nodos de una lista a partir de uno dado. Ilustración 4.9 Esquema de lista enlazada circular Una lista enlazada circular que contiene tres valores enteros a) Listas enlazadas circulares simples Definición 4.48 Cada nodo tiene un enlace, similar al de las listas enlazadas simples, excepto que el siguiente nodo del último apunta al primero. Como en una lista enlazada simple, los nuevos nodos pueden ser solo eficientemente insertados después de uno que ya tengamos referenciado. Por esta razón, es usual quedarse con una referencia solamente al 122 CAPITULO IV: Estructuras de datos último elemento en una lista enlazada circular simple, esto nos permite rápidas inserciones al principio, y también permite accesos al primer nodo desde el puntero del último nodo. [1] b) Lista Enlazada Doblemente Circular Definición 4.49 En una lista enlazada doblemente circular, cada nodo tiene dos enlaces, similares a los de la lista doblemente enlazada, excepto que el enlace anterior del primer nodo apunta al último y el enlace siguiente del último nodo, apunta al primero. Como en una lista doblemente enlazada, las inserciones y eliminaciones pueden ser hechas desde cualquier punto con acceso a algún nodo cercano. Aunque estructuralmente una lista circular doblemente enlazada no tiene ni principio ni fin, un puntero de acceso externo puede establecer el nodo apuntado que está en la cabeza o al nodo cola, y así mantener el orden tan bien como en una lista doblemente enlazada. NODOS CENTINELAS Definición 4.50 Un nodo centinela (también llamado falso nodo o nodo ficticio) es un nodo que se ubica al principio y/o al final de la lista, el cual no es usado para guardar datos. Su propósito es simplificar o agilizar algunas operaciones, asegurando que cualquier nodo tiene otro anterior o posterior, y que toda la lista (incluso alguna que no contenga datos) siempre tenga un “primer y último” nodo. APLICACIONES DE LAS LISTAS ENLAZADAS Las listas enlazadas son usadas como módulos para otras muchas estructuras de datos, tales como pilas, colas y sus variaciones. 123 Lic. Elmer Alberto León Zárate El campo de datos de un nodo puede ser otra lista enlazada. Mediante este mecanismo, podemos construir muchas estructuras de datos enlazadas con listas; esta práctica tiene su origen en el lenguaje de programación Lisp, donde las listas enlazadas son una estructura de datos primaria (aunque no la única), y ahora es una característica común en el estilo de programación funcional. A veces, las listas enlazadas son usadas para implementar arreglos asociativos, y estas en el contexto de las llamadas listas asociativas. Hay pocas ventajas en este uso de las listas enlazadas; hay mejores formas de implementar éstas estructuras, por ejemplo con árboles binarios de búsqueda equilibrados. Sin embargo, a veces una lista enlazada es dinámicamente creada fuera de un subconjunto propio de nodos semejante a un árbol, y son usadas más eficientemente para recorrer ésta serie de datos VENTAJAS Como muchas opciones en programación y desarrollo, no existe un único método correcto para resolver un problema. Una estructura de lista enlazada puede trabajar bien en un caso pero causar problemas en otros. He aquí una lista con algunas de las ventajas más comunes que implican las estructuras de tipo lista. En general, teniendo una colección dinámica donde los elementos están siendo añadidos y eliminados frecuentemente e importa la localización de los nuevos elementos introducidos se incrementa el beneficio de las listas enlazadas. Ventajas de usar listas: Las listas son dinámicas, es decir, podemos almacenar en ellas tantos elementos como necesitemos, siempre y cuando haya espacio suficiente espacio en memoria. Al insertar un elemento en la lista, la operación tiene un tiempo constante 124 CAPITULO IV: Estructuras de datos independientemente de la posición en la que se inserte, solo se debe crear el nodo y modificar los enlaces. Esto no es así en los arreglos, ya que si el elemento lo insertamos al inicio o en medio, tenemos un tiempo lineal debido a que se tienen que mover todos los elementos que se encuentran a la derecha de la posición donde lo vamos a insertar y después insertar el elemento en dicha posición; solo al insertar al final del arreglo se obtienen tiempos constantes. Al eliminar un elemento paso lo mismo que se menciono en el punto anterior. DESVENTAJAS DE USAR LISTAS: El acceso a un elemento es más lento, debido a que la información no está en posiciones contiguas de memoria, por lo que no podemos acceder a un elemento con base en su posición como se hace en los arreglos. OPERACIONES EN LISTAS ENLAZADAS Las operaciones que podemos realizar sobre una lista enlazada son las siguientes: a) RECORRIDO. Esta operación consiste en visitar cada uno de los nodos que forman la lista. Para recorrer todos los nodos de la lista, se comienza con el primero, se toma el valor del campo liga para avanzar al segundo nodo, el campo liga de este nodo nos dará la dirección del tercer nodo, y así sucesivamente. b) INSERCIÓN. Esta operación consiste en agregar un nuevo nodo a la lista. Para esta operación se pueden considerar tres casos: Insertar un nodo al inicio. Insertar un nodo antes o después de cierto nodo. Insertar un nodo al final. 125 Lic. Elmer Alberto León Zárate c) BORRADO. La operación de borrado consiste en quitar un nodo de la lista, redefiniendo las ligas que correspondan. Se pueden presentar cuatro casos: d) Eliminar el primer nodo. Eliminar el último nodo. Eliminar un nodo con cierta información. Eliminar el nodo anterior o posterior al nodo cierta con información. BÚSQUEDA. Esta operación consiste en visitar cada uno de los nodos, tomando al campo liga como puntero al siguiente nodo a visitar. E) ÁRBOLES Definición 4.51 Un árbol se define como una colección de nodos organizados en forma recursiva. Cuando hay 0 nodos se dice que el árbol esta vacío, en caso contrario el árbol consiste en un nodo denominado raíz, el cual tiene 0 o más referencias a otros árboles, conocidos como subárboles. Las raíces de los subárboles se denominan hijos de la raíz, y consecuentemente la raíz se denomina padre de las raíces de sus subárboles. Una visión gráfica de esta definición recursiva se muestra en la siguiente figura: Ilustración 4.10 Esquema de un árbol 126 CAPITULO IV: Estructuras de datos Definición 4.52 Los nodos que no poseen hijos se denominan hojas. Dos nodos que tienen el padre en común se denominan hermanos. Definición 4.53 Un camino entre un nodo n1 y un nodo nk está definido como la secuencia de nodos n1, n2,..., nk tal que ni es padre de ni+1, 1 <= i < k. El largo del camino es el número de referencias que componen el camino, que para el ejemplo son k-1. Existe un camino desde cada nodo del árbol a sí mismo y es de largo 0. Nótese que en un árbol existe un único camino desde la raíz hasta cualquier otro nodo del árbol. A partir del concepto de camino se definen los conceptos de ancestro y descendiente: un nodo n es ancestro de un nodo m si existe un camino desde n a m; un nodo n es descendiente de un nodo m si existe un camino desde m a n. Definición 4.54 Se define la profundidad del nodo nk como el largo del camino entre la raíz del árbol y el nodo nk. Esto implica que la profundidad de la raíz es siempre 0. La altura de un nodo nk es el máximo largo de camino desde nk hasta alguna hoja. Esto implica que la altura de toda hoja es 0. La altura de un árbol es igual a la altura de la raíz, y tiene el mismo valor que la profundidad de la hoja más profunda. La altura de un árbol vacío se define como -1. Ejemplo 4.30 La siguiente figura muestra los conceptos previamente descritos: 127 Lic. Elmer Alberto León Zárate Ilustración 4.11 Esquema de los elementos de un árbol A es la raíz del árbol. A es padre de B, C y D. E y F son hermanos, puesto que ambos son hijos de B. E, J, K, L, C, P, Q, H, N y O son las hojas del árbol. El camino desde A a J es único, lo conforman los nodos A-B-F-J y es de largo 3. D es ancestro de P, y por lo tanto P es descendiente de D. L no es descendiente de C, puesto que no existe un camino desde C a L. La profundidad de C es 1, de F es 2 y de Q es 4. La altura de C es 0, de F es 1 y de D es 3. La altura del árbol es 4 (largo del camino entre la raíz A y la hoja más profunda, P o Q). 128 CAPITULO IV: Estructuras de datos ÁRBOLES BINARIOS Definición 4.55 Un árbol binario es un árbol en donde cada nodo posee 2 referencias a subárboles (ni más, ni menos). En general, dichas referencias se denominan izquierda y derecha, y consecuentemente se define el subárbol izquierdo y subárbol derecho del árbol. Ilustración 4.12 Esquema de un árbol binario En este caso, la implementación del nodo de un árbol binario es como sigue: class NodoArbolBinario { Object elemento; NodoArbolBinario izq; NodoArbolBinario der; } Los nodos en sí que conforman un árbol binario se denominan nodos internos, y todas las referencias que son null se denominan nodos externos. 129 Lic. Elmer Alberto León Zárate Ilustración 4.13 Esquema de un árbol binario con nodos internos y externos PROPIEDADES DE LOS ÁRBOLES BINARIOS Propiedad 4.1 Si se define i = número de nodos internos, e = número de nodos externos, entonces se tiene que: e = i+1 Propiedad 4.2 Sea n = número de nodos internos. Se define: In = suma del largo de los caminos desde la raíz a cada nodo interno (largo de caminos internos). En = suma del largo de los caminos desde la raíz a cada nodo externo (largo de caminos externos). Se tiene que: 130 CAPITULO IV: Estructuras de datos En = In+2n Propiedad 4.3 ¿Cuántos árboles binarios distintos se pueden construir con n nodos internos? n 0 1 2 3 bn 1 1 2 5 ¿bn? Ejemplo 4.31 b4 = b0*b3 + b1*b2 + b2*b1 + b3*b0 = 5 + 2 + 2 + 5 = 14. Este tipo de ecuaciones se puede resolver y la solución es la siguiente: La serie de números que genera bn se conoce como números de Catalán. Asintóticamente: 131 Lic. Elmer Alberto León Zárate Ejemplo 4.32 La siguiente figura muestra un ejemplo de un árbol de expresiones matemáticas. En un árbol de expresiones las hojas corresponden a los operandos de la expresión (variables o constantes), mientras que los nodos restantes contienen operadores. Dado que los operadores matemáticos son binarios (o unarios como en el caso del operador signo -), un árbol de expresiones resulta ser un árbol binario. Ilustración 4.14 Esquema de un árbol binario de expresiones matemáticas Un árbol de expresiones se puede evaluar de la siguiente forma: Si la raíz del árbol es una constante o una variable se retorna el valor de ésta. Si la raíz resulta ser un operador, entonces recursivamente se evalúan los subárboles izquierdo y derecho, y se retorna el valor que resulta al operar los valores obtenidos de las evaluaciones de los subárboles con el operador respectivo. 132 CAPITULO IV: Estructuras de datos RECORRIDOS DE ÁRBOLES BINARIOS Existen tres formas principales para recorrer un árbol binario en forma recursiva. Estas son: Preorden: raíz - subárbol izquierdo - subárbol derecho. Inorden: subárbol izquierdo - raiz - subárbol derecho. Postorden: subárbol izquierdo - subárbol derecho - raíz. Ejemplos 4.33 Recorrido del árbol de expresiones anterior en preorden se obtiene: * + a b - c d Recorrido del árbol de expresiones en inorden se obtiene: a + b * c - d Recorrido del árbol de expresiones en postorden se obtiene: a b + c d - * La expresión que se obtiene con el recorrido en postorden se conoce como notación polaca. 4.3 RELACION DE EJERCICIOS: 1. Realiza el pseudocódigo que permita el ingreso de 5 alumnos con 4 notas cada uno y determine el promedio por cada alumno y al final determine el promedio de los promedios obtenidos por cada estudiante. 2. Calcular la suma de los elementos de un arreglo bidimensional de n elementos. 3. Realizar el algoritmo para determinar la mayor nota ingresada a un arreglo de notas de 4x4. 133 Lic. Elmer Alberto León Zárate 4. Realizar el algoritmo para ingresar un arreglo bidimensional de numero y luego determine: La suma de la primera fila La multiplicación de la última fila La suma de primera columna La multiplicación de la última columna La suma de la diagonal principal La multiplicación de la diagonal secundaria 5. Escribir un pseudocódigo que permita sumar el número de elementos positivos y el de negativos de una matriz n. 6. De una lista de n elementos escribir el pseudocódigo que permita insertar el valor x en un lugar ingresado por el usuario. 7. Leer una matriz de 3x3 y calcular la suma de sus filas y la suma de sus columnas. 8. Se tiene una lista de n nombres en un arreglo unidimensional, escribir el pseudocódigo que solicite el nombre de un alumno y lo busque en la lista. 9. Obtener el promedio de cierta cantidad de alumnos, considerando para cada alumno los siguientes datos, código, nombre, sexo, promedio de prácticas y notas de exámenes parciales y final. Luego mostrar él numero de alumnos aprobados - desaprobados personas del sexo masculino – femenino. 10. Se pide emitir el pago mensual del personal de una empresa considerando los siguientes datos por empleado: código, área, sueldo básico, y horas extras. 11. Realizar un algoritmo para el borrado de un elemento. Por ejemplo: Eliminar el elemento repetido 134 CAPITULO IV: Estructuras de datos A B C D E E F 12. Programa en Visual Basic donde se ingrese un texto en los Cuadros TEXT1 Y TEXT2 y luego se unan en un cuadro de TEXT3 al presionar Clic en un botón command que se llame Concatenación. Text3.Text = Text1.Text + Text2.Text Text3.Text = Text1.Text & Text2.Text 135 CAPITULO V TEORIA DE GRAFOS 5.1 CONCEPTOS BASICOS Definición 5.1 Un grafo es un objeto matemático que se utiliza para representar circuitos, redes, etc. Los grafos son muy utilizados en computación, ya que permiten resolver problemas muy complejos. Definición 5.2 Un grafo consta de vértices (o nodos) y aristas. Los vértices son objetos que contienen información y las aristas son conexiones entre vértices. Para representarlos, se suelen utilizar puntos para los vértices y líneas para las conexiones, aunque hay que recordar siempre que la definición de un grafo no depende de su representación. Definición 5.3 Un camino entre dos vértices es una lista de vértices en la que dos elementos sucesivos están conectados por una arista del grafo. Así, el camino AJLOE es un camino que comienza en el vértice A y pasa por los vértices J, L y O (en ese orden) y al final va del O al E. El grafo será conexo si existe un camino desde cualquier nodo del grafo hasta cualquier otro. Si no es conexo constará de varias componentes conexas. Definición 5.4 Un camino simple es un camino desde un nodo a otro en el que ningún nodo se repite (no se pasa dos veces). Si el camino simple tiene como primer y último elemento al mismo nodo se denomina ciclo. Cuando el grafo no tiene ciclos tenemos un árbol. Varios árboles independientes forman un bosque. Un árbol de expansión de un grafo es una 136 CAPITULO V: Teoria de grafos reducción del grafo en el que solo entran a formar parte el número mínimo de aristas que forman un árbol y conectan a todos los nodos. Definición 5.5 Un grafo es completo si cuenta con todas las aristas posibles (es decir, todos los nodos están conectados con todos), disperso si tiene relativamente pocas aristas y denso si le faltan pocas para ser completo. Definición 5.6 Un grafo no dirigido es cuando las aristas son la mayor parte de las veces bidireccionales, es decir, si una arista conecta dos nodos A y B se puede recorrer tanto en sentido hacia B como en sentido hacia A. Definición 5.7 Un grafo dirigido es cuando las aristas son unidireccionales. Estas uniones se suelen dibujar con una flecha. Definición 5.8 Un grafo es ponderado cuando las aristas llevan un coste asociado (un entero al que se denomina peso). Definición 5.9 Una red es un grafo dirigido y ponderado. Definición 5.10 Dos grafos son isomorfos cuando sólo queda lo esencial del dibujo: la forma de las aristas no son relevantes, sólo importan sus extremidades (o cabos); la posición de los vértices tampoco, y se puede variar para obtener un grafo más claro, y hasta sus nombres se pueden cambiar. Generalmente, se considera que colocar los vértices en forma de polígono regular da grafos muy legibles. 137 Lic. Elmer Alberto León Zárate Ilustración 5.1 Esquema de grafos isomorfos COLORACION DE UN MAPA Cuatro colores son siempre suficientes para colorear un mapa. El mapa siguiente muestra que tres colores no bastan: Si se empieza por el país central a y se esfuerza uno en utilizar el menor número de colores, entonces en la corona alrededor de a alternan dos colores. Llegando al país h se tiene que introducir un cuarto color. Lo mismo sucede en i si se emplea el mismo método. Ilustración 5.2 Esquema de un mapa coloreado 138 CAPITULO V: Teoria de grafos 5.2 REPRESENTACIÓN DE GRAFOS Una característica especial en los grafos es que podemos representarlos utilizando dos estructuras de datos distintas. En los algoritmos que se aplican sobre ellos veremos que adoptarán tiempos distintos dependiendo de la forma de representación elegida. En particular, los tiempos de ejecución variarán en función del número de vértices y el de aristas, por lo que la utilización de una representación u otra dependerá en gran medida de si el grafo es denso o disperso. Para nombrar los nodos utilizaremos letras mayúsculas, aunque en el código deberemos hacer corresponder cada nodo con un entero entre 1 y V (número de vértices) de cara a la manipulación de los mismos. 5.2.1 REPRESENTACIÓN POR MATRIZ DE ADYACENCIA Es la forma más común de representación y la más directa. Consiste en una tabla de tamaño V x V, en que la que a[i] [j] tendrá como valor 1 si existe una arista del nodo i al nodo j. En caso contrario, el valor será 0. Cuando se trata de grafos ponderados en lugar de 1 el valor que tomará será el peso de la arista. Si el grafo es no dirigido hay que asegurarse de que se marca con un 1 (o con el peso) tanto la entrada a[i] [j] como la entrada a[j] [i], puesto que se puede recorrer en ambos sentidos. int V, A; int a[maxV][maxV]; void inicializar() { int i,x,y,p; 139 Lic. Elmer Alberto León Zárate char v1,v2; // Leer V y A memset(a,0,sizeof(a)); for (i=1; i<=A; i++) { scanf("%c %c %d\n",&v1,&v2,&p); x=v1-'A'; y=v2-'A'; a[x][y]=p; a[y][x]=p; } } En esta implementación se ha supuesto que los vértices se nombran con una letra mayúscula y no hay errores en la entrada. Evidentemente, cada problema tendrá una forma de entrada distinta y la inicialización será conveniente adaptarla a cada situación. En todo caso, esta operación es sencilla si el número de nodos es pequeño. Si, por el contrario, la entrada fuese muy grande se pueden almacenar los nombres de nodos en un árbol binario de búsqueda o utilizar una tabla de dispersión, asignando un entero a cada nodo, que será el utilizado en la matriz de adyacencia. Como se puede apreciar, la matriz de adyacencia siempre ocupa un espacio de V*V, es decir, depende solamente del número de nodos y no del de aristas, por lo que será útil para representar grafos densos. 140 CAPITULO V: Teoria de grafos 5.2.2 REPRESENTACIÓN POR LISTA DE ADYACENCIA Otra forma de representar un grafo es por medio de listas que definen las aristas que conectan los nodos. Lo que se hace es definir una lista enlazada para cada nodo, que contendrá los nodos a los cuales es posible acceder. Es decir, un nodo A tendrá una lista enlazada asociada en la que aparecerá un elemento con una referencia al nodo B si A y B tienen una arista que los une. Obviamente, si el grafo es no dirigido, en la lista enlazada de B aparecerá la correspondiente referencia al nodo A. Las listas de adyacencia serán estructuras que contendrán un valor entero (el número que identifica al nodo destino), así como otro entero que indica el coste en el caso de que el grafo sea ponderado. Ejemplo 5.1 En este ejemplo se ha utilizado un nodo z ficticio en la cola (ver listas, apartado cabeceras y centinelas). struct nodo { int v; int p; nodo *sig; }; int V,A; // vértices y aristas del grafo struct nodo *a[maxV], *z; 141 Lic. Elmer Alberto León Zárate void inicializar() { int i,x,y,peso; char v1,v2; struct nodo *t; z=(struct nodo *)malloc(sizeof(struct nodo)); z->sig=z; for (i=0; i<V; i++) a[i]=z; for (i=0; i<A; i++) { scanf("%c %c %d\n",&v1,&v2,&peso); x=v1-'A'; y=v2-'A'; t= (struct nodo *) malloc (sizeof (struct nodo)); t->v=y; t->p=peso; t->sig=a[x]; a[x]=t; t=(struct nodo *)malloc(sizeof(struct nodo)); t->v=x; t->p=peso; t->sig=a[y]; a[y]=t; } } En este caso el espacio ocupado es O(V + A), muy distinto del necesario en la matriz de adyacencia, que era de O(V2). La representación por listas de adyacencia, por tanto, será más adecuada para grafos dispersos. 142 CAPITULO V: Teoria de grafos Hay que tener en cuenta un aspecto importante y es que la implementación con listas enlazadas determina fuertemente el tratamiento del grafo posterior. Como se puede ver en el código, los nodos se van añadiendo a las listas según se leen las aristas, por lo que nos encontramos que un mismo grafo con un orden distinto de las aristas en la entrada producirá listas de adyacencia diferentes y por ello el orden en que los nodos se procesen variará. Una consecuencia de esto es que si un problema tiene varias soluciones la primera que se encuentre dependerá de la entrada dada. Podría presentarse el caso de tener varias soluciones y tener que mostrarlas siguiendo un determinado orden. Ante una situación así podría ser muy conveniente modificar la forma de meter los nodos en la lista (por ejemplo, hacerlo al final y no al principio, o incluso insertarlo en una posición adecuada), de manera que el algoritmo mismo diera las soluciones ya ordenadas. 5.3 EXPLORACIÓN DE GRAFOS A la hora de explorar un grafo, nos encontramos con dos métodos distintos. Ambos conducen al mismo destino (la exploración de todos los vértices o hasta que se encuentra uno determinado), si bien el orden en que éstos son "visitados" decide radicalmente el tiempo de ejecución de un algoritmo, como se verá posteriormente. En primer lugar, una forma sencilla de recorrer los vértices es mediante una función recursiva, lo que se denomina búsqueda en profundidad. La sustitución de la recursión (cuya base es la estructura de datos pila) por una cola nos proporciona el segundo método de búsqueda o recorrido, la búsqueda en amplitud o anchura. 143 Lic. Elmer Alberto León Zárate Ilustración 5.3 Esquema de exploración de grafos Suponiendo que el orden en que están almacenados los nodos en la estructura de datos correspondiente es A-B-C-D-E-F... (El orden alfabético), tenemos que el orden que seguiría el recorrido en profundidad sería el siguiente: A-B-E-I-F-C-G-J-K-H-D En un recorrido en anchura el orden sería, por contra: A-B-C-D-E-G-H-I-J-K-F Es decir, en el primer caso se exploran primero los verdes y luego los marrones, pasando primero por los de mayor intensidad de color. En el segundo caso se exploran primero los verdes, después los rojos, los naranjas y, por último, el rosa. Es destacable que el nodo D es el último en explorarse en la búsqueda en profundidad pese a ser adyacente al nodo de origen (el A). Esto es debido a que primero se explora la rama del nodo C, que también conduce al nodo D. 144 CAPITULO V: Teoria de grafos En estos ejemplos hay que tener en cuenta que es fundamental el orden en que los nodos están almacenados en las estructuras de datos. Si, por ejemplo, el nodo D estuviera antes que el C, en la búsqueda en profundidad se tomaría primero la rama del D (con lo que el último en visitarse sería el C), y en la búsqueda en anchura se exploraría antes el H que el G. 5.4 RELACION DE EJERCICIOS: 1.- La matriz de adyacencia del grafo G es 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 Construir su grafo e indicar si es conexo. 2.- Sea A la matriz de adyacencia de un multígrafo G con vértices {v1, v2,..., vn} y sea a23=3 una de las entradas de A. Entonces, A) Existe un camino con tres vértices entre v2 y v3. B) Hay tres aristas con extremos los vértices v2 y v3. C) Hay tres vértices adyacentes con v2 y v3 3.- Dadas las matrices de adyacencia A, B y C de tres grafos A 0 1 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 1 C 0 1 0 1 ; B 1 0 1 1 1 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 ; 1 0 A) A y B son isomorfos B) A y C son isomorfos C) B y C son isomorfos 145 Lic. Elmer Alberto León Zárate 4.- Teniendo en cuenta la región exterior ¿cuántos colores son necesarios para colorear las regiones del mapa? A) Tres B) Cuatro C) Cinco 5.- Los grafos de la figura, ¿son isomorfos? A) No, porque uno es plano y el otro no B) Sí, pues existe un isomorfismo entre ellos. C) Sí, porque tienen el mismo número de vértices y aristas. 146 CAPITULO VI ORDENAMIENTO Y BUSQUEDA DE DATOS 6.1 ORDENAMIENTO DE DATOS Debido a que las estructuras de datos son utilizadas para almacenar información, para poder recuperar esa información de manera eficiente es deseable que aquella esté ordenada. Existen varios métodos para ordenar las diferentes estructuras de datos básicas. En general los métodos de ordenamiento no son utilizados con frecuencia, en algunos casos sólo una vez. Hay métodos muy simples de implementar que son útiles en los casos en dónde el número de elementos a ordenar no es muy grande (Ej., Menos de 500 elementos). Por otro lado hay métodos sofisticados, más difíciles de implementar pero que son más eficientes en cuestión de tiempo de ejecución. Los métodos sencillos por lo general requieren de aproximadamente n x n pasos para ordenar n elementos. Los métodos directos son: Inserción, Intercambio y Selección. Los métodos más complejos o Avanzados son: Shell, Quicksort y Heapsort. Definición 6.1 El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una secuencia tal que represente un orden, el cual puede ser numérico, alfabético o incluso alfanumérico, ascendente o descendente. 147 Lic. Elmer Alberto León Zárate Se ha dicho que el ordenamiento puede efectuarse moviendo los registros con las claves. El mover un registro completo implica un costo, el cual se incrementa conforme sea mayor el tamaño del registro. Es por ello que es deseable evitar al máximo el movimiento de los registros. Una alternativa es el crear una tabla de referencias a los registros y mover las referencias y no los datos. A continuación se mostrarán los métodos de ordenamiento empezando por el más sencillo y avanzando hacia los más sofisticados. La eficiencia de los algoritmos se mide por el número de comparaciones e intercambios que tienen que hacer, es decir, se toma n como el número de elementos que tiene el arreglo a ordenar y se dice que un algoritmo realiza O(n2) comparaciones cuando compara n veces los n elementos, n x n = n2. ANÁLISIS DE ALGORITMOS NOTACIÓN DE ORDEN Una función f(n) se define de orden O (g(n)), es decir, f(n) = O (g(n)) si existen constantes positivas n0 y c tales que: | f(n) | = c * <= | g(n) | , para toda n > n0 100 n3 => O(n3) 6n2 + 2n + 4 => O(n2) 1024 => O(1) 1+2+3+4+...+n-1+n= n * (n+1)/2 = O(n2) 148 CAPITULO VI: Ordenamiento y búsqueda de datos 6.1.1 METODOS DIRECTOS A).MÉTODO DE INSERCIÓN Este es uno de los métodos más sencillos. Consta de tomar uno por uno los elementos de un arreglo y recorrerlo hacia su posición con respecto a los anteriormente ordenados. Así empieza con el segundo elemento y lo ordena con respecto al primero. Luego sigue con el tercero y lo coloca en su posición ordenada con respecto a los dos anteriores, así sucesivamente hasta recorrer todas las posiciones del arreglo. Este es el algoritmo: Procedimiento Insertion Sort Este procedimiento recibe el arreglo de datos a ordenar a [] y altera las posiciones de sus elementos hasta dejarlos ordenados de menor a mayor. N representa el número de elementos que contiene a []. Paso 1: [Para cada pos. del arreglo] For i <- 2 to N do Paso 2: [Inicializa v y j] j <- i. Paso 3: [Compara v con los anteriores] While a [j-1] > v AND j>1 do Paso 4: [Recorre los datos mayores] Set a[j] <- a [j-1], Paso 5: [Decrementa j] set j <- j-1. Paso 5: [Inserta v en su posición] Set a[j] <- v. Paso 6: [Fin] End. Ejemplo 6.1 Si el arreglo a ordenar es a = ['a','s','o','r','t','i','n','g','e','x','a','m','p','l','e'], 149 Lic. Elmer Alberto León Zárate El algoritmo va a recorrer el arreglo de izquierda a derecha. Primero toma el segundo dato 's' y lo asigna a v y i toma el valor de la posición actual de v. Luego compara esta 's' con lo que hay en la posición j-1, es decir, con 'a'. Debido a que 's' no es menor que 'a' no sucede nada y avanza i. Ahora v toma el valor 'o' y lo compara con 's', como es menor recorre a la 's' a la posición de la 'o'; decrementa j, la cual ahora tiene la posición en dónde estaba la 's'; Compara a 'o' con a [j-1], es decir, con 'a'. Como no es menor que la 'a' sale del for y pone la 'o' en la posición a[j]. El resultado hasta este punto es el arreglo siguiente: a = ['a','o','s','r',....] Así se continúa y el resultado final es el arreglo ordenado: a = ['a','a','e','e','g','i','l','m','n','o','p','r','s','t','x'] B).MÉTODO DE INTERCAMBIO El bubble sort, también conocido como ordenamiento burbuja, funciona de la siguiente manera: Se recorre el arreglo intercambiando los elementos adyacentes que estén desordenados. Se recorre el arreglo tantas veces hasta que ya no haya cambios. Prácticamente lo que hace es tomar el elemento mayor y lo va recorriendo de posición en posición hasta ponerlo en su lugar. Procedimiento Bubble Sort Paso 1: [Inicializa i al final de arreglo] For i <- N downto 1 do Paso 2: [Inicia desde la segunda pos.] For j <- 2 to i do Paso 4: [Si a [j-1] es mayor que el que le sigue] If a [j-1] < a[j] then Paso 5: [Los intercambia] Swap(a, j-1, j). 150 CAPITULO VI: Ordenamiento y búsqueda de datos Paso 7: [Fin] End. Tiempo de ejecución del bubble sort: para el mejor caso (un paso) O(n) peor caso n(n-1)/2 promedio O(n2) C) MÉTODO DE SELECCIÓN El método de ordenamiento por selección consiste en encontrar el menor de todos los elementos del arreglo e intercambiarlo con el que está en la primera posición. Luego el segundo más pequeño, y así sucesivamente hasta ordenar todo el arreglo. Procedimiento Selection Sort Paso 1: [Para cada pos. del arreglo] For i <- 1 to N do Paso 2: [Inicializa la pos. del menor] menor <- i Paso 3: [Recorre todo el arreglo] For j <- i+1 to N do Paso 4: [Si a[j] es menor] If a[j] < a [menor] then Paso 5: [Reasigna el apuntador al menor] min = j Paso 6: [Intercambia los datos de la pos.min y posición i] Paso 7: [Fin] End. Ejemplo 6.2 El arreglo a ordenar es a = ['a','s','o','r','t','i','n','g','e','x','a','m','p','l','e']. Se empieza por recorrer el arreglo hasta encontrar el menor elemento. En este caso el menor elemento es la 151 Lic. Elmer Alberto León Zárate primera 'a'. De manera que no ocurre ningún cambio. Luego se procede a buscar el siguiente elemento y se encuentra la segunda 'a'. Esta se intercambia con el dato que está en la siguiente posición, la 's', quedando el arreglo así después de dos recorridos: a = ['a','a','o','r','t','i','n','g','e','x','s','m','p','l','e']. El siguiente elemento, el tercero en orden de menor mayor es la primera 'e', la cual se intercambia con lo que está en la tercera posición, o sea, la 'o'. Le sigue la segunda 's', la cual es intercambiada con la 'r'. El arreglo ahora se ve de la siguiente manera: a = ['a','a','e','e','t','i','n','g','o','x','s','m','p','l','r']. De esta manera se va buscando el elemento que debe ir en la siguiente posición hasta ordenar todo el arreglo. El número de comparaciones que realiza este algoritmo es: Para el primer elemento se comparan n-1 datos, en general para el elemento i-ésimo se hacen n-i comparaciones, por lo tanto, el total de comparaciones es: La sumatoria para i de 1 a n-1 (n-i) = 1/2 n (n-1). 6.1.2 METODOS AVANZADOS A).MÉTODO SHELL Denominado así por su desarrollador Donald Shell (1959), ordena una estructura de una manera similar a la del Bubble Sort, sin embargo no ordena elementos adyacentes sino que utiliza una segmentación entre los datos. Esta segmentación puede ser de cualquier tamaño de acuerdo a una secuencia de valores que empiezan con un valor grande (pero menor al tamaño total de la estructura) y van disminuyendo hasta llegar al '1'. Una secuencia que se 152 CAPITULO VI: Ordenamiento y búsqueda de datos ha comprobado ser de las mejores es: ...1093, 364, 121, 40, 13, 4, 1. En contraste, una secuencia que es mala porque no produce un ordenamiento muy eficiente es ...64, 32, 16, 8, 4, 2, 1. Su complejidad es de O (n1.2) en el mejor caso y de O (n1.25) en el caso promedio. void shellsort (int a [], int n) /* Este procedimiento recibe un arreglo a ordenar a [] y el tamaño del arreglo n. Utiliza en este caso una serie de t=6 incrementos h= [1,4,13,40,121,364] para el proceso (asumimos que el arreglo no es muy grande). */ B).MÉTODO QUICKSORT El método Quicksort divide la estructura en dos y ordena cada mitad recursivamente. Tiene la ventaja de que utiliza un tiempo proporcional a: n log (n), su desventaja radica en que se requiere de un espacio extra para el procedimiento. 153 Lic. Elmer Alberto León Zárate Este tipo de ordenamiento es útil cuando se tiene una estructura ordenada y los nuevos datos a añadir se almacenan en una estructura temporal para después agregarlos a la estructura original de manera que vuelva a quedar ordenada. Procedimiento Quicksort #include<stdio.h> void ordenar (int *,int,int); void main() { // Dar valores al array ordenar(array,0,N-1); // Para llamar a la función } void ordenar(int *array, int desde, int hasta) { int i,d,aux; // i realiza la búsqueda de izquierda a derecha // y j realiza la búsqueda de derecha a izquierda. if(desde>=hasta) return; for(i=desde+1,d=hasta;;) // Valores iniciales de la búsqueda. { for(;i<=hasta && array[i]<=array[desde];i++); // Primera búsqueda for(;d>=0 && array[d]>=array[desde];d--); if(i<d) // si no se han cruzado: { aux=array[i]; // Intercambiar. 154 // segunda búsqueda CAPITULO VI: Ordenamiento y búsqueda de datos array[i]=array[d]; array[d]=aux; } else break; // si se han cruzado: // salir del bucle. } if(d==desde-1) d=desde; // Si la segunda búsqueda se sale del array // es que el pivote es el elemento // más pequeño: se cambia con él mismo. aux=array[d]; // Colocar el pivote array[d]=array[desde]; // en su posición. array[desde]=aux; ordenar(array,desde,d-1); // Ordenar el primer array. ordenar(array,d+1,hasta); // Ordenar el segundo array. } C).MÉTODO HEAPSORT Este método garantiza que el tiempo de ejecución siempre es de: O(n log n) El significado de heap en ciencia computacional es el de una cola de prioridades (priority queue). Tiene las siguientes características: Un heap es un arreglo de n posiciones ocupado por los elementos de la cola. (Nota: se utiliza un arreglo que inicia en la posición 1 y no en cero, de tal manera que al implementarla en C se tienen n+1 posiciones en el arreglo.) 155 Lic. Elmer Alberto León Zárate Se mapea un árbol binario de tal manera en el arreglo que el nodo en la posición i es el padre de los nodos en las posiciones (2*i) y (2*i+1). El valor en un nodo es mayor o igual a los valores de sus hijos. Por consiguiente, el nodo padre tiene el mayor valor de todo su subárbol. HeapSort consiste esencialmente en: convertir el arreglo en un heap construir un arreglo ordenado de atrás hacia adelante (mayor a menor) repitiendo los siguientes pasos: o sacar el valor máximo en el heap (el de la posición 1) o poner ese valor en el arreglo ordenado o reconstruir el heap con un elemento menos Utilizar el mismo arreglo para el heap y el arreglo ordenado. Procedimiento Heapsort /* Recibe como parámetros un arreglo a ordenar y un entero que indica el numero de datos a ordenar */ void heapsort (int a [], int N) { int k; for (k=N/2; k>=1; k--) downheap (a,N,k); while (N > 1) { 156 CAPITULO VI: Ordenamiento y búsqueda de datos Swap (a, 1, N); downheap (a,--N, 1); } } /* El procedimiento downheap ordena el árbol de heap para que el nodo padre sea mayor que sus hijos */ void downheap (int a [], int N, int r) { int j, v; v = a[r]; while (r <= N/2) { j = 2*r; if (j < N && a[j] < a [j+1]); j++; if (v >= a[j]) Break; a[r] = a[j]; r = j; } a[r] = v; } 157 Lic. Elmer Alberto León Zárate 6.2 BUSQUEDA DE DATOS Definición 6.2 La búsqueda de un elemento dentro de un array es una de las operaciones más importantes en el procesamiento de la información, y permite la recuperación de datos previamente almacenados. El tipo de búsqueda se puede clasificar como interna o externa, según el lugar en el que esté almacenada la información (en memoria o en dispositivos externos). Todos los algoritmos de búsqueda tienen dos finalidades: - Determinar si el elemento buscado se encuentra en el conjunto en el que se busca. - Si el elemento está en el conjunto, hallar la posición en la que se encuentra. En este apartado nos centramos en la búsqueda interna. Como principales algoritmos de búsqueda en arrays tenemos la búsqueda secuencial, la binaria y la búsqueda utilizando tablas de hash. 6.2.1 BÚSQUEDA SECUENCIAL Consiste en recorrer y examinar cada uno de los elementos del array hasta encontrar el o los elementos buscados, o hasta que se han mirado todos los elementos del array. for(i=j=0;i<N;i++) if(array[i]==elemento) { solucion[j]=i; j++; } 158 CAPITULO VI: Ordenamiento y búsqueda de datos Este algoritmo se puede optimizar cuando el array está ordenado, en cuyo caso la condición de salida cambiaría a: for(i=j=0;array[i]<=elemento;i++) O cuando sólo interesa conocer la primera ocurrencia del elemento en el array: for(i=0;i<N;i++) if(array[i]==elemento) break; En este último caso, cuando sólo interesa la primera posición, se puede utilizar un centinela, esto es, dar a la posición siguiente al último elemento de array el valor del elemento, para estar seguro de que se encuentra el elemento, y no tener que comprobar a cada paso si seguimos buscando dentro de los límites del array: array[N]=elemento; for(i=0;;i++) if(array[i]==elemento) break; Si al acabar el bucle, i vale N es que no se encontraba el elemento. El número medio de comparaciones que hay que hacer antes de encontrar el elemento buscado es de (N+1)/2. 6.2.2 BÚSQUEDA BINARIA O DICOTÓMICA Para utilizar este algoritmo, el array debe estar ordenado. La búsqueda binaria consiste en dividir el array por su elemento medio en dos subarrays más pequeños, y comparar el 159 Lic. Elmer Alberto León Zárate elemento con el del centro. Si coinciden, la búsqueda se termina. Si el elemento es menor, debe estar (si está) en el primer subarray, y si es mayor está en el segundo. Ejemplo 6.3 Buscar el elemento 3 en el array {1,2,3,4,5,6,7,8,9} se realizarían los siguientes pasos: Se toma el elemento central y se divide el array en dos: {1,2,3,4}-5-{6,7,8,9} Como el elemento buscado (3) es menor que el central (5), debe estar en el primer subarray: {1,2,3,4} Se vuelve a dividir el array en dos: {1}-2-{3,4} Como el elemento buscado es mayor que el central, debe estar en el segundo subarray: {3,4} Se vuelve a dividir en dos: {}-3-{4} Como el elemento buscado coincide con el central, lo hemos encontrado. Si al final de la búsqueda todavía no lo hemos encontrado, y el subarray a dividir está vacío {}, el elemento no se encuentra en el array. La implementación sería: int desde,hasta,medio,elemento,posicion; // desde y // Hasta indican los límites del array que se está mirando. int array[N]; // Dar valor a elemento. for (desde=0, hasta=N-1; desde<=hasta;) { if (desde==hasta) // si el array sólo tiene un elemento: 160 CAPITULO VI: Ordenamiento y búsqueda de datos { if (array [desde]==elemento) // si es la solución: posicion=desde; // darle el valor. else // si no es el valor: posicion=-1; // no está en el array. break; // Salir del bucle. } medio= (desde+hasta)/2; // Divide el array en dos. if (array [medio]==elemento) // Si coincide con el central: { posicion=medio; // ese es la solución break; // y sale del bucle. } else if (array[medio]>elemento) // si es menor: hasta=medio-1; // elige el array izquierda. else // y si es mayor: desde=medio+1; // elige el array de la derecha. } En general, este método realiza log (2, N+1) comparaciones antes de encontrar el elemento, o antes de descubrir que no está. Este número es muy inferior que el necesario para la búsqueda lineal para casos grandes. Este método también se puede implementar de forma recursiva, siendo la función recursiva la que divide al array en dos más pequeños. 161 Lic. Elmer Alberto León Zárate 6.2.3 BÚSQUEDA MEDIANTE TRANSFORMACIÓN DE CLAVES (HASHING) Es un método de búsqueda que aumenta la velocidad de búsqueda, pero que no requiere que los elementos estén ordenados. Consiste en asignar a cada elemento un índice mediante una transformación del elemento. Esta correspondencia se realiza mediante una función de conversión, llamada función hash. La correspondencia más sencilla es la identidad, esto es, al número 0 se le asigna el índice 0, al elemento 1 el índice 1, y así sucesivamente. Pero si los números a almacenar son demasiado grandes esta función es inservible. Por ejemplo, se quiere guardar en un array la información de los 1000 usuarios de una empresa, y se elige el número de DNI como elemento identificativo. Es inviable hacer un array de 100.000.000 elementos, sobre todo porque se desaprovecha demasiado espacio. Por eso, se realiza una transformación al número de DNI para que nos dé un número menor, por ejemplo coger las 3 últimas cifras para guardar a los empleados en un array de 1000 elementos. Para buscar a uno de ellos, bastaría con realizar la transformación a su DNI y ver si está o no en el array. La función de hash ideal debería ser biyectiva, esto es, que a cada elemento le corresponda un índice, y que a cada índice le corresponda un elemento, pero no siempre es fácil encontrar esa función, e incluso a veces es inútil, ya que puedes no saber el número de elementos a almacenar. La función de hash depende de cada problema y de cada finalidad, y se pueden utilizar con números o cadenas, pero las más utilizadas son: A) Restas sucesivas: esta función se emplea con claves numéricas entre las que existen huecos de tamaño conocido, obteniéndose direcciones consecutivas. Por ejemplo, si el 162 CAPITULO VI: Ordenamiento y búsqueda de datos número de expediente de un alumno universitario está formado por el año de entrada en la universidad, seguido de un número identificativo de tres cifras, y suponiendo que entran un máximo de 400 alumnos al año, se le asignarían las claves: 1998-000 --> 0 = 1998000-1998000 1998-001 --> 1 = 1998001-1998000 1998-002 --> 2 = 1998002-1998000 1998-399 --> 399 = 1998399-1998000 1999-000 --> 400 = 1999000-1998000+400 yyyy-nnn --> N = yyyynnn-1998000+ (400*(yyyy-1998)) B) Aritmética modular: el índice de un número es resto de la división de ese número entre un número N prefijado, preferentemente primo. Los números se guardarán en las direcciones de memoria de 0 a N-1. Este método tiene el problema de que cuando hay N+1 elementos, al menos un índice es señalado por dos elementos (teorema del palomar). A este fenómeno se le llama colisión, y es tratado más adelante. Si el número N es el 13, los números siguientes quedan transformados en: 13000000 --> 0 12345678 --> 7 13602499 --> 1 71140205 --> 6 73062138 --> 6 C) Mitad del cuadrado: consiste en elevar al cuadrado la clave y coger las cifras centrales. Este método también presenta problemas de colisión: 163 Lic. Elmer Alberto León Zárate 123*123=15129 --> 51 136*136=18496 --> 84 730*730=532900 --> 29 301*301=90601 --> 06 625*625=390625 --> 06 D) Truncamiento: consiste en ignorar parte del número y utilizar los elementos restantes como índice. También se produce colisión. Por ejemplo, si un número de 8 cifras se debe ordenar en un array de 1000 elementos, se pueden coger el primer, el tercer y las últimas cifras para formar un nuevo número: 13000000 --> 100 12345678 --> 138 13602499 --> 169 71140205 --> 715 73162135 --> 715 E) Plegamiento: consiste en dividir el número en diferentes partes, y operar con ellas (normalmente con suma o multiplicación). También se produce colisión. Por ejemplo, si dividimos el número de 8 cifras en 3, 3 y 2 cifras y se suman, dará otro número de tres cifras (y si no, se cogen las tres últimas cifras): 13000000 --> 130=130+000+00 12345678 --> 657=123+456+78 71140205 --> 118 --> 1118=711+402+05 164 CAPITULO VI: Ordenamiento y búsqueda de datos 13602499 --> 259=136+024+99 25000009 --> 259=250+000+09 TRATAMIENTO DE COLISIONES Pero ahora se nos presenta el problema de qué hacer con las colisiones, qué pasa cuando a dos elementos diferentes les corresponde el mismo índice. Pues bien, hay tres posibles soluciones: Cuando el índice correspondiente a un elemento ya está ocupado, se le asigna el primer índice libre a partir de esa posición. Este método es poco eficaz, porque al nuevo elemento se le asigna un índice que podrá estar ocupado por un elemento posterior a él, y la búsqueda se ralentiza, ya que no se sabe la posición exacta del elemento. También se pueden reservar unos cuantos lugares al final del array para alojar a las colisiones. Este método también tiene un problema: ¿Cuánto espacio se debe reservar? Además, sigue la lentitud de búsqueda si el elemento a buscar es una colisión. Lo más efectivo es, en vez de crear un array de número, crear un array de punteros, donde cada puntero señala el principio de una lista enlazada. Así, cada elemento que llega a un determinado índice se pone en el último lugar de la lista de ese índice. El tiempo de búsqueda se reduce considerablemente, y no hace falta poner restricciones al tamaño del array, ya que se pueden añadir nodos dinámicamente a la lista. 165 Lic. Elmer Alberto León Zárate 6.3 RELACION DE EJERCICIOS: 1.- Insertar los elementos: 67, 46, 88, 93, 81, 26 y 17 en una tabla de dispersión cerrada de tamaño b=10 y la función de dispersión h (k) = k mod b.si es necesario aplicar la función de redispersion lineal hi(k)= [h (k)+ i] mod b. 2.-Ordenar el siguiente arreglo aplicando el método Heapsort. E X A M E N D E P R O G R A M A C I O N 3.- En un arreglo V se guardan los apellidos de N alumnos. Aplique el primer método de intercambio para ordenar en forma ascendente, de tal manera que: Ap1 Ap2 Ap3 Ap4 ……… Apn. 4. En cierta empresa se maneja tres listas (Vectores P, Q, R) que contienen los datos de los N artículos que se venden. a) El vector P contiene los códigos de los artículos. b) El vector Q contiene los nombres de los artículos c) El vector Q contiene los precios de los artículos. Ordene los arreglos en forma descendente utilizando el método de selección. 5. Escriba un algoritmo para que utilizando la búsqueda secuencial e informe todas las ocurrencias de los datos X en un vector T de 77 elementos. 6. Dado un arreglo NOMBRES que contiene los nombres de N alumnos ordenado alfabéticamente, escriba un programa que encuentre en el arreglo un nombre dado. Si lo encuentra debe informar la posición en que la encontró. En caso contrario debe enviar un mensaje adecuado. 7. Se tienen tres vectores de Z elementos: El vector A con los nombres 166 CAPITULO VI: Ordenamiento y búsqueda de datos El vector B con los promedios El vector C con el número de materias aprobadas. Escriba un algoritmo que lea un nombre, lo busque y si lo encuentra informe su promedio y número de materias aprobadas. Si el nombre dado no está en el arreglo, envié un mensaje adecuado. a) Considere que los arreglos están ordenados. b) Considere que los arreglos están desordenados. 167 CAPITULO VII SOFTWARE DE PROGRAMACION MATLAB 7.1 INTRODUCCIÒN Definición 7.1 MATLAB es un entorno de computación y desarrollo de aplicaciones totalmente integrado orientado para llevar a cabo proyectos en donde se encuentre elevados cálculos matemáticos y su visualización gráfica. MATLAB integra análisis numérico, cálculo matricial, proceso de señal y visualización gráfica. Definición 7.2 MATLAB es la disponibilidad de los paquetes especializados llamados Toolboxes orientados a ingenieros, científicos y técnicos. Entre los más destacados están: - Procesamiento de señal - Diseño de Sistemas de control - The MATLAB Math Library - Identificación de Sistema - Matemáticas Simbólicas - Optimización - Procesamiento de Imagen - Diseño de control no lineal - The MATLAB compiler - Lógica Difusa - Estadística - Splines 168 CAPITULO VII: Software de programación Matlab 7.2 OPERADORES 7.2.1 OPERADORES LOGICOS OPERADOR DESCRIPCION & Y ¡ O ~ NO 7.2.2 OPERADORES ARITMETICOS ESCALAR MATRIZ VECTOR DESCRIPCION + + + Adición - - - Sustracción * * .* Multiplicación / / ./ División hacia la derecha \ \ \. División hacia la izquierda ^ ‘ .’ Transpuesta 7.2.3 OPERADORES RELACIONALES OPERADOR DESCRIPCION < Menor que <= Menor o igual que > Mayor que >= Mayor o igual que 169 Lic. Elmer Alberto León Zárate == Igual ~= No igual 7.2.4 CARACTERES ESPECIALES CARACTERES DESCRIPCION [] Para formar matrices y vectores () Define precedencia en expresiones aritméticas , Separador de elementos de una matriz, argumentos de funciones y declaraciones. ; Separador de declaraciones, termina renglones de una matriz Ejemplo 7.1 Ejemplo 7.2 Ejemplo 7.3 >> 13/3 >> 3/13 >> 4^ 2 ans = 4.3333 ans = 62.3333 ans = 16 Ejemplo 7.4 Ejemplo 7.5 Ejemplo 7.6 >> 2* pi^ 3 >>a = [0 1 2 3 4 5 6 7 8 9 10] >>t = 0: 2: 20 a = 0 1 2 3 4 5 6 7 8 9 10 t = 0 2 4 6 8 10 12 14 Ejemplo 7.7 Ejemplo 7.8 Ejemplo 7.9 >>b = a + 3 >>t = [1; 3; 5] >>c = a + b ans = 62.01255336059 b = 3 4 5 6 7 8 9 10 11 12 13 t=1 c = 3 4 5 6 7 8 9 11 13 15 17 3 19 21 23 5 170 CAPITULO VII: Software de programación Matlab Ejemplo 7.10 Ejemplo 7.11 Ejemplo 7.12 >>d’ >>f = [4; 6; 9] >>d.*f ans= f= ans= 4 4 6 18 9 45 1 3 5 7.3 VARIABLES Definición 7.3 Las variables deben tener un nombre según las siguientes reglas: no pueden comenzar con un número, pero si pueden tener números en los caracteres siguientes. Las mayúsculas y minúsculas se diferencian en los nombres de variables. Los nombres de variables no pueden contener operadores ni puntos. No es necesario definir el tipo de variable ó tamaño (si se usa un vector y después se expande). 7.4 EXPRESIONES Definición 7.4 Una expresión en MATLAB, puede ser: una variable ó un número (ejemplo: variable 1,x,3,22.3) Un comando aplicado (ejemplo: norm (A), sin (2*pi)) Una expresión matemática (ejemplo: 2+3* variab1^4.5) 171 Lic. Elmer Alberto León Zárate Observación 7.1 Cualquiera de las expresiones anteriores si se escribe en la línea de comandos (>>) devolverá el nombre de la variable y su valor, si no tiene nombre MATLAB devolverá ans = resultado. Observación 7.2 Si la expresión termina en un punto y coma MATLAB no imprime su valor en la pantalla, pero si realiza al cálculo. 7.5 MATLAB Y EL ALGEBRA LINEAL Para crear un vector introducimos los valores deseados separados por espacios (o comas) todo ello entre corchetes []. Si lo que queremos es crear una matriz lo hacemos de forma análoga pero separando las filas con puntos y comas (;). Generalmente usaremos letras mayúsculas cuando nombremos a las matrices y minúsculas para vectores y escalares. Esto no es imprescindible y Matlab no lo exige, pero resulta útil. Ejemplo 7.13 >> x = [5 7 -2 4 -6] % es un vector, los elementos los separamos con espacios x= 5 7 -2 4 -6 Ejemplo 7.14 >> y = [2, 1, 3,7] % es otro vector, los elementos los separamos con comas 172 CAPITULO VII: Software de programación Matlab y= 2137 Ejemplo 7.15 >> z = [0 1 2,3 4,5] % es otro vector, da igual separar los elementos por comas o espacios z= 012345 Ejemplo 7.16 >> A = [1 2 3; 4 5 6] % es una matriz con 2 filas y 3 columnas A= 123 456 7.5.1 DIRECCIONAMIENTO DE ELEMENTOS DE VECTORES Y MATRICES Para acceder a los elementos individuales de un vector lo haremos utilizando subíndices, así x(n) sería el n-ésimo elemento del vector x. Si queremos acceder al último podemos indicarlo usando end como subíndice. Ejemplo 7.17 >> x = [5 7 -2 4 -6]; >> x (2) % segundo elemento del vector x 173 Lic. Elmer Alberto León Zárate ans = 7 Ejemplo 7.18 >> x (end) % último elemento del vector x ans = -6 Para acceder a un bloque de elementos a la vez, se usa la notación de dos puntos (:), así x (m: n) nos da todos los elementos desde el m-ésimo hasta el n-ésimo del vector x. Ejemplo 7.19 >> x (2:4) % devuelve desde el segundo al cuarto elemento del vector x ans = 7 -2 4 Si introducimos un número entre el primero y el segundo también separado por dos puntos (:) se mostrarán los elementos del primero al último indicado, incrementados según el número que aparece en el centro (o decrementados si el número es negativo). Ejemplo 7.20 >> x (1:2:5) % devuelve el primero, tercero y quinto elemento del vector x ans = 5 -2 -6 174 CAPITULO VII: Software de programación Matlab Otra forma de obtener un conjunto concreto de elementos del vector es indicando entre corchetes [] las posiciones de los elementos que queremos obtener poniendo paréntesis fuera de los corchetes. Ejemplo 7.21 >> x ([3 5 1]) % devuelve el tercer, quinto y primer elemento del vector x ans = -2 -6 5 Para acceder a los elementos de una matriz necesitamos dar dos valores, el primero indica la fila y el segundo la columna. Ejemplo 7.22 >> A = [1 2 3; 4 5 6]; >> A (2,1) % elemento de la matriz que está en la fila 2 y en la columna 1 ans = 4 Si queremos que escriba toda una fila usaremos los dos puntos para indicar que queremos todos los elementos. Ejemplo 7.23 >> A (2, :) % escribe la segunda fila de la matriz ans = 456 175 Lic. Elmer Alberto León Zárate Similarmente si queremos que escriba toda una columna pero ahora situamos los dos puntos en el lugar de las filas para indicar que queremos todas las filas de esa columna. Ejemplo 7.24 >> A (:,2) % escribe la segunda columna de la matriz ans = 2 5 Al igual que con los vectores podemos indicar que escriba una serie de filas o columnas, la manera de hacerlo sería muy parecido. Ejemplo 7.25 >> A (2,2:3) % escribe de la segunda fila de la matriz, las columnas de la 2 a la 3 ans = 56 Ejemplo 7.26 >> A (2, [3 1]) % escribe de la segunda fila de la matriz, las columnas 3 y 1 ans = 64 Ejemplo 7.27 >> A ([2 1], 2:3) % escribe de las filas 2 y 1 de la matriz, las columnas de la 2 a la 3 ans = 56 176 CAPITULO VII: Software de programación Matlab 23 Ejemplo 7.28 >> A (end, [1 3]) % escribe de la última fila, las columnas 1 y 3 ans = 46 Matlab tiene además otra forma de identificar cada elemento de una matriz, de modo que podemos acceder a un elemento de una matriz indicando sólo un valor y no dos, pero debemos saber que el orden elegido por Matlab es por columnas así los elementos de la matriz A serían denominados: Ejemplo 7.29 Como la matriz A que teníamos era A= 123 456 >>A (5) %accede al elemento 5 de la matriz, es decir, igual que si escribiéramos A (1,3) ans = 3 177 Lic. Elmer Alberto León Zárate Pero es preferible para evitar confusiones trabajar con los elementos de las matrices indicando la fila y la columna correspondiente. 7.5.2 CONSTRUCCIÓN ABREVIADA DE ALGUNOS VECTORES A parte de definir un vector introduciendo cada uno de sus elementos, también podemos crearlo haciendo uso de las siguientes sentencias: (a: b) crea un vector que comienza en el valor a y acaba en el valor b aumentando de 1 en 1. (a: c: b) crea un vector q comienza en el valor a y acaba en el valor b aumentando de c en c. linspace (a,b,c) genera un vector linealmente espaciado entre los valores a y b con c elementos. linspace (a,b) genera un vector linealmente espaciado entre los valores a y b con 100 elementos. logspace (a,b,c) genera un vector logarítmicamente espaciado entre los valores 10^a y 10^b con c elementos. logspace (a,b) genera un vector logarítmicamente espaciado entre los valores 10^a y 10^b con 50 elementos. Ejemplo 7.30 >> (1:7) % crea un vector que comienza en 1, aumenta de 1 en 1 y acaba en 7 ans = 1234567 Ejemplo 7.31 >> (1:3:10) % crea un vector que comenzando en 1, aumenta de 3 en 3 hasta el 10 178 CAPITULO VII: Software de programación Matlab ans = 1 4 7 10 Ejemplo 7.32 >> (1:4:10) % comenzando en 1, aumenta de 4 en 4 hasta el 10 y por eso acaba en 9 ans = 159 Ejemplo 7.33 >> (50:-7:1) % crea un vector que comenzando en 50, disminuye de 7 en 7 hasta el 1 ans = 50 43 36 29 22 15 8 1 Ejemplo 7.34 >> linspace (2,6,3) % genera un vector desde el 2 al 6 con 3 elementos equidistantes ans = 246 Ejemplo 7.35 >> linspace (2,6,4) % genera un vector desde el 2 al 6 con 4 elementos equidistantes ans = 2.0000 3.3333 4.6667 6.0000 179 Lic. Elmer Alberto León Zárate Ejemplo 7.36 >> logspace (0,2,4) % genera un vector logarítmicamente espaciado entre 10^0 y 10^2 con 4 elementos ans = 1.0000 4.6416 21.5443 100.0000 7.5.3 CONSTRUCCIÓN DE ALGUNAS MATRICES Al igual que pasa con los vectores, existen unas sentencias que nos ayudan a crear más rápidamente algunas matrices que Matlab ya tiene predefinidas (m y n deben tomar valores naturales): zeros (n) crea una matriz cuadrada n x n de ceros. zeros (m,n) crea una matriz m x n de ceros. ones (n) crea una matriz cuadrada n x n de unos. ones (m,n) crea una matriz m x n de unos. rand (n) crea una matriz cuadrada n x n de números aleatorios con distribución uniforme (0,1). rand (m,n) crea una matriz m x n de números aleatorios con distribución uniforme (0,1). randn (n) crea una matriz n x n de números aleatorios con distribución normal (0,1). randn (m,n) crea una matriz m x n de números aleatorios con distribución normal (0,1). eye (n) crea una matriz cuadrada n x n de unos en la diagonal y ceros el resto. eye (m,n) crea una matriz m x n de unos en la diagonal y ceros el resto. magic (n) crea una matriz cuadrada n x n de enteros de modo que sumen lo mismo las filas y las columnas. 180 CAPITULO VII: Software de programación Matlab hilb (n) crea una matriz cuadrada n x n de Hilbert, es decir, los elementos (i,j) responden a la expresión (1/(i+j-1)). invhilb (n) crea una matriz cuadrada n x n que es la inversa de la matriz de Hilbert. Ejemplo 7.37 >> zeros (3) % matriz cuadrada 3 x 3 de ceros ans = 000 000 000 Ejemplo 7.38 >> zeros (2,5) % matriz 2 x 5 de ceros ans = 00000 00000 Ejemplo 7.39 >> ones (2,3) % matriz de unos ans = 111 111 Ejemplo 7.40 >> rand (2,4) % matriz de valores aleatorios entre 0 y 1 según la uniforme (0,1) 181 Lic. Elmer Alberto León Zárate ans = 0.9355 0.4103 0.0579 0.8132 0.9169 0.8936 0.3529 0.0099 Ejemplo 7.41 >> randn (2,5) % matriz de valores aleatorios según la normal (0,1) ans = 0.8156 1.2902 1.1908 -0.0198 -1.6041 0.7119 0.6686 -1.2025 -0.1567 0.2573 Ejemplo 7.42 >> eye (2) % matriz identidad o unidad ans = 10 01 Ejemplo 7.43 >> magic (4) % matriz mágica 4 x 4 ans = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 182 CAPITULO VII: Software de programación Matlab Ejemplo 7.44 >> hilb (3) % matriz de Hilbert 3 x 3 ans = 1.0000 0.5000 0.3333 0.5000 0.3333 0.2500 0.3333 0.2500 0.2000 Ejemplo 7.45 >> invhilb (3) % inversa de la matriz de Hilbert 3 x 3 ans = 9 -36 30 -36 192 -180 30 -180 180 7.5.4 OPERACIONES BÁSICAS CON MATRICES 183 Lic. Elmer Alberto León Zárate Ejemplo 7.46 Definimos tres matrices para poder hacer operaciones entre ellas. A=B=C= 1 2 1 1 1.0000 + 1.0000i 2.0000 + 2.0000i 3 4 0 1 3.0000 + 1.0000i 4.0000 + 7.0000i >> A * B % multiplicación de matrices ans = 13 37 Ejemplo 7.47 >> A .* B % multiplicación elemento a elemento ans = 12 04 Ejemplo 7.48 >> C ' % traspuesta conjugada ans = 1.0000 - 1.0000i 3.0000 - 1.0000i 2.0000 - 2.0000i 4.0000 - 7.0000i Ejemplo 7.49 >> C .' % traspuesta 184 CAPITULO VII: Software de programación Matlab ans = 1.0000 + 1.0000i 3.0000 + 1.0000i 2.0000 + 2.0000i 4.0000 + 7.0000i Ejemplo 7.50 >> A + 2 % si sumamos el número 2 a la matriz se suma ese número a cada elemento ans = 34 56 7.5.5 FUNCIONES PARA OPERAR CON VECTORES Ejemplo 7.51 >> x = [1 2 3]; y = [4 5 6]; >> cross (x,y) % producto vectorial ans = -3 6 –3 Ejemplo 7.52 >> dot (x,y) % producto escalar ans = 32 185 Lic. Elmer Alberto León Zárate 7.5.6 FUNCIONES PARA EL ANÁLISIS DE MATRICES (Con A matriz, v vector y n número natural) Ejemplo 7.53 >> diag (v) % crea una matriz diagonal a partir del vector v ans = 100 020 003 Ejemplo 7.54 >> A = [1 2 3 4; 7 8 9 2; 2 4 6 8] A= 1234 7892 2468 186 CAPITULO VII: Software de programación Matlab Ejemplo 7.55 >> diag (A) % crea un vector columna a partir de la diagonal de la matriz A ans = 1 8 6 Ejemplo 7.56 >> size (A) % devuelve las dimensiones de la matriz como un vector fila ans = 34 Ejemplo 7.57 >> length (A) % devuelve la mayor de las dos dimensiones de la matriz ans = 4 Ejemplo 7.58 >> trace (A) % traza de la matriz ans = 15 Ejemplo 7.59 >> rank (A) % rango de la matriz 187 Lic. Elmer Alberto León Zárate ans = 2 Ejemplo 7.60 >> rref (A) % reducción mediante Gauss ans = 1.0000 0 -1.0000 -4.6667 0 1.0000 2.0000 4.3333 0000 Ejemplo 7.61 >> l = tril (A), u = triu (A) l= 1 0 0 0 % convierte en ceros todos los elementos que quedan encima de 7 8 0 0 % la diagonal principal y lo guarda en la variable l 2460 Ejemplo 7.62 u= 1 2 3 4 % convierte en ceros todos los elementos que quedan debajo de 0 8 9 2 % la diagonal principal y lo guarda en la variable u 0068 188 CAPITULO VII: Software de programación Matlab 7.5.7 OTRAS OPERACIONES CON MATRICES (Con A matriz, m y n naturales) Ejemplo 7.63 >> A = [pi 0; pi/4 pi/3] A= 3.1416 0 0.7854 1.0472 Ejemplo 7.64 >> find (A) % devuelve los índices como un vector columna ans = 1 2 189 Lic. Elmer Alberto León Zárate 4 Ejemplo 7.65 >> reshape (A,1,4) ans = 3.1416 0.7854 0 1.0472 Ejemplo 7.66 >> rot90 (A) % gira la matriz 90º ans = 0 1.0472 3.1416 0.7854 Ejemplo 7.67 >> rot90 (A,3) % gira la matriz 270º ( 90º x 3 = 270º ) ans = 0.7854 3.1416 1.0472 0 Ejemplo 7.68 >> funm (A,@sin) % calcula el seno de cada elemento de la matriz ans = 0.0000 0 -0.3248 0.8660 190 CAPITULO VII: Software de programación Matlab Ejemplo 7.69 >> expm (A) ans = 23.1407 0 7.6091 2.8497 COMANDOS AVANZADOS Definición 7.5 Cada comando en MATLAB es un archivo con extensión .m por lo tanto es necesario tener las librerías donde se encuentran los comandos que se desean utilizar. MATLAB no distingue entre mayúsculas y minúsculas en los comandos. ARCHIVOS CON EXTENSIÓN . M Todos los comandos pueden utilizarse directamente desde la línea de comandos del MATLAB (>>). Un archivo (con extensión .m) debe contener el programa (para modificarlo, revisarlo, correcto otra vez …) Para trabajar estos archivos es necesario saber: - que es: Es un archivo de texto como cualquier otro donde se encuentra el listado del programa. - Desde Windows: con el NOTEPAD cambiando el tipo de archivo a “todos los archivos (*,*)” antes de grabarlo. - En el Editor de MATLAB. 191 Lic. Elmer Alberto León Zárate - El archivo debe quedar grabado en el mismo directorio que MATLAB para poder correrlo 7.6 COMANDOS DE PROGRAMACIÓN 7.6.1 COMMAND END Determina hasta cual orden llega el efecto de if, for y while. 7.6.2 COMANDO IF Verifica si se cumple la condición, si es verdadero ó falso ejecuta la acción correspondiente. SINTAXIS: if (condición), (acción 1) [else, (acción 2)] end; Donde las ordenes entre [] son opcionales: (acción 1) = se ejecuta si la condición es verdadera (acción 2) = se ejecuta si la condición es falsa (condición) puede ser: a==b a<b a>b a<=b a>=b a~=b Ejemplo 7.70 % uso de if n = 0; 192 CAPITULO VII: Software de programación Matlab if n = = 0, n % MATLAB escribe su resultado en pantalla else, n=1 end n = 2; if n = 0, n else, n=1 end; SALIDA n= 0 n= 1 7.6.3 COMANDO WHILE Mientras la condición es verdadera ejecuta la acción correspondiente. SINTAXIS while (condición), (acción) end; Donde: (acción) son las ordenes a ejecutar 193 Lic. Elmer Alberto León Zárate (condición) puede ser igual a la condición del comando if. Ejemplo 7.71 % uso del comando while n=0 while n<=2 n n=n+1; end; SALIDA n= 0 n= 1 n= 2 7.6.4 COMANDO FOR Utiliza un contador y es útil si se quiere repetir una parte del programa un número determinado de veces. SINTAXIS for (contador), (acción) end; 194 CAPITULO VII: Software de programación Matlab Donde: (acción) = son las ordenes a ejecutar hasta que el contador llega a su valor final (contador) = Es de la forma: variable = a [ : b] : c Donde: variable es el contador a es el valor inicial del contador b es el segundo valor del contador (opcional, si de omite b = a +1), determina el incremento del contador. c es el valor final del contador. Ejemplo 7.72 % uso del for for i = 0.5 : 2.0 i % MATLAB muestra su valor end; SALIDA i= 0 i= 0.5 i= 1 i= 195 Lic. Elmer Alberto León Zárate 1.5 i= 2 7.6.5 COMANDO DISP Sirve para escribir texto de salida ó vectores de resultados SINTAXIS disp (X); X puede ser: - Un vector. - Una matriz - Una cadena de texto Ejemplo 7.73 % uso de disp a = [1,2,3,4,9,11]; % un vector disp (a); a = [1,2,7;6,3,4]; % un matriz disp (a); a = ` Texto de Prueba´; % una cadena de texto disp (a); disp (`También se puede escribir así´); SALIDA 1 2 3 4 9 11 1 2 7 196 CAPITULO VII: Software de programación Matlab 6 3 4 Texto de Prueba También se puede escribir así 7.6.6 COMANDO INPUT Se utiliza para que el programa pida valores de variables mientras se ejecuta: SINTAXIS Variable = input (texto); Donde: variable es un nombre valido donde se almacena el valor que se pregunta. Texto puede ser una variable ó una cadena Ejemplo 7.74 % uso de input a = 0; a = input (`Ingrese el valor de a; ´); texto = `Cual es el nuevo valor de a: ´; a a = input (texto); a SALIDA Ingrese el valor de a: (espera) a= 197 Lic. Elmer Alberto León Zárate XXX % se imprime el valor asignado a. Cual es el nuevo valor de a? (espera) a= YYY Donde XXX y YYY son valores ingresados por el usuario al momento de correr el programa Ejemplo 7.75 Hacer un programa en MATLAB para encontrar los números primos menores que 100. clc, disp('Estos son los números primos menores de 100') disp (2) for i=3:100 n=2; while n <= sqrt(i) if rem(i,n)==0 n=i; else n=n+1; end end if n~=i disp(i) end end Ejemplo 7.76 198 CAPITULO VII: Software de programación Matlab Hacer un programa en MATLAB para encontrar la suma de los divisores de un numero entero positivo N ingresado por el usuario. clc, N=input('Ingrese un numero entero positivo:'); Suma=0; for i=1:N if rem(N,i)==0 Suma=Suma+i; end end disp ('La Suma de los divisores del número es: ') disp(Suma) 7.7 GRÁFICAS 2-D La orden plot genera una gráfica. Los argumentos deben ser vectores de la misma longitud. Ejemplo 7.77 >> x = [-2 -1 0 1 2 3]; y = [4 1 0 1 4 9]; >> plot (x,y) 199 Lic. Elmer Alberto León Zárate Figura 7.1 Esquema de grafico con el comando plot Si queremos cambiar la apariencia de la gráfica basta pinchar en el último botón de la barra de herramientas y se abrirán unos cuadros en los laterales que nos permitirán ir haciendo los cambios deseados como darle nombre a los ejes. Figura 7.2 Esquema de grafico para modificación La función plot nos permite otras opciones como superponer gráficas sobre los mismos ejes: Ejemplo 7.78 >> x = [-2 -1 0 1 2 3]; y = [4 1 0 1 4 9]; z = [6 5 3 7 5 2]; >> plot (x,y,x,z) 200 CAPITULO VII: Software de programación Matlab Figura 7.3 Esquema de 2 gráficos con el comando plot Ejemplo 7.79 También podemos usar distintos tipos de líneas para el dibujo de la gráfica: >> plot (x,y,'*') Figura 7.4 Esquema de grafico con otro tipo de línea Además podemos colocar etiquetas o manipular la gráfica: Etiqueta sobre el eje X de la gráfica actual: >> xlabel('texto') Etiqueta sobre el eje Y de la gráfica actual: >> ylabel('texto') Título en la cabecera de la gráfica actual: >> title('texto') Texto en el lugar especificado por las coordenadas: >> text(x,y, 'texto') Texto, el lugar lo indicamos después con el ratón: >> gtext('texto') 201 Lic. Elmer Alberto León Zárate Dibujar una rejilla: >> grid Fija valores máximo y mínimo de los ejes: >> axis ([xmin xmax ymin ymax]) Fija que la escala en los ejes sea igual: >> axis equal Fija que la gráfica sea un cuadrado: >> axis square Desactiva axis equal y axis square: >> axis normal Abre una ventana de gráfico: >> hold on Borra lo que hay en la ventana de gráfico: >> hold off Todas estas órdenes se las podemos dar desde la propia ventana de la gráfica una vez que hemos abierto las opciones con el botón indicado anteriormente. Otros comandos relacionados con las gráficas son los siguientes: Para obtener una información más detallada se recomienda utilizar la ayuda de Matlab: >> help <orden> Una ventana gráfica se puede dividir en m particiones horizontales y en n verticales, de modo que cada subventana tiene sus propios ejes, y para hacer esto vamos a usar subplot (m,n,p) donde p indica la subdivisión que se convierte en activa. 202 CAPITULO VII: Software de programación Matlab Ejemplo 7.80 >> x = 1:360; y1 = sind (x); y2 = cosd (x); y3 = exp (x); y4 = exp (-x); >> subplot (2,2,1), plot (x,y1), title ('seno') >> subplot (2,2,2), plot (x,y2), title ('coseno') >> subplot (2,2,3), plot (x,y3), title ('exponencial') >> subplot (2,2,4), plot (x,y4), title ('-exponencial') Figura 7.5 Esquema de grafico con varias funciones Para volver al modo por defecto basta escribir: subplot (1,1,1). Para dibujar polígonos podemos usar la función plot pero teniendo en cuenta que el último punto de ambos vectores deben coincidir para que la gráfica quede cerrada. Pero si lo que queremos es que quede coloreado todo el interior del polígono debemos usar mejor la función fill, tiene tres argumentos, los dos vectores que forman los puntos y un tercer argumento para indicar el color. Ejemplo 7.81 >> x = [-2 0 2 0 -2]; y = [4 8 4 0 4]; >> plot (x,y) 203 Lic. Elmer Alberto León Zárate Figura 7.6 Esquema de grafico de un rombo Ejemplo 7.82 >> x = [-2 0 2 0 -2]; y = [4 8 4 0 4]; >> fill (x,y,'r') % dibuja el polígono, 'r' indica el color rojo Figura 7.7 Esquema de grafico con fondo 7.8 GRAFICOS 3-D También podemos crear gráficas en 3 dimensiones, se trata de extender la orden de plot (2-D) a plot3 (3-D) donde el formato será igual pero los datos estarán en tripletes: Ejemplo 7.83 >> x = -720:720; y = sind (x); z = cosd (x); >> plot3 (x,y,z) 204 CAPITULO VII: Software de programación Matlab Figura 7.8 Esquema de grafico en 3-D Podemos hacer girar la gráfica usando de la barra de herramientas el botón correspondiente o hacerla más grande o más pequeña. Al igual que ocurría con las gráficas en dos dimensiones podemos nombrar los ejes o hacer modificaciones entrando en opciones con el botón. Si queremos representar un polígono en 3 dimensiones lo haremos con la función fill3 de forma similar a fill pero ahora con 4 argumentos, siendo el cuarto el que indica el color. Ejemplo 7.84 >> x = [-2 0 2 0 -2]; >> y = [4 8 4 0 4]; >> z = [3 5 10 5 3]; >> fill3 (x,y,z,'b') % dibuja en 3-D, 'b' indica el color azul Figura 7.9 Esquema de grafico relleno en 3-D 205 Lic. Elmer Alberto León Zárate Superficie de malla: La orden [X,Y]=meshgrid(x,y) crea una matriz X cuyas filas son copias del vector x y una matriz Y cuyas columnas son copias del vector y. Para generar la gráfica de malla se usa la orden mesh(X,Y,Z), mesh acepta un argumento opcional para controlar los colores. También puede tomar una matriz simple como argumento: mesh(Z). Ejemplo 7.85 >> x = -10:0.5:10; y = -10:0.5:10; >> [X,Y] = meshgrid (x,y); % crea matrices para hacer la malla >> Z = sin (sqrt (X .^2 + Y .^2)) ./ sqrt (X .^ 2 + Y .^ 2 + 0.1); >> mesh (X,Y,Z) % dibuja la gráfica Figura 7.10 Esquema de grafico de superficie de malla Hubiera dado igual si hubiéramos escrito: >> [X,Y] = meshgrid (-10:0.5:10); >> Z = sin (sqrt (X .^2 + Y .^ 2)) ./ sqrt (X .^ 2 + Y .^ 2 + 0.1); >> mesh (X,Y,Z) 206 CAPITULO VII: Software de programación Matlab Gráfica de superficie: Es similar a la gráfica de malla, pero aquí se rellenan los espacios entre líneas. La orden que usamos es surf con los mismos argumentos que para mesh. Ejemplo 7.86 >> surf (X,Y,Z) Figura 7.11 Esquema de grafico de superficie Las gráficas de contorno en 2-D y 3-D se generan usando respectivamente las funciones contour y contour3. Ejemplo 7.87 >> contour (X,Y,Z) % dibuja las líneas de contorno Figura 7.12 Esquema de contorno en 2-D 207 Lic. Elmer Alberto León Zárate La función pcolor transforma la altura a un conjunto de colores. Ejemplo 7.88 >> pcolor (X,Y,Z) Figura 7.13 Esquema de grafico con pcolor Manipulación de gráficos: Fija el ángulo de visión especificando el azimut y la elevación: >> view(az,el) Coloca su vista en un vector de coordenada cartesiana (x,y,z) en el espacio 3-D: >>view([x,y,z]) Almacena en az y el los valores del azimut y de la elevación de la vista actual: >> [az,el]=view Añade etiquetas de altura a los gráficos de contorno: >> clabel(C,h) Añade una barra de color vertical mostrando las transformaciones: >> colorbar 208 CAPITULO VII: Software de programación Matlab Ejemplo 7.89 >> surf (X,Y,Z) >> view (10,70) Figura 7.14 Esquema de grafico con superficie >> colorbar % añade la barra de color a la figura actual Figura 7.15 Esquema de grafico con superficie y barra 209 Lic. Elmer Alberto León Zárate Ejemplo 7.90 >> surf (X,Y,Z) >> view ([10,-12,2]) Figura 7.16 Esquema de grafico de superficie y vista Ejemplo 7.91 >> surf (X,Y,Z) >> [az,el] = view az = -37.5000 el =30 Ejemplo 7.92 >> [C,h] = contour (X,Y,Z); >> clabel (C,h) 210 CAPITULO VII: Software de programación Matlab Figura 7.17 Esquema de grafico de contorno en 2-D Comprensión de los mapas de color: La sentencia colormap (M) instala a la matriz M como el mapa de color a utilizar por la figura actual. 211 Lic. Elmer Alberto León Zárate Ejemplo 7.93 >> surf (X,Y,Z) >> colormap (pink) Figura 7.18 Esquema de grafico de superficie y color en 3-D 7.9 RELACION DE EJERCICIOS: 1. ¿Qué instrucción debemos teclear para obtener?: » v= (0 2 4 6 8 10) a. v=0:2:10 b. v=linspace(0,10,6) c. Todas son correctas d. v=[0 2 4 6 8 10] 2. Dado A= [1 2 3;4 5 6 ] ¿Qué devuelve: >>ones(size(A))?. a. Error b. [1 1 1;1 1 1] c. [1 1 1] 212 CAPITULO VII: Software de programación Matlab d. [1 0 0;0 1 0] 3. ¿Qué puede devolver: >>rand(2)?. a. [0.2190 0.0470] b. [0.2190;0.0470] c. [3.2190,1.1617;5.4678,3.567] d. [3.2190,1.1617; 5.4678,3.567;6.2123,5.125] 4. Dado A= [1 2 3; 4 5 6] ¿Qué devuelve: >>length(A)?. a. 3 b. [2 3] c. 2 d. [3 2] 5.¿Qué obtenemos al introducir >>N=[ones(2)M;zeros(2)eye(2)]?, siendo M=[2 3;3 2] 6. Dado el vector v= [7 6 5 4 3 2 1] ¿Cómo se obtiene el elemento 4? a. v(4) b. v[4] c. v(3) d. v[3] 7. Dado el vector v= [7 6 5 4 3 2 1] ¿Qué devuelve la instrucción >>x=v (1:3)? a. x=[3 2 1] b. [1 2 3] c. [7 6 5 4 3] d. x=[7 6 5] 8. Dado el vector v= [7 6 5 4 3 2 1] ¿Qué devuelve la instrucción >>x=v ([3 5 1 7])? a. x=[5 3 7 1] 213 Lic. Elmer Alberto León Zárate b. Ninguna es correcta c. x=[3 1 5 7] d. Error 9. Dado el vector v= [7 6 5 4 3 2 1] ¿Qué devuelve la instrucción >>x=v (3:-1:1)? a. x=[3 2 1] b. x=[] c. x=[3 -1 1] d. x=[5 6 7] 10. Dado el vector v= [7 6 5 4 3 2 1]. Calcula lo que devuelve la instrucción: >>v (:) a. Error b. [7 6 5 4 3 2 1] c. [7 6 5 4 3 2 1]’ d. : 11. Dada A= [1 2 3; 4 5 6; 7 8 9]. Calcula lo que devuelve la instrucción: >>A (3 3)=0 a. A= [0 0 0;0 0 0;0 0 0] b. A= [1 2 3;4 5 6;7 8 0] c. A=0 d. A[3 3]=0 12. Dada A= [1 2 3; 4 5 6; 7 8 9]. Calcula lo que devuelve la instrucción: >>E=A (1:2,2:3) a. [2 3;5 6] b. [1 2;2 3] c. (1:2,2:3) d. [1:2,2:3] 13. Dada A= [1 2 3; 4 5 6; 7 8 9]. Calcula lo que devuelve la instrucción: >>B=A (3:-1:1,1:3) 214 CAPITULO VII: Software de programación Matlab a. [3 2 1;1 2 3] b. Error c. [7 8 9;4 5 6;1 2 3] d. Todas son correctas 14. Dada A= [4:-2:0; 2:3:8; 3:5:14]. Escribir la matriz que devuelve: (introduce todos los elementos de la matriz uno por uno y en cada fila separada por espacios) >>A (2,1)=5*A (3,2)-A (1,1) 15. Dada A= [4 2 0; 36 5 8; 3 8 13]. Escribir la matriz que devuelve: (introduce todos los elementos de la matriz uno por uno y en cada fila separada por espacios) >>D=A (1:2,2:3) 16. Dada A= [4 2 0; 36 5 8; 3 8 13]. Escribir la matriz que devuelve: (introduce todos los elementos de la matriz uno por uno y en cada fila separada por espacios) >>E=A (1:2, :) 17. Dada A= [4 2 0; 36 5 8; 3 8 13]. Escribir la matriz que devuelve: (introduce todos los elementos de la matriz uno por uno y en cada fila separada por espacios) >>F=A (:) 18. Dada A= [4 2 0; 36 5 8; 3 8 13]. Escribir la matriz que devuelve: (introduce todos los elementos de la matriz uno por uno y en cada fila separada por espacios) >>G=A (1:2) 19. Dada A= [4 2 0; 36 5 8; 3 8 13]. Escribir la matriz que devuelve: (introduce todos los elementos de la matriz uno por uno y en cada fila separada por espacios) >>H=A (:,3) 20. Dada A= [4 2 0; 36 5 8; 3 8 13]. Escribir la matriz que devuelve: (introduce todos los elementos de la matriz uno por uno y en cada fila separada por espacios) 215 Lic. Elmer Alberto León Zárate >>K=A ([1 3], :) 21. Dada A= [4 2 0; 36 5 8; 3 8 13]. Escribir la matriz que devuelve: (introduce todos los elementos de la matriz uno por uno y en cada fila separada por espacios) >>L=A ([1 3], [2 3]) 22. Escribir la matriz que devuelve: >>x=linspace(0,20,5) 23. ¿Cómo representarías en Matlab el polinomio: P(X)=-x4+x2-1? 24. ¿Qué ocurre si intentamos sumar A= [1 2 3; 4 5 6; 7 8 9] y B= [1 2 3]?. a. Error b. [2 4 6;5 7 9;8 10 12] c. [2 3 4;6 7 8;10 11 12] d. Ninguna es correcta 25. ¿Qué ocurre si intentamos sumar A= [1 2; 3 4] y B= [5 6; 7 8]?. a. [6 8;10 12] b. Error c. [8 6;12 10] d. Ninguna es correcta 26. Calcular la suma de A= [] y B= [3]?. a. [] b. Error c. [3] d. [[3]] 27. Calcular A*B, con A= [1; 2; 3] y B= [6]?. a. [6;12;18] 216 CAPITULO VII: Software de programación Matlab b. Error c. [] d. [6 12 18]’ 28. Dado el vector v= [1 2 3], usando las funciones de álgebra, ¿qué instrucción debemos ejecutar para obtener la matriz: A= [1 0 0; 1 2 0; 0 0 3]? 29. Dada A= [1 2 3; 4 5 6; 7 8 9], ¿qué instrucción debemos ejecutar para obtener la matriz: [1 0 0; 1 5 0; 0 0 9]? 30. Dada A= [1 2 3; 4 5 6; 7 8 9], ¿qué instrucción debemos ejecutar para obtener la matriz: [1 2 3; 0 5 6; 0 0 9]? 31. Usando las funciones de álgebra lineal, ¿Cómo podemos obtener la matriz: [0 1 0 0 0; 1 0 1 0 0; 0 1 0 1 0; 0 0 1 0 1; 0 0 0 1 0]? 32. Genera una matriz de tamaño 6x6, que esté formada en sus tres primeras filas y columnas por una matriz de elementos aleatorios, en sus tres siguientes filas y sus tres primeras columnas por la matriz identidad, en sus tres siguientes columnas y tres primeras filas compuestas por ceros y en las tres últimas filas y tres últimas columnas por una matriz diagonal compuesta por los elementos de la diagonal de A. 33. Representar gráficamente en [0,10] la función. f(x) = e(-x/4) *sin(x) 34. Representar gráficamente en [-10,10] la función. f(x) = (7*x2-sin(x))/(2*x+3) 35. Escribe una función que devuelva como resultado el mayor de los elementos de un vector. 36. Escribe una función que dada una matriz A de orden nxm, permute los renglones k e i. Function [B]=permuta(A, k, i). 217 Lic. Elmer Alberto León Zárate 37. Escribe una función que determine el número de entradas igual a cero de una matriz A. Function [nc]=ceros(A). 38. Escribe una función que represente a un número natural n en base 2, la salida es un vector v de ceros o unos. Debe usar funciones de Matlab como mod y el comando while. Function[v]=basedos(n). 39. Escribir un programa en MATLAB que determine si dados 4 números a, b, c, d están en progresión aritmética 40. Escribir las sentencias de MATLAB necesarias para obtener los cuadrados de los números pares entre 0 y 50. Crear una tabla con cada entero y su cuadrado. 41. Determinar cuantas veces se ejecutará un bucle for si escribimos: a. for n = 7:10 b. for j = 7:-1:10 c. for i = 1:10:10 d. for –10:3:-7 42. Determinar el valor de x al final de los siguientes bucles: a) x= 0; for x = 1:10 x = x+1; end b) x = 0; for x = 1:10 y = x + x; end c) x = 0; 218 CAPITULO VII: Software de programación Matlab for x1 = 1:10 for x2 = x1:10 if x2 >6 break; end x = x + 1; end end 43. Examinar los siguientes bucles while y determinar el valor de la variable x al final de cada uno de ellos. ¿Cuántas veces se ejecuta el bucle? x = 2; while x <= 200 x = x^2; end 219 CAPITULO VIII LENGUAJE DE PROGRAMACION C++ 8.1 INTRODUCCION El Lenguaje de Programación C++ fue creado por Bjarne Stroustrup en 1985 como una extensión del Lenguaje C, el mismo que es mas consistente y conocido que otros lenguajes de programación científicos. Definición 8.1 El Lenguaje de Programación C++ es de propósito general porque ofrece control de flujo, estructuras sencillas y un buen conjunto de operadores. Se puede utilizar en varios tipos de aplicación. Este Lenguaje ha sido creado estrechamente ligado al sistema operativo UNIX, puesto que fueron desarrollados conjuntamente. Sin embargo, este lenguaje no esta ligado a ningún sistema operativo ni a ninguna máquina concreta. Sus características principales son: - Es un Lenguaje que Incluye a versiones anteriores de Lenguaje C - Abstracción de Datos - Permite definir nuevos tipos de Datos - Permite la programación orientada a objetos - Varias funciones pueden compartir el mismo nombre. - Permite definir una función como miembro de una estructura. - Incluye Operadores para reservar y liberar memoria. 220 CAPITULO VIII: Lenguaje de programación C++ 8.2 OPERADORES Definición 8.2 Son símbolos que se utiliza para manipular datos. Existen los siguientes tipos de operadores: 8.2.1 OPERADORES DE ASIGNACIÓN Definición 8.3 Es el símbolo “=” que se utiliza para dar un valor a una variable. A = 3; coloca directamente un valor A = b; se le da un valor de otra variable A=b=c=3; da un valor a varias variables A=b=c=d; todos toman el valor de la variable d 8.2.2 OPERADORES ARITMÉTICOS Definición 8.4 Son símbolos que indican los cálculos que se deben realizar sobre una o más variables dentro de una expresión. + suma suma = a + b ++ Incrementar un uno x = x + 1; - resta resta = a – b -- Decremento en uno x = x - 1; 221 // x = x++; // x +=1; // x = x - -; // x -=1; Lic. Elmer Alberto León Zárate * Multiplicación i = i * j; // i * = j; / División x= x / 2; // x /=2; % modulo Resto de la división de enteros. 8.2.3 OPERADORES DE COMPARACIÓN Definición 8.5 Son símbolos para indicar la relación que hay entre dos o mas valores. = == != igual que, cumple sin son iguales distinto que, lo contrario de igual >, <, >=, <= mayor, menor, mayor o igual y menor o igual 8.2.4 OPERADORES LÓGICOS Definición 8.6 Son símbolos que sirven para unir varias comparaciones && & and ( alt + 38 ) || | or ( alt + 124 ) ! not 8.2.5 PRIORIDAD DE LOS OPERADORES () 222 CAPITULO VIII: Lenguaje de programación C++ ++ -- & * /% +- < <= > >= == ¡= && || = 8.3 TIPOS DE DATOS Definición 8.7 Son los atributos de una parte de los datos que indica al ordenador (y/o el programador) algo sobre la clase de datos sobre los que se va a procesar. 8.3.1 ENTEROS Para números enteros con el siguiente rango: int -32768 ... 32767 long -2147483648 ... 2147483647 223 Lic. Elmer Alberto León Zárate 8.3.2 REALES (COMA FLOTANTE) Para números reales con el siguiente rango: float -3.40E+38… -1.17E-37 para negativos float 1.17E-37 ... 3.40E+38 para positivos double -1.79E+308 ... –2.22E-307 para negativos double 2.22E-307 ... 1.79E+308 para positivos 8.3.3 CARACTER Para caracteres solos y cadenas de caracteres: char [cantidad] 8.4 CONSTANTES Definición 8.8 Son aquellos datos que no pueden cambiar a lo largo de la ejecución de un programa. Sintaxis: Dentro de la Función Principal 1. Declarar la Variable 2. Variable = valor_según_declaración Dentro de las Librerías de Cabecera 224 CAPITULO VIII: Lenguaje de programación C++ #define nombre _ constante Valor _ constante Ejemplo 8.1 float pi; pi = 3.14159 Ejemplo 8.2 #define pi 3.14159 8.5 VARIABLES Definición 8.9 Son aquellos datos que puede cambiar su valor dentro de la ejecución del programa. 8.5.1 PRIMERA FORMA (DECLARACIÓN GLOBAL): Estas se declaran después de las librerías y sirven para todo el programa, incluyendo las funciones definidas por el usuario. # include < conio.h > # include < stdio.h > tipo_dato variables globales; void main() { } 225 Lic. Elmer Alberto León Zárate 8.5.2 SEGUNDA FORMA (DECLARACIÓN LOCAL): Estas se declaran dentro de la función principal ó las funciones definidas por el usuario en el programa. # include < conio.h > # include < stdio.h > void main() { tipo_dato variables locales; } 8.6 ENTRADA Y SALIDA DE DATOS Las Librerías que se activa para la entrada y salida de datos son: - #include < stdio.h > - #include < bcd.h > 8.6.1 ENTRADA FUNCIÓN CIN : ( # include < stdio.h > # include < bcd.h > ) Sintaxis: cin >>apuntador de Variable; cin >>Variable 1>>Variable 2; 226 CAPITULO VIII: Lenguaje de programación C++ Ejemplo 8.3 cin >> n1 >>n2 >>n3 ; NOTA: No importa que tipo de datos sea, no se tiene que especificar. 8.6.2 SALIDA FUNCIÓN COUT: (# include < stdio.h > - # include< bcd.h >) Forma: cout << “mensaje de Salida “; cout << “mensaje de Salida “<<Variable <<Variable; cout << “mensaje de Salida \n “<<Variable <<” \n” <<Variable; Ejemplo 8.4 cout << “los números son “<< a << b <<c; Para una mejor ubicación del texto en la pantalla colocar el comando: gotoxy (Coordenadas_x, Coordenada_y); cout... 8.7 INSTRUCCIONES DE CONTROL Definición 8.10 Las Instrucciones de Control permiten que los programas sean más estructurados y puedan de esta forma solucionar todo tipo de problemas (Joyanes Aguilar, 1994). 227 Lic. Elmer Alberto León Zárate Estas instrucciones pueden ser: - Selectivas (if, if...else, switch) - Repetitivas (for, while y do...while) - De Salto ( break, continue, goto ) 8.7.1 SELECTIVAS Definición 8.11 Se realizan mediante las instrucciones if, if...else, switch y permiten evaluar una condición o expresión y en función del resultado de la misma se realizara una acción u otra. A) IF.-Toma una decisión referente al bloque de sentencias a ejecutar en un programa, basándose en el resultado (Verdadero o falso) de una Condición. 1ra Sintaxis: if (Condición _ verdadera) Sentencias Ejecutables; 2da Sintaxis: if (Condición) { ...................... Sentencias Ejecutables; ...................... 228 CAPITULO VIII: Lenguaje de programación C++ } else { ......................; Sentencias Ejecutables ......................;} Observación 8.1 Si la condición a evaluar en el IF necesita más opciones colocar: && (and) || (or) Ejemplo 8.5 CONDICION PARA ENCONTRAR NÚMEROS PARES if (N % 2! = 1) cout <<” NUMERO PAR” Ejemplo 8.6 CONDICION PARA LOS NUMEROS NEGATIVOS O NÚMEROS CERO if ((N < 0) || (N==0)) cout <<” NUMERO NEGATIVO O CERO” 229 Lic. Elmer Alberto León Zárate Ejemplo 8.7 CONDICION PARA LAS PERSONAS MAYORES DE EDAD Y QUE GANEN 500 SOLES, AUMENTARLE 100 SOLES DE LO CONTRARIO DISMINUIRLE 200. if ((SUELDO==500) && (EDAD<17)) { SUELDO=SUELDO + 100; cout<<” SU NUEVO SUELDO ES: “<< SUELDO; } else { SUELDO=SUELDO - 200; cout<<” SU SUELDO SIGUE SIENDO:” << SUELDO;} B) SWITCH.- Esta sentencia permite ejecutar una de varias acciones, en función del valor de una expresión. Sintaxis: switch (EXPRESION) { case 1: Sentencias Ejecutables; 230 CAPITULO VIII: Lenguaje de programación C++ getch(); break; case 2: Sentencias Ejecutables; getch(); break; case 3: Sentencias Ejecutables; getch(); break; case 4: Sentencias Ejecutables; getch(); break; } REGLAS PARA EL USO DEL switch: 1) La EXPRESION puede ser una variable o constante 2) No funciona con datos Flotantes (Reales) 3) El valor en cada CASE debe ser Entero o ‘ Carácter ’ 4) C++ no soporta varios casos en el mismo lugar paras esto se utiliza : Case 1: Case 2: 5) Necesita utilizar la sentencia BREAK al finalizar cada CASE. Break hace que la ejecución del programa continúe después del SWITCH. 231 Lic. Elmer Alberto León Zárate 6) Si no se coloca SWITCH la ejecución del programa se reanuda en las demás CASE. 7) El conjunto de sentencias de cada CASE no necesita encerrarse entre llaves. 8.7.2 REPETITIVAS Definición 8.12 Estas instrucciones hacen que una sección del programa se repita un cierto número de veces. La repetición continua mientras una condición sea verdadera, cuando la decisión es falsa el bucle termina y el control pasa a las sentencias a continuación del bucle, existen tres clases de Bucles for, while y do...while. A) FOR.- El bucle FOR, ejecuta una sección de código un número fijo de veces. Sintaxis: for (exp1; exp2; exp3) Sentencia Ejecutables; for (exp1; exp2; exp3) for (exp1, exp A; exp2, exp B; exp3, Exp B) { .......................; { Sentencia Ejecutables; ...................; Sentencia Ejecutables; .....................; } ....................; } 232 CAPITULO VIII: Lenguaje de programación C++ Donde: exp1 : Es el Valor inicial ( Signo =) exp2 : Condición(Signo <=, >=, <, >) exp3 : Es el Operador de incremento o decremento ( i + + , i - - ) Ejemplo 8.8 IMPRIMIR LOS 10 PRIMEROS NÚMEROS. int i; for (i = 1; i < = 10; i + +) cout << “\n” << i; Ejemplo 8.9 IMPRIMIR LOS 20 PRIMEROS NUMERO EN FORMA DESCENDENTE int i; for (i = 20; i >= 1; i - - ) cout << “\n” << i; B) WHILE.- El bucle while ejecuta un bloque de sentencias ejecutables mientras su condición sea verdad. Sintaxis: 233 Lic. Elmer Alberto León Zárate while (condicion_verdadera) { .......................; Sentencias Ejecutables; ...................... ; } Ejemplo 8.10 IMPRIMIR LOS 20 PRIMEROS NUMERO ENTEROS ASCENDENTE int c=1; while (c < = 20) { cout << “\n” << c; c + +; } Ejemplo 8.11 IMPRIMIR LOS 20 PRIMEROS ENTEROS EN FORMA DESCENDENTE int c = 20; while (c > = 1) 234 CAPITULO VIII: Lenguaje de programación C++ { cout << “\n” << c; c--; } Observación 8.2 ¿COMO INGRESAR UNA CADENA, SI VARIABLE SE DECLARA COMO CHAR? UTILIZAR getline (VARIABLE, CANTIDAD_DECLARADA); char nombre [40]; cout << “ingrese su nombre completo:”; cin.getline(nombre,40); Observación 8.3 ¿COMO CONTROLAR LA CANTIDAD DE DECIMALES DE UNA RESPUESTA? UTILIZAR #include < iomanip. h > setprecision (CANTIDAD_DE_DECIMALES) float raiz_cuadrada, n; cout << “ingrese un numero entero:”; cin >> n; raiz_cuadrada = pow (n, 0.5); 235 Lic. Elmer Alberto León Zárate cout << “La raíz es:” << setprecision (2) << raiz_cuadrada; Observación 8.4 ¿COMO IMPRIMIR VARIAS REPUESTAS SEPARADOS POR UN ESPACIO DETERMINADO? UTILIZAR #include < iomanip. h > setw (CANTIDAD_DE_ESPACIOS) cout << a << setw (5) << b << setw (5) << c; // Ancho cout << a << “\t” << b << “\t” << c; //tabulador C) DO... WHILE.- Ejecuta un bloque de sentencias, una o más veces, dependiendo de la condición que tiene que ser verdadera. Sintaxis: do { ...................... ; SENTENCIAS EJECUTABLES; ...................... ; } 236 CAPITULO VIII: Lenguaje de programación C++ while (CONDICIÓN _ VERDADERA); Ejemplo 8.12 INGRESAR NUMEROS Y TERMINAR CUANDO SE INGRESE UN NUMERO NEGATIVO DEVOLVIENDO LA SUMA. SUMA = 0; cin >> N; do{ SUMA + = N; cin >> N; } while (N > 0); Ejemplo 8.13 COLOCAR ¿DESEA CONTINUAR S/N? PARA RETORNAR A UN PROGRAMA char OP; do { clrscr(); cout <<” INGRESE UN NUMERO:”; cin >> N; 237 Lic. Elmer Alberto León Zárate cout <<” DESEA SEGUIR S/N:”; cin >> OP; } while (OP == ‘S’); 8.7.3 DE SALTO Definición 8.13 Estas instrucciones hacen que en un determinado momento de la ejecución del programa se traslade a otra parte o abandone una instrucción repetitiva y pueda continuar con el resto del programa, existen tres clases: break, continue y goto. A) BREAK.- Hace finalizar la ejecución del Ciclo ó bucle: DO, FOR, SWITCH, WHILE más interno que lo contenga. Sintaxis: break; BREAK solamente finaliza la ejecución de la sentencia de donde esta incluida. Ejemplo 8.14 Imprimir los 4 primeros números enteros n=1; while(n < 5) 238 CAPITULO VIII: Lenguaje de programación C++ { cout<< n; if (n == 4) break; else n++; } B) CONTINUE.- Traslada la ejecución del programa a la última línea del Ciclo ó bucle: DO, FOR, SWITCH, WHILE más interno que lo contenga. Sintaxis: continue; Ejemplo 8.15 Imprimir los números entre 1 y 50 que no sean múltiplos de 5 n=1; while(n < 50) { 239 Lic. Elmer Alberto León Zárate if (n % 5 == 0) continue; else cout<< n; n++; } C) GOTO.- Traslada la ejecución del programa a una línea específica identificada por una etiqueta. Sintaxis: goto etiqueta; ...................... ...................... Etiqueta: bloque de SENTENCIAS; Ejemplo 8.16 Calcular el área de un triangulo Inicio: { cout<<” Ingrese la base del triangulo:”; 240 CAPITULO VIII: Lenguaje de programación C++ cin >>b; cout<<”Ingrese la altura del Triangulo:”; cin >>a; cout<<”El área del triangulo es: “<< (b*a)/2; } if (a>0) goto Inicio; cout<<”FIN DEL PROGRAMA”; 8.8 FUNCIONES Definición 8.14 Es una colección independiente de declaraciones y sentencias, generalmente realiza una tarea específica, En C++ existe una función por naturaleza y es el programa principal: void main ( ) { …………… } 241 Lic. Elmer Alberto León Zárate Cuando se llama a una función el control pasa a la función para su ejecución, una vez finalizado el trabajo de la función devuelve el control a la función que lo llamó. void main( ) Función1( ) Función2( ) { { { Función1 ( ); Instrucciones; Instrucción; Función2 ( ); Instrucciones; } } Instrucción; } Observación 8.5 - Una función no pertenece al programa - En el programa sólo se le llama - El cuerpo de una función es la parte funcional de un programa. - Una función siempre debe estar fuera de la función principal main( ). PASOS PARA DEFINIR UNA FUNCIÓN: 1. Tener en cuenta las variables globales o locales 242 CAPITULO VIII: Lenguaje de programación C++ 2. En C++ se debe declarar una función antes de utilizarla, colocándolo el encabezado de la función int suma (int a, int b); 3. Comenzar con la función Sintaxis: TIPO NOMBRE (TIPO VARIABLE DE ENTRADA) { DECLARACIONES DE VARIABLES LOCALES; SENTENCIAS EJECUTABLES; return [VARIABLE;] // Variables de Salida } Donde: TIPO : Indica el tipo de Datos que devolverá la función luego de su uso (no es necesario, solo en casos que se quiera hacer referencia a la salida). NOMBRE : Es el nombre de la función, trata de no tenerlo como variable. 243 Lic. Elmer Alberto León Zárate TIPO VARIABLE DE ENTRADA Aquí se colocan las Variables con su respectivo tipo de Datos que entraran a la función para su posterior uso, reemplazando a la variable verdadera. Si dentro de la función se hace uso de variables que no pertenecen a la función MAIN solo se declararan dentro de la función, como una variable local. FORMAS: Función Sin Argumentos SUMA ( ); int SUMA ( ); int SUMA (int A); int SUMA ( int A,int B) ; Funcion con 1 entrada Funcion con 2 entradas int SUMA ( int A, float C, int B) Funcion con 3 entradas VALOR RETORNADO POR UNA FUNCIÓN – SENTENCIA RETURN Indicara que variable retornara con el valor, solo puede haber un solo retorno y en algunos casos no se coloca valor de retorno cuando se trata de varios valores. Sintaxis: return variable; 244 CAPITULO VIII: Lenguaje de programación C++ Observación 8.6 - Esta variable debe estar declarado dentro de la función o como variable global. - En el valor de retorno también se le puede alterar su devolución return (N) return (N + 2) return (N * 2) LLAMADA A LA FUNCIÓN Una llamada se realiza para que la función tenga efecto. Sintaxis: [Variable =] Nombre_de_la_función (parámetros o argumentos) Ejemplo 8.17 Suma ( ) cout << suma ( ) Su = suma ( ) 245 Lic. Elmer Alberto León Zárate 8.9 LIBRERÍA DE FUNCIONES CREADAS POR EL USUARIO Definición 8.15 Son un programa fichero que tiene las funciones que serán compiladas en forma separada y pueda ser utilizado en cualquier programa de C++. Pasos: a) Se crean solo funciones dentro de un programa, indicando en la parte superior los prototipos de las funciones y los ficheros. b) Luego, una vez terminado la función grabarlo con un nombre y extensión (.hpp) (por ejemplo: Sumatoria. hpp o Factorial. hpp) c) Se pueden colocar varias funciones dentro de este programa( .hpp) d) No ejecutar un programa hpp, mas bien cerrarlo. e) Dentro de un programa cpp, llamar a la función que se encuentra dentro del programa hpp. Sintaxis: En la Cabecera del programa CPP: # include “NombredelFichero.hpp” 8.10 ARREGLOS Definición 8.16 Los arreglos son estructuras de datos, que permiten el almacenamiento masivo de información. 246 CAPITULO VIII: Lenguaje de programación C++ Un arreglo esta compuesto por varios componentes, todas del mismo tipo y almacenados consecutivamente en la memoria de la PC. Ventajas de usar arreglos: Almacenamiento de datos en una sola variable A la vez cada dato es independiente de los demás Se puede acceder a cada elemento indicando el número de índice. Se pueden manipular con operaciones de cualquier tipo Los Arreglos se presentan en dos formas: 8.10.1 VECTORES O ARREGLOS UNIDIMENSIONALES Definición 8.17 Son listas de datos que pueden almacenar un número determinado de datos. NOMBRE 0 1 .... Dato 1 Dato 2 ..... n Dato N DEL …… ARREGLO Un vector está compuesto: Nombre del Arreglo Índice : 0, 1, 2, 3,... n (Utilizar Estructuras Repetitivas) 247 Lic. Elmer Alberto León Zárate Datos : Son los datos ingresados al arreglo de un mismo tipo. Ejemplo 8.18 0 NOTAS NOMBRES 1 08 ANA PROMEDIOS 10.5 2 09 10 3 11 4 10 LUISA LIZA JANET ELISA 11.50 19.55 0.025 3.45 Para acceder a cada elemento solo se escribirá el nombre de la variable arreglo y el índice. Para acceder a Janet Para acceder a 3.45 NOMBRES [ 3 ] PROMEDIOS [ 2 ] Sintaxis: TIPO_DE_DATOS NOMBRE_DEL_ARREGLO [TAMAÑO_APROX]; Observación 8.7 Si el tipo de datos del arreglo es de caracteres su declaración será: char nombre_del_arreglo [tamaño_aprox] [cantidad_de_espacios]; Ejemplo 8.19 Declarar el ingreso de 5 notas enteras: int notas [ 5 ] ; 248 CAPITULO VIII: Lenguaje de programación C++ Ejemplo 8.20 Declarar el ingreso de 5 nombres de personas : char nombres [5] [20]; 8.10.2 MATRICES O ARREGLOS BIDIMENSIONALES Definición 8.18 Son Arreglos que tienen 2 dimensiones. 1 2 3 4 1 10 8 13 11 2 10 8 13 11 3 10 8 13 11 4 10 8 13 11 Una Matriz está compuesta: Nombre del Arreglo Índice filas : 0, 1, 2, 3,... n (utilizar estructuras repetitivas) Índice Columnas : 0, 1, 2, 3,... n (utilizar estructuras repetitivas) Datos : Son los datos ingresados al arreglo de un mismo tipo. 249 Lic. Elmer Alberto León Zárate Ejemplo 8.21 Nombre del Arreglo: NÚMERO 1 2 3 4 1 A E I M 2 B F J N 3 C G K O 4 D H L P Para acceder a cada elemento solo se escribirá el nombre de la variable arreglo y los índices. Para acceder a la Letra A (NÚMERO [ 1 ][ 1 ]) Para acceder a la Letra L (NÚMERO [ 4 ][ 3 ]) Sintaxis: TIPO_DATOS NOM_ARREGLO [TAMAÑO_FILAS] [TAMAÑO_COLUMNAS]; Observación 8.8 Al hacer referencia de cada elemento de un arreglo Bidimensional se coloca el nombre del arreglo luego la fila y la columna. Ejemplo 8.22 Ingresar un arreglo Bidimensional de 3 x 3 y determinar la suma de todos sus Elementos. 250 CAPITULO VIII: Lenguaje de programación C++ for( I = 1 ; I < = 3 ; I + + ) for( j = 1 ;j < = 3 ; j + + ) cin>> números [I] [j]; for( I = 1 ; I < = 3 ; I + + ) for( j = 1 ;j < = 3 ; j + + ) suma=suma+números[ I ] [ j ] ; cout<<”la suma es “<< suma; 8.10.3 RELACION DE EJERCICIOS RESUELTOS 1. En una Función recursiva determinar si un número es primo o no, y termine con el ingreso de un número negativo. #include<conio.h> #include<stdio.h> void main() { int n,i,p=0; clrscr(); printf ("ingrese un numero entero :"); scanf ("%d",&n); i=1; while(i<=n) { if (n%i==0) 251 Lic. Elmer Alberto León Zárate { p=p+1; i=i+1;} else i=i+1; } if(p==2) printf("El numero es primo"); else printf("El numero NO es primo"); getch(); } 2. Realizar el Mínimo Común múltiplo de 2 números ingresados, utilizando Función recursiva. #include<iostream.h> #include<conio.h> #include<stdio.h> int mcd(int w,int z); int mcm(int x,int y,int k); void main() {clrscr();int a,b,x; cout<<"INGRESE DOS NÚMEROS: "; cin>>a>>b; x=mcd(a,b); mcm(a,b,x); getch(); return 0; } 252 CAPITULO VIII: Lenguaje de programación C++ int mcd(int w,int z) { while(w!=z) { if(w>z) w=w-z; else z=z-w; } } int mcm(int x,int y,int k) { int m; m=x*y/k; cout<<"El MINIMO COMUN MULTIPLO es: "<<m; } 3. Realizar el Máximo Común Divisor de 2 números ingresados, utilizando Recursividad. #include<conio.h> #include<bcd.h> #include<stdio.h> int n1,n2,m2,m1,mayor,menor,r; void main() { clrscr(); 253 Lic. Elmer Alberto León Zárate cout<<"Ingrese 2 números para sacar el máximo común divisor:"; cin>>n1, n2; if(n1>n2) { mayor=n1; menor=n2; } else { mayor=n2; menor=n1; } while(mayor%menor!=0) { r=mayor%menor; mayor=menor; menor=r; } cout<<menor; getch(); } 4. Función recursiva para listar los 100 primeros números primos. #include<conio.h> #include<stdio.h> #include<bcd.h> int divisor(); int primos(); 254 CAPITULO VIII: Lenguaje de programación C++ int i=2,c=0,n=1,s=0; void main() { clrscr(); cout<<"los 100 números primos son:\n"; cout<<"1"<<"\t"<<"2"<<"\t"<<"3"<<"\t"<<"5"<<"\t" <<"7"; primos(); getch(); } int primos() { if(i>450) return 0; else { if((i%2!=0)&&(i%3!=0)&&(i%5!=0)&&(i%7!=0)) cout<<i<<"\t"; i+=1; } primos(); } 5. Función recursiva para listar los 30 primeros números primos. #include<bcd.h> #include<stdio.h> #include<conio.h> int primos(); int i=2; 255 Lic. Elmer Alberto León Zárate void main() { clrscr(); cout<<"los 30 primeros números primos son:\t"; cout<<1<<"\t"<<2<<"\t"<<3<<"\t"<<5<<"\t"<<7; primos(); getch(); } int primos() { if (i>110) return 0; else if((i%2!=0)&&(i%3!=0)&&(i%7!=0)&&(i%5!=0)) cout<<"\t"<<i; i+=1; primos(); } 6.-Construir una función que reciba un numero entero de 4 cifras y determine el digito mayor así como el digito menor contenido en dicho numero. Ejemplo: 1520 Digito mayor: 5 Digito menor 0 #include<conio.h> #include<stdio.h> #include<bcd.h> compara1(int a); 256 CAPITULO VIII: Lenguaje de programación C++ compara2(int a); int mayor=0,menor=9999; void main() { int h,n,i,b,a,d; clrscr ( ); cout<<"ingrese un numero entero de 4 cifras:"; cin>>n; i=1; d=1000; while(i<5) { a=n/d; b=n%d; d=d/10; n=b; i++; // cout<<"\n"<<a; compara1(a); compara2(a); } cout<<"\n\n el mayor es :"<<mayor; cout<<"\n\n el menor es :"<<menor; getch(); } compara1(int a) 257 Lic. Elmer Alberto León Zárate { // Si el numero fuera 1520 if (a>mayor) mayor=a; // 1 > 0 // mayor=1 else mayor=mayor; return mayor; } compara2 (int a) { // Si el numero fuera 1520 if (a<menor) menor=a; // 1 < 0 // menor=1 else menor=menor; return menor; } 8.11 ESTRUCTURAS EN C++ Definición 8.19 Una estructura se puede definir como una colección de Datos de diferentes tipos de datos, lógicamente relacionados. Definición 8.20 Una estructura se utiliza cuando de un objeto se va a nombrar varias características ó atributos. CREACIÓN DE UNA ESTRUCTURA Crear una estructura es definir un nuevo tipo de datos, denominado TIPO ESTRUCTURA 258 CAPITULO VIII: Lenguaje de programación C++ Aquí se especifican los elementos que la componen, así como los tipos de datos, cada elemento de la estructura recibe el nombre de miembro (campo de registro). Una vez declarado la Estructura se tiene que DEFINIR una variable que sea del tipo de Estructura que se declaro. Para hacer REFERENCIA dentro del programa a una variable de tipo Estructura se separan por un punto por cada campo utilizado. Sintaxis: struct Nombre_estructura { tipo1 campo_1; tipo2 campo_2; ......................... tipo campo_n; }; 1RA FORMA: Nombre_estructura variables_de_tipo_estructura; 2DA FORMA: struct Nombre_estructura { // Declaraciones de los miembros } Variables_de_tipo_estructura; 259 Lic. Elmer Alberto León Zárate REFERENCIA: Variable_Tipo_Structura. Campo_i; Ejemplo 8.23 Declarar la estructura Datos con los siguientes campos: Nombre, Paterno, Materno, edad y Sueldo de un alumno. struct DATOS { char nombre [20], paterno [20], materno [20]; int edad; float sueldo; } ALUMNO; // También puede ser DATOS ALUMNO; // PARA EL ALMACENAMIENTO DE DATOS EN ESTA ESTRUCTURA cin >> alumno.nombre; // gets (ALUMNO. NOMBRE) cin >> alumno.edad; // PARA LA SALIDA DE DATOS EN ESTRUCTURA: cout << alumno.nombre; // SE PUEDEN REALIZAR OPERACIONES CON LOS DATOS DE ESTRUCTURA if (alumno.sueldo == 500) if (alumno.edad > 18) cout << alumno.edad + 1; 260 CAPITULO VIII: Lenguaje de programación C++ Ejemplo 8.24 Programa que ingrese los siguientes datos para 3 alumnos: NOMBRES, EDAD Y SUELDO, sin arreglos. void main() { struct datos { char nombres [20]; int edad; float sueldo; } a1,a2,a3,a4,a5; cout<<”ingrese nombre del primer alumno: “; gets (a1.nombres); cout<<”Ingrese edad:”; cin>> a1.edad; cout<<”Ingrese Sueldo:”; cin>> a1.sueldo; cout<<”ingrese nombre del Segundo alumno: “; gets (a2.nombres); cout<<”Ingrese edad:”; cin>> a2.edad; cout<<”Ingrese Sueldo:”; cin>> a2.sueldo; cout<<”ingrese nombre del Tercer alumno: “; gets (a3.nombres); cout<<”Ingrese edad:”; cin>> a3.edad; cout<<”Ingrese Sueldo:”; cin>> a3.sueldo; getch(); } 261 Lic. Elmer Alberto León Zárate 8.11.1 ARREGLOS DE ESTRUCTURAS En este tipo de Arreglos se caracterizan por tener un solo índice (arreglo Unidimensional) sin embargo en cada elemento. Todos los elementos del arreglo tienen la misma estructura. índice Nombre Promedio Edad 0 Acosta Ferrer 15 23 1 Calle de La Cruz 14 25 2 Soto Hernández 10 20 . ................ ............ ............. ........... El acceso a cada elemento del Arreglo Variable_Tipo_Estructura [índice]. Campo Ejemplo 8.25 Declarar el ingreso de 50 alumnos con los siguientes campos: PATERNO, MATERNO, NOMBRE, CARRERA PROFESIONAL, CICLO, TURNO y simular el llenado. // Declaración struct item { char paterno [20], materno [20], nombres [20], carrera [30], turno [10]; int ciclo; } alumno [50]; // Llenado de datos 262 CAPITULO VIII: Lenguaje de programación C++ for ( i=1; i<=50 ; i++) { gets (alumno [ i ] . paterno) ; gets (alumno [ i ] . materno) ; gets (alumno [ i ] . carrera) ; cin >> alumno [i] . ciclo ; gets (alumno [ i ] . turno) ; } Observación 8.9 Si existen campos que tienen que subdividirse dentro de la declaración de una estructura se tiene que declarar una nueva estructura dentro de la estructura y se seguirán llamando por medio de puntos. Ejemplo 8.26 Fecha de Nacimiento Día, mes, año Paterno, Materno, Nombres Apellidos Edad y promedio struct datos { struct a { char nombre[20],paterno[20],materno[20]; } apellidos; struct f { int dia,mes,año; 263 Lic. Elmer Alberto León Zárate } fecha; int edad; float promedio; } alumno[20]; 8.12 ARCHIVOS EN C++ Definición 8.21 Los Archivos o Ficheros es una colección de información que almacena y recupera información para poder manipularla en cualquier momento, a esto se le llama Funciones de Entrada/Salida (Input / Output) Antes de conectar un archivo con el programa y realizar operaciones de Entrada y Salida activar la librería < fstream.h > el cual define las siguientes clases: CLASE IFSTREAM Permite el manejo de archivos cuyo acceso sea solamente de Entrada (Lectura) ( I NPUT F ILE STREAM ). Esta clase dispone de los siguientes métodos o funciones más utilizados: - open ( NOMBRE ) - close( ) - get ( CARACTER ) - eof( ) Abre el Archivo Cierra el Archivo Obtiene el carácter o byte Determina si se alcanzo el final del archivo CLASE OFSTREAM Permite el manejo de archivos solamente de grabación o salida Escritura (O UTPUT F ILE STREAM ). Esta clase dispone de los siguientes métodos o funciones más utilizados: 264 CAPITULO VIII: Lenguaje de programación C++ - open ( NOMBRE) - close( ) - put (CARACTER) - eof( ) Abre el archivo Cierra el archivo Graba un caracter o byte determina si se alcanzo el fin del archivo CLASE FSTREAM Permite el manejo de archivos cuyo acceso sea de entrada, de salida, o de entrada y salida a la vez (File Stream). - open ( “NOMBRE del Archivo” , Modo De Acceso) Modo de Acceso ios : : in Permite solo Entrada ios : : out Permite solo Salida ios : : app Permite Añadir al Final del Registro ios : : binary Permite abrir archivos binarios Para la combinación de ambos ios : : in |ios : : out - close( ) - eof ( ) 8.12.1 OPERACIONES DE ARCHIVOS DE TEXTO Las operaciones requeridas para manipular un archivo son: Abrir un archivo Leer y Escribir datos en un archivo 265 Lic. Elmer Alberto León Zárate Detectar EOF (Final del Archivo) Cerrar un archivo A) APERTURA DEL ARCHIVO Un archivo se puede abrir para: - Modo solo lectura (entrada) - Modo salida ( Escritura ) - Modo Lectura/Escritura (entrada/salida ) La apertura de un archivo de salida se puede hacer por dos métodos diferentes: Definir la librería fstream.h Llamara a la función open ( ), para la apertura del archivo. Sintaxis: fstream NOMBRE_ARCHIVO; NOMBRE_ARCHIVO.open (“Nombre.dat”, ios : : in); fstream NOMBRE_ARCHIVO ( “NOMBRE.DAT” , ios : : in ); Ejemplo 8.27 // DECLARACION fstream ARCHIVO1; ARCHIVO1.open (“DATOS.DAT”, ios:: in); // DECLARACION fstream ARCHIVO1 (“DATOS.DAT”, ios:: in); 266 CAPITULO VIII: Lenguaje de programación C++ B) CERRAR UN ARCHIVO Al cerrar un archivo no elimina su contenido solo lo desconecta del archivo. Una llamada OPEN lo puede cancelar nuevamente. Normalmente va al final de cada programa. Sintaxis Nombre_Archivo.close ( ); Ejemplo 8.28 Archivo1.close( ); 8.12.2 ARCHIVOS BINARIOS CARACTERÍSTICAS Ocupa menos espacio que los archivos de textos. No contienen caracteres de espacio en blanco. Los datos no están organizados en líneas más bien en forma de Registros de una Base de Datos. El formato Binario es más preciso para números. CLASE FSTREAM La entrada es de Lectura y Escritura normalmente para binarios. 8.12.3 OPERACIONES DE ARCHIVOS BINARIOS A) ABRIR EL ARCHIVO 267 Lic. Elmer Alberto León Zárate fstream ARCHIVO1; ARCHIVO1.open (“DATOS.DAT” , ios : : binary) ; ifstream ARCHIVO1 (“DATOS.DAT”, ios : : binary) ; // Lectura de Binario ofstream ARCHIVO1 (“DATOS.DAT”, ios : : binary) ; // Escritura de Binario B) CERRAR EL ARCHIVO close() ; C) ESCRITURA DE CARACTERES DE FLUJO ARCHIVO1.put ((char), CONTADOR_BYTES ++ ); // AQUÍ SE PIDE EL INGRESO DE LOS DATOS ARCHIVO1.write((char*)&Estructura, TAMAÑO_ESTRUCTURA_BYTE); D) LECTURA DE CARACTERES DE FLUJO ARCHIVO1.get ((char), CONTADOR_BYTES ++ ) ; ARCHIVO1.read((char*)&Estructura, TAMAÑO_ESTRUCTURA_BYTES); // AQUÍ SE IMPRIMEN LOS DATOS // AQUÍ SE COMPARAN DATOS PARA SU BUSQUEDA, SOLO NUMEROS Observación 8.10 El Tamaño de la Estructura en Bytes para la lectura no es conocido utilizar el comando: sizeof(Estructura); Ejemplo 8.29 sizeof(persona); sizeof(empleado); 268 CAPITULO VIII: Lenguaje de programación C++ 8.12.4 RELACION DE EJERCICIOS RESUELTOS 1.- Programa para la creación de un archivo de texto #include<conio.h> #include<stdio.h> #include<bcd.h> #include<fstream.h> void main() { clrscr(); char nombres[20],paterno[20],materno[20]; fstream x; x.open("demo.txt",ios::out); cout<<"ingrese su nombre completo : ";gets(nombres); cout<<"ingrese su apellido paterno:”;gets(paterno); cout<<"ingrese su apellido materno: ";gets(materno); x << nombres <<"\n"; x << paterno <<"\n"; x << materno <<"\n"; x.close(); } 2.- Programa para la lectura de un archivo de texto. Solo permite que se lean los datos mas no manipularlo. #include<conio.h> 269 Lic. Elmer Alberto León Zárate #include<stdio.h> #include<bcd.h> #include<fstream.h> void main() { clrscr(); char c; //aquí se almacena letra por letra los datos del archivo fstream x; x.open("demo.txt",ios::in); while(x.get(c)) cout<<c; getch(); x.close(); } 3.- Programa para agregar mas datos a un archivo de texto ya guardado #include<conio.h> #include<stdio.h> #include<bcd.h> #include<fstream.h> void main() { clrscr(); char nombres[20],paterno[20],materno[20]; fstream x; x.open("demo.txt",ios::app); 270 CAPITULO VIII: Lenguaje de programación C++ cout<<"ingrese su nombre completo : ";gets(nombres); cout<<"ingrese su apellido paterno:gets(paterno); cout<<"ingrese su apellido materno: ";gets(materno); x << nombres <<"\n"; x << paterno <<"\n"; x << materno <<"\n"; x.close(); } 4.- Programa para la creación de un archivo de texto #include<conio.h> #include<stdio.h> #include<dos.h> #include<fstream.h> void main() { clrscr(); ofstream archsal("copia.dat",ios::out); if (!archsal) { cerr<<"Nose puede abrir el archivo"; exit(-1); } char car; while(cin.get(car)) archsal.put(car); clrscr(); } 271 Lic. Elmer Alberto León Zárate 5.- Programa para la lectura de un archivo de texto #include<conio.h> #include<stdio.h> #include<fstream.h> #include<stdlib.h> void main() { fstream archen("copia.dat",ios::in); if (!archen) { cerr<<"No se puede abrir el archivo"; exit(-1); } char car; while(archen.get(car)) cout.put(car); getch(); return(0); } 6.- Programa para agregar más datos a un archivo de texto ya creado #include<conio.h> #include<stdio.h> #include<bcd.h> #include<fstream.h> void main() { clrscr(); 272 CAPITULO VIII: Lenguaje de programación C++ //char a [40], b [40]; struct a { char paterno[20],materno[20],nombres[20]; } persona[20]; int n,i; fstream x; x.open("demo.txt",ios::app); cout<<"Cuantos datos desea ingresar y grabarlo en el archivo: "; cin>>n; for(i=1;i<=n;i++) { cout<<"ingrese su nombre completo: ";gets(persona[i].nombres); cout<<"ingrese su apellido paterno: ";gets(persona[i].paterno); cout<<"ingrese su apellido materno: ";gets(persona[i].materno); x<<persona[i].nombres<<"\n"; x<<persona[i].paterno<<"\n"; x<<persona[i].materno<<"\n"; } x.close(); } 7.- Programa para la creación de un archivo de texto #include<stdlib.h> #include<fstream.h> #include<stdio.h> 273 Lic. Elmer Alberto León Zárate #include<bcd.h> #include<conio.h> void main() { clrscr(); filebuf archivo1; if (archivo1.open("abc.txt",ios::out)==NULL) { cout<<"Error no se puede abrir el Fichero "; exit(1); } ofstream escribir(&archivo1); char linea[81]; cout<<"introducir datos y Finalizar con Ctrl+Z\n"; char *fin=gets(linea); while(fin!=NULL) { escribir<<linea<<"\r\n"; fin=gets(linea); } archivo1.close(); } 8.- Programa para la lectura de un archivo de texto #include<conio.h> #include<bcd.h> 274 CAPITULO VIII: Lenguaje de programación C++ #include<fstream.h> #include<stdlib.h> void main() { clrscr(); char c; fstream x("demo.dat",ios::in); while(x.get(c)) cout<<c; getch(); x.close(); } 9.- Programa para la creación de un archivo de texto #include<conio.h> #include<fstream.h> #include<bcd.h> void main() { fstream archivo("copia.dat",ios::out); char car; while(cin.get(car)) archivo.put(car);} 10.- Escribe datos dentro de un archivo binario utilizando las funciones put y write para 5 registros empleado. #include<conio.h> #include<stdio.h> 275 Lic. Elmer Alberto León Zárate #include<bcd.h> #include<fstream.h> void main() { struct datos { char nombre[30]; int edad; float salario; } empleado; ofstream empresa("registros.dat",ios::binary); if (!empresa) { clrscr(); cout<<"No se puede abrir archivo Registros.dat"; return; } clrscr(); int numero=0; while (numero<5 && empresa ) { empresa.put((char)numero++); cout<<"Ingrese nombre :"; cin>>empleado.nombre; cout<<"Ingrese edad :"; cin>>empleado.edad; cout<<"Ingrese Salario :"; cin>>empleado.salario; empresa.write((char*)&empleado,sizeof(empleado)); } getch(); empresa.close();} 11.- Lectura de Datos Binarios del Ejercicio 10 #include<conio.h> #include<stdio.h> #include<bcd.h> 276 CAPITULO VIII: Lenguaje de programación C++ #include<fstream.h> void main() { struct datos { char nombre[30]; int edad; float salario; } empleado; ifstream empresa("registros.dat",ios::binary); if (!empresa) { clrscr(); cout<<"No se puede abrir archivo Registros.dat"; return; } clrscr(); int numero=0; while (!empresa.eof() && numero<5) { empresa.get((char)numero++); empresa.read((char*)&empleado,sizeof(empleado)); cout<<empleado.nombre<<"\t"; cout<<empleado.edad<<"\t"; cout<<empleado.salario<<"\n"; } getch(); empresa.close(); } 12.-Busqueda secuencial de un dato del archivo binario while (!empresa.eof() && numero<5) { empresa.get((char)numero++); 277 Lic. Elmer Alberto León Zárate empresa.read((char*)&empleado,sizeof(empleado)); if ( empleado.edad == edad ) { cout<<empleado.nombre<<"\t"; cout<<empleado.edad<<"\t"; cout<<empleado.salario<<"\n"; } } 8.13 CADENA DE CARACTERES EN C++ Definición 8.22 Una cadena de caracteres es un Arreglo Unidimensional, en el cual todos los elementos contenidos en el son de tipo carácter. 8.13.1 LEER UNA CADENA DE CARACTERES FUNCIÓN cin>> FUNCIÓN gets: Lee caracteres y lo almacena en una variable especificada, a diferencia de la función cin, la función gets permite la entrada de una cadena de caracteres formada por palabras separadas por espacios en blanco sin ningún tipo de formato. El cin actúa como separador de variable al dejar espacio solo para caracteres. Sintaxis: gets (CADENA); 278 CAPITULO VIII: Lenguaje de programación C++ 8.13.2 ESCRBIR UNA CADENA DE CARACTERES FUNCION cout<< FUNCION puts: Escribe una cadena de caracteres en la salida estándar y reemplazar el carácter nulo de terminación de la Cadena (\0) por el carácter nueva línea (\n). Sintaxis: puts (CADENA); 8.13.3 ARREGLO DE CADENA DE CARACTERES En un arreglo de cadenas de caracteres cada elemento es un arreglo de caracteres. Es un arreglo de 2 dimensiones de tipo char. Sintaxis: char CADENA [N° ELEMENTOS] [LONGITUD DE LA CADENA]; 8.13.4 FUNCIONES DE CADENAS DE CARACTERES Para utilizar las Funciones de tipo Cadena se tiene que activar la librería INCLUDE <STRING.H> A) STRCAT._ Agrega toda la cadena2 en la cadena1 y el resultado es devuelto en la cadena1 Sintaxis: strcat(CADENA1, CADENA2); Ejemplo 8.30 1ERA FORMA: char NOMBRE1 (30), NOMBRE2 ( 30); gets (NOMBRE1) ; gets ( NOMBRE2); cout<<”La unión de las cadenas es:“<< strcat(NOMBRE1, NOMBRE2); 279 Lic. Elmer Alberto León Zárate 2DA FORMA: char NOMBRE1 (30) , NOMBRE2 (30); gets ( NOMBRE1); gets ( NOMBRE2); strcat ( NOMBRE1, NOMBRE2); cout<<” La unión de las cadenas es: << NOMBRE1; B) STRCPY.- Esta función copia cadena2 en la cadena 1 y el resultado lo devuelve en la cadena 1. Sintaxis: STRCPY (CADENA 1, CADENA2); Ejemplo 8.31 1ERA FORMA: char NOMBRE 1 (30), NOMBRE2 (30); gets (NOMBRE1); gets (NOMBRE2); cout <<”La Nueva cadena es :“<< strcpy (NOMBRE 1, NOMBRE2): 2DA FORMA: char NOMBRE1 (30), NOMBRE (2); gets (NOMBRE1); gets (NOMBRE2); srtcpy (NOMBRE1, NOMBRE2); cout<<” LA NUEVA CADENA ES; “<< NOMBRE1; C) STRLEN .- Esta función devuelve la longitud de la cadena Sintaxis: strlen (CADENA 1); Ejemplo 8.32 char NOMBRE1 (30), gets (NOMBRE1); 280 CAPITULO VIII: Lenguaje de programación C++ cout <<”La Longitud de la cadena es :“<< strlen(NOMBRE 1) D) STRLWR.- Convierte la Cadena de mayúsculas a minúsculas Sintaxis: strlwr (CADENA 1); Ejemplo 8.33 1ERA FORMA: char NOMBRE1 (30), gets (NOMBRE1); cout <<”En minúsculas es:” << strlwr (NOMBRE 1) E) STRUPR.- Convierte la cadena de minúsculas a mayúsculas Sintaxis: strupr (CADENA 1); Ejemplo 8.34 1ERA FORMA: char NOMBRE1(30), gets (NOMBRE1); cout <<”En mayúsculas es :“<< strupr (NOMBRE1): F) ATOF.- Convierte una cadena caracteres a un valor de doble precisión Sintaxis: atof (CADENA); G) ATOL.- Convierte una cadena de caracteres aun valor entero o a un valor entero largo. Sintaxis: atol (CADENA); H) ITOA.- Convierte un numero entero en uno cadena de caracteres Sintaxis: itoa (VALOR, CADENA, BASE); Donde: 281 Lic. Elmer Alberto León Zárate Valor -Es el valor a transformar a cadena. Cadena - Cadena donde ira el resultado Base - Colocar a la base en la que se transformara el número Ejemplo 8.35 Realizar un programa que ingrese un numero entero y determine su base binaria utilizar la función itoa. # include <conio.h> # include < bcd.h> # include <string.h> # include < stdlib.h> # include< stdio.h> void main() { clrscr(); char a (15); int n; puts(“ingrese un número a cambiar de base:”); cin>> n; itoa (n, a, 16); cout<<” en base 2 es: “<<a<<”/n”; getch() ; } 8.14 GRAFICOS EN C++ Para crear gráficos en C++, necesita el fichero # include < graphics.h > y los pasos son los siguientes: Activar la librería graphics.h 282 CAPITULO VIII: Lenguaje de programación C++ Colocar los controladores y Detecciones de gráficos en C++ Colocar los comandos para la creación de gráficos Cerrar los gráficos con closegraph( ) Tener en cuenta las coordenadas 283 Lic. Elmer Alberto León Zárate 8.14.1 CONSTANTES GRAFICAS COLORES OSCUROS - 0 NEGRO - 1 AZUL MARINO CLARO - 2 VERDE PERICO - 3 VERDE CLARO - 4 ROJO - 5 MORADO O VIOLETA - 6 CAFÉ CLARO - 7 GRIS CLARO COLORES CLAROS - 8 GRIS FUERTE - 9 AZUL MARINO CLARO - 10 VERDE - 11 AZUL CLARO - 12 ROJO CLARO - 13 ROSA MEXICANO - 14 AMARILLO - 15 BLANCO 284 CAPITULO VIII: Lenguaje de programación C++ 8.14.2 JUSTIFICACION DE TEXTO HORIZONTAL - 0 LEFT_TEXT (JUSTIFICAR IZQUIERDA) - 1 CENTER_TEXT (JUSTIFICAR CENTRADA) - 2 RIGHT_TEXT (JUSTIFICAR DERECHA) - 0 BOTTOM_TEXT (JUSTFICACION ABAJO) - 1 CENTER_TEXT (JUSTFICACION CENTRADA) - 2 TOP_TEXT (JUSTFICACION ALTA) VERTICAL 8.14.3 BASE PARA LA CREACION DE GRAFICOS # include<graphics.h> # include<stdio.h> # include<conio.h> void main( ) { int controlador, modo=1; controlador=DETECT; initgraph(&controlador, modo, “ ”); /* Aquí colocar los comandos de creación de gráficos */ getch( ); closegraph( );} 285 Lic. Elmer Alberto León Zárate 8.14.4 FUNCIONES GRAFICAS 1. PUTPIXEL : Crea un pixel en la posición X Y. putpixel( x , y , color); 2. LINE : Crea una línea line( x1, y1, x2, y2); 3. ARC : Dibuja un arco arc(x , y , anguloinicio , angulofinal , radio); 4. BAR : Traza una barra bar( x1, y1, x2, y2 ); 5. BAR3D : Traza una barra en 3 dimensiones bar3d(x1,y1,x2,y2,tamaño _de_proyección,1); 1 topon 6. RECTANGLE : 0 topoff Crea un rectángulo rectangle(x1,y1,x2,y2) 7. LINETO : Crea una línea desde la posición actual lineto( x ,y ); 8. CLEARDEVICE : Limpia Pantalla cleardevice( ); 9. SETCOLOR : Cambia el color de los trazos setcolor(color); 10. SETBKCOLOR : Cambia el color del fondo setbkcolor(color); 11. PIESLICE : Traza un sector circular 286 CAPITULO VIII: Lenguaje de programación C++ pieslice(x,y,ángulo inicial, ángulo final, radio); 12. SETCOLOR : Cambia el color de los trazos setcolor(color); 8.14.5 FUNCIONES DE TEXTO EN MODO GRAFICO Tipo de letra 0 tipo de letra por defecto 1 triplex 2 pequeña 3 sanserif 4 gótica Tamaño Puede variar de 1 a 10 (Incrementando el tamaño) Valores de dirección 0 forma horizontal 1 forma vertical 1. SETTEXTSTYLE : Se configura el tamaño tipo de letra y su forma settextstyle(tipodeletra, dirección, tamaño); 2. OUTTEXTXY : Escribe un texto en la coordenada dada. outtextxy (x,y, “texto”); 287 Lic. Elmer Alberto León Zárate 8.15 RELACION DE EJERCICIOS: 1. Programa que ingrese 3 alumnos con 3 Notas cada uno y determine el promedio de cada uno (Utilizar arreglos unidimensionales y Funciones). 2. Ingrese N valores a un arreglo y determinar cuántos pares o impares se han ingresado en el arreglo utilizar funciones. 3. Programa que ingrese 15 números enteros a un arreglo unidimensional y decida si dos de estos enteros, cualquiera que ellas sean sumen 15. Utilizando funciones. 4. Programa que ingrese 10 números a un arreglo unidimensional, y diga cuál es el número que se repite más de los ingresados. 5. Programa que ingrese 5 nombres de personas con su respectivo tipo de sexo y edad, a un arreglo para cada uno y determinar cuántos son: Mayores de Edad, menores de edad, cantidad de Hombres, cantidad de mujeres, hombres mayores de edad, mujeres mayores de Edad. 6. Realizar el siguiente menú: Ingreso de Datos (Nombres-Paterno-Materno-Edad-Sexo) Listado de los Datos ingresados Listado de Nombres y Edad Listado de Paterno, Materno y Nombres Listado de Paterno, Nombres y Edad Salir Utilizar Arreglos para ingreso de Datos, funciones, Switch 7. Programa que ingrese 10 Nombres con sus respectivas 3 Notas por alumno y determinar su promedio, mostrar quien es el alumno con mayor promedio (utilizar arreglos unidimensionales y Funciones). 288 CAPITULO VIII: Lenguaje de programación C++ 8. Ingresar una matriz N x N y Determinar la Suma de todos sus elementos 9. Ingresar una matriz N x N y Determinar el mayor valor ingresado en la matriz 10. Ingresar una matriz de 3x3 determinar los siguientes resultados a través de un menú de opciones : Ingreso de datos de la matriz La suma de primera fila La suma de última fila La suma de la fila central La multiplicación de la primera columna La multiplicación de la última columna La suma de la diagonal principal La multiplicación de la diagonal secundaria Salir 11. Ingresar una matriz de FxC y determinar la suma de los valores de la frontera 12. Ingresar una matriz de FxC y determinar la Suma de la Primera y Última Fila 13. Ingresar una matriz de FxC y determinar el producto de la primera y la última columna. 14. Realizar un programa que ingrese el orden de la matriz (Filas y Columnas) para 2 matrices A y B y Determine la Suma de matrices. 15. Realizar un programa que ingrese el orden de la matriz (Filas y Columnas) para 2 matrices A y B y Determine la Resta de matrices. 16. Realizar un programa que ingrese el orden de la matriz para 2 matrices A (Fila1, Columna1) y B (Columna2, Fila2) y Determine la Multiplicación de matrices. 289 Lic. Elmer Alberto León Zárate 17. Realizar un programa que ingrese el orden de la matriz para una matriz A y devuelva la transpuesta de la matriz 18. Ingresar en un arreglo de 3x3 números enteros y realizar la determinante 19. Cubo Mágico 1, Programa que ingrese un número 5 a una variable N y con los números del 1 al 9, colocarlos en cada casillero para que la suma horizontal, vertical y sus diagonales siempre sumen 15. Definir un Arreglo de 3 x 3, para mostrar los resultados, la variable N debe ser colocada en el centro del Arreglo Bidimensional. 20. Cubo Mágico 2, Programa que ingrese un número 4 a una variable N y con los números del 0 al 8, colocarlos en cada casillero para que la suma horizontal, vertical y sus diagonales siempre sumen 12. Definir un Arreglo de 3 x 3, para mostrar los resultados, la variable N debe ser colocada en el centro del Arreglo Bidimensional. 21. Distribuir 1, Definir un Arreglo Bidimensional de 4 x 4, y distribuya los números del 1 al 12 en las casillas de tal modo que la suma de cada lado sea 22. 22. Distribuir 2, Definir un arreglo Bidimensional de 4 x 4, y distribuya los números del 1 al 12 en las casillas de modo que la suma de cada lado sea 26 23. Permitir el ingreso de N datos a una estructura de arreglos con los siguientes campos: PATERNO, MATERNO, NOMBRES, EDAD, SEXO, PROMEDIO DE NOTAS. Generar el siguiente menú : Reporte Total de Datos Reporte Total de Hombres 290 CAPITULO VIII: Lenguaje de programación C++ Reporte Total de Mujeres Reporte de los mayores de Edad Reporte de los menores de Edad Reporte de los desaprobados Reporte de los aprobados Reporte de Mujeres mayores de Edad aprobadas Salir Su opción es: 24. Se pide emitir la planilla de pago del personal de una empresa considerando los siguientes datos por empleado. Código, Apellidos (nombres, paterno, materno), Sueldo (Básico, Horas extras, Bruto). PLANILLA DE SUELDOS HORAS CODIGO NOMBRES PATERNO MATERNO BASICO EXTRAS XXXX XXXX XXXXXX XXXXXX XXXXXX XXXXXX XXXXX XXXXX 999.99 99 BRUTO 999.99 999.99 99 BRUTO 999.99 25. En una Biblioteca se desea tener un control sobre los préstamos de sus libros, los cuales tienen los siguientes datos: CODIGO, TITULO, AUTOR, AÑO DE EDICION, FECHA DE DEVOLUCION. Realizar el siguiente menú : Reporte Total de Libros Mostrar los libros ordenados en forma Ascendente por año 291 Lic. Elmer Alberto León Zárate Consulta Salir Su opción es: Formato de Consulta: Código del Libro : Aquí se ingresara un código Titulo : xxxx xxx Autor : xxxxx xxxx Fecha de devolución: xxxxxx xxx 26. Realizar una Estructura de Datos para que muestre la TABLA de posiciones de 8 equipos de Fútbol de Primera división a un arreglo, Ingresar el Nombre del Equipo Cantidad de partidos jugados, cantidad de partidos ganados (3 puntos), cantidad de partidos empatados (1 punto) y cantidad de partidos perdidos( 0 punto), Determinar en un menú lo siguiente : Campeón del Torneo Equipos que Irán a la copa Libertadores (3 primeros) Equipos que bajan a segunda división (2 últimos) Mostrar la Tabla de Posiciones de todos los equipos 27. Ingresar a una estructura de Datos los siguientes campos para un alumno, Apellidos, Sexo, Nota 1, Nota 2, Nota 3, para un total de N alumnos de un aula. Determinar por medio de un menú las siguientes opciones, utilizar funciones : Listado de los alumnos y su promedio Cantidad de alumnos aprobados y Desaprobados en porcentaje. Cantidad de Hombres y mujeres aprobadas Alumno con mayor promedio 292 CAPITULO VIII: Lenguaje de programación C++ 28. Ingresar a una estructura de Datos los siguientes campos para un alumno, Apellidos, Edad, prueba 1, prueba 2, prueba 3, prueba 4, para un total de N alumnos de un aula. Determinar por medio de un menú las siguientes opciones Utilizar Funciones : Listado de los alumnos y su promedio Cantidad de alumnos aprobados y Desaprobados en porcentaje. Listado de los mayores y menores de edad con su promedio Alumno con menor promedio 29. Crear un archivo de texto llamado DATOS.TXT para los programas de Ficheros, el primero guardara los datos personales del autor del programa (nombres, paterno, materno), el siguiente programa mostrara el contenido del mismo. 30. Crea un programa de fichero que agregue los siguientes datos al archivo DATOS.TXT, edad, sexo, Estado Civil. 31. Crear un Programa que pida el nombre del fichero y luego llenar N personas a un Arreglo de Estructuras con los siguientes campos: CODIGO, NOMBRES, PATERNO, MATERNO. Utilizando Funciones. 32. Crear un programa que Lea un Archivo de Texto y muestre los contenidos de los archivos creados en el programa del ejercicio Nº 31, utilizando Funciones. 33. Crear un programa que permita agregar más datos o información a los registros creados en el ejercicio Nº 31. 34. Crear el Siguiente menú de opciones, Todos con uso de Funciones MENÚ DE OPCIONES 1. Ingreso de datos al fichero 2. Listado de los datos del fichero 3. Agregar datos al fichero 293 Lic. Elmer Alberto León Zárate 4. Salir Su opción es: NOTA: Para un total de N personas que se ingresara en la opción 2 del menú, Utilizar Funciones, Arreglos y Estructuras para los siguientes campos del alumno: Nº MATRICULA, PATERNO, MATERNO, NOMBRES, CARRERA, CICLO, TURNO, SECCION. 35. Crear un archivo de texto que almacene todos los datos de una factura en un archivo llamado factura.txt con el siguiente formato Factura Nº 00001 CODIGO DESCRIPCION CANTIDAD PRECIO TOTAL A001 MENÚ 1 3 4.00 12.00 .... .... .... ..... ..... 36. Crear un archivo Binario que ingrese 10 registros con los siguientes campos ORDEN, NOMBRE, PATERNO, EDAD, SUELDO de una Estructura de datos. 37. Crear un programa que lea los datos creados en el archivo binario del ejercicio Nº 36. 38. Crear un programa que ingrese un número de Orden y muestre a que registro le pertenece. Utilizar el archivo del ejercicio Nº 36. 39. Realizar los 3 programas anteriores en un menú, utilizando funciones, estructura, Binarios. 294 CAPITULO VIII: Lenguaje de programación C++ 40. Realizar la siguiente estructura: CODIGO NOMBRE PATERNO MATERNO CICLO ESPECIALIDAD DEL ALUMNO Para un total de 10 alumnos utilizando: Archivos Binarios, Estructura de Datos, Funciones y menú. Generar el Siguiente menú de opciones: MENÚ DE OPCIONES Ingreso de datos al fichero Listado de los datos del fichero Búsqueda por el código del alumno Salir Su opción es: 41. Crear un archivo Binario que almacene todos los datos de una factura en un archivo llamado factura.dat con el siguiente formato: Factura Nº 00001 CODIGO DESCRIPCIÓN CANTIDAD PRECIO TOTAL A001 Producto 3 4.00 12.00 .... .... .... ..... ..... Dentro del archivo solo guardara el numero de Factura y luego cuando se quiera ver el contenido de la Factura solo se digitara el numero de factura. 295 Lic. Elmer Alberto León Zárate 42. Realizar un programa que ingrese una de caracteres y luego muestre el texto en caracteres. 43. Realizar un programa que ingrese una cadena de caracteres y realizar el siguiente menú. Numero de caracteres. Convertirlos en mayúsculas Convertirlas en minúsculas. Todas las vocales se conviertan en. Texto invertido. Salir. 44. Permitir el ingreso de una clave para realizar un programa a cualquiera y que solo permite el ingreso de 3 veces la clave luego emitir el mensaje ERROR DE CLAVE y terminar el programa. 45. Determinar si una cadena de caracteres es un palíndromo ( es un texto que se lee igual hacia la derecha o hacia la izquierda) Ejemplo: Radar, somos 46. Realizar un programa que ingrese un número entero de no más de 4 cifras y mostrar el equivalente en palabras. Ejemplo : 2000 dos mil 2001 dos mil uno 296 DISCUSIÓN Considerando que el presente trabajo no tiene resultados experimentales, obtenidos en gabinete o laboratorio no es posible realizar una discusión en ese sentido. Sin embargo podemos realizar una discusión respecto de otros trabajos. La elaboración del texto esta destinada al dictado de la asignatura Programación de computadoras, estructurado en xxxxx capítulos donde se exponen los principales conceptos de la informática y sus aplicaciones. El texto “PROGRAMACION DE COMPUTADORAS Y SUS APLICACIONES” a diferencia de otros, ha sido redactado en un lenguaje simple e incluso por cada capítulo se presenta una relación de ejemplos desarrollados para una mejor comprensión. La mayoría de los textos responsables de los temas tratados se encuentran escritos en diferentes idiomas, lo que dificulta su entendimiento por parte del estudiantado. Por lo que estos textos no pueden ser usados en el dictado de la asignatura. Por lo expuesto podemos concluir que el presente texto facilitara el proceso de enseñanza y aprendizaje en esta materia y será de gran utilidad a los profesores y alumnos universitarios interesados en las aplicaciones de la informática a las ciencias e ingenierías. 297 REFERENCIAS BIBLIOGRAFICAS 1.- JOYANES AGUILAR, LUIS; Fundamentos de programación, FERNANDEZ AZUELA, MATILDE; Madrid: McGraw-Hill, 2a edición, 1998. RODRIGUEZ BAENA, LUIS 2.- DEL AGUILA S,W. Algoritmos y diagramas de flujo, Lima: Gómez, 1a edición, 1992. 3.-JOYANES AGUILAR, LUIS. C++ a su alcance, Madrid: McGraw-Hill, 1a edición, 1994. 4.-CEVALLOS SIERRA, FRANCISCO. Curso de programación C++, Madrid: RA-MA, 1a edición, 1997. 5.- DELORES M, ETTER Solución de problemas de ingeniería con MATLAB, México: Prentice-Hall, 2a edición, 1998. 6.- NAKAMURA, CHOICHIRO Análisis Numérico y Visualización Grafica con Matlab, México: Prentice–Hall, 1a edición, 2000. 7.- STROUSTRUP, BJARNE. El Lenguaje de programación C++, Madrid: Addison-Wesley, 3a edición, 2002. 8. - STROUSTRUP, BJARNE. The C++ Programming Language, Madrid: Addison-Wesley, 3a edición, 2000. 9.- STROUSTRUP, BJARNE. The Design and Evolution of C++, ÇMadrid: Addison-Wesley, 1a edición, 1994. 298 10.- COPLIEN, JAMES. Advanced C++:Programming Styles and Idioms, Madrid: Addison-Wesley, 3a edición, 1992. 11.- MUSSER, D.R. Effective C++, Madrid: Addison – Wesley, 2a edición, 1997. 12.- FORD, W – TOPP, W. Data structures with C++, México: Prentice – Hall, 2a edición, 2002. 299 APENDICE DIAGRAMA DE LAS ESTRUCTURAS DE DATOS 300