I N D I C E - unac.edu.pe · 7.5 Matlab y el algebra lineal. 172 7.6 Comandos de ... las...
Transcript of I N D I C E - unac.edu.pe · 7.5 Matlab y el algebra lineal. 172 7.6 Comandos de ... las...
1
I N D I C E
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
2
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
3
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
4
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
5
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.
6
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” con aplicaciones
fundamentales para estudiantes de ciencias e ingeniería.
7
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.
8
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.
9
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).
10
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).
11
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
12
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.
13
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.
Lic. Elmer Alberto León Zárate
14
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.
CAPITULO I: Hardware y Software
15
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
Lic. Elmer Alberto León Zárate
16
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. La mayoría de las de IBM o
compatibles de marca de calidad que se venden actualmente.
CAPITULO I: Hardware y Software
17
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:
Lic. Elmer Alberto León Zárate
18
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.
CAPITULO I: Hardware y Software
19
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.
Lic. Elmer Alberto León Zárate
20
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:
CAPITULO I: Hardware y Software
21
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.
Lic. Elmer Alberto León Zárate
22
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
CAPITULO I: Hardware y Software
23
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.
Lic. Elmer Alberto León Zárate
24
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
CAPITULO I: Hardware y Software
25
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
Lic. Elmer Alberto León Zárate
26
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.
CAPITULO I: Hardware y Software
27
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.
Lic. Elmer Alberto León Zárate
28
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:
CAPITULO I: Hardware y Software
29
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
Lic. Elmer Alberto León Zárate
30
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.
CAPITULO I: Hardware y Software
31
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
Lic. Elmer Alberto León Zárate
32
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
CAPITULO I: Hardware y Software
33
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
Lic. Elmer Alberto León Zárate
34
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:
CAPITULO I: Hardware y Software
35
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 MS-
DOS 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
Lic. Elmer Alberto León Zárate
36
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.
CAPITULO I: Hardware y Software
37
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
Lic. Elmer Alberto León Zárate
38
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
CAPITULO I: Hardware y Software
39
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
Lic. Elmer Alberto León Zárate
40
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
CAPITULO I: Hardware y Software
41
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.
Lic. Elmer Alberto León Zárate
42
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.
CAPITULO I: Hardware y Software
43
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.
Lic. Elmer Alberto León Zárate
44
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.
CAPITULO I: Hardware y Software
45
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
Lic. Elmer Alberto León Zárate
46
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.
47
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 : Radio del Circulo (Tipo de Datos REAL)
Las Datos Salida : Superficie del Circulo – Circunferencia del
Circulo
Variables : RADIO, AREA, CIRCUNFERENCIA (Tipo REAL)
Lic. Elmer Alberto León Zárate
48
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.
CAPITULO II: Herramientas de programación
49
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
Comparación entre los datos.
DECISIÓN MULTIPLE: de acuerdo a la
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 delas operaciones.
LINEA CONECTORA: Sirve para unir dossímbolos.
LLAMADA A LA SUBRUTINA: Es un modulo
independiente del programa principal, realiza una tarea
determinada y retorna al programa principal.
Lic. Elmer Alberto León Zárate
50
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
CAPITULO II: Herramientas de programación
51
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
Lic. Elmer Alberto León Zárate
52
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.
CAPITULO II: Herramientas de programación
53
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.
54
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
CAPITULO III: Programación estructurada
55
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
Lic. Elmer Alberto León Zárate
56
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
CAPITULO III: Programación estructurada
57
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
Lic. Elmer Alberto León Zárate
58
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.
CAPITULO III: Programación estructurada
59
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
Lic. Elmer Alberto León Zárate
60
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 OINSTRUCCIONES
CONDICIONFALSO
VERDADERO
PSEUDOCODIGO
REPETIR
INSTRUCCIONES
HASTA <CONDICION>
PSEUDOCODIGO EN INGLES
REPEAT
INSTRUCCIONES
UNTIL <CONDICION>
CAPITULO III: Programación estructurada
61
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
Lic. Elmer Alberto León Zárate
62
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:
!!21
2
n
nxx
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:
CAPITULO III: Programación estructurada
63
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 tiene 1, 2,3 o más dígitos
considerar los negativos.
Lic. Elmer Alberto León Zárate
64
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.
65
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)
Lic. Elmer Alberto León Zárate
66
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í:
CAPITULO IV: Estructuras de datos
67
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)
Lic. Elmer Alberto León Zárate
68
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]...
CAPITULO IV: Estructuras de datos
69
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
Lic. Elmer Alberto León Zárate
70
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
CAPITULO IV: Estructuras de datos
71
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
Lic. Elmer Alberto León Zárate
72
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.
CAPITULO IV: Estructuras de datos
73
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 ]
Lic. Elmer Alberto León Zárate
74
Í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] PROM [5] PROM [6]
10 11 20 11
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
CAPITULO IV: Estructuras de datos
75
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
Lic. Elmer Alberto León Zárate
76
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
CAPITULO IV: Estructuras de datos
77
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
Lic. Elmer Alberto León Zárate
78
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
CAPITULO IV: Estructuras de datos
79
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
Lic. Elmer Alberto León Zárate
80
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
CAPITULO IV: Estructuras de datos
81
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.
Lic. Elmer Alberto León Zárate
82
Acceso directo
Registro 2 Registro 1 Registro 5
Posición 1 Posición 2 Posición 3 Posición 4 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.
CAPITULO IV: Estructuras de datos
83
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
AC
04
CH
06
GF
Área primaria
AA - AB - AC - BC - CH - FA - GF -
01 02 03 04 05 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.
Lic. Elmer Alberto León Zárate
84
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.
CAPITULO IV: Estructuras de datos
85
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
Lic. Elmer Alberto León Zárate
86
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.
CAPITULO IV: Estructuras de datos
87
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.
Lic. Elmer Alberto León Zárate
88
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];
CAPITULO IV: Estructuras de datos
89
MAYUS := ['A','B','S'];
DECEN := [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.
Lic. Elmer Alberto León Zárate
90
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
=
<>
<=
>=
IN
Igualdad de Conjuntos
Desigualdad de Conjuntos
Subconjunto de
Superconjunto de
Pertenencia a
Tipos Set compatibles
Tipos Set compatibles
Tipos Set compatibles
Tipos Set compatibles
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).
CAPITULO IV: Estructuras de datos
91
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:
Lic. Elmer Alberto León Zárate
92
OPERADOR OPERACION TIPO DE OPERANDOS
+
-
*
Unión de Conjuntos
Diferencia de Conjuntos
Intersección de Conjuntos
Tipos Set compatibles
Tipos Set compatibles
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.
CAPITULO IV: Estructuras de datos
93
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
Lic. Elmer Alberto León Zárate
94
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)
CAPITULO IV: Estructuras de datos
95
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
S
U
U
A
A
L
L
B
B
A
A
S
S
I
I
C
C
V
V
I
I
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
1
10
1
11
1
12
1
13
1
14
1
15
1
16
1
17
1
18
1
19
2
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
1
15
V
V
I
I
S
S
U
U
A
A
L
L
B
B
A
A
S
S
I
I
C
C
V
V
I
I
DONDE:
17 es la longitud máxima
Lic. Elmer Alberto León Zárate
96
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.
CAPITULO IV: Estructuras de datos
97
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:
Lic. Elmer Alberto León Zárate
98
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’ C=’Basic’
D=A+’ ‘+B+’ ‘+C
CAPITULO IV: Estructuras de datos
99
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.
Lic. Elmer Alberto León Zárate
100
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
CAPITULO IV: Estructuras de datos
101
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
Lic. Elmer Alberto León Zárate
102
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.
CAPITULO IV: Estructuras de datos
103
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
Lic. Elmer Alberto León Zárate
104
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).
CAPITULO IV: Estructuras de datos
105
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.
Lic. Elmer Alberto León Zárate
106
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)
{
CAPITULO IV: Estructuras de datos
107
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()
Lic. Elmer Alberto León Zárate
108
{
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;
}
CAPITULO IV: Estructuras de datos
109
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
{
Lic. Elmer Alberto León Zárate
110
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;
CAPITULO IV: Estructuras de datos
111
}
}
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:
Lic. Elmer Alberto León Zárate
112
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]);
CAPITULO IV: Estructuras de datos
113
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)
{
Lic. Elmer Alberto León Zárate
114
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)
{
CAPITULO IV: Estructuras de datos
115
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.
Lic. Elmer Alberto León Zárate
116
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.
CAPITULO IV: Estructuras de datos
117
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.
Lic. Elmer Alberto León Zárate
118
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;
CAPITULO IV: Estructuras de datos
119
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).
Lic. Elmer Alberto León Zárate
120
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.
CAPITULO IV: Estructuras de datos
121
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
Lic. Elmer Alberto León Zárate
122
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
CAPITULO IV: Estructuras de datos
123
ú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.
Lic. Elmer Alberto León Zárate
124
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
CAPITULO IV: Estructuras de datos
125
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.
Lic. Elmer Alberto León Zárate
126
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:
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.
d) 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
CAPITULO IV: Estructuras de datos
127
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:
Lic. Elmer Alberto León Zárate
128
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).
CAPITULO IV: Estructuras de datos
129
Á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.
Lic. Elmer Alberto León Zárate
130
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:
CAPITULO IV: Estructuras de datos
131
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:
Lic. Elmer Alberto León Zárate
132
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.
CAPITULO IV: Estructuras de datos
133
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.
Lic. Elmer Alberto León Zárate
134
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
CAPITULO IV: Estructuras de datos
135
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
136
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
CAPITULO V: Teoria de grafos
137
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.
Lic. Elmer Alberto León Zárate
138
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
CAPITULO V: Teoria de grafos
139
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;
Lic. Elmer Alberto León Zárate
140
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.
CAPITULO V: Teoria de grafos
141
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;
Lic. Elmer Alberto León Zárate
142
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.
CAPITULO V: Teoria de grafos
143
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.
Lic. Elmer Alberto León Zárate
144
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.
CAPITULO V: Teoria de grafos
145
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
1110
1101
1011
0111
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
0111
1011
1101
1110
;
0101
1001
0001
1110
;
0110
1010
1101
0010
C
BA
A) A y B son isomorfos
B) A y C son isomorfos
C) B y C son isomorfos
Lic. Elmer Alberto León Zárate
146
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.
147
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.
Lic. Elmer Alberto León Zárate
148
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)
CAPITULO VI: Ordenamiento y búsqueda de datos
149
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'],
Lic. Elmer Alberto León Zárate
150
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).
CAPITULO VI: Ordenamiento y búsqueda de datos
151
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] Swap(a, min, j).
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
Lic. Elmer Alberto León Zárate
152
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
CAPITULO VI: Ordenamiento y búsqueda de datos
153
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.
Lic. Elmer Alberto León Zárate
154
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--); // segunda búsqueda
if(i<d) // si no se han cruzado:
{
aux=array[i]; // Intercambiar.
CAPITULO VI: Ordenamiento y búsqueda de datos
155
array[i]=array[d];
array[d]=aux;
}
else // si se han cruzado:
break; // salir del bucle.
}
if(d==desde-1) // Si la segunda búsqueda se sale del array
d=desde; // 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.)
Lic. Elmer Alberto León Zárate
156
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)
{
CAPITULO VI: Ordenamiento y búsqueda de datos
157
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;
}
Lic. Elmer Alberto León Zárate
158
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++;
}
CAPITULO VI: Ordenamiento y búsqueda de datos
159
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
Lic. Elmer Alberto León Zárate
160
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:
CAPITULO VI: Ordenamiento y búsqueda de datos
161
{
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.
Lic. Elmer Alberto León Zárate
162
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
CAPITULO VI: Ordenamiento y búsqueda de datos
163
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:
Lic. Elmer Alberto León Zárate
164
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
CAPITULO VI: Ordenamiento y búsqueda de datos
165
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.
Lic. Elmer Alberto León Zárate
166
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
CAPITULO VI: Ordenamiento y búsqueda de datos
167
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.
168
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
- The MATLAB Math Library
- Matemáticas Simbólicas
- Procesamiento de Imagen
- The MATLAB compiler
- Estadística
- Diseño de Sistemas de control
- Identificación de Sistema
- Optimización
- Diseño de control no lineal
- Lógica Difusa
- Splines
CAPITULO VII: Software de programación Matlab
169
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
Lic. Elmer Alberto León Zárate
170
== 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
>> 13/3
ans = 4.3333
Ejemplo 7.2
>> 3/13
ans = 62.3333
Ejemplo 7.3
>> 4^ 2
ans = 16
Ejemplo 7.4
>> 2* pi^ 3
ans = 62.01255336059
Ejemplo 7.5
>>a = [0 1 2 3 4 5 6 7 8 9 10]
a = 0 1 2 3 4 5 6 7 8 9 10
Ejemplo 7.6
>>t = 0: 2: 20
t = 0 2 4 6 8 10 12 14
Ejemplo 7.7
>>b = a + 3
b = 3 4 5 6 7 8 9 10 11 12 13
Ejemplo 7.8
>>t = [1; 3; 5]
t = 1
3
5
Ejemplo 7.9
>>c = a + b
c = 3 4 5 6 7 8 9 11 13 15 17
19 21 23
CAPITULO VII: Software de programación Matlab
171
Ejemplo 7.10
>>d’
ans=
1 3 5
Ejemplo 7.11
>>f = [4; 6; 9]
f =
4
6
9
Ejemplo 7.12
>>d.*f
ans=
4
18
45
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)
Lic. Elmer Alberto León Zárate
172
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
CAPITULO VII: Software de programación Matlab
173
y =
2 1 3 7
Ejemplo 7.15
>> z = [0 1 2,3 4,5] % es otro vector, da igual separar los elementos por comas o
espacios
z =
0 1 2 3 4 5
Ejemplo 7.16
>> A = [1 2 3; 4 5 6] % es una matriz con 2 filas y 3 columnas
A =
1 2 3
4 5 6
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
Lic. Elmer Alberto León Zárate
174
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
CAPITULO VII: Software de programación Matlab
175
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 =
4 5 6
Lic. Elmer Alberto León Zárate
176
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 =
5 6
Ejemplo 7.26
>> A (2, [3 1]) % escribe de la segunda fila de la matriz, las columnas 3 y 1
ans =
6 4
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 =
5 6
CAPITULO VII: Software de programación Matlab
177
2 3
Ejemplo 7.28
>> A (end, [1 3]) % escribe de la última fila, las columnas 1 y 3
ans =
4 6
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 =
1 2 3
4 5 6
>>A (5) %accede al elemento 5 de la matriz, es decir, igual que si escribiéramos A
(1,3)
ans =
3
Lic. Elmer Alberto León Zárate
178
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 =
1 2 3 4 5 6 7
Ejemplo 7.31
>> (1:3:10) % crea un vector que comenzando en 1, aumenta de 3 en 3 hasta el 10
CAPITULO VII: Software de programación Matlab
179
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 =
1 5 9
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 =
2 4 6
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
Lic. Elmer Alberto León Zárate
180
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.
CAPITULO VII: Software de programación Matlab
181
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 =
0 0 0
0 0 0
0 0 0
Ejemplo 7.38
>> zeros (2,5) % matriz 2 x 5 de ceros
ans =
0 0 0 0 0
0 0 0 0 0
Ejemplo 7.39
>> ones (2,3) % matriz de unos
ans =
1 1 1
1 1 1
Ejemplo 7.40
>> rand (2,4) % matriz de valores aleatorios entre 0 y 1 según la uniforme (0,1)
Lic. Elmer Alberto León Zárate
182
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 =
1 0
0 1
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
CAPITULO VII: Software de programación Matlab
183
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
Lic. Elmer Alberto León Zárate
184
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 =
1 3
3 7
Ejemplo 7.47
>> A .* B % multiplicación elemento a elemento
ans =
1 2
0 4
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
CAPITULO VII: Software de programación Matlab
185
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 =
3 4
5 6
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
Lic. Elmer Alberto León Zárate
186
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 =
1 0 0
0 2 0
0 0 3
Ejemplo 7.54
>> A = [1 2 3 4; 7 8 9 2; 2 4 6 8]
A =
1 2 3 4
7 8 9 2
2 4 6 8
CAPITULO VII: Software de programación Matlab
187
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 =
3 4
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
Lic. Elmer Alberto León Zárate
188
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
0 0 0 0
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
2 4 6 0
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
0 0 6 8
CAPITULO VII: Software de programación Matlab
189
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
Lic. Elmer Alberto León Zárate
190
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
CAPITULO VII: Software de programación Matlab
191
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.
Lic. Elmer Alberto León Zárate
192
- 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;
CAPITULO VII: Software de programación Matlab
193
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
Lic. Elmer Alberto León Zárate
194
(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;
CAPITULO VII: Software de programación Matlab
195
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 =
Lic. Elmer Alberto León Zárate
196
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
CAPITULO VII: Software de programación Matlab
197
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 =
Lic. Elmer Alberto León Zárate
198
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
CAPITULO VII: Software de programación Matlab
199
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)
Lic. Elmer Alberto León Zárate
200
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)
CAPITULO VII: Software de programación Matlab
201
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')
Lic. Elmer Alberto León Zárate
202
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.
CAPITULO VII: Software de programación Matlab
203
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)
Lic. Elmer Alberto León Zárate
204
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)
CAPITULO VII: Software de programación Matlab
205
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
Lic. Elmer Alberto León Zárate
206
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)
CAPITULO VII: Software de programación Matlab
207
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
Lic. Elmer Alberto León Zárate
208
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
CAPITULO VII: Software de programación Matlab
209
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
Lic. Elmer Alberto León Zárate
210
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)
CAPITULO VII: Software de programación Matlab
211
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.
Lic. Elmer Alberto León Zárate
212
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]
CAPITULO VII: Software de programación Matlab
213
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]
Lic. Elmer Alberto León Zárate
214
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)
CAPITULO VII: Software de programación Matlab
215
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)
Lic. Elmer Alberto León Zárate
216
>>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]
CAPITULO VII: Software de programación Matlab
217
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).
Lic. Elmer Alberto León Zárate
218
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;
CAPITULO VII: Software de programación Matlab
219
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
220
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.
CAPITULO VIII: Lenguaje de programación C++
221
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; // x = x++; // x +=1;
- resta resta = a – b
-- Decremento en uno x = x - 1; // x = x - -; // x -=1;
Lic. Elmer Alberto León Zárate
222
* 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
( )
CAPITULO VIII: Lenguaje de programación C++
223
++ -- &
* / %
+ -
< <= > >=
== ¡=
&&
||
=
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
Lic. Elmer Alberto León Zárate
224
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
CAPITULO VIII: Lenguaje de programación C++
225
#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()
{
}
Lic. Elmer Alberto León Zárate
226
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;
CAPITULO VIII: Lenguaje de programación C++
227
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).
Lic. Elmer Alberto León Zárate
228
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;
......................
CAPITULO VIII: Lenguaje de programación C++
229
}
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”
Lic. Elmer Alberto León Zárate
230
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;
CAPITULO VIII: Lenguaje de programación C++
231
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.
Lic. Elmer Alberto León Zárate
232
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;
.....................; ....................;
} }
CAPITULO VIII: Lenguaje de programación C++
233
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:
Lic. Elmer Alberto León Zárate
234
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)
CAPITULO VIII: Lenguaje de programación C++
235
{ 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);
Lic. Elmer Alberto León Zárate
236
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;
...................... ;
}
CAPITULO VIII: Lenguaje de programación C++
237
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;
Lic. Elmer Alberto León Zárate
238
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)
CAPITULO VIII: Lenguaje de programación C++
239
{
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)
{
Lic. Elmer Alberto León Zárate
240
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:”;
CAPITULO VIII: Lenguaje de programación C++
241
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 ( )
{
……………
}
Lic. Elmer Alberto León Zárate
242
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; Instrucciones;
Instrucción; Función2 ( ); }
}
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
CAPITULO VIII: Lenguaje de programación C++
243
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.
Lic. Elmer Alberto León Zárate
244
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:
SUMA ( ); Función Sin Argumentos
int SUMA ( );
int SUMA (int A); Funcion con 1 entrada
int SUMA ( int A,int B) ; 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;
CAPITULO VIII: Lenguaje de programación C++
245
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 ( )
Lic. Elmer Alberto León Zárate
246
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.
CAPITULO VIII: Lenguaje de programación C++
247
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.
0 1 .... n
NOMBRE
DEL
ARREGLO
Dato 1 Dato 2 .....
……
Dato N
Un vector está compuesto:
Nombre del Arreglo
Índice : 0, 1, 2, 3,... n (Utilizar Estructuras Repetitivas)
Lic. Elmer Alberto León Zárate
248
Datos : Son los datos ingresados al arreglo de un mismo
tipo.
Ejemplo 8.18
0 1 2 3 4
NOTAS 08 09 10 11 10
NOMBRES ANA LUISA LIZA JANET ELISA
PROMEDIOS 10.5 11.50 3.45 19.55 0.025
Para acceder a cada elemento solo se escribirá el nombre de la variable
arreglo y el índice.
Para acceder a Janet NOMBRES [ 3 ]
Para acceder a 3.45 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 ] ;
CAPITULO VIII: Lenguaje de programación C++
249
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.
Lic. Elmer Alberto León Zárate
250
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.
CAPITULO VIII: Lenguaje de programación C++
251
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)
Lic. Elmer Alberto León Zárate
252
{ 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;
}
CAPITULO VIII: Lenguaje de programación C++
253
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();
Lic. Elmer Alberto León Zárate
254
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();
CAPITULO VIII: Lenguaje de programación C++
255
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;
Lic. Elmer Alberto León Zárate
256
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);
CAPITULO VIII: Lenguaje de programación C++
257
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)
Lic. Elmer Alberto León Zárate
258
{ // Si el numero fuera 1520
if (a>mayor) // 1 > 0
mayor=a; // mayor=1
else
mayor=mayor;
return mayor;
}
compara2 (int a)
{ // Si el numero fuera 1520
if (a<menor) // 1 < 0
menor=a; // 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
CAPITULO VIII: Lenguaje de programación C++
259
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;
Lic. Elmer Alberto León Zárate
260
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;
CAPITULO VIII: Lenguaje de programación C++
261
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();
}
Lic. Elmer Alberto León Zárate
262
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
CAPITULO VIII: Lenguaje de programación C++
263
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
Apellidos Paterno, Materno, Nombres
Edad y promedio
struct datos
{ struct a
{
char nombre[20],paterno[20],materno[20];
} apellidos;
struct f
{
int dia,mes,año;
Lic. Elmer Alberto León Zárate
264
} 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 ) Abre el Archivo
- close( ) Cierra el Archivo
- get ( CARACTER ) Obtiene el carácter o byte
- eof( ) 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:
CAPITULO VIII: Lenguaje de programación C++
265
- open ( NOMBRE) Abre el archivo
- close( ) Cierra el archivo
- put (CARACTER) Graba un caracter o byte
- eof( ) 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
Lic. Elmer Alberto León Zárate
266
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);
CAPITULO VIII: Lenguaje de programación C++
267
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
Lic. Elmer Alberto León Zárate
268
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);
CAPITULO VIII: Lenguaje de programación C++
269
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>
Lic. Elmer Alberto León Zárate
270
#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);
CAPITULO VIII: Lenguaje de programación C++
271
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();
}
Lic. Elmer Alberto León Zárate
272
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();
CAPITULO VIII: Lenguaje de programación C++
273
//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>
Lic. Elmer Alberto León Zárate
274
#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>
CAPITULO VIII: Lenguaje de programación C++
275
#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>
Lic. Elmer Alberto León Zárate
276
#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>
CAPITULO VIII: Lenguaje de programación C++
277
#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++);
Lic. Elmer Alberto León Zárate
278
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);
CAPITULO VIII: Lenguaje de programación C++
279
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);
Lic. Elmer Alberto León Zárate
280
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);
CAPITULO VIII: Lenguaje de programación C++
281
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:
Lic. Elmer Alberto León Zárate
282
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< stdio.h>
# include <string.h> # include < stdlib.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
CAPITULO VIII: Lenguaje de programación C++
283
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
Lic. Elmer Alberto León Zárate
284
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
CAPITULO VIII: Lenguaje de programación C++
285
8.14.2 JUSTIFICACION DE TEXTO
HORIZONTAL
- 0 LEFT_TEXT (JUSTIFICAR IZQUIERDA)
- 1 CENTER_TEXT (JUSTIFICAR CENTRADA)
- 2 RIGHT_TEXT (JUSTIFICAR DERECHA)
VERTICAL
- 0 BOTTOM_TEXT (JUSTFICACION ABAJO)
- 1 CENTER_TEXT (JUSTFICACION CENTRADA)
- 2 TOP_TEXT (JUSTFICACION ALTA)
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( );}
Lic. Elmer Alberto León Zárate
286
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 0 topoff
6. RECTANGLE : 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
CAPITULO VIII: Lenguaje de programación C++
287
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”);
Lic. Elmer Alberto León Zárate
288
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).
CAPITULO VIII: Lenguaje de programación C++
289
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.
Lic. Elmer Alberto León Zárate
290
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
CAPITULO VIII: Lenguaje de programación C++
291
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
CODIGO NOMBRES PATERNO MATERNO BASICOHORAS
EXTRAS
XXXX XXXXXX XXXXXX XXXXX 999.99 99
BRUTO 999.99
XXXX XXXXXX XXXXXX XXXXX 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
Lic. Elmer Alberto León Zárate
292
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
CAPITULO VIII: Lenguaje de programación C++
293
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
Lic. Elmer Alberto León Zárate
294
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.
CAPITULO VIII: Lenguaje de programación C++
295
40. Realizar la siguiente estructura:
CODIGO
DEL
ALUMNO
NOMBRE PATERNO MATERNO CICLO ESPECIALIDAD
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.
Lic. Elmer Alberto León Zárate
296
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
297
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.
298
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.
299
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.