ALGORÍTMIA Y ESTRUCTURA DE DATOS
Carol Roxana Rojas Moreno
Cada autor es responsable del contenido de su propio texto. De esta edición: © Universidad Continental S.A.C 2012 Jr. Junin 355, Miraflores, Lima-18 Teléfono: 213 2760 Derechos reservados Primera Edición: Noviembre 2013 Tiraje: 500 ejemplares Autor: Carol Roxana Rojas Moreno Oficina de Producción de Contenidos y Recursos Impreso en el Perú - Rebelars S.A.C Jr. Los Bosques 555 - El Tambo - Huancayo Fondo Editorial de la Universidad Continental
Todos los derechos reservados. Esta publicación no puede ser reproducida, en todo ni en parte, ni registrada en o trasmitida por un sistema de recuperación de información, en ninguna forma ni por ningún medio sea mecánico, fotoquímico, electrónico, magnético, electroóptico, por fotocopia, o cualquier otro sin el permiso previo por escrito de la Universidad.
INTRODUCCIÓN
9
DIAGRAMA DE PRESENTACIÓN DE LA ASIGNATURA
11
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
13
DIAGRAMA DE PRESENTACIÓN DE LA UNIDAD i Tema N° 1: Algoritmo 1 Definición del Algoritmo
14
2 Características de un algoritmo
17
3 Instrucciones Algorítmicas Básicas
17
4 Representación del Algoritmo
18
Tema N° 02: Programación Estructurada 1 Programa
26
2 Lenguaje de Programación
27
3 Programas Traductores
28
4 Definición Programación Estructurada
29
Tema N° 03: Sentencias Básicas de Programación 1 Estructura Básica Secuencial
31
2 Estructura Básica Selectiva
31
3 Estructura Básica Repetitiva
32
ACTIVIDAD N°1: Tema N° 4: Modularización de Programas 1 Definición de Módulos de Programa
14
2 Paso de Parámetros
17
3 Procedimientos
17
4 Funciones
18
5 Librerías de Programación creadas por el usuario
18
Tema N° 05: Funciones Recursivas 1 Definición de Recursividad
26
2 Recursividad de Factorial
27
3 Recursividad de la Multiplicación
28
4 Recursividad de Torres de Hanoi
29
ACTIVIDAD N°1: Lectura seleccionada N°1: Autoevaluación DE LA UNIDAD i
36
GLOSARIO
35
BIBLIOGRAFÍA DE LA UNIDAD I
40
UNIDAD II: ESTRUCTURA DE DATOS ESTÁTICAS
41
DIAGRAMA DE PRESENTACIÓN DE LA UNIDAD ii TEMA 1: Estructuras de Datos 1 Definición de Estructura de Datos
42
2 Clasificación de Estructura de Datos
43
Tema N° 02: Arreglos Unidimensionales 1 Definición de Arreglos Unidimensionales
56
2 Algoritmos de Actualización
57
3 Búsqueda de Arreglos Unidimensionales
56
4 Ordenación de Arreglos Unidimensionales
57
ACTIVIDAD N°1: Tema N° 03: Arreglos Bidimensionales 1 Definición de Arreglos Bidimensionales
56
2 Algoritmos de Actualización de Arreglos Bidimensionales
57
ACTIVIDAD N°2: Lectura seleccionada n° 1: Autoevaluación de la unidad ii
61
GLOSARIO
60
Bibliografía de la unidad ii
65
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICA LINEAL
67
DIAGRAMA DE PRESENTACIÓN DE LA UNIDAD iii Tema N° 01: Registro (Estructura) y Unión 1 Definición de Registro (Estructura)
68
2 Módulos y Estructuras
69
3 Invocación de una Estructura en otra
71
4 Definición de Unión: Ejemplo Práctico
75
Tema N° 02: Tipos de Datos Abstractos (TDA) 1 Definición de TDA 2 Clases y Programación Orientada a Objetos
76 77
Tema N° 03: Puntero a Dirección de Memoria 1 Definición de Puntero a dirección de Memoria
79
2 Creación y Eliminación de Variables Dinámicas
79
ACTIVIDAD N°1: Tema N° 04: Estructuras de Datos Dinámicas Lineal 1 Listas Enlazadas: simple, Doble, circular
56
2 Colas y Pilas
57
ACTIVIDAD N°2: Lecturas seleccionada n° 1
85
Autoevaluación de la unidad iii
87
GLOSARIO
86
Bibliografía de la unidad iii
90
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICA NO LINEAL
91
DIAGRAMA DE PRESENTACIÓN DE LA UNIDAD iv Tema N° 01: Árbol y Grafo 1 Árbol General: Conceptos básicos y algoritmos de manipulación
92
2 Árbol Binario: Recorridos: PreOrden, InOrden, PostOrden
94
3 Árboles Binarios de Búsqueda ( ABB )
96
4 Grafos: Conceptos y algoritmos de manipulación
97
ACTIVIDAD N°1: Tema N° 02: Archivo (Fichero) 1 Archivo: Conceptos y Algoritmos de manipulación
109
ACTIVIDAD N°2: Lecturas seleccionada n° 1
119
Autoevaluación de la unidad iv
122
GLOSARIO
121
Bibliografía Y DIRECCIONES ELECTRÓNICAS
125
ANEXO Clave de respuesta de Autoevaluaciones
111
INTRODUCCIÓN
A
lgoritmia y Estructura de Datos es una asignatura que
cas: Sentencias Básicas de Programación: Secuenciales, Selecti-
se desarrolla con una modalidad de educación virtual,
vas y Repetitivas y la Modularización en la Programación Estruc-
y el presente manual autoformativo es su material di-
turada, es decir, se puede dividir a un programa complejo, en
dáctico más importante.
segmentos de programa mas simples (Modularización), y poder ser reutilizados en otros programas, a través del uso de funcio-
Esta asignatura tiene como finalidad proporcionar al estudiante, los conocimientos necesarios en las técnicas y estructuras de datos para iniciarse en la programación asistida por un computador y basado en el enfoque estructurado, requeridos en su formación básica para poder desarrollar programas en otros niveles más avanzados.
nes y procedimientos, y en algunos casos usando el concepto de recursividad. Unidad II: Estructuras de Datos Estáticas, presentando los algoritmos de creación y actualización de Arreglos Unidimensionales y Bidimensionales, Unidad III: Estructuras de Datos Dinámica Lineal, donde se expone las formas de almacenamiento temporal de datos a través estructuras listas, pilas, cola. Unidad IV: Estructuras de Datos Dinámica No Lineal, en esta última unidad, se exponen otras formas de almacenamien-
La competencia a desarrollar es: Construye algoritmos en un
to de datos como árboles, grafos, archivos.
lenguaje de programación, utilizando las sentencias básicas de programación, diferenciando su uso para la propuesta de solución de un problema, y con ello construye programas computacionales utilizando módulos de programa (funciones y procedi-
Para el estudio del manual y la ejecución de las actividades, se recomienda para cada unidad:
mientos), valorando la reutilización de los módulo, y utilizando
• Realizar el estudio de los contenidos. Esta lectura será ana-
las diferentes estructuras de datos: estáticas y dinámicas para
lítica y reflexiva subrayando, resumiendo y asimilando la in-
almacenar datos temporalmente, diferenciando el uso de las
formación.
estructuras con respecto al uso de los archivos como almacenamiento de datos permanente, promoviendo el interés por otras técnicas de almacenamiento.
• Pasar al estudio de las lecturas seleccionadas, que son de estudio de profundización o ampliación. • Desarrollar las actividades programadas para cada semana en el aula virtual y asistidas por un lenguaje de programa-
El presente material consta de cuatro unidades: Unidad I: Algoritmos y Programación Estructurada, que presenta conceptos, representaciones y programación del algoritmo, con sus técni-
ción, con la asesoría del Profesor Tutor. • Desarrollar la auto evaluación, que es una preparación para la prueba final de la asignatura. .
8
Desarrollo de contenidos
PRESENTACIÓN DE LA ASIGNATURA ALGORITMIA Y ESTRUCTURA DE DATOS Diagrama
Objetivos
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Inicio
COMPETENCIA DE LA ASIGNATURA
Desarrollo Construye de contenidos
Actividades enAutoevaluación algoritmos un lenguaje de programación, utilizando las sentencias básicas de programación, diferenciando su uso para la propuesta de solución de un problema, y con ello construye programas computacionales utilizando módulos de programa (funciones y procedimientos), valorando la reutilización de los módulo, y utilizando las diferentes estructuras de datos: estáticas y dinámicas para almacenar datos temporalmente, diferenciando el uso de las estructuras con respecto al uso de los archivos como almacenamiento Lecturas Glosario Bibliografía de datos permanente, promoviendo el interés seleccionadas por otras técnicas de almacenamiento.
UNIDADES Recordatorio DIDÁCTICAS Anotaciones UNIDAD Nº 1
UNIDAD Nº 2
UNIDAD Nº 3
UNIDAD Nº 4
“Algoritmos y Programación Estructurada”
“Estructuras de Datos Estáticas”
“Estructuras de Datos Dinámica Lineal”
“Estructuras de Datos Dinámica No Lineal”
UNIDAD Nº 3
UNIDAD Nº 4
TIEMPO MÍNIMO DE ESTUDIO: UNIDAD Nº 1
UNIDAD Nº 2
1ª y 2ª semana
3ª y 4ª semana
5ª y 6ª semana
7ª y 8ª semana
16 horas
16 horas
16 horas
16 horas
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Bibliografía
9
10
Desarrollo de contenidos
Diagrama
Desarrollo de contenidos
Diagrama Lecturas seleccionadas
Objetivos
Inicio
Lecturas seleccionadas
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA Actividades
Autoevaluación
DIAGRAMA DE PRESENTACIÓN DE LA UNIDAD Objetivos Glosario
Inicio Bibliografía
CONTENIDO
Desarrollo de contenidos Recordatorio
Actividades
EJEMPLOS
Autoevaluación
Anotaciones
Glosario
BIBLIOGRAFÍA
ACTIVIDADES
AUTOEVALUACIÓN
Bibliografía
Anotaciones CONOCIMIENTOS
PROCEDIMIENTOS
ACTITUDES
Tema N° 1: Algoritmo 1. Definición del Algoritmo 2. Características de un algoritmo 3. Instrucciones Algorítmicas Básicas 4. Representación del Algoritmo
1. Analiza diferentes situaciones problema para proponer un algoritmo computacional como solución.
1. Asume con responsabilidad sus actividades académicas asignadas.
2. Aplica el flujo de trabajo de la sentencia de programación secuencial.
2. Realiza con honestidad las evaluaciones asignadas.
Recordatorio
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Tema N° 2: Programación Estructurada 1. Programa 2. Lenguaje de Programación 3. Programas Traductores 4. Definición Programación Estructurada Tema Nº 3: Sentencias Básicas de Programación 1. Estructura Básica Simple o Secuencial 2. Estructura Básica Selectiva 3. Estructura Básica Repetitiva Tema Nº 4: Modularización de Programas 1. Definición de Módulos de Programa 2. Paso de Parámetros 3. Procedimientos 4. Funciones 5. Librerías de Programación creadas por el usuario Lectura seleccionada N° I: Introducción a los Subalgoritmos o Subprogramas – Luis Joyanes Aguilar Tema Nº 5: Funciones Recursivas 1. Definición de Recursividad 2. Recursividad del Factorial 3. Recursividad de la Multiplicación 4. Recursividad de Torres de Hanoi Autoevaluación de la Unidad I
3. Aplica las sentencias de programación selectiva en la construcción de un algoritmo como solución de un problema. 4. Aplica las sentencias de programación repetitiva en la construcción de un algoritmo como solución de un problema. 5. Aplica los conceptos de la modularización a través de las Funciones, Procedimientos. 6. Construye Librerías de Programación, para la reutilización de módulos en los programas. 7. Aplica algoritmos recursivos en la construcción de programas. Actividad N° 1: Elaboración de Algoritmos y programas usando las sentencias básicas de programación. Actividad N° 2: Elaboración de programas usando módulos y librerías de programas, y elaboración de algoritmos recursivos. Control de Lectura Nº 1: Sentencias de Programación en los Algoritmos y Módulos de Programa.
Bibliografía
11
12
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
TEMA N° 1: ALGORITMO 1 DEFINICIÓN DE ALGORITMO ¿En su quehacer diario, realiza sus actividades generalmente en un orden, organizado, finaliza y realiza otro conjunto de actividades de similar manera? Entonces quiere decir que está realizando un algoritmo, y en este caso, al desarrollarlo sin ayuda de un computador, se trata de un algoritmo no computacional. La definición de “Algoritmo” es precisamente como Ud. pensó que desarrolla sus actividades diarias, es decir: “Un algoritmo es un conjunto ordenado y finito de actividades, que generalmente, conducen a la solución de un problema”.
La palabra algoritmo se deriva de la traducción al latín del nombre árabe Al-Khuwarizmi, matemático y astrónomo árabe que escribió un tratado sobre manipulación de números y ecuaciones en el siglo IX. (Angela Carrasco Loli. Principios de Programación)
Tenemos algunos ejemplos de algoritmo: - Al instalar un equipo de sonido, ejecutamos las instrucciones (algoritmo) contenidas en el manual del equipo. - El algoritmo matemático de Euclides para la obtención del máximo común divisor de dos números. Algunos algoritmos pueden ser ejecutados con ayuda de una computadora, a esto le llamamos algoritmo computacional, donde las actividades desarrolladas se llaman instrucciones y se expresan en un lenguaje de programación. (Términos que se explican mas adelante). Todo algoritmo puede ser descompuesto en tres partes, como se muestra en la siguiente figura: E: Entrada de datos. P: Proceso. S: Salida de resultados. Figura Nro 1: Partes de un algoritmo 2 CARACTERÍSTICAS DE UN ALGORITMO
• Un algoritmo debe ser preciso e indicar el orden de realización de cada paso. • Un algoritmo debe ser definido. El algoritmo dos veces, se debe obtener el mismo resultado cada vez. • Un algoritmo debe ser finito: Si se sigue use debe terminar en algún momento, o sea, debe tener un número finito de pasos. (Luis Joyanes Aguilar. Fundamentos de Programación.)
Para que pueda escribir las instrucciones algorítmicas, necesita conocer lo que es una Variable: Es una localización o casillero en la memoria principal que almacena un valor que puede cambiar en el transcurso de la ejecución del programa. Tiene un nombre, un tipo de dato y un valor. Antes de poder utilizar una variable es necesario declararla especificando su nombre y su tipo de dato.
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Ejemplo 1: Entero edad
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Ejemplo 2: Real peso, talla 3 INSTRUCCIONES ALGORÍTMICAS BÁSICAS a. Entrada: Consiste en obtener un dato de un dispositivo de entrada, como el teclado el lector óptico, etc., y almacenarlo en una variable, y se expresa en el pseudocódigo mediante la palabra LEER, de la siguiente forma: Ejemplo: LEER variable LEER edad • En lenguaje C/C++: cin>>edad; b. Salida: Consiste en mostrar el valor de una variable en un dispositivo de salida, como la pantalla del computador, se expresa en el pseudocódigo mediante la palabra ESCRIBIR,de la siguiente forma: Ejemplo: ESCRIBIR variable ESCRIBIR TotalCompra • En lenguaje C/C++: cout<<TotalCompra; c. Asignación: Consiste en dar a una variable el valor de una expresión. La asignación se expresa en el pseudocódigo de la siguiente forma: variable
expresión
Donde variable y el valor de expresión deben tener el mismo tipo de dato. Ejemplo: numero1 + numero 2
resultado
En lenguaje C/C++: resultado = numero1 + numero 2 4 REPRESENTACIÓN DEL ALGORITMO Para poder comprender el orden lógico en el que realizan los pasos de un algoritmo, se hace uso de diagramas de representación, definidas por conjunto de símbolos y significado de cada uno de ellos A continuación se le mostrará algunas de las representaciones de algoritmos más conocidas: a. Pseudocódigo: Es la representación del algoritmo en el lenguaje natural del programador. Ejemplo: algoritmo para sumar dos números enteros. INICIO entero
numero1, numero2, resultado
Leer numero1 Leer numero2 resultado
numero1 + numero 2
Escribir “El resultado de la suma es: ” Escribir resultado FIN Descripción: - Todo algoritmo por ser finito, tiene un INICIO un FIN. - Las variables numero1, numero2 y resultado, son asignadas como tipo de dato entero.
Bibliografía
13
14
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
- Note que se mantiene las tres partes de un algoritmo: ENTRADA (Leer numero1, Leer numero2), PROCESO (La suma de numero1 y numero2, y dicho valor de suma asignado a la variable resultado) y SALIDA (Escribir el mensaje por pantalla “El resultado es: ” y Escribir el valor pantalla de la variable resultado) b. Diagrama de Flujo Estructurado: Representación con flujos entre los procesos a realizar. Los principales símbolos de representación para este diagrama son: Inicio/Fin del algoritmo Procesos del algoritmo Entada/Salida Estándar de Datos del algoritm Flujo de recorrido entre Procesos del algoritmo Punto de Decisión del algoritmo Subrutinas en el algoritmo Conector del algoritmo en la misma hoja Conector del algoritmo en otra hoja
c. Diagrama Nassi/Schneiderman (N-S): Representación en bloques, es decir cada uno de los procesos como ingreso/salida de datos, decisiones, acciones, repeticiones; están representados en bloques de tareas consecutivos. INICIO Declaración de variables Lectura de Datos Acción 1 Acción 2 Acción n Reporte de Datos FIN Se le mostrará ejemplos de estas dos últimas representaciones de algoritmos en el tema de Sentencias de Programación.
TEMA N° 2: PROGRAMACIÓN ESTRUCTURADA 1 PROGRAMA ¿Se ha preguntado como el computador puede realizar las órdenes como ingresar datos por teclado, reproducir música, editar imágenes? Todo esto es posible gracias a la ejecución de algún programa, es decir, un conjunto de pasos ordenados y finitos (algoritmo) escrito en un lenguaje de programación (programa fuente). 2 LENGUAJE DE PROGRAMACIÓN Así como Ud. conoce el alfabeto (símbolos), gramática y semántica de un idioma como por ejemplo el castellano o el inglés, así es como usará un lenguaje de programación, con sus propios símbolos, gramática y semántica.
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Lecturas seleccionadas
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Glosario
Entonces, el lenguaje de programación es un conjunto de sentencias utilizadas para escribir secuencias de instrucciones para que ejecute un programa en una computadora.
Recordatorio Existen los siguientes lenguajes de programación que ya fueron revisados en alguna asignatura previa a esta, las que recordamos como:
a. Lenguaje Máquina: Lenguaje de programación que la computadora interpreta y ejecuta directamente, y está compuesto de instrucciones codificadas en binario (0, 1). b. Lenguaje de Bajo Nivel: también llamados lenguajes ensambladores, permiten al programador escribir instrucciones de un programa usando abreviaturas del lenguaje natural (inglés), también llamadas palabras nemotécnicas (ADD, DIV, SUB, etc). c. Lenguaje de Alto Nivel: permite al programador escribir las instrucciones de un programa utilizando palabras o expresiones sintácticas muy similares al lenguaje natural (ejemplo: el inglés). Recuerde que así escriba un programa en un lenguaje de alto nivel, el computador debe traducir estas instrucciones a lenguaje máquina, es decir, en código binario. 3 PROGRAMAS TRADUCTORES Son aquello programas que traducen algoritmos escritos en un programa en lenguaje de alto nivel hacia el lenguaje de código máquina. a. Intérprete: es un traductor que toma un programa fuente, lo traduce y a continuación lo ejecuta. La siguiente figura muestra el flujo de desarrollo de un intérprete.
PROGRAMA FUENTE
INTERPRETE
TRADUCCIÓN Y EJECUCIÓN LINEA POR LINEA
Figura Nro 2: Programa Intérprete (Luis Joyanes Aguilar. Fundamentos de Programación) b. Compilador: la traducción del programa se realiza en una sola operación llamada compilación del programa, es decir se traducen las instrucciones del programa en un solo bloque. El programa compilado y depurado (eliminado los errores de código fuente) se denomina programa ejecutable porque ya se puede ejecutar directamente y cuantas veces de desee, y puede volver a compilarse por ejemplo en el lenguaje C/C++. En la siguiente figura se muestra del flujo de desarrollo de un compilador.
Anotaciones
Bibliografía
15
16
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
PROGRAMA FUENTE
COMPLADOR
PROGRAMA OBJETIVO Figura Nro 3: Programa Compilador (Luis Joyanes Aguilar. Fundamentos de Programación) La compilación es el proceso de traducción del programa fuente a programa objeto (traducido a código máquina), a través de un programa enlazador (conduce a un programa en lenguaje máquina directamente ejecutable), para obtener el programa ejecutable. El detalle del proceso de un compilador se muestra en la siguiente figura:
PROGRAMA FUENTE
COMPLADOR
PROGRAMA OBJETIVO
PROGRAMA ENLAZADOR
PROGRAMA EJECUTABLE Figura Nro 4: Detalle de un Programa Compilador (Luis Joyanes Aguilar. Fundamentos de Programación) 4 DEFINICIÓN PROGRAMACIÓN ESTRUCTURADA Existen dos enfoques de programación y por lo tanto de desarrollo de software, muy utilizados en la actualidad, el Enfoque Estructurado y el Enfoque Orientado a Objetos, cada uno con sus conceptos, técnicas y herramientas. En esta asignatura, por ser de formación básica en su carrera y para facilitar el inicio del estudiante en la elaboración de programas, usaremos la Programación del Enfoque Estructurado. La Programación Estructurada es un conjunto de técnicas para escribir, verificar, depurar, y mantener los programas realizando refinamientos sucesivos es decir un todo se divide en segmentos más sencillos o de menor complejidad que al darles solución, se proceden a unificar. Para que estos segmentos de programa realicen las tareas que se le asignen, se recurre a las Estructuras de Control Básicas.
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Estructuras de Control Básicas (Flujos de Control)
Lecturas seleccionadas
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Glosario
Las estructuras básicas que permiten iniciarse sin dificultad en la programación, se conocen como: • Secuenciales
Recordatorio
• Selectivas • Repetitivas Éste conjunto de técnicas permite elaborar programas en cualquier lenguaje de programación. Las estructuras de Control Básicas mencionadas, o también conocidas como Sentencias Básicas de Programación, serán desarrolladas más adelante. NOTA: Estructura de un Programa en C/C++ Para iniciar la elaboración de programas en esta asignatura, se muestra la Estructura de un Programa Simple en C++, en el Tema de Módulos de Programa, la estructura del programa tendrá algunas modificaciones.
Figura Nro 5: Estructura simple de un Programa en C/C++ (Elaboración personal) Descripción: - El símbolo #, es una directiva del procesador que permite acceder la carpeta include. - La carpeta o librería include, es propia del compilador, es donde se encuentran las librerías de cabecera (extensión .h) del lenguaje C/C++ - Una de las librerías de cabecera es el iostream, (i:imput, o:output, stream: flujo de cadenas) que permite reconocer las instrucciones de entrada, salida y manejo de caracteres o cadenas (simbolos) dentro del programa. - using namespace std; indica que se está haciendo uso del espacio de nombres estándar, es decir un conjunto de símbolos para lenguajes de programación. - El Módulo Principal main( ), en el cual se escribirán las instrucciones de programa o invocaciones a otros módulos de programa.
Anotaciones
Bibliografía
17
18
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
TEMA N° 3: SENTENCIAS BÁSICAS DE PROGRAMACIÓN 1 ESTRUCTURA BÁSICA SECUENCIAL En un mundo ideal, el orden de realización de tareas no tendrían ninguna restricción (condición o selección), es decir se realizarían de forma secuencial. Es una estructura paso a paso, sin bifurcaciones ni repeticiones; donde la salida de un proceso es entrada para otro. Diagrama de Flujo:
INICIO
Declaración de variables
Lectura de datos
Acción 1
Acción 2
Acción n
Reporte de datos
FIN
Diagrama N-S: INICIO Declaración de variables Lectura de Datos Acción 1 Acción 2 Acción n Reporte de Datos FIN Ejemplo: Calcular el área de un triángulo. Área = (base * altura) / 2 Solución Leyenda de Datos Base: valor de la base del triángulo Altura: valor de la altura del triángulo Área: valor del resultado del cálculo del área del triángulo
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Diagrama de Flujo:
INICIO real ← base, altura, área
Leer base
Leer altura
Área ← (base*altura)/2
Escribir "El valor del área para el triángulo es:"
Escribir área
FIN
Diagrama N-S: INICIO real ← base, altura, área Leer base Leer altura Área (base*altura)/2 Escribir "EL valor del área para el triángulo es:" Escribir área FIN Código en C++: #include<iostream> using namespace std; void main( ) { float base, altura, Area; cout<<”Ingrese valor de la base: ”; cin>>base; cout<<”\n”;
//Salto de línea
cout<<”Ingrese valor de la altura: ”; cin>>altura; cout<<”\n”; Area = (base * altura) / 2; cout<<”El valor del área para el triángulo es: ”;
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
19
20
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
cout<<Area; cout<<”\n”; system(“PAUSE”); Anotaciones
} 2 ESTRUCTURA BÁSICA SELECTIVA Es una estructura que tiene un punto de decisión para realizar un conjunto de acciones. Pueden ser: • E. B. Selectiva Simple • E. B. Selectiva Compuesta • E. B. Selectiva Múltiple a. Estructura Básica Selectiva Simple: Se tiene un punto de decisión que evalúa una condición y si es Verdadero, ejecuta un conjunto de Acciones. Diagrama de Flujo:
INICIO
Declaración de variables
Lectura de datos F
Cond 1
V Acción 1 Acción n
Reporte de datos
FIN
Diagrama N-S: INICIO Declaración de variables Lectura de datos V Acción 1 Acción 2 Acción n Reporte de datos FIN
cond 1
F
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Ejemplo:
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Sumar dos números enteros positivos c = a + b Solución: Leyenda de Datos a: valor del primer número entero positivo b: valor del segundo número entero positivo c: valor del resultado la suma de dos números a y b
Diagrama de Flujo:
INICIO entero ← a,b,c
Leer a, b F
V
a > 0 && b > 0
c←a+b Escribir "El valor de la suma es:" c
FIN
Diagrama N-S: INICIO Entero ← a, b, c Leer a, b V
a>0 && b>0
c←a+b Escribir "El valor la suma es:", c FIN
Código C: #include<iostream> using namespace std; int main( ) { float a, b, c; cout<<”Ingrese primer número: ”; cin>>a; cout<<”\n”; cout<<”Ingrese segundo número: ”; cin>>b; cout<<”\n”;
F
Bibliografía
21
22
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
if (a>0 && b>0) {
c = a + b; cout<<”El valor la suma es: ”;
Anotaciones
cout<<c; cout<<”\n”; } system(“PAUSE”); return 0; } b. Estructura Básica Selectiva Compuesta: Se tiene un punto de decisión que evalúa una condición y si es Verdadero, ejecuta un conjunto de Acciones, y si es Falsa ejecuta otro conjunto de acciones. Diagrama de Flujo:
INICIO
Declaración de variables
Lectura de datos F
Cond 1
V
Acción 2
Acción 1
Acción m
Acción n
Reporte de datos
FIN
Diagrama N-S: INICIO Declaración de variables Lectura de datos V
cond 1
Acción 1
Acción 2
...
...
Acción n
Acción m
F
Reporte de datos FIN
Ejemplo: Sumar dos números enteros si son positivos, sino multiplicarlos.
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Solución:
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Leyenda de Datos a: valor del primer número entero positivo b: valor del segundo número entero positivo c: valor del resultado la suma de dos números a y b
Diagrama de Flujo:
INICIO entero ← a,b,c
Leer a, b F
a > 0 && b > 0
c←a*b
V c←a+b
Escribir "El valor de la multiplicación es:" c
Escribir "El valor de la suma es:" c
FIN
Diagrama N-S: INICIO Entero ← a, b, c Leer a, b V
a>0 && b>0
F
c←a+b
c←a*b
Escribir "El valor la suma es:", c
Escribir "El valor la multiplicación es:", c
FIN
Código C: #include<iostream> using namespace std; void main( ) { int a, b, c; cout<<”Ingrese primer número: ”; cin>>a; cout<<”\n”; cout<<”Ingrese segundo número: ”; cin>>b; cout<<”\n”; if(a>0 && b> 0)
Bibliografía
23
24
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
{
c = a + b; cout<<”El valor la suma es: ”; cout<<c; cout<<”\n”;
Anotaciones
} else {
c = a * b; cout<<”El valor la multiplicacion es: ”; cout<<c; cout<<”\n”;
} system(“PAUSE”); } c. Estructura Básica Selectiva Múltiple: Se tiene un punto de decisión que evalúa más de dos alternativas para realizar un conjunto de acciones. Diagrama de Flujo:
INICIO
Declaración de variables
Lectura de datos 1
default
Cond 1
3
3
Acción 1
Acción 2
Acción 3
Acción 4
Acción n
Acción m
Acción m
Acción m
Acción 4 Reporte de datos
FIN
Diagrama N-S: INICIO Declaración de variables Lectura de datos 1
2
Acción 1
Acción 2
Acción 3
Acción 4
...
...
...
...
Acción n
Acción m
Acción m
Acción m
Reporte de datos FIN
3
cond 1
default
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Ejemplo:
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Ingresa cinco números e imprime que vocal es. Solución: Leyenda de Datos num: valor del número entero positivo
Diagrama de Flujo:
INICIO entero ← num.
Leer num.
num
1 2
Escribir "Vocal A"
Escribir "Vocal A"
3
default 4
Escribir "Vocal A"
5
Escribir "Vocal A"
Escribir "Vocal A"
4
5
Escribir "Vocal A"
FIN
Diagrama N-S: INICIO Entero ← a, b, c Leer a, b 1
2
Escribir "Vocal A"
Escribir "Vocal E"
3 Escribir "Vocal I"
Escribir "Vocal O"
FIN
Código C: #include<iostream> using namespace std; void main( ) { int num; cout<<”Ingrese número: ”; cin>>num; switch(num) {
case 1: cout<<”Vocal A”; break; case 2: cout<<”Vocal E”; break; case 3: cout<<”Vocal I”; break;
num
Escribir "Vocal U"
default
Escribir "No es vocal "
Bibliografía
25
26
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
case 4: cout<<”Vocal O”; break; case 5: cout<<”Vocal U”; break; default: cout<<”No es numero para una vocal”; Anotaciones
} system(“PAUSE”); } Existe una conformación de la Estructura Selectiva que ayuda en la elaboración de programas: Estructura Básica Selectiva Anidada: se evalúa una condición y si es Verdadero, ejecuta un nuevo punto de decisión y así sucesivamente, y si es Falsa ejecuta otro conjunto de acciones. Diagrama de Flujo:
INICIO
Declaración de variables
Lectura de datos F
Cond 1 F
Acción 2
V
Cond 2
V
Acción 1 Acción m Acción n
Reporte de datos
FIN
Diagrama N-S: INICIO Declaración de variables Lectura de datos F
Cond 1
Acción 2
V
...
Acción 1
...
...
Acción m
Acción n
Reporte de datos FIN
V Cond 2
F
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Lecturas seleccionadas
Ejemplo:
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Glosario
Ingresar un número entero y si es positivo y diferente de cero, reportar si se encuentra entre los diez primeros números. Recordatorio
Solución:
Leyenda de Datos a: valor del número entero
Diagrama de Flujo:
INICIO entero ← a
Leer a F
a>0 F
Escribir "No es un número mayor que cero"
V
a > = 1 && a >10
V
Escribir "Primeros 10"
Escribir "Son mas de los primeros l0"
FIN
Diagrama N-S: INICIO Entero a Leer a F
a>0
Escribir "No es un número mayor que cero"
F
Código C: #include<iostream> using namespace std; void main( ) { int a; cout<<”Ingrese número: ”; cin>>a; if(a>0) if(a>=1 && a<10)
a >= 1 && a > 10
Escribir "Son mas de los primeros 10"
FIN
V
cout<<”Primeros 10”;
V
Escribir "Primeros 10"
Anotaciones
Bibliografía
27
28
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
else
cout<<”Son más de los primeros 10”;
else Anotaciones
cout<<”No es un número mayor que cero”;
system(“PAUSE”); } 3 ESTRUCTURA BÁSICA REPETITIVA Es una estructura permite repetir un conjunto de acciones dada una condición. Pueden ser: • E. B. Repetitiva Mientras • E. B. Repetitiva Hacer-Mientras • E. B. Repetitiva Para a. Estructura Básica Repetitiva Mientras: Primero evalúa una expresión condicional y si es verdadera permite realizar el conjunto de acciones y regresa evaluar nuevamente la expresión condicional, hasta que deje de cumplir (Falso). Diagrama de Flujo:
INICIO
Declaración de variables
Lectura de datos
Cond 1 V
Acción 1 Acción n
Acción 2 FIN
Diagrama N-S: INICIO Declaración de variables Lectura de datos Cond 1 Acción 1 ... Acción n Acción 2 Reporte de datos FIN
F
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Ejemplo:
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Imprimir la serie Fibonacci, menor a un límite dado: 0,1,1,2,3,5,8,13,…. Diagrama de Flujo:
INICIO entero ← lim, a=0, b=1, c
Leer lim
Escribir a
b<=lim V
Escribir b c←a+b a←b b←c
FIN
Diagrama N-S: INICIO entero ← min, a=0, b=1, c Leer lim Escribir a b <= lim Escribir c←a+b a←b b←c FIN
Código C: #include<iostream> using nameaspace std; void main( ) { int lim, a=0, b=1,c; cout<<”Ingrese límite: ”; cin>>lim;
F
Bibliografía
29
30
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
cout<<a; while(b<=lim) { Anotaciones
cout<<b; c=a+b; a=b;
b=c;
} system(“PAUSE”); } b. Estructura Básica Repetitiva Hacer - Mientras: Realiza al menos una vez un conjunto de acciones, y luego evalúa una expresión condicional, si es Verdadero regresa a repetir el conjunto de acciones, si no cumple, termina la repetición. Diagrama de Flujo:
INICIO
Declaración de variables
Lectura de datos Acción 1 Acción n Cond 1 F
Acción 2 Reporte de Datos FIN
Diagrama N-S: INICIO Declaración de variables Lectura de datos Acción 1 ... Acción n Cond 1 Acción 2 Reporte de datos FIN
V
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Lecturas seleccionadas
Ejemplo:
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Glosario
Leer un número entero mayor que cero, sino es así, volver a solicitar el número con esas condiciones. Diagrama de Flujo:
Recordatorio
INICIO entero ← num
Leer num
num <= 0
V
F
FIN
Diagrama N-S: INICIO entero ← mun Leer num num <= 0 FIN
Código C: #include<iostream> using namespace std; void main() { int num; do{ cout<<” Ingrese un numero entero mayor a cero: “;
cin>>num;
}while(num <= 0);
system(“PAUSE”); } c. Estructura Básica Repetitiva Para: Tambien conocida como Desde ó Por, permite repetir un conjunto de acciones, secuencialmente hasta llegar a un límite dado; recorrido se realiza desde una variable o índice de recorrido y avanza de uno en uno hasta llegar al límite. Diagrama de Flujo:
Anotaciones
Bibliografía
31
32
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
INICIO Anotaciones
Declaración de variables
Lectura de datos
Definir variables de recorrido y limite
Inicializar la variable de recorrido F
Variable es menor a limite V
Acción 1 Acción n Incrementar variable de recorrido
Acción 2 Reporte de Datos FIN
Diagrama N-S: INICIO Declaración de variables Lectura de datos i = 0; i <= limite; i ++ Acción 1 ... Acción n Acción 2 Reporte de datos FIN Ejemplo: Calcular el Factorial de un número (n!). Diagrama de Flujo:
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
INICIO entero ← i, num, p = 1
Escribir " Ingrese numero para factorial"
Leer num
i←1 F
i < = num V
p←p*i i ++
Escribir " El factorial es", p FIN
Diagrama N-S: INICIO entero ← num i, p = 1 Leer num i = 1; i <= num; i ++ p←p*i Escribir "el factorial es:" Escribir p FIN
Código C: #include<iostream> using namespace std; void main( ) { int num, i, p=1; cout<<”Ingrese numero para factorial: ”; cin>>num; for(i=1;i<=num; i++) { p = p * i; } cout<<”El factorial de ”<<n<<”es: ”<<p; system(“PAUSE”); }
Bibliografía
33
34
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
Diagrama
Objetivos
Desarrollo de contenidos
Actividades
Inicio
ACTIVIDAD N° 1: Autoevaluación
Esta actividad puede consultarla en su aula virtual.
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
TEMA N° 4: MODULARIZACIÓN DE PROGRAMAS 1 DEFINICIÓN DE MÓDULOS DE PROGRAMA Imagine que está iniciando un negocio y no tiene colaboradores, y asume todas las tareas para su funcionamiento: buscar proveedor, ofrecer y publicitar el producto o servicio, estar involucrados en el proceso de transacción etc. Pero en alguna etapa de crecimiento, asignamos estas tareas a otros colaboradores, quienes interactúan entre sí, y al final le informan de su cumplimiento. Es lo mismo que pasa en la elaboración de módulos de programa. Los Módulos de Programa (subprogramas) son partes separadas de código que ejecutan tareas pequeñas de un módulo principal. El módulo es con un conjunto de instrucciones precisas, independientes y reutilizables. Para poder crear los módulos de programa, debe conocer las formas en que se pasan los datos de un módulo a otro, al ser invocados. 2 PASO DE PARÁMETROS Parámetros de entrada (valor) Imagine nuevamente, que se hace un clon de su persona, todas las modificaciones que haga sobre él (cambio de peinado, forma de vestir, aprendizaje de otro idioma) no le afectaría a Ud. que es el dato original. Es decir, se guarda en memoria una copia temporal de la variable, y dentro del módulo solo se utiliza la copia para las modificaciones. Parámetros de entrada/salida (referencia) Ahora el ejemplo ya no es clonar a su persona, sino que es Ud. mismo, y donde sea que se encuentre (o referencia de ubicación), las modificaciones que se realicen siempre se mantendrán en Ud., por ser el dato original. Es decir, los cambios que se efectúen sobre dicha variable dentro del procedimiento se mantienen incluso después de que este haya terminado. La siguiente figura muestra un programa, haciendo uso de los tipos de paso de parámetros.
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Figura Nro 6: Programa Ejemplo de Paso de Parámetros (Elaboración personal) Descripción: - En el programa se tienen dos módulos: el Principal: main (no olvide que siempre debe existir) y el módulo f (que como programadores, estamos creando). - En el módulo Principal se está declarando dos variables: x, y a las cuales se les está asignando el valor de 1, a cada una respectivamente. - En el mismo módulo Principal se invoca al módulo f, al que se le envía los valores de x, y: f(x,y) significa f(1,1); - Esa invocación permite que se desarrolle el módulo void f (int a, int &b), es decir la variable a, recibe el valor de la variable x y la variable b recibe el valor de la variable y, por estar en un orden dentro del paréntesis. - La variable a, servirá para un paso de parámetros de entrada, y la variable b para un paso de parámetros de entrada/salida por que lo acompaña el operador de dirección & (para hacer referencia, es decir apuntar a la dirección de memoria de la variable y) - Es decir, la variable a, recibe el valor de 1 proveniente de x, mientras que la variable b recibe la dirección de memoria (en base hexadecimal) de la variable y. - El módulo f, es independiente al módulo Principal, por lo que la declaración de la variable a es de forma local, es decir las modificaciones o cambios de valores a la variable a, solo es afectada en el módulo f, mientras que el valor original de x se mantiene y no sufre los cambios que realice en la variable a. - Lo mismo ocurriría con la variable b, pero en este caso, b no es copia de y, sino que invoca la dirección de memoria de y, por lo que los cambios que realice en b, afecta directamente a y. Se tiene dos tipos de módulos de programa: Procedimiento y Función. 3 PROCEDIMIENTOS Son módulos que se utilizan para elaborar un conjunto de instrucciones, independientes y reutilizables, pero definiendo claramente el significado y utilidad de esa porción de programa (cohesión). Declaración en C/C++: void NombreProcedimiento( ) void NombreProcedimiento (argumentos)
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Bibliografía
35
36
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
4 FUNCIONES Son módulos que tienen la misma definición de un procedimiento, pero con la particularidad de que permite devolver UN valor en una variable. Anotaciones
Declaración en C/C++: Tipo_dato NombreFunción( ) Tipo_dato NombreFunción(argumentos) Nota: - En la Función, el Tipo de dato que se escribe al declararla, debe ser el mismo tipo de dato de la variable cuyo valor se devuelve (retorna) - En el Procedimiento, como no devuelve ningún valor, se escribe la palabra void, que indica vació o sin especificar un tipo de dato. - Tanto en función y en procedimiento, se puede declarar con o sin argumentos, es decir los argumentos son el envío de valores de variables a través de estos módulos y pueden ser paso de parámetros por entrada o paso de parámetros por entrada/salida. Pasamos a un ejemplo, simple en solucionar, pero el objetivo de este ejemplo es crear y comparar el uso de Función, Procedimiento, con o sin argumentos. Ejemplo: se tiene el siguiente programa simple para sumar dos números //Programa Simple #include<iostream> using namespace std; void main() { int a,b,c; cout<<”Ingrese valor de a: \t”; cin>>a; cout<<”Ingrese valor de b: \t”; cin>>b; c=a+b; cout<<c; cout<<”\n”; system(“PAUSE”); } Es simple porque todas las instrucciones de programa para lograr sumar dos números, es decir la entrada de datos en la variable a y b, el proceso de sumar y asignar y la salida del resultado en la variable c, se están escribiendo solo en el Módulo Principal main( ) A continuación se muestra la forma para crear un módulo llamado sumar, usando la siguiente técnica: creando el módulo antes del módulo que lo invoca. El desarrollo del programa se muestra con el uso Procedimiento con y sin argumentos, y usando Función con y sin argumentos.
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
//Procedimientos con Argumentos: Ejemplo 1 #include<iostream> using namespace std; void sumar(int a, int b) { int c; c=a+b; cout<<c; cout<<”\n”; } void main() { int a,b; cout<<”Ingrese valor de a: \t”; cin>>a; cout<<”Ingrese valor de b: \t”; cin>>b; sumar(a,b); system(“PAUSE”); }
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
//Procedimientos sin Argumentos: Ejemplo 2 #include<iostream> using namespace std; void sumar() { int a,b,c; cout<<”Ingrese valor de a: \t”; cin>>a; cout<<”Ingrese valor de b: \t”; cin>>b; c=a+b; cout<<c; } void main() { sumar( ); system(“PAUSE”); }
Descripción: - En ambos casos, con o sin argumentos, el módulo sumar( ) está realzando exactamente la tarea para la cual ha sido creada, es decir, sumar dos números. - Además, en el Módulo principal main( ), se invoca al módulo sumar ( ) exactamente con su nombre, sin ayuda de ninguna otra variable, ya que no devuelve ningún valor. - Pero, en ambos casos, la tarea de leer los valores de a y b, están siendo asumidos en el primer caso por el módulo principal, o en el segundo caso, por el módulo sumar. Esta tarea también será asumida por un módulo apropiado que permita realizar la tarea de obtener los valores, sin recargar la responsabilidad de otros módulos. (Se verá mas adelante)
Bibliografía
37
38
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
//Funciones con Argumentos: Ejemplo1 #include<iostream> using namespace std; int sumar(int a, int b) { int c; c=a+b; return c; } void main() { int sum,a,b; cout<<”Ingrese valor de a: \t”; cin>>a; cout<<”Ingrese valor de b: \t”; cin>>b; sum=sumar(a,b); cout<<”Valor de la suma de a y b: “<<sum; cout<<”\n”; system(“PAUSE”); } //Funciones sin Argumentos: Ejemplo 2 #include<iostream> using namespace std; int sumar() { int a,b,c; cout<<”Ingrese valor de a: \t”; cin>>a; cout<<”Ingrese valor de b: \t”; cin>>b; c=a+b; return c; } void main() { int sum; sum=sumar(); cout<<”Valor de la suma de a y b: “<<sum; cout<<”\n”; system(“PAUSE”); }
Descripción: - En ambos casos, con o sin argumentos, el módulo sumar( ) está realzando exactamente la tarea para la cual ha sido creada, es decir, sumar dos números. - El módulo sumar( ), está siendo declarado acompañado de un tipo de dato entero: int, ya que es el mismo tipo de dato de la variable que está devolviendo (return) en este caso, la variable c. - Por lo que, el módulo principal, al invocar al módulo sumar, debe recibir el valor que se está devolviendo, y para esto se recomienda el uso de una variable que reciba dicho valor, en el ejemplo la variable sum, la cual debe estar declarada con el mismo tipo de dato de la variable que recibe. - De igual manera que en el ejemplo de Procedimientos, la tarea de leer los valores de a y b, deben ser asumidos por un módulo apropiado. Otra Manera de definir un Procedimiento y una Función, con o sin argumentos, es con la técnica: declarar de manera global a la función o procedimiento, es decir en la cabecera del programa, y luego desarrollar las instrucciones de la función o procedimiento después del Módulo Principal.
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
//Procedimientos con Argumentos #include<iostream> using namespace std; void sumar(int a, int b); int main() { int a,b; cout<<”Ingrese valor de a: \t”; cin>>a; cout<<”Ingrese valor de b: \t”; cin>>b; sumar(a,b); return 0; } void sumar(int a, int b) { int c; c=a+b; cout<<c; cout<<”\n”; }
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
//Funciones con Argumentos #include<iostream> using namespace std; int sumar(int a, int b); void main() { int sum,a,b; cout<<”Ingrese valor de a: \t”; cin>>a; cout<<”Ingrese valor de b: \t”; cin>>b; sum=sumar(a,b); cout<<”Valor de la suma de a y b: “<<sum; cout<<”\n”; } int sumar(int a, int b) { int c; c=a+b; return c; }
Descripción: - El ejemplo anterior solo ha sido dado con Procedimientos y Funciones con argumentos, pero también puede darse sin argumentos. - En esta forma, el orden de creación de los módulos no es relevante, siempre y cuando estén declarados de manera global en el programa. Ejemplo: Para repartir una herencia se tiene en cuenta: Si la cantidad de hijos es menor a 4, se repartirá exactamente entre el número de hijos; si son cuatro o más hijos, la mitad le tocará al hermano mayor y el resto se dividirá entre los demás hermanos.
#include<iostream> using namespace std; //procedimientos sin argumentos void herencia() { float her,may; int num; cout<<”Ingresar importe de herencia \n”; cin>>her; cout<<”Ingresar cantidad de hijos \n”; cin>>num;
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Bibliografía
39
40
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
if(num<4) { her=her/num; cout<<”Herencia a cada hijo es “<<her; } else { may=her/2; her=may/(num-1); cout<<”\nHerencia de hermano mayor es”<<may; cout<<”\nHerencia de cada hijo es “<<her; }
Anotaciones
} void main( ) { herencia( ); system(“PAUSE”); }
5 LIBRERÍAS DE PROGRAMACIÓN CREADAS POR EL USUARIO Al elaborar programas, además de crear módulos independientes y reutilizables en el programa fuente, Ud. se verá en la necesidad de usar esos mismos módulos en otros programas fuentes, diferentes entre sí, ya que el algoritmo que necesita son los mismos para cada uno de ellos. Existen librerías de cabecera (header, de alli la extensión “.h”), y algunas son propias del del lenguaje C como: iostream.h, math.h, conio.h, stdio.h, srting.h y otras que pueden ser creadas por el programador, y ser invocadas en diferentes programas fuente (el programa con extensión “.cpp”) como parte de la reutilización de código. Ejemplo 1: Leer un número entero diferente a cero, y si es positivo, reportar “El numero es positivo”, caso contrario es negativo. Solución: - Crear la librería con extensión .h llamado lecturadato.h para crear la función de lectura de datos enteros, llamada leedatoe( ). lecturadato.h #include<iostream> using namespace std; int leedatoe() { int dato; do{ cout<<”Ingrese valor del dato”; cin>>dato; }while(dato==0); return dato; }
- Crear el programa Ejemplo.cpp que invoca a la librería lecturadato.h, especificando la ruta que se encuentre:
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Ejemplo: cpp #include<iostream> #include “c:\programas\lecturadato.h” using namespace std; void main() { int num; num=leedatoe(); if(num>0) cout<<”El numero es positivo”; else cout<<”El numero es negativo”; system(“PAUSE”); }
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Descripción: - Al invocar a lecturadato.h, a través de su ruta de ubicación, permite usar las veces que se requeira, al módulo leedatoe( ) que se encuentra ubicado dentro de librería creada. - Si se tiene otro programa con la extensión .cpp, puede también invocar a la librería lecturadato.h, sin ningún inconveniente. - Puede agregar otros módulos de lectura a la librería lecturadato.h, según el tipo de dato que necesite. - Escribir la ruta de la librería se hace innecesaria por la ayuda que ofrece las interfaces de la herramienta de programación que ese esté usando. Ejemplo: LecturaDatos.h
Figura Nro 7: Ejemplo de Librería LecturaDatos.h (Elaboración personal)
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Bibliografía
41
42
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
RepartoHerencia.cpp
Figura Nro 8: Ejemplo de Programa Fuente RepartoHerencia.cpp (Elaboración personal) Descripción: - Como puede ver, en el programa fuente RepartoHerencia.cpp, se invoca al módulo leedatod( ) y leedatoe( ) para obtener los valores de monto de herencia y cantidad de hijos respectivamente; dichos módulos están creados en la librería LecturaDatos.h, que es invocada en el programa fuente. - El módulo principal main( ) se debe escribir líneas abajo del programa fuente, y debe invocar al módulo Herencia( ), como ya se ha explicado en el ejemplo anterior.
TEMA N° 6: FUNCIONES RECURSIVAS En cierta ocasión en un aula de clase, pregunté si podían definir o dar un ejemplo de recursividad, sorprendiéndome la respuesta de un estudiante: “Si yo tengo un apuro económico, vendo mi reproductor de música, y atiendo ese apuro. Es decir, un recurso que le pertenece a una entidad, es usada nuevamente por la misma entidad para buscar una solución, eso es Recursividad”, finalizó. 1 DEFINICIÓN DE RECURSIVIDAD Entonces, se denominan funciones recursivas a aquellas que se invocan a sí mismas en un programa, para desarrollar un determinado proceso. Hay que tener algunas cosas en cuenta, en las funciones recursivas: - Toda función recursiva debe tener algún punto de finalización o valor base. - La función recursiva debe acercarse a ese punto de finalización o valor base. (Eduardo Raffo Lecca, Turbo C++)
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
Lecturas seleccionadas
2 RECURSIVIDAD DEL FACTORIAL:
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Glosario
n! 4! = 4 * 3 * 2 * 1 4 * 3! → Es decir n*(n-1)!
3! = 3 * 2 * 1 3 * 2! → Es decir n*(n-1)!
2! = 2 * 1 2 * 1! → Es decir n*(n-1)!
1! = 1 * 0!
Recordatorio 4! = 4 * 3 * 2 * 1 4 * 3! 3! = 3 * 2 * 1 3 * 2! 2! = 2 * 1 2 * 1! 1! = 1 * 0! 0! = 1
0! = 1 1 * 1 * 2 * 3 * 4 = 24
int factorial(int n) { if (n == 0) return 1; else
return n*factorial(n-1); } 3 RECURSIVIDAD DE LA MULTIPLICACIÓN: a*b 3*4=3+3+3+3 3 + (3 * 3)
3*3=3+3+3
3 + (3 * 2)
3*2=3+3
3 + (3 *1)
3*4=3+3+3+3 3 + (3 * 3) 3*3=3+3+3 3 + (3 * 2) 3*2=3+3 3 + (3 * 1) 3*1 =3 3 + 3 + 3 + 3 = 12
3*1 =3
int multiplica(int a, int b) { if (a == 0 || b == 0)
return 0; else
if (b == 1) return a; else return a+multiplica(a,b-1); } 4 RECURSIVIDAD DE TORRES DE HANOI Las restricciones para la recursividad de torres de hanoi, se expresan: - Usar n discos para trasladarlos desde un poste origen, hacia un poste final, usando un poste auxiliar. - Por cierta cantidad de discos, hay una cantidad de movimientos, ni mas ni menos, cant_movim = 2n − 1. - Los discos están dispuestos del tamaño grande al más pequeño. No puede estar un disco grande sobre uno pequeño. A continuación se tiene el algoritmo, puesto a prueba a través del Método del Árbol, muy útil para comprobar la recursividad.
Anotaciones
Bibliografía
43
44
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
Figura Nro 9: Ejemplo de Método del Árbol para Torres de Hanoi (Elaboración personal)
Diagrama
Objetivos
Desarrollo de contenidos
Actividades
Inicio
ACTIVIDAD N° 2: Autoevaluación
Esta actividad puede consultarla en su aula virtual.
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
Diagrama
Objetivos
Inicio
Desarrollo de contenidos
Actividades
Autoevaluación
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
LECTURA SELECCIONADA N° 1 Lecturas seleccionadas
Glosario
Bibliografía
INTRODUCCIÓN A LOS SUBALGORITMOS O SUBPROGRAMAS Luis Joyanes Aguilar, 2008, Fundamentos de Programación. Pág. 202 Recordatorio
Anotaciones
Un método ya citado para solucionar un problema complejo es dividirlo en subproblemas –problemas más sencillos– y a continuación dividir estos subproblemas en otros más simples, hasta que los problemas más pequeños sean fáciles de resolver. Esta técnica de dividir el problema principal en subproblemas se suele denominar “divide y vencerás” (divide and conquer). Este método de diseñar la solución de un problema principal obteniendo las soluciones de sus subproblemas se conoce como diseño descendente (top-down design). Se denomina descendente, ya que se inicia en la parte superior con un problema general y el diseño específico de las soluciones de los subproblemas. Normalmente las partes en que se divide un programa deben poder desarrollarse independientemente entre sí. Las soluciones de un diseño descendente pueden implementarse fácilmente en lenguajes de programación de alto nivel, como C/C++, Pascal o Fortran. Estas partes independientes se denominan subprogramas o subalgoritmos si se empelan desde el concepto algorítmico. La correspondencia entre el diseño descendente y la solución por computadora en términos de programa principal y subprogramas se analizará a lo largo de este capítulo. Consideremos el problema del cálculo de la superficie (área) de un rectángulo. Este problema se puede dividir en tres subproblemas: •
Subproblema 1: Entrada de datos de altura y base.
•
Subproblema 2: Cálculo de la superficie.
•
Subproblema 3: Salida de resultados.
El algoritmo correspondiente que resuelve los tres subproblemas es: Leer (altura, base)
// entrada de datos
Área ← base * altura
// cálculo de la superficie
Escribir (base, altura, área)
// salida de resultados
El método descendente se muestra en la Figura:
Algoritmo
Problema
Subproblema 1
Subproblema 2
Subalgoritmo 1
Subproblema 3
Subalgoritmo 2
Subalgoritmo 3
Figura Nro 10: Diseño Descendente (Fuente: Luis Joyanes Aguilar. Fundamentos de Programación) El problema principal se soluciona por el correspondiente programa o algoritmo principal – también llamado controlador o conductor (driver) – y la solución de los subproblemas mediante subprogramas, conocidos como procedimientos (subrutinas) o funciones. Los subprogramas, cuando se tratan en lenguaje algorítmico, se denominan también subalgoritmos.
Bibliografía
45
46
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
Un subprograma puede realizar las mismas acciones que un programa: 1) aceptar datos, 2) realizar algunos cálculos, 3) devolver resultados. Un subprograma, sin embargo, se utiliza por el programa para un propósito específico. El subprograma recibe datos desde el programa y le devuelve resultados. Haciendo un símil con una oficina, el problema es como el jefe que da instrucciones a sus subordinados – subprogramas-; cuando la tarea termina, el subordinado devuelve un resultado al jefe. Se dice que el programa principal llama o invoca al subprograma. El subprograma ejecuta la tarea, a continuación devuelve el control al programa. Eso puede suceder en diferentes lugares del programa. Cada vez que el programa es llamado, el control retorna al lugar donde fue hecha la llamada como muestra la siguiente figura (Figura 12). Un subprograma puede llamar a su vez a sus propios subprogramas (Figura 13). Existen – como ya se ha comentado – dos tipos importantes de subprogramas: funciones y procedimientos o subrutinas. Programa
Llamada 1 Retorno 1
Subprograma
Llamada 2 Retorno 2 Algoritmo
Subalgoritmo
Figura Nro 11: Un programa con un subprograma: función y procedimiento (Fuente: Luis Joyanes Aguilar. Fundamentos de Programación)
Programa
Subprograma 1
Subprograma 1.1
Subprograma 2
Figura Nro 12: Un programa con diferentes niveles de subprogramas (Fuente: Luis Joyanes Aguilar. Fundamentos de Programación) Diagrama
Objetivos
Inicio
Desarrollo de contenidos
Actividades
Autoevaluación
AUTOEVALUACIÓN DE LA UNIDAD N° I INSTRUCCIONES: Lee detenidamente y responde las siguientes preguntas: Lecturas seleccionadas
Glosario
Bibliografía 1. Indique la alternativa que describa la característica “Ser Preciso” de un algoritmo:
a) Sólo se desarrollarán las tareas programadas y con los datos suministrados. b) Las tareas desarrolladas deben permitir ponerlas a prueba antes de ejecutar. Recordatorio
Anotaciones
c) Las tareas de un algoritmo tienen un orden de realización. d) Se emplear los recursos necesarios para el desarrollo de las tareas. e) Se debe expresar en una forma estándar, comúnmente aceptada. 2. El programa traductor denominado compilador realiza el siguiente flujo de trabajo. a) Obtiene el programa fuente, genera el código objeto, lo enlaza al código máquina y genera el programa ejecutable. b) Obtiene el programa fuente, genera el código algoritmo, lo enlaza al código máquina y genera el programa ejecutable. c) Obtiene el programa fuente, genera el código objeto, lo enlaza al código fuente
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
y genera el programa ejecutable.
Lecturas seleccionadas
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Glosario
d) Obtiene el programa fuente, genera el código máquina, lo enlaza al código fuente y genera el programa ejecutable. Recordatorio e) Obtiene el programa fuente, genera el código algoritmo, lo enlaza al código fuente y genera el programa ejecutable.
3. Dado el siguiente bloque de código que utiliza una estructura repetitiva, indique que valores lógicos de la tabla de verdad (Verdadero=V y Falso=F) se necesita en la condición, para que no solicite nuevamente el ingreso el valor: a) V,V. b) F,V. c) V,F. d) F,F.
do{ cout<<”Ingrese valor: ”; cin>>valor; }while(valor==’S’ || valor==’s’);
e) FFV. 4. Indique la alternativa que presenta el orden de ejecución de la estructura repetitiva Para: for( i = 0; i < n; i++) { accion 1; acción m; }
a) Inicializa la variable de recorrido, compara que esté dentro del límite, incrementa la variable, realiza las acciones, e inicia nuevamente el mismo orden de ejecución. b) Inicializa la variable de recorrido, compara que esté dentro del límite, realiza las acciones, incrementa la variable e inicia nuevamente el mismo orden de ejecución. c) Inicializa la variable de recorrido, compara que esté dentro del límite, incrementa la variable, realiza las acciones, y finaliza el orden de ejecución. d) Inicializa la variable de recorrido, incrementa la variable, compara que esté dentro del límite, realiza las acciones, e inicia nuevamente el mismo orden de ejecución. e) Inicializa la variable de recorrido, decrementa la variable, compara que esté dentro del límite, realiza las acciones, e inicia nuevamente el mismo orden de ejecución. 5. Dado el siguiente bloque de código, indique el tipo de sentencia: if(num > 0) if(num > 30 && num < 60 ) cout<<pow(num,2);
a) Sentencia Repetitiva Para. b) Sentencia Selectiva Compuesta. c) Sentencia Repetitiva Hacer-Mientras. d) Sentencia Selectiva Múltiple. e) Sentencia Selectiva Anidada. 6. Indique la alternativa cuyo enunciado no es correcto: a) Las funciones y procedimientos son módulos de programa. b) Las funciones recursivas se invocan a sí mismas. c) Sólo las funciones usan argumentos, los procedimientos no lo usan.
Anotaciones
Bibliografía
47
48
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA
d) Los módulos son independientes y reutilizables. e) Los pasos de parámetros son dos: por valor y por referencia. Anotaciones
7. Indique la alternativa que defina a “permite usar módulos independientes, en diferentes programas”. a) Función Recursiva. b) Paso de Parámetros por valor. c) Sentencias Repetitivas. d) Librerías de programación. e) Sentencias Selectivas. 8. Indique a que algoritmo recursivo, se refiere el siguiente módulo de programa: int modulo(int a, int b) { if(b==0) return 1; else return a*modulo(a,b-1); } a) Función Recursiva de la Multiplicación. b) Función Recursiva del Factorial. c) Función Recursiva de la Potencia. d) Función Recursiva de Fibonacci. e) Función Recursiva de Torres de Hanoi. 9. El paso de parámetros por valor, realiza el siguiente proceso: a) Crea una variable original y las modificaciones afectan a la copia de la variable original. b) Crea una copia temporal de la variable y las modificaciones solo afectan a ésta copia. c) Crea un variable original y las modificaciones solo afectan a ésta. d) Crea una copia temporal de la variable y las modificaciones afectan a la variable original. e) Crea una variable original y no tiene modificaciones. 10. Indique la alternativa que indique la(s) variables(s) que sean paso de parámetros por referencia. void calcular(int x, int & y) { int c; c = x + y; cout<<c; }
a) La variable “x”. b) La variable “x” y la variable “y”. c) La variable “y”. d) La variable “c” y la variable “y”. e) La variable “c”.
os
s
o
Diagrama
Objetivos
Inicio
Desarrollo de contenidos
Actividades
Autoevaluación
Lecturas seleccionadas
Glosario
Desarrollo UNIDAD I: ALGORITMOS Y PROGRAMACIÓN ESTRUCTURADA de contenidos
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
GLOSARIO Bibliografía
Argumento: valores suministrados a un módulo de programa, al momento de ser invocado. Recordatorio
Anotaciones
Librería: es un archivo, que contiene código, usualmente en módulos de programa. Que pueden ser reutilizados por diferentes proyectos de programa. Programa fuente: algoritmo codificado en un lenguaje de programación, que administra otros módulos de programa, y es necesario para la ejecución del programa. Objetivos
Inicio
String.h: librería del compilador, en este caso el C/C++, que permite usar el tipo de dato del mismo nombre: string.
Actividades
Autoevaluación
Glosario
Bibliografía
BIBLIOGRAFÍA DE LA UNIDAD I:
Carrasco Loli Angela. Principios de Programación. Junio 2005
Anotaciones
Joyanes Aguilar, Luis. Fundamentos de Programación. 4ta. ed. España: McGraw-Hill; 2008. Raffo Lecca, Eduardo. Turbo C++. 1 ed. Lima: Mundigraph; 2000.
Bibliografía
49
50
Desarrollo de contenidos
Diagrama
Desarrollo de contenidos
Diagrama Lecturas seleccionadas
Objetivos
Inicio
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS Actividades
Autoevaluación
DIAGRAMA DE PRESENTACIÓN DE LA UNIDAD Objetivos Glosario
Inicio Bibliografía
CONTENIDO
Desarrollo de contenidos Recordatorio
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Actividades
EJEMPLOS
Autoevaluación
Anotaciones
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
BIBLIOGRAFÍA
AUTOEVALUACIÓN
Bibliografía
CONOCIMIENTOS Tema N° 1: Estructuras de Datos 1. Definición de Estructura de Datos 2. Clasificación de Estructura de Datos Tema N° 2: Arreglos Unidimensionales 1. Definición de Arreglos Unidimensionales. 2. Algoritmos de Actualización. 3. Búsqueda de Arreglos Unidimensionales 4. Ordenación de Arreglos Unidimensionales Tema N° 3: Arreglos Bidimensionales 1. Definición Arreglos Bidimensionales. 2. Algoritmos de Actualización de Arreglos Bidimensionales Lectura seleccionada N° 1: Arrays Multidimensionales – Jesús Carretero Pérez. García Carballena, Felix. Pérez Lobato José Autoevaluación de la Unidad II
ACTIVIDADES
PROCEDIMIENTOS
ACTITUDES
1. Aplica los algoritmos de 1. Asume con responsabilidad sus actividades académicas actualización de arreglos asignadas. unidimensionales: añadir, insertar, eliminar; en la 2. Realiza con honestidad las construcción de programas. evaluaciones asignadas. 2. Aplica los algoritmos de búsqueda y ordenación de arreglos unidimensionales en la construcción de programas. 3. Aplica los algoritmos de actualización de arreglos bidimensionales en la construcción de programas. 4. Usa los algoritmos de matriz transpuesta, diagonales, rodean a un número; con arreglos bidimensionales. Actividad N° 1: Elaboración de Programas usando arreglos unidimensionales, para casos propuestos.
Actividad N° 2: Elaboración de Programas usando arreglos bidimensionales, para casos propuestos.
Tarea Académica Nº 1: Construcción de Programas y prueba de escritorio, usando Arreglos.
Bibliografía
51
52
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS
TEMA N° 1: ESTRUCTURAS DE DATOS 1 DEFINICIÓN DE ESTRUCTURA DE DATOS Considere como ejemplo un librero, un espacio donde almacena libros en cada compartimiento (un solo tipo de dato: libro), o como a su oficina de trabajo, como un espacio donde se almacenan elementos tales como expedientes, computadoras, gabinetes, personas, entre otros; es decir permite almacenar diferentes elementos (diferentes tipos de datos). Entonces la estructura de datos, es aquel espacio que permite almacenar valores, ya sean del mismo o de diferentes tipos de datos. 2 CLASIFICACIÓN DE ESTRUCTURA DE DATOS
Estructuras de Datos Estándar Estructura de Datos Simples
-
Enteros Reales Caracter
-
Arreglos Registros Archivos
-
Cadenas
-
Lineales
-
Listas Pilas Colas
-
No Lineales
-
Arboles Grafos
Estructuras de Datos No Estándar (Definidos por el programador)
Estructuras de Datos Estáticos Estructuras de Datos Compuestos Estructuras de Datos Dinámicos
A. Estructuras de Datos Simples: permiten almacenar un solo valor en un espacio de memoria (variable) a. Estructuras de Datos Estándar: es el almacenamiento que todos los lenguajes de programación utilizan, dado el tipo de dato que se defina. Por ejemplo, se tiene una estructura estándar de tipo real para una variable denominada precio: Declaración en C/C++:
float precio;
Representación Gráfica en Memoria, asignándole el valor de precio de 12.6: 12.6 float precio b. Estructuras de Datos No Estándar: es la estructura que no pertenece a un lenguaje de programación específico, y puede ser creado por el programador. En C/C++ se definen con la palabra reservada typedef. B. Estructuras de Datos Compuestas: permiten almacenar un conjunto de valores (celdas o nodos) en un espacio de memoria. Pueden ser de dos tipos: a. Estructuras de Datos Estáticos: necesitan definir su tamaño inicial, antes de la ejecución del programa. Como ejemplo de este tipo de estructuras tenemos a los arreglos unidimensionales, arreglos bidimensionales y estructuras (registros). Declaración de Arreglo Unidimensional en C/C++:
char Mensaje[11];
Desarrollo UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS de contenidos
Representación Gráfica en Memoria, asignándole un valor en cada celda: char Mensaje
b
i
e
n
v
e
n
i
d
o
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
` \0 ´
Declaración de Registro en C/C++: struct Paciente{ int codPaciente; string apePaciente; string nombPaciente; char generoPaciente; }; Representación Gráfica en Memoria, asignándole un valor en cada celda:
b. Estructuras de Datos Dinámicos: no necesita definir tamaño inicial, ya que los espacios se van creando conforme se van ingresando los valores. Se tiene dos tipos: lineal, por que nodos se crean uno tras otro (Ejemplo: lista, colas y pilas), y no lineal, por que los nodos no necesariamente se encuentran uno tras otro (árbol y grafo).
TEMA N° 2: ARREGLOS UNIDIMENSIONALES 1 DEFINICIÓN DE ARREGLOS UNIDIMENSIONALES. También llamado vectores, es un conjunto finito y ordenado de elementos de un mismo tipo de dato (homogéneos). La definición de un arreglo es como sigue: Ejemplo:
TipoDato
Entero
NombreArreglo[tamaño]
M[10]
Acceso a los elementos de un arreglo unidimensional: Nombre del arreglo [posición del elemento]; Ejemplo: Gráfico de Arreglo Unidimensional
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Bibliografía
53
54
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS
edad[0] edad[1] edad[2] edad[3] edad[4] Anotaciones
edad
23
45
34
19
62
0
1
2
3
4
Descripción: - Nombre del arreglo: edad. - Tamaño Máximo del arreglo (cantidad de celdas): 5 - Posición de cada celda: 0, 1, 2, 3, 4 (recorridos con la variable index: i , desde la posición 0 hasta la posición del tamaño máximo -1) - Elementos o valores dentro del arreglo, dada por cada celda: 23 en edad[0], 45 en edad[1], 34 en edad[2], 19 en edad[3] y 62 en edad[4], es decir para leer, mostrar u operar un valor del arreglo, escribe el nombre del arreglo y dentro de corchetes la posición de la celda del arreglo. El siguiente programa lee un arreglo de números enteros y encuentra el mayor y menor elemento. El máx de elementos es 100 pero solo ingresa n elementos. //Programa para hallar el mayor y menor elemento de un arreglo #include<iostream> #include “LecturaDatos.h” #define MAXIMO 100 using namespace std; void leerarre(int N, int array[]) { int i; for(i=0;i<=N-1;i++) { cout<<"Ingrese altura alumno A"<<"["<<i<<"]"<<":\t"; cin>>array[i]; cout<<"\n"; } } void comparar(int N, int array[]) { int i, mayor, menor; mayor=array[0]; menor=array[0]; for(i=0;i<=N-1;i++) { if (array[i]>mayor) mayor=array[i]; else if (array[i]<menor) menor=array[i]; } cout<<"El mayor es :"<<mayor<<"\n"; cout<<"El menor es :"<<menor<<"\n"; } void main() { int A[MAXIMO]; int n; do{ cout<<"Ingrese cantidad de elementos (>= a CERO y <= que 100): "; n=leedatoe(); }while(n<=0 || n>MAXIMO); leerarre(n,A); comparar(n,A); system("PAUSE"); }
2 ALGORITMOS DE ACTUALIZACIÓN. Los Arreglos necesitan actualizarse mientras se efectúa algún proceso con ellos. La actualización de arreglos consiste en tres operaciones: Añadir elementos al final
Desarrollo UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS de contenidos
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
del arreglo (siempre y cuando exista espacio en el arreglo), Insertar elementos en cualquier posición del arreglo y Eliminar elementos. Añadir: Añadir un valor en la última posición. #include<iostream> #include”LecturaDatos.h” #define MAX 100 using namespace std; void ingresadatos(int V[MAX], int n) {
int i; cout<<"Ingrese elementos para el arreglo "; cout<<"\n"; for(i=0;i<=n-1;i++)
{
cout<<"Elemento ["<<i<<"]"<<":";
cin>>V[i]; }
} void mostrar(int V[MAX], int n) {
int i;
cout<<"Los elementos del arreglo son"; cout<<"\n";
for(i=0;i<=n-1;i++)
{ cout<<"Elemento"<<"["<<i<<"]"<<":\t"; cout<<V[i]; cout<<"\n"; }
} int ultimoelemento(int a[MAX], int n) { int i,p = n; if (p<MAX)
{
for(i=p;i<=n;i++) //ingresa nuevo elemento { cout<<"\n Ingrese nuevo elemento de arreglo "<<":\t";
cin>>a[i]; }
n=n+1;
return n;
}
} void main() {
int A[MAX]; int num,elem; do{ cout<<"Ingrese numero de elementos para el arreglo: ";
num= leedatoee();
}while(num<=0 || num>MAX); ingresadatos(A,num); cout<<"\n"; mostrar(A,num); cout<<"\n"; elem=ultimoelemento(A, num); mostrar(A,elem); system("PAUSE"); } Insertar: Insertar un valor en cualquier posición, desplazando los elementos desde la ultima celda hasta la posición que desea insertar. #include<iostream> #include”LecturaDatos.h” #define MAX 100 using namespace std; void ingresadatos(int V[MAX], int n) {
int i;
Bibliografía
55
56
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS
cout<<"Ingrese elementos para el arreglo "; cout<<"\n";
for(i=0;i<=n-1;i++)
{
cout<<"Elemento ["<<i<<"]"<<":";
Anotaciones
cin>>V[i]; } } void mostrar(int V[MAX], int n) {
int i;
cout<<"Los elementos del arreglo son"; cout<<"\n";
for(i=0;i<=n-1;i++) { cout<<"Elemento"<<"["<<i<<"]"<<":\t";
cout<<V[i]; cout<<"\n"; }
} int posicion(int a[MAX], int n) { int i,p; cout<<"\n Ingrese posicion a insertar un elemento"<<":\t";
p=leedatoe();
i=n-1; while (i>=p) {
a[i+1]=a[i]; i=i-1;
} return p; } int nuevoelemento(int a[MAX],int p, int n) {
int elem;
cout<<"\n Ingrese nuevo elemento de arreglo a"<<":\t";
elem=leedatoe();
a[p]=elem;
n=n+1;
return n;
} void main() {
int A[MAX]; int num,pos,elem; do{
cout<<"Ingrese numero de elementos para el arreglo: "; num= leedatoee();
}while(num<=0 || num>MAX); ingresadatos(A,num); cout<<"\n"; mostrar(A,num); cout<<"\n"; pos=posicion(A,num); elem=nuevoelemento(A,pos, num); mostrar(A,elem); system("PAUSE"); } Eliminar: Eliminar un valor en cualquier posición, desplazando los elementos desde la derecha del valor que se quiere eliminar. #include<iostream> #include”LecturaDatos.h” #define MAX 100 using namespace std; void ingresadatos(int V[MAX], int n) {
int i;
Desarrollo UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS de contenidos
cout<<"Ingrese elementos para el arreglo "; cout<<"\n";
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
for(i=0;i<n;i++)
{ cout<<"Elemento ["<<i<<"]"<<":";
cin>>V[i]; }
} void mostrar(int V[MAX], int n) {
int i;
cout<<"Los elementos del arreglo son"; cout<<"\n";
for(i=0;i<n;i++)
{ cout<<"Elemento"<<"["<<i<<"]"<<":\t";
cout<<V[i]; cout<<"\n"; }
} int elimina(int a[MAX], int n) {int i,p; cout<<"\n Ingrese posicion a eliminar elemento de arreglo "<<":\t"; p=leedatoe(); i=p; while (i<n) {
a[i]=a[i+1];
i++; } return n-1;
} void main() {
int A[MAX]; int num,el; do{
cout<<"Ingrese numero de elementos para el arreglo: "; num= leedatoee();
}while(num<=0 || num>MAX); ingresadatos(A,num); cout<<"\n"; mostrar(A,num); cout<<"\n"; el=elimina(A,num); mostrar(A,el); system("PAUSE"); } 3 BÚSQUEDA DE ARREGLOS UNIDIMENSIONALES La búsqueda es la recuperación de la información de los elementos de un arreglo. Para ello se necesita recorrer el arreglo y hacer uso de uno de los métodos de búsqueda de un elemento, revisaremos dos tipos: Búsqueda Secuencial y Búsqueda Binaria. A. Secuencial: recorre el arreglo celda por celda, verificando si es el elemento que se busca, usando una bandera llamada Encontrado, el cual se asume como falsa, y solo cambia a verdadera si encuentra el valor buscado, si terminado el recorrido en el arreglo, no lo encuentra, la bandera se queda en el estado de falsa. Es útil para arreglos con pocos elementos. #include<iostream> #include”LecturaDatos.h” #define MAX 100 using namespace std; void ingresadatos(int V[MAX], int n) {
int i;
Bibliografía
57
58
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS
cout<<"Ingrese elementos para el arreglo "; cout<<"\n";
for(i=0;i<n;i++)
Anotaciones
{ cout<<"Elemento ["<<i<<"]"<<":";
cin>>V[i]; }
} void mostrar(int V[MAX], int n) {
int i;
cout<<"Los elementos del arreglo son"; cout<<"\n";
for(i=0;i<n;i++)
{ cout<<"Elemento"<<"["<<i<<"]"<<":\t";
cout<<V[i]; cout<<"\n"; }
} void bsecuencial(int a[MAX], int n) { int elem,i; bool Encontrado = false; cout<<"\n Ingrese elemento a buscar en el arreglo "<<":\t"; cin>>elem; for(i=0;i<n;i++)
{ if(a[i]==elem)
{ Encontrado=true;
cout<<"\n Encontrado\t Posicion :\t"<<i<<"\t\n";
} }
if(Encontrado==false)
{
cout<<"\n No Encontrado\t "; cout<<"\n\n"; }
} void main() {int A[MAX]; int num; do{ cout<<"Ingrese numero de elementos para el arreglo: ";
num= leedatoee();
}while(num<=0 || num>MAX); ingresadatos(A,num); cout<<"\n"; mostrar(A,num); cout<<"\n"; bsecuencial(A,num); system("PAUSE"); } B. Búsqueda Binaria: Necesita que el arreglo se encuentre ordenado ascendentemente para poder aplicar este algoritmo, que consiste en dividir el arreglo en dos partes y si la celda central es el elemento que se busca, termina el algoritmo, sino se verifica si el elemento buscado se encuentra a la derecha (mayor) o la izquierda (menor) del valor de la celda central, para solo buscar en esa porción del arreglo, volvendo a dividira esa parte en dos, y buscar un nuevo valor central, repitiendo los pasos anteriores. #include<iostream> #include”LecturaDatos.h” #define MAX 100 using namespace std; void ingresadatos(int V[MAX], int n) {
int i;
cout<<"Ingrese elementos para el arreglo ";cout<<"\n";
for(i=1;i<=n;i++)
}
{ cout<<"Elemento ["<<i<<"]"<<":";cin>>V[i]; }
Desarrollo UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS de contenidos
void mostrar(int V[MAX], int n) {
int i;
cout<<"Los elementos del arreglo son"; cout<<"\n";
for(i=1;i<=n;i++)
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
{ cout<<"Elemento"<<"["<<i<<"]"<<":\t";cout<<V[i]; }
} void bbinaria(int a[MAX], int n) {
int elem; int BAJO, ALTO, CENTRAL;
BAJO=1; ALTO=n;
cout<<"\n Ingrese elemento a buscar"<<":\t"; cin>>elem;
CENTRAL=((BAJO+ALTO)/2);
while ((BAJO<=ALTO) && (a[CENTRAL]!=elem))
{
if(elem<a[CENTRAL])
{ALTO=CENTRAL-1; CENTRAL=(BAJO+ALTO)/2; }
else{
BAJO=CENTRAL+1;
CENTRAL=(BAJO+ALTO)/2; }
}
if(elem==a[CENTRAL]) { cout<<"\n ENCONTRADO \n"; cout<<"\n a["<<CENTRAL<<"] = "<<a[CENTRAL]; cout<<"\n"; }
else cout<<"\n NO ENCONTRADO \n ";
} void main() {int A[MAX]; int num; do{ cout<<"Ingrese numero de elementos para el arreglo: ";
num= leedatoee();
}while(num<=0 || num>MAX); ingresadatos(A,num); cout<<"\n"; mostrar(A,num); cout<<"\n"; bbinaria(A,num); system("PAUSE"); } 4 ORDENACIÓN DE ARREGLOS UNIDIMENSIONALES Permite comparar elementos e intercambiar posiciones, ya sea en forma ascendente o descendente. //Ordenación por Burbuja #include<iostream> #include”LecturaDatos.h” #define MAX 100 using namespace std; void ingresadatos(int V[MAX], int n) {
int i;
cout<<"Ingrese elementos para el arreglo "; cout<<"\n";
for(i=0;i<n;i++)
{ cout<<"Elemento ["<<i<<"]"<<":";
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Bibliografía
59
60
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS
cin>>V[i];
}
} void mostrar(int V[MAX], int n) Anotaciones
{
int i;
cout<<"Los elementos del arreglo son"; cout<<"\n";
for(i=0;i<n;i++)
{ cout<<"Elemento"<<"["<<i<<"]"<<":\t";
cout<<V[i]; cout<<"\n"; }
} void burbuja(int a[MAX], int n) {
int i,j,temp;
for(i=0;i<n-1;i++)
for(j=n-1;j>=i+1;j--)
if (a[j]<a[j-1])
{
a[j]=a[j-1];
temp=a[j]; a[j-1]=temp;
}
} void main() {int A[MAX]; int num; do{ cout<<"Ingrese numero de elementos para el arreglo: ";
num= leedatoee();
}while(num<=0 || num>MAX); ingresadatos(A,num); cout<<"\n\n"; burbuja(A,num); mostrar(A,num); system("PAUSE"); } Diagrama
Objetivos
Desarrollo de contenidos
Actividades
Inicio
ACTIVIDAD N° 1: Autoevaluación
Esta actividad puede consultarla en su aula virtual.
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
Desarrollo UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS de contenidos
TEMA N° 3: ARREGLOS BIDIMENSIONALES 1 DEFINICIÓN DE ARREGLOS BIDIMENSIONALES.
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
También llamado matrices, es un conjunto finito y ordenado de elementos de un mismo tipo de dato. La definición de un arreglo es como sigue: TipoDato Ejemplo:
Entero
NombreMatriz[n°filas][nºcolumnas]
M[4][5] columnas 0
1
2
3
filas
//Lectura y Presentación de Datos en una Matriz: #include<iostream> #include”LecturaDatos.h” #define MAX 100 using namespace std; void ingresadatos(int M[MAX][MAX], int nf,int nc) { int i,j; cout<<"Ingrese elementos para la matriz "; cout<<"\n"; for(i=0;i<=nf-1;i++) for(j=0;j<=nc-1;j++) { cout<<"Elemento ["<<i<<"]"<<"["<<j<<"]"<<":"; cin>>M[i][j];
}
} void mostrar(int M[MAX][MAX], int nf, int nc) { int i,j; cout<<"Los elementos de la matriz son"; cout<<"\n"; for(i=0;i<=nf-1;i++) {for(j=0;j<=nc-1;j++) { cout<<M[i][j]; cout<<"\t"; } cout<<"\n"; } } void main() {
int B[MAX][MAX]; int nf,nc; do{ cout<<"Ingrese numero de filas: ";
nf= leedatoee(); }while(nf<=0 || nf>MAX); do{ cout<<"Ingrese numero de columnas: ";
nc= leedatoee(); }while(nc<=0 || nc>MAX); ingresadatos(B,nf,nc); cout<<"\n"; mostrar(B,nf,nc); cout<<"\n";
}
4
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Bibliografía
61
62
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS
//Diagonal Principal y Diagonales de una matriz ….. //Se entiende que se realizan los procedimientos de lectura de datos void diagonal_principal(int M[MAX][MAX], int nf, int nc) Anotaciones
{ int i,j; if(nf==nc) { for(i=0;i<=nf-1;i++) { for(j=0;j<=nc-1;j++) if(i==j) { cout<<"\n"; cout<<M[i][j]<<"\n"; } else cout<<" "; cout<<"\n"; } } else {cout<<"Columnas y filas deben ser iguales"; cout<<"\n\n"; } } void diagonalsecundaria(int M[MAX][MAX], int nf, int nc) { int i,j,k; k=nc-1; if(nf==nc) {
for(i=0;i<nf;i++) { for(j=0;j<nc;j++) if(j == k) { cout<<M[i][j]; } else cout<<"\t"; k--; cout<<"\n"; }
} else { cout<<"Para la Diagonales: columnas y filas deben ser iguales"; cout<<"\n\n"; } } void diagonales(int M[MAX][MAX], int nf, int nc) { int i,j,k; k=nc-1; if(nf==nc) { for(i=0;i<=nf-1;i++) { for(j=0;j<=nc-1;j++) if(i==j || j==k) { cout<<"\n"; cout<<M[i][j]<<"\n"; } else {cout<<" ";} k- -; cout<<"\n"; } }
Desarrollo UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS de contenidos
else
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
{ cout<<"Columnas y filas deben ser iguales"; cout<<"\n\n"; } } void main() { int B[MAX][MAX]; int nf,nc; do{
cout<<"Ingrese numero de filas: ";
nf= leedatoee(); }while(nf<=0 || nf>MAX);
do{
cout<<"Ingrese numero de columnas: "; nc= leedatoee();
}while(nc<=0 || nc>MAX); ingresadatos(B,nf,nc); cout<<"\n"; mostrar(B,nf,nc); cout<<"\n"; cout<<"Los elementos de la diagonal Principal: "<<"\n"; diagonal_principal(B,nf,nc); cout<<"\n"; cout<<"Los elementos de las diagonales : "<<"\n"; diagonales(B,nf,nc); cout<<"\n"; system("PAUSE"); } 2 ALGORITMOS DE ACTUALIZACIÓN DE ARREGLOS BIDIMENSIONALES //Insertar fila y columna de una matriz … //Se entiende que se realizan los procedimientos de lectura de datos int insertar_fila(int M[MAX][MAX], int nf, int nc) { int i,j,pos;
do{ cout<<"Ingrese posicion para insertar fila: "; cin>>pos; }while(pos<0 || pos>nf); for(i=nf-1;i>=pos;i--) for(j=0;j<=nc-1;j++) M[i+1][j]=M[i][j]; for(j=0;j<=nc-1;j++) {
cout<<"M["<<pos<<"]"<<"["<<j<<"] : "; cin>>M[pos][j];
} nf++; return nf; } int insertar_columna(int M[MAX][MAX], int nf, int nc) {int i,j,pos; do{ cout<<"Ingrese posicion para insertar columna: "; cin>>pos; }while(pos<0 || pos>nc); for(i=0;i<=nf-1;i++) for(j=nc-1;j>=pos;j--) M[i][j+1]=M[i][j]; for(i=0;i<=nf-1;i++) {
cout<<"M["<<i<<"]"<<"["<<pos<<"] : "; cin>>M[i][pos];
} nc++; return nc; }
Bibliografía
63
64
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS
void main() { int B[MAX][MAX]; int nf,nc,fil,col; Anotaciones
do{ cout<<"Ingrese numero de filas: ";
nf= leedatoee(); }while(nf<=0 || nf>MAX); do{
cout<<"Ingrese numero de columnas: "; nc= leedatoee();
}while(nc<=0 || nc>MAX); ingresadatos(B,nf,nc); cout<<"\n"; mostrar(B,nf,nc); cout<<"\n"; cout<<"Inserta fila: "<<"\n"; fil=insertar_fila(B,nf,nc); cout<<"\n"; cout<<"Matriz Inicial con fila insertada"; mostrar(B,fil,nc); cout<<"\n"; cout<<"Inserta columna: "<<"\n"; col=insertar_columna(B,nf,nc); cout<<"\n"; cout<<"Matriz Inicial con columna insertada"; mostrar(B,nf,col); cout<<"\n"; system("PAUSE"); } //Borrar fila y columna de una matriz … //Se entiende que se realizan los procedimientos de lectura de datos int borrar_fila(int M[MAX][MAX], int nf, int nc) { int i,j,pos; do{ cout<<"Ingrese posicion para borrar fila: "; cin>>pos; }while(pos<0 || pos>=nf); for(i=pos;i<=nf-1;i++) for(j=0;j<=nc-1;j++) M[i][j]=M[i+1][j]; nf--; return nf; } int borrar_columna(int M[MAX][MAX], int nf, int nc) { int i,j,pos; do{ cout<<"Ingrese posicion para insertar columna: "; cin>>pos; }while(pos<0 || pos>=nc); for(i=0;i<=nf-1;i++) for(j=pos;j<=nc-1;j++) M[i][j]=M[i][j+1]; nc- -; return nc; } void main() { int B[MAX][MAX] nf,nc,fil,col; do{ cout<<"Ingrese numero de filas: ";
nf= leedatoee(); }while(nf<=0 || nf>MAX); do{ cout<<"Ingrese numero de columnas: ";
Desarrollo UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS de contenidos
nc= leedatoee();
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
}while(nc<=0 || nc>MAX); ingresadatos(B,nf,nc); cout<<"\n"; mostrar(B,nf,nc); cout<<"\n"; cout<<"Elimina fila: "<<"\n"; fil=borrar_fila(B,nf,nc); cout<<"\n"; cout<<"Matriz Inicial con fila eliminada"; mostrar(B,fil,nc); cout<<"\n"; cout<<"Elimina columna: "<<"\n"; col=borrar_columna(B,nf,nc); cout<<"\n"; cout<<"Matriz Inicial con columna eliminada"; mostrar(B,nf,col); cout<<"\n"; system("PAUSE"); } Diagrama
Objetivos
Desarrollo de contenidos
Actividades
Inicio
ACTIVIDAD N° 2: Autoevaluación
Esta actividad puede consultarla en su aula virtual. Lecturas seleccionadas
Recordatorio
Glosario
Bibliografía
Diagrama
Objetivos
Inicio
Actividades
Autoevaluación
Anotaciones Desarrollo de contenidos
LECTURA SELECCIONADA N° 1 Lecturas seleccionadas
Glosario
Bibliografía
ARRAYS MULTIDIMENSIONALES Recordatorio
Jesús Carretero Pérez. García Carballena, Felix. Pérez Lobato José, 2007, Fundamentos de Programación. Pág. 196 Anotaciones
Hasta ahora se ha trabajado con vectores de una única dimensión, llamados arrays unidimensionales. Pero el lenguaje de programación C también permite definir arrays de varias dimensiones. Suponga que se desea almacenar las temperaturas de un punto geográfico durante un año, minuto a minuto. Para este problema, se podría usar la siguiente definición: float temperaturas [366][24][60]; En ella encontramos: •
Float es el tipo de dato de cada elemento.
•
Temperaturas es el nombre de la variable utilizada para el array multidimensional;
•
[366][24][60] indica el número de elementos del array en cada dimensión. La primera dimensión tiene un total de 366 elementos, la segunda 24 y la tercera 60. La primera dimensión está junto al nombre de la variable.
Aunque el ejemplo presenta tres dimensiones, podrían definirse muchas más. Lo habitual es usar dos y tres dimensiones. Si un array unidimensional se conoce como vector, un array bidimensional se denomina matriz.
Bibliografía
65
66
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS
Inicialización y acceso a un array multidimensional Considere ahora la siguiente definición de una matriz de 4 filas y 2 columnas:
int matriz[4][2];
Anotaciones
Si se conocen los valores de la matriz, se puede inicializar de forma similar a un array: int matriz[4][2]= {
{11,12}, {21,22}, {31,32}, {41,42},
}; Para acceder al segundo elemento de la tercera fila se utiliza la siguiente expresión: matriz[2][1] Como se muestra en la figura 8.5, el índice de una dimensión toma valores de la misma manera que lo hace un vector: desde cero hasta el número de elementos menos uno. [0][0]
[0][1]
[1][0]
[1][1]
[2][0]
[2][1]
[3][0]
[3][1]
Distribución de los índices de una matriz. Un array multidimensional también es descrito como un array de arrays de ... Más concretamente, la variable matriz es un array de cuatro elementos. matriz[0] ,…, matriz[3] cuyos elementos son a su vez arrays de dos elementos cada uno matriz[i][0] ,…, matriz[i][1] para i de 0 a 3. En un array multidimensional de n dimensiones, los elementos de la última dimensión, que forman un vector, se almacenan siempre en memoria consecutivamente. En el caso de una matriz (n=2), esto significa que los valores se almacenan por filas, a diferencia de otros lenguajes de programación como FORTRAN donde se almacenan por columnas. En la siguiente figura se muestra de forma gráfica como todos los elementos de una misma fila se almacenan consecutivamente.
int matriz[4][2]; [0][0]
[0][1]
[1][0]
[1][1]
[2][0]
[2][1]
[3][0]
[3][1]
[0][0] [0][1] [1][0] [1][1] [2][0] [2][1] [3][0] [3][1]
Disposición de matriz en memoria.
s
s
o
Desarrollo UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS de contenidos
Objetivos
Inicio
Actividades
Autoevaluación
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
AUTOEVALUACIÓN DE LA UNIDAD N° II INSTRUCCIONES: Lee detenidamente y responde las siguientes preguntas: Glosario
Bibliografía 1. Indique la alternativa que describa la característica de una estructura de datos estática:
a) Necesita definir los valores antes de ejecutar el programa. Anotaciones
b) No necesita definir un tamaño antes de ejecutar el programa. c) Necesita mostrar los valores antes de ejecutar el programa. d) Necesita definir un tamaño antes de ejecutar el programa. e) Necesita definir un tamaño después de ejecutar el programa. 2. Los tipos de datos: entero, real, cadena; pertenecen a la siguiente clase de estructuras de datos: a) Estructuras de Datos Simple No Estándar. b) Estructuras de Datos Compuesta Estática. c) Estructuras de Datos Simple Estándar. d) Estructuras de Datos Dinámica Lineal. e) Estructuras de Datos Dinámica No Lineal. 3. Indique la alternativa que contenga tres características de un arreglo: a) Homogéneo, Infinito, Secuencial. b) Homogéneo, Finito, Secuencial. c) Heterogéneo, Finito, Secuencial. d) Heterogéneo, Infinito, Secuencial. e) Homogéneo, Finito, No Secuencial. 4. En un arreglo unidimensional, se añade un elemento al final considerando: a) Que se elimine el último elemento. b) Que no importa que exceda el tamaño definido. c) Que se elimine el primer elemento. d) Que no se exceda el tamaño definido. e) Que se exceda a la cantidad ingresada. 5. Para asignar directamente un valor de una posición 2 de un arreglo A, a otra posición 5 de un arreglo B, se escribe: a) B[5] = A[2]; b) B[2] = A[5]; c) A[5] = B[2]; d) A[2] = B[5]; e) B[5] = A[5]; 6. Para mostrar los elementos de la diagonal principal de una matriz, el algoritmo necesita evaluar: a) Que la posición de fila y columna no sean iguales. b) Que la posición de una variable auxiliar y la de columna sean iguales. c) Que la posición de una variable auxiliar y la de columna no sean iguales. d) Que la posición de una variable auxiliar y la de fila sean iguales. e) Que la posición de fila y columna sean iguales.
Bibliografía
67
68
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS
7. Para insertar una nueva fila en una matriz, el algoritmo inserta los valores: a) Por fila desde la posición 0 hasta número de fila-1. b) Por columna desde la posición 0 hasta número de columna-1. Anotaciones
c) Por fila desde la posición 0 hasta número de fila+1. d) Por columna desde la posición 0 hasta número de columna+1. e) Por columna desde la posición columna-1 hasta posición 0. 8. Indique lo que realiza la línea siete (línea 7.) del código para desplazar a la derecha, en una operación de inserción de elementos en un arreglo unidimensional:
1. int posicion(int a[MAX], int n) 2. { int i,p; 3. cout<<"\n Ingrese posicion a insertar un elemento:"; 4. cin>>p; 5. i=n-1; 6. while (i>=p) 7. { a[i+1]=a[i]; 8. i=i-1; 9. } 10. return p; 11. }
a) Asigna el valor de la posición i, incrementando la variable i. b) Asigna el valor de una posición más de i, en la posición i. c) Asigna el valor de una posición incrementada de i. d) Asigna el valor de una posición más de i, incrementando la variable i. e) Asigna el valor de la posición i, en una posición más. 9. Indique lo que realiza la línea nueve (línea 9.) del código para la operación de eliminación de elementos en una columna un arreglo bidimensional:
1. int borrar_columna(int M[MAX][MAX], int nf, int nc) 2. { int i,j,pos; 3. do{ 4. cout<<"Ingrese posicion para insertar columna: "; 5. cin>>pos; 6. }while(pos<0 || pos>=nc); 7. for( i=0;i<=nf-1;i++) 8. for( j=pos;j<=nc-1;j++) 9. M[ i ][ j ]=M[ i ][ j + 1 ]; 10. nc- -; 11. return nc; 12. }
a) Asigna el valor de la columna actual más uno, en una fila más uno. b) Asigna el valor de la columna actual más uno, en la columna actual. c) Asigna el valor de la columna actual, en una columna más uno. d) Asigna el valor de la fila actual, en una fila más uno. e) Asigna el valor de la fila actual más uno, en la fila actual. 10. Dado el siguiente bloque de código para búsqueda binaria en una arreglo unidimensional, indique la alternativa que es correcta:
os
s
o
Desarrollo UNIDAD II: ESTRUCTURAS DE DATOS ESTÁTICAS de contenidos
void bbinaria(int a[MAX], int n) { int elem; int BAJO, ALTO, CENTRAL; BAJO=0; ALTO=n-1; cout<<"\n Ingrese elemento a buscar"<<":\t"; cin>>elem; CENTRAL=((BAJO+ALTO)/2); while ((BAJO<=ALTO) && (a[CENTRAL]!=elem)) { if(elem<a[CENTRAL]) {ALTO=CENTRAL-1; CENTRAL=(BAJO+ALTO)/2; } else{ BAJO=CENTRAL+1; CENTRAL=(BAJO+ALTO)/2; } } if(elem==a[CENTRAL]) { cout<<"\n ENCONTRADO \n"; cout<<"\n a["<<CENTRAL<<"] = "<<a[CENTRAL]; } else cout<<"\n NO ENCONTRADO \n "; }
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
a) Para ejecutar el algoritmo de búsqueda binaria, no es necesario que el arreglo se encuentre ordenado, y solo se puede usar con valores numéricos. b) En el algoritmo, el valor de la variable CENTRAL es la que determina si se sigue buscando al valor requerido en un sector del arreglo, o si es que se detiene la búsqueda. c) Los valores de las variables BAJO y ALTO, pueden ser inicializadas con valores decimales, como posición dentro de un arreglo unidimensional. Diagrama
d) En la última sentencia selectiva compuesta del algoritmo, se asigna el valor de la Inicio variable “elem” como valor para la posición central del arreglo.
Objetivos
e) La posición CENTRAL es un valor decimal de (BAJO + ALTO) /2. Desarrollo de contenidos
Actividades
Lecturas seleccionadas
Glosario
Autoevaluación
GLOSARIO Bibliografía
Celda: es un espacio de memoria dentro de un arreglo, y si es bidimensional es referenciado por fila y columna que ocupe. Recordatorio Objetivos
Anotaciones Inicio
Dimensión: es el conjunto de elementos que puede tener un arreglo, y puede ser desde una dimensión hasta n dimensiones.
Actividades
Autoevaluación
Glosario
Bibliografía
BIBLIOGRAFÍA DE LA UNIDAD II:
Carretero Pérez, Jesús. García Carballena, Felix. Pérez Lobato José. Fundamentos de Programación. 1ra. ed. España: Thomson; 2007. Anotaciones
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Joyanes Aguilar, Luis. Fundamentos de Programación. 4ta. ed. España: McGraw-Hill; 2008.
Bibliografía
69
70
Desarrollo de contenidos
Diagrama
Desarrollo de contenidos
Diagrama Lecturas seleccionadas
Objetivos
Inicio
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL Actividades
Autoevaluación
DIAGRAMA DE PRESENTACIÓN DE LA UNIDAD Objetivos Glosario
Inicio Bibliografía
CONTENIDO
Desarrollo de contenidos Recordatorio
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Actividades
EJEMPLOS
Autoevaluación
Anotaciones
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
BIBLIOGRAFÍA
ACTIVIDADES
AUTOEVALUACIÓN
Bibliografía
CONOCIMIENTOS
PROCEDIMIENTOS
ACTITUDES
TEMA Nº 1: Registro (Estructura) y Unión
1. Aplica los algoritmos de creación de estructura y unión en la construcción de programas.
1. Asume con responsabilidad sus actividades académicas asignadas.
1. Definición de Registro (Estructura) 2. Módulos y Estructuras 3. Invocación de una Estructura en Otra 4. Definición de Unión: Ejemplo Práctico. TEMA Nº 2: Tipos de Datos Abstractos (TDA). 1. Definición de TDA 2. Clases y Programación Orientada a Objetos. TEMA Nº 3: Puntero a Dirección de Memoria. 1. Definición de Puntero a Dirección de Memoria
2. Conoce los fundamentos de la programación orientada a objetos. 3. Implementa Clases como tipo de dato abstracto. 4. Conoce la aplicación de los punteros a direcciones de memoria en la construcción de programas de estructuras de datos dinámicas. 5. Aplica los algoritmos creación y manipulación de datos con los diferentes tipos de listas enlazadas, colas y pilas en la construcción de programas. Actividad N° 1:
Lectura Seleccionada N° 1:
Elaboración de Programas usando registros y clases. Elaboración de informe sobre Aplicaciones de Punteros a Dirección de Memoria.
Introducción al enfoque OOP – Rosalía Laza Fidalgo. Baltasar García Pérez-Shofield
Actividad N° 2:
2. Creación y Eliminación de Variables Dinámicas
Tema Nº 4: Estructuras de Datos Dinámicas Lineal
Elaboración de Programas usando algoritmos para estructuras de lista simple, doble, circular.
1. Listas Enlazadas: Simple, Doble, Circular.
Control de Lectura Nº 2:
2. Colas y Pilas
Estructuras de Datos Dinámicas Lineal
Autoevaluación de la Unidad III
2. Realiza con honestidad las evaluaciones asignadas
Bibliografía
71
72
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
TEMA N° 1: REGISTRO (ESTRUCTURA) Y UNIÓN 1 DEFINICIÓN DE REGISTRO (ESTRUCTURA) Como Ud. ha podido notar, en los arreglos unidimensionales y bidimensionales, los valores que se pueden ingresar son del mismo tipo de dato, pero en realidad se necesitará almacenar mas datos de diferentes tipos de datos, por lo que recurriremos en esta unidad a otras estructuras que nos lo permitan, como el STRUCT o también llamado registro que es un tipo definido por el usuario en base a otros tipos de datos. Ejemplo: "JUAN"
19
1.73
`M´
nombre
edad
talla
sexo
(cadena)
(int)
(float)
(char)
Otra forma gráfica, según el tamaño del tipo de dato, ocupado en memoria: Registro: Persona
entero NumDNI
cadena Nombre
cadena Apellido
carácter Genero
Figura Nro 13: Ejemplo de un Registro: Persona. (Elaboración personal) Cada componente de la estructura se denomina campo. Declaración:
struct nomb_estructura{ char f[5]; char e[3]; int s; char a; };
Datos afines respecto a la estructura.
Podemos darle una variable:
struct { char f[5]; char e[3]; int s; char a; }nomb_variable;
Un ejemplo de programa usando a la estructura con nombre de variable, el cual ya no necesita crear una variable en el Módulo Principal:
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
#include<iostream> using namespace std; struct{ int dia; int mes; long int anual; }hoy; void main( ) { cout<<"Ingrese dia: \t"; cin>>hoy.dia; cout<<"Ingrese mes: \t"; cin>>hoy.mes; cout<<"Ingrese anno: \t"; cin>>hoy.anual; cout<<hoy.dia<<" / "<<hoy.mes<<" / "<<hoy.anual; cout<<"\n"; system("PAUSE"); }
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Un ejemplo de programa usándolo como nombre de estructura, donde se necesita de crear una o más variables en el Módulo Principal:
#include<iostream> using namespace std; struct direccion{ char nombre[30]; char calle[30]; int num; char ciudad[30]; }; void main( ) { direccion oficina, casa; cout<<"Datos Oficina";cout<<"\n"; cout<<"Ingrese su nombre: \t"; cin>>oficina.nombre; cout<<"Ingrese calle: \t"; cin>>oficina.calle; cout<<"Ingrese num calle: \t"; cin>>oficina.num; cout<<"Ingrese ciudad: \t"; cin>>oficina.ciudad; cout<<"\n"; cout<<oficina.nombre<<"-"<<oficina.calle<<"-"<<oficina. num<<"-"<<oficina.ciudad; cout<<"\n"; cout<<"\n"; cout<<"Datos Casa";cout<<"\n"; cout<<"Ingrese su nombre: \t"; cin>>casa.nombre; cout<<"Ingrese calle: \t"; cin>>casa.calle; cout<<"Ingrese num calle: \t"; cin>>casa.num; cout<<"Ingrese ciudad: \t"; cin>>casa.ciudad; cout<<"\n"; cout<<casa.nombre<<"---"<<casa.calle<<"---"<<casa.num<<"--"<<casa.ciudad; system("PAUSE"); }
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Bibliografía
73
74
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
Es decir, Ud. puede crear estructuras con typedef, de la siguiente manera:
struct domicilio{ char nombre[30]; char calle[30]; int num; char ciudad[20]; }; typedef struct domicilio; void main( ) { domicilio Oficina, casa; }
Se puede hacer todo lo anterior de esta forma (definiendo la estructura y creando el tipo a la vez): typedef struct{ char nombre[25]; char apellidos[50]; char dni[10]; int edad; }Persona; void main( ) { Persona individuo; }
b. Asignación de estructuras #include<iostream> #include<string> using namespace std; typedef struct{ char nombre[25]; char apellidos[50]; int edad; } Persona; void main( ) { Persona per1,per2; strcpy(per1.nombre,"Pepe"); strcpy(per1.apellidos,"Villegas Varas"); per1.edad=12; per2=per1; // Asignación de estructuras cout<<"\n ---- Reporte de Datos de Pepe ----\n"; cout<<per1.nombre;cout<<"\n"; cout<<per1.apellidos;cout<<"\n"; cout<<per1.edad;cout<<"\n"; cout<<"\n ---- Reporte de Datos de Jaime ----\n"; cout<<per2.nombre;cout<<"\n"; cout<<per2.apellidos;cout<<"\n"; cout<<per2.edad;cout<<"\n"; } 2 MÓDULOS Y ESTRUCTURAS Se pueden usar los módulos de programa para operar los datos de una estructura o registro. El ejemplo dado a continuación, usa el módulo subirEdad, que recibe todos los campos de la estructura Persona, en una variable denominada pers. #include<iostream> #include<string> using namespace std; typedef struct{ char nombre[25];
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
char apellidos[50];
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
int edad; } Persona; void subirEdad(Persona pers) {
pers.edad++; cout<<pers.edad;cout<<"\n";
} void main() {
Persona alumno; strcpy(alumno.nombre,"Pepe"); strcpy(alumno.apellidos,"Villegas Varas"); alumno.edad=12; cout<<"\n ---- Reporte de Datos de Pepe ----\n"; cout<< alumno.nombre;cout<<"\n"; cout<< alumno.apellidos;cout<<"\n"; cout<< alumno.edad;cout<<"\n"; cout<<"\n ---- Reporte de Nuevos Datos de Pepe ----\n"; cout<< alumno.nombre;cout<<"\n"; cout<< alumno.apellidos;cout<<"\n"; subirEdad(alumno); // Invoca al módulo procedimiento
} 3 INVOCACIÓN DE UNA ESTRUCTURA EN OTRA Una estructura puede ser usada dentro de otra estructura, como un tipo de dato de uno de sus campos. Ejemplo: una estructura para fecha con día, mes y año creada antes de la estructura persona, la cual se invocará con la variable inscrito y tiene nombres, apellidos, nacimiento (que es del tipo fecha), y sexo. #include<iostream> #include<string> #define N 50 using namespace std; struct fecha{ int dia; int mes; long int anual; }; struct persona{ char nombres[N]; char apellidos[N]; fecha fnacimiento; char sexo[10]; }; void main() {
persona inscrito; cout<<"\n\n-----Ingrese datos----- \n\n"; cout<<"Ingrese nombre
\t";
cin>>inscrito.nombres; cout<<"Ingrese apellidos \t"; cin>>inscrito.apellidos;
Bibliografía
75
76
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
cout<<"\n\n-----Fecha de Nacimiento----- \n\n"; cout<<"Ingrese dia \t"; cin>>inscrito.fnacimiento.dia; Anotaciones
cout<<"Ingrese mes \t"; cin>>inscrito.fnacimiento.mes; cout<<"Ingrese a¤o \t"; cin>>inscrito.fnacimiento.anual; cout<<"Ingrese sexo \t"; cin>>inscrito.sexo; cout<<"\n\n----Los Datos ingresados fueron----- \n\n"; cout<<inscrito.nombres<<"\n"; cout<<inscrito.apellidos<<"\n"; cout<<inscrito.fnacimiento.dia<<"\n"; cout<<inscrito.fnacimiento.mes<<"\n"; cout<<inscrito.fnacimiento.anual<<"\n"; cout<<inscrito.sexo<<"\n\n"; } 4 DEFINICIÓN DE UNIÓN: EJEMPLO PRÁCTICO. Son a primera vista, entidades muy similares a las estructuras, están formadas por un número cualquiera de miembros, al igual que aquellas, pero en éste caso no existen simultáneamente todos los miembros, y sólo uno de ellos tendrá un valor válido. A diferencia de la Estructura, esta es una localidad de memoria que se utiliza para compartir datos de diferentes tipos. Ejemplo:
struct tabla { char nombre[30]; char tipo; char cadena[5]; int entero;
Entonces:
Si tipo es ‘c ’, se utiliza cadena, pero si es ‘ e ’, se utiliza entero.
};
struct tabla{ char nombre[30]; char tipo; union { char cadena[5]; int entero; } dato; };
A continuación se muestra un ejemplo práctico, donde se crea la unión denominada dato, dentro de la estructura tabla, y dependiendo si se selecciona ingresar el tipo cadena, solo se usa el espacio de la variable char cadena[5] y ya no se necesita ingresar en la variable int entero, y viceversa. Mientras que en una estructura, se necesita ingresar datos a todas las variables definidas en ella. #include<iostream> using namespace std; struct tabla{
char nombre[30];
char tipo;
union {
char cadena[5];
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
int entero;
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
} dato;
}; void main() {
tabla tb;
cout<<"Ingrese nombre de tabla: ";
cin>>tb.nombre;
cout<<"Ingrese tipo: ";
cin>>tb.tipo;
if(tb.tipo == 'c')
{
cout<<"Ingrese cadena: ";
cin>>tb.dato.cadena;
cout<<"La cadena es: ";
cout<<tb.dato.cadena;
cout<<"El entero es: ";
cout<<tb.dato.entero;
} else
if(tb.tipo == 'e')
{
cout<<"Ingrese entero: ";
cin>>tb.dato.entero;
cout<<"El entero es: ";
cout<<tb.dato.entero;
cout<<"La cadena es: ";
cout<<tb.dato.cadena; } else
cout<<"ERROR.";
}
TEMA N° 2: TIPOS DE DATOS ABSTRACTOS (TDA) 1 DEFINICIÓN DE TDA Es un tipo de dato definido por el programador, que consta de datos y operaciones. Ejemplo: clases, listas, pilas, colas. TDA = Representación (datos) + Operaciones (funciones y procedimientos) class alumno {
alumno
private: string nombre; string carrera;
nombre
public: alumno(); ~alumno(); void ingresar(); void imprimir(); };
carrera
ingresar imprimir
Bibliografía
77
78
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
2 CLASES Y PROGRAMACIÓN ORIENTADA A OBJETOS.
Anotaciones
En esta asignatura, no se pretende explicar todo lo que respecta a la programación orientada a objetos, solo veremos los conceptos y técnicas necesarias que nos ayuden y faciliten la creación de algoritmos de estructuras dinámicas, mas adelante. Esta es una técnica o estilo de programación basada en elementos básicos llamados objetos y clases y contempla cinco fundamentos: Herencia, Jerarquía, Encapsulamiento, Polimorfismo y Mensajes. Objeto: entidad que se caracteriza por determinados atributos: datos miembro y funciones miembro. Clase: colección de objetos con atributos y funciones comunes.
OBJETOS
CLASE
Figura Nro 14: Ejemplo Objetos y Clase. (Elaboración personal) Se puede decir entonces, que el objeto es el valor (instancia) de una clase, y la clase es un conjunto de objetos que tienen los mismos datos y responsabilidades. En lenguaje C/C++, una clase se declara: class < nombre de la clase > { < private:/public: > tipodato atributo; tipodato atributo; tipodato atributo; < private:/public: > Funcion/procedimiento(); Funcion/procedimiento(); Funcion/procedimiento(); };
Los datos y funciones miembros pueden ser definidos como private o public. • private: sólo pueden ser accedidos desde funciones miembro. • public: pueden ser accedidos directamente, sin utilizar funciones miembro. Usualmente se debe declarar los datos miembro tipo private y las funciones miembro tipo public.
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Para acceder desde fuera del objeto a sus datos públicos y funciones miembro públicas escribe. nombre del objeto . dato miembro nombre del objeto . función miembro
Constructor: Un constructor es una función miembro que permite inicializar los datos miembros de un objeto. Tiene las siguientes características: - Su nombre es igual al de la clase. - No devuelve valores. - Puede haber más de un constructor. - Se invoca al momento de declarar al objeto. Destructor: Un destructor es una función que permite liberar el área de memoria ocupada por un objeto cuando este ya no va ser usado .Sus características son: - Su nombre es igual al de la clase pero precedido por el símbolo “ ~ ”. - No devuelve valores. - Sólo puede haber un destructor. - Se invoca al momento de salir o abandonar el ámbito donde fue creado el objeto. A continuación, se muestra un ejemplo de programa, donde se crea la clase alumno, con sus datos nombre, carrera y sus responsabilidades ingresar e imprimir; además de su respectivo constructor y destructor de clase.
#include <iostream> #include <string> using namespace std; class alumno { private: string nombre; string carrera; public: alumno(); //constructor de clase ~alumno(); //destructor de clase void ingresar(); void imprimir(); }; alumno::alumno() { nombre=" "; carrera=" "; } alumno::~alumno() { } void alumno::ingresar() { cout<<"Ingrese nombre: "; cin>>nombre; cout<<"Ingrese carrera: "; cin>>carrera; } void alumno::imprimir() { cout<<"Nombre Alumno: "; cout<<nombre<<"\n"; cout<<"Carrera: ";
Bibliografía
79
80
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
cout<<carrera<<"\n"; } Anotaciones
void main() { alumno al; cout<<"Ingrese Alumno";cout<<"\n"; al.ingresar();cout<<"\n"; cout<<"Mostrar Alumno"<<"\n"; al.imprimir();cout<<"\n\n"; cout<<"Eliminar Alumno"<<"\n"; al.~alumno();cout<<"\n"; cout<<"Mostrar Alumno"<<"\n"; al.imprimir();cout<<"\n"; system("PAUSE"); }
TEMA N° 3: PUNTERO A DIRECCIÓN DE MEMORIA. 1 DEFINICIÓN DE PUNTERO A DIRECCIÓN DE MEMORIA Un puntero es un tipo especial de variable, que almacena el valor de una dirección de memoria, Los punteros, también pertenecen a un tipo, se dice que un puntero 'apunta a' ese tipo al que pertenece. MEMORIA DEL COMPUTADOR 200 p
800
800 x 23
*p
p es una variable tipo puntero. x es una variable tipo entero (int), apuntada por p. Entonces: 23, es el valor entero de la variable x, y 800 es la dirección de memoria de la variable x, que es almacenada (apuntada) por la variable puntero p. a. Declaración de variables tipo puntero tipo de dato apuntado * variable tipo puntero; Ejemplos: int *p; // p es una variable tipo puntero que apunta a una variable tipo int. float *q; // q es una variable tipo puntero que apunta a una variable tipo float. char *r;
// r es una variable tipo puntero que apunta a una variable tipo char.
Para hacer referencia a la variable apuntada se usa la notación: *variable tipo puntero En el ejemplo anterior, *p hace referencia a la variable x, es decir:
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
int *p; // p: variable puntero que hace referencia (apunta) a la variable x
Lecturas seleccionadas
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Glosario
int x; // x es la variable entero, apuntado por p (*p es otro nombre para la variable x) Recordatorio
NOTA:
Variables estáticas: Son aquellas que se declaran expresamente en los programas y a las que el sistema operativo asigna una posición de memoria antes de la ejecución del mismo. Variables dinámicas: Son variables que se crean y se destruyen durante la ejecución del programa. No son declaradas explícitamente en los programas. Operador de Dirección (&): Devuelve la dirección de memoria de una variable. Su sintaxis es: & nombre de variable Operador de Indirección (*): Devuelve el valor almacenado en una variable apuntada por una variable puntero. Su sintaxis es: * variable puntero Ejemplo: #include <iostream> using namespace std; void main () { int x,y; // Variables de tipo entero int *p; // Puntero a una variable de tipo entero // Leemos la dirección de la variable x mediante & // y lo almacenamos en la variable puntero p p = &x; // p contiene la dirección en la que se encuentra x // Utilizando el operador *, podemos acceder a la información en x. // *p representa ahora el valor de la variable x *p = 10;
// Ahora x contiene el valor 10
cout<<x;cout<<"\n"; // Visualiza si x tiene el valor que recibió su puntero p cout<<*p;cout<<"\n"; // Visualiza el valor de x, apuntada por p y = 15; // Si ahora hacemos que el puntero p apunte a la variable y, utilizando el operador & p = &y; cout<<y<<"\n"; //Visualiza el valor de y // El valor que ahora toma *p será el valor de y, // ya que es la vaariable que ahora se apunta *p = 125; // Ahora y contiene el valor 125 x = *p;
// Ahora x contiene también 125
cout<<y<<"\n"; //visualiza el nuevo valor de y cout<<x<<"\n"; //visualiza el nuevo valor de x cout<<*p<<"\n"; //Visualiza el valor de y
Anotaciones
Bibliografía
81
82
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
cout<<&x<<"\n"; //visulaiza la direccion de memoriade x cout<<p<<"\n"; //visualiza la direccion de memoria de y } Anotaciones
2 CREACIÓN Y ELIMINACIÓN DE VARIABLES DINÁMICAS Creación de variables dinámicas Para crear variables dinámicas se usa el objeto new cuya sintaxis es la siguiente: variable de tipo puntero = new tipo de dato de la variable creada ;
Ejemplo: int *p; float *q; p = new int;
//crea una variable dinámica de tipo int, p apunta a ella.
q = new float;
// crea una variable dinámica de tipo float, q apunta a ella.
NOTA: - No se puede asignar un valor constante a una variable tipo puntero, ni ingresar un valor por teclado para ella. int *p; p = 800; // ERROR de asignación cin>>p;
// ERROR de ingreso
Un ejemplo de creación y asignación, correctas: int *p, *q;
p = new int;
q = new int;
*p = 8; *q = *p; - No se puede asignar una variable tipo puntero a otra que no sea de su mismo tipo. int *p, *q; float *r; p = new int; *p = 7; r = p;
// ERROR de asignación
Eliminación de variables dinámicas delete variable tipo puntero que apunta a la variable dinámica que será eliminada ;
Se libera el espacio ocupado por la variable dinámica para poder ser utilizado nuevamente. void main() {
int *p;
p = new int;
*p = 17;
cout<<p;
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
delete p;
cout<<p;
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
} Constante NULL Es una constante predefinida en C++ cuyo valor es cero (0) y sirve para inicializar una variable tipo puntero que no apunta a ninguna variable. variable tipo puntero = NULL; void main() {
int *p;
p = new int;
*p = 17;
cout<<p;
delete p;
cout<<p;
p = NULL;
cout<<p;
}
Diagrama
Objetivos
Desarrollo de contenidos
Actividades
Inicio
ACTIVIDAD N° 1: Autoevaluación
Esta actividad puede consultarla en su aula virtual. Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
Bibliografía
83
84
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
TEMA N° 4: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL 1 LISTAS ENLAZADAS: SIMPLE, DOBLE, CIRCULAR. Una lista enlazada es una estructura de datos dinámica formada por un conjunto de elementos llamados nodos. Cada nodo consta de dos partes: - Una que contiene el (los) dato(s). - Otra que contiene la dirección del siguiente nodo. Nodo
Ejemplo de Nodo con un dato: Dato
Direcc Sig Nodo
Los nodos son variables dinámicas que se crean y destruyen de acuerdo a los requerimientos del proceso. - Para acceder a la lista es necesario un puntero que contenga la dirección del primer nodo. - Si la lista está vacía dicho puntero tendrá el valor NULL. - El último elemento de la lista se reconoce porque su puntero al siguiente tiene valor NULL. Representación con Direcciones de Memoria de una Lista Enlazada (usamos direcciones de memoria en hexadecimal, ejemplo: AF01) Recodando que Lista (más adelante lo llamamos pL, es decir puntero a Lista) también es un nodo, pero que sirve para guardar la dirección de memoria del primer nodo de la lista.
Representación Gráfica de una Lista Enlazada, es decir Lista apunta (tiene la dirección de memoria del primer nodo) al primer nodo con valor 12, y éste apunta al siguiente nodo con valor 30 y así sucesivamente hasta que el último nodo con valor 54 apunta a NULL porque ya no hay nodos.
a. Lista Enlazada Simple Es un conjunto de elementos en los que cada elemento contiene la posición o dirección del siguiente campo de la Lista.
Donde cada elemento de la lista simplemente enlazada llamado nodo se define: struct nodo{
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
int n; //puede tener mas campos: string, float, estructura, etc.
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
nodo *sig; // puntero de dirección al siguiente nodo };
ListasSE.h #include <iostream> #include <string> #define MAX 100 using namespace std; struct nodo {
int dato;
nodo *sig;
}; typedef nodo *pnodo; class lista {
private:
pnodo pL;
public:
lista();
~lista();
void insertar_comienzo();
void insertar_final();
void insertar_despues();
void eliminar_inicio();
void eliminar_final();
void buscar();
pnodo buscar_ buscar_parainsertadespues (int x);
void imprimir();
}; lista::lista() { pL = NULL; } lista::~lista() {
pnodo p,q; if ( pL != NULL ) { p = pL; while ( p != NULL )
{
q = (*p).sig;
delete p;
p = q; }
pL=p; } } void lista::insertar_comienzo()
Bibliografía
85
86
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
{
pnodo nuevo; int valor;
cout<<"Ingrese dato:";
cin>>valor;
nuevo = new nodo;
(*nuevo).dato = valor;
(*nuevo).sig = pL;
pL = nuevo;
} void lista::insertar_final() {
pnodo nuevo,aux; int valor;
nuevo = new nodo;
cout<<"Ingrese dato:";
cin>>valor;
(*nuevo).dato = valor;
(*nuevo).sig = NULL;
if ( pL == NULL )
pL = nuevo; else
{ aux = pL;
while ( (*aux).sig != NULL )
aux = (*aux).sig;
(*aux).sig = nuevo; }
} void lista::insertar_despues() { pnodo nuevo,r,temp; int num;
nuevo=new nodo;
cout<<"Ingrese dato";
cin>>(*nuevo).dato;
cout<<"Ingrese dato despues del nodo con valor: ";
cin>>num;
r=lista::buscar_parainsertadespues (num);
if(r==NULL)
cout<<"Lista vacia o no se encontro";
else
{
temp=(*r).sig; if(temp!=NULL)
{
(*r).sig=nuevo;
(*nuevo).sig=temp; } else
{
(*nuevo).sig=NULL; (*r).sig=nuevo;
}
}
} void lista::buscar() {
pnodo pos; int valor, ban=0;
cout<<"Ingrese dato:";
cin>>valor;
if ( pL == NULL )
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
{ cout<<"LISTA VACIA";
else
{ pos = pL;
while ( pos != NULL)
{
if((*pos).dato != valor)
{
pos = (*pos).sig;
ban=1;
}
else
{
ban=0;
break;
}
}
if(ban==0)
{cout<<"ENCONTRADO";
else
{cout<<"NO ENCONTRADO"; }
}
}
} pnodo lista::buscar_parainsertadespues(int valor) {
pnodo pos; int ban=0;
if ( pL == NULL )
{
cout<<"LISTA VACIA"; pos=NULL; }
else
{
pos = pL; while ( pos != NULL)
{
if((*pos).dato != valor)
{
pos = (*pos).sig;
ban=1;
}
else
{
ban=0;
break;
}
}
if(ban==0)
{cout<<"ENCONTRADO";
}
else
{cout<<"NO ENCONTRADO"; }
}
return pos;
} void lista::eliminar_inicio() {
pnodo aux;
if(pL==NULL)
else
{ cout<<"lista vacia"; {
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
pos=NULL; }
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
}
aux=pL; if((*pL).sig==NULL) {
pL=NULL; }
// un nodo
Bibliografía
87
88
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
else
{ pL=(*pL).sig; }
Anotaciones
cout<<"elemento eliminado"<<(*aux).dato;
delete aux; }
} void lista::eliminar_final() {
pnodo aux=pL,temp; if(pL==NULL) {
cout<<"lista vacia"; }
else
{
if((*pL).sig==NULL)
{
pL=NULL; }
else
{
while((*aux).sig!=NULL)
{
}
temp=aux; aux=(*aux).sig;
(*temp).sig=NULL;
}
cout<<"elemento eliminado"<<(*aux).dato ;
delete aux;
}
} void lista::imprimir() {
pnodo p;
if ( pL == NULL )
cout<<"Lista vacia"<<endl;
else
{ p = pL;
while (p != NULL)
{
cout<<(*p).dato<<" -> "; p = (*p).sig;
}
cout<<"NULO"<<endl;
}
} ListasSE.cpp #include <iostream.h> #include "ListasSE.h" using namespace std; void main() {
lista L; pnodo b; int valor,opc; do
{ cout<<"\nmenu";
cout<<"\n1 insertar al inicio";
cout<<"\n2 insertar al final";
cout<<"\n3 insertar despues del número";
cout<<"\n4 Eliminar al inicio";
cout<<"\n5 Eliminar al final";
cout<<"\n6 Eliminar Lista";
cout<<"\n7 Buscar en lista";
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
cout<<"\n8 Visualizar lista";
cout<<"\n9 Salir";
do
{
} while(opc>9);
cout<<"\n Seleccione opción";
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
cin>>opc;
switch(opc)
{
case 1:L.insertar_comienzo();break;
case 2:L.insertar_final();break;
case 3:L.insertar_despues();break;
case 4:L.eliminar_inicio();break;
case 5:L.eliminar_final();break;
case 6:L.~lista();break;
case 7:L.buscar();break;
case 8:L.imprimir();break;
}
} while(opc!=9); } b. Lista Enlazada Circular Simple Es un conjunto de nodos. Cada nodo es un registro que tiene dos campos: Un campo para almacenar información de algún tipo de dato y otro campo tipo puntero que contiene la dirección del nodo siguiente. La particularidad que presenta, es que el último nodo de la lista no contiene NULO en su campo sig sino la dirección del primer nodo, lo que le da la característica circular a la lista. Para tener acceso a la lista es necesario un puntero Lc que contenga la dirección del primer nodo.
c. Lista Enlazada Doble Ees un conjunto de nodos. Cada nodo es un registro que tiene tres campos: Un campo para almacenar información de algún tipo de dato y dos campos tipo puntero que contienen las direcciones de los nodos anterior y siguiente respectivamente. *ant
dato
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
*sig
A través de los punteros ant y sig se puede recorrer la Lista en forma bidireccional, lo cual constituye una ventaja importante frente a una lista enlazada simple que sólo puede recorrerse en un sentido. El campo ant del primer nodo tiene valor NULO, pues no existe un nodo anterior a este, análogamente, el último nodo tiene también en su campo sig el valor NULO para expresar el hecho de que no existe un siguiente nodo.
Bibliografía
89
90
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
2 COLAS Y PILAS a. Colas Una Cola es una lista ordenada de elementos en la cual las inserciones se realizan por un extremo llamado Final y las eliminaciones por el otro extremo denominado Frente. Una Cola es una estructura tipo FIFO ( First In - First Out ) ya que los elementos se sacan de la cola en el mismo orden en que fueron insertados. La estructura de los nodos de una cola es la siguiente: dato
sig
Para especificar una cola son necesarios dos punteros, uno que apunte al primer elemento de la cola y el otro al último elemento de la cola.
En una cola se definen dos operaciones: Encolar: insertar un nuevo elemento al final de la cola Desencolar: eliminar el elemento del comienzo de la cola Cola.h #include <iostream> using namespace std; struct nodo {
int dato;
nodo *sig;
}; typedef nodo *pnodo; class cola {
private: pnodo pL; public: cola(); ~cola(); void encolar(); void desencolar();
void mostrar();
}; cola::cola() {
pL = NULL; }
cola::~cola() {
pnodo p,q; if ( pL != NULL ) {
p = pL;
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
while ( p != NULL )
{
delete p;
p = q; }
pL=p; } } void cola::encolar() {
pnodo nuevo,aux; int valor; nuevo = new nodo; cout<<"Ingrese valor:"; cin>>valor; (*nuevo).dato = valor; (*nuevo).sig = NULL; if ( pL == NULL )
pL = nuevo;
else
{
aux = pL;
while ( (*aux).sig != NULL )
aux = (*aux).sig;
(*aux).sig = nuevo;
}
} void cola::desencolar() {
pnodo aux;
if(pL==NULL)
else
{ cout<<"cola vacia"; }
{
aux=pL; if((*pL).sig==NULL)
{
// un nodo
pL=NULL; }
else
{ pL=(*pL).sig; }
cout<<"elemento eliminado"<<(*aux).dato; delete aux;
} } void cola::mostrar() {
pnodo p;
if ( pL == NULL )
cout<<"cola vacia"<<endl;
else
{ p = pL;
while (p != NULL)
{
}
cout<<(*p).dato<<" -> "; p = (*p).sig;
}
cout<<"NULO"<<endl; }
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
q = (*p).sig;
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Bibliografía
91
92
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
Cola.cpp #include <iostream> #include "Cola.h" Anotaciones
using namespace std; void main() {
cola C; int opc;
do
{
cout<<"\nmenu";
cout<<"\n1 encolar";
cout<<"\n2 desencolar";
cout<<"\n3 mostrar";
cout<<"\n4 Salir";
do
{
} while(opc>4);
cout<<"\n Seleccione opción"; cin>>opc;
switch(opc)
{case 1:C.encolar();break;
case 2:C.desencolar();break;
case 3:C.mostrar();break;
}
} while(opc!=4); }
b. Pilas Una Pila es una lista de elementos en la cual las inserciones y las eliminaciones se realizan por un mismo extremo llamado Cima. Una Pila es una estructura tipo LIFO ( Last In - First Out ) ya que los elementos se sacan de la pila en orden contrario al que fueron insertados. La estructura de los nodos de una pila es la siguiente: dato
sig
Para especificar una pila es necesario un puntero, que apunte al primer elemento de la pila, es decir a la cima.
En una pila sólo están permitidas dos operaciones: Apilar: Insertar un elemento por el lado de la cima Desapilar: Eliminar el elemento de la cima de la pila Pila.h #include<iostream> using namespace std; struct nodo {
int dato;
nodo *sig;
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
};
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
typedef nodo *pnodo; class stack {
private: pnodo pL; public: stack(); ~stack(); void apilar(); void desapilar();
void mostrar();
}; stack::stack() {
pL = NULL; }
stack::~stack() {
pnodo p,q; if ( pL != NULL ) {
p = pL; while ( p != NULL )
{
q = (*p).sig;
delete p;
p = q;
} pL=p;
} } void stack::apilar() {
pnodo nuevo,aux;
nuevo = new nodo;
cout<<"Ingrese dato:";
int valor;
cin>>valor;
(*nuevo).dato = valor;
(*nuevo).sig = NULL;
if ( pL == NULL )
pL = nuevo;
else
{ aux = pL;
while ( (*aux).sig != NULL )
aux = (*aux).sig;
(*aux).sig = nuevo; }
} void stack::desapilar() {pnodo aux=pL,temp; if(pL==NULL) {
cout<<"Pila vacia"; }
else
{
if((*pL).sig==NULL) { else
pL=NULL; }
Bibliografía
93
94
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
{
while((*aux).sig!=NULL) {
Anotaciones
temp=aux; aux=(*aux).sig;
}
(*temp).sig=NULL;
}
cout<<"elemento eliminado"<<(*aux).dato;
delete aux; }
} void stack::mostrar() {
pnodo p;
if ( pL == NULL )
cout<<"Pila vacia"<<endl;
else
{ p = pL;
while (p != NULL)
{
cout<<(*p).dato<<" -> ";
p = (*p).sig;
}
cout<<"NULO"<<endl;
}
} Pila.cpp #include <iostream> #include "Pila.h" using namespace std; void main() {
stack S; int opc;
do
{
cout<<"\nmenu";
cout<<"\n1 apilar";
cout<<"\n2 desapilar";
cout<<"\n3 mostrar";
cout<<"\n4 Salir";
do
{
cout<<"\n Seleccione opción"; cin>>opc;
} while(opc>4);
switch(opc)
{case 1:S.apilar();break;
case 2:S.desapilar();break;
case 3:S.mostrar();break;
} } while(opc!=4);
}
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
Diagrama
Objetivos
Desarrollo de contenidos
Actividades
Inicio
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
ACTIVIDAD N° 2: Autoevaluación
Esta actividad puede consultarla en su aula virtual. Lecturas seleccionadas
Recordatorio
Diagrama Glosario
Objetivos Bibliografía
Inicio
Desarrollo de contenidos Anotaciones
Actividades
Autoevaluación
LECTURA SELECCIONADA N° 1 Lecturas seleccionadas
Glosario
Bibliografía
INTRODUCCIÓN AL ENFOQUE OOP Rosalía Laza Fidalgo. Baltasar García Pérez-Shofield, 2008, Recordatorio
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Anotaciones
Metodología y Tecnología de la Programación. Pág. 1
Durante los últimos años, la Programación Orientada a Objetos (Object Oriented Programming, u OOP) ha tomado gran importancia. El término OOP indica más de una forma de diseño y una metodología de desarrollo que un lenguaje de programación, ya que en realidad se pueden aplicar los principios del paradigma de programación orientada a objetos (encapsulación, herencia y polimorfismo) en cualquier lenguaje de programación. A menudo se confunde la Orientación a Objetos con sistemas de ventanas, íconos y similares, Interfaces Gráficas de Usuario. Esto debido a que se usan técnicas orientadas a objetos para construir entornos. También es razonable pensar que todo lo programado por lenguajes orientados a objetos es OOP. Esto no es cierto, ya que incluso en un lenguaje orientado a objetos puro, es posible que un mal diseño lleve una implementación que en realidad no siga los principios de Orientación a Objetos mencionados. DE lo que se trata, en todo caso, es de, dado un problema a automatizar (“resolver” mediante una aplicación), hacer una aplicación de la mejor manera posible en todos los aspectos del desarrollo de software. Los aspectos importantes que determinan el desarrollo de software son: • Portabilidad: El software desarrollado debe funcionar independientemente del hardware y del entorno de funcionamiento o Sistema Operativo sobre el cual se ejecute. • Productividad: Uno de los principales objetivos es simplificar el proceso de desarrollo de software, para lo cual es fundamental reutilizar componentes. • Mantenimiento. Constituye una de las etapas más costosas en el desarrollo de software que, por tanto, se deberá intentar optimizar todo lo posible. Es fundamental estructurar bien el programa para prever futuros cambios o modificaciones. • Calidad: A la hora de producir software, no hay que olvidar que se deben de desarrollar productos de calidad, dada a partir de una serie de aspectos como robustez, fiabilidad, eficiencia, flexibilidad, … Cualquier metodología de programación debe intentar producir programas portables, reducir los tiempos de desarrollo y los costes de mantenimiento, así como mejorar la calidad del producto. El paradigma de programación clásico, esto es, el estructurado, se basa en tomar un problema, y subdividirlo sucesivamente en subproblemas, hasta llegar a unos subpro-
Bibliografía
95
96
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
blemas suficientemente sencillos de resolver. Los principales problemas del paradigma de programación estructurada son: • Creciente complejidad de las aplicaciones: Los requisitos cada vez más ambiciosos de las aplicaciones reflejan una sofisticación en demanda de software. • Limitaciones en la modelización de problemas no estructurados: Las actuales metodologías estructuradas dificultan la modelización y resolución de problemas complejos no estructurados. Siguiendo una metodología estructurada, los sistemas se descomponen en una jerarquía de módulos. Estos se diseñan para transformar entradas y salidas bien definidas. - Este enfoque es el más apropiado para su empleo en problemas estructurados en donde el comportamiento del software se conoce y se puede describir en base al algoritmo de transformación de datos. El software se estructura según la solución del problema en vez de enfocarlo directamente según el problema mismo. Esto puede conducir a un separación conceptual entre el problema del mundo real y su representación e implementación informática. • Difícil reutilización del software: Es normal que se construyan y reconstruyan una y otra vez módulos muy parecidos funcionalmente. Esto es debido a que la subdivisión en subproblemas en la que se basa el paradigma de programación estructurada, no supone un énfasis en que cada uno de los módulos utilizados en esos problemas sean reutilizables. Incluso en la actualidad, muchos de los intentos de crear librerías de componentes de software utilizables no han tenido mucha implantación debido sobre todo a los problemas inherentes a su reutilización. Cualquier simplificación del proceso de desarrollo del software para la reutilización de componentes ya implementados. • Mantenimiento difícil y costoso: El mantenimiento de las aplicaciones supone el coste más importante durante el ciclo de vida. Debido a la evolución que sufren todas las aplicaciones, a menudo se introducen ampliaciones y se desarrollan nuevos entornos de operación, lo cual argumenta que el mantenimiento sea una actividad esencial. Como durante el desarrollo de las aplicaciones no se han tenido en cuenta futuros cambios, es frecuente encontrar programas mal estructurados en lo cuales es difíciles la incorporación de nuevos módulos o estructuras de datos. El desarrollo de la OOP empieza a destacar durante la década de los 80, partiendo de la programación estructurada, a la vez que engloba, y dotando al programador de nuevos elementos para el análisis y desarrollo de software. Así, las metodologías orientadas a objetos pueden facilitar la producción de sistemas cada vez más complejos, permiten modelar problemas no estructurados, incrementan la productividad gracias a la reutilización de objetos y facilitan el mantenimiento. La orientación a objetos puede describirse como el conjunto de disciplinas que desarrollan y modelizan software y que facilitan la construcción de sistemas complejos a partir de componentes. Su característica más importante, frente a la programación estructurada, es que no trata de hacer más sencillo el problema a resolver (dividiéndolo), sino que trata de simular el problema a resolver. Así, en todo problema existen una serie entidades (físicas o no) que interaccionan para resolverlo, de manera que simulando estas entidades, y su comportamiento, es posible resolver el problema en cuestión. Cada una de estas entidades es un objeto en el sistema desarrollado mediante OOP, de ahí el nombre de programación orientada a objetos. El atractivo de la orientación a objetos es que proporciona conceptos y herramientas con las cuales se modela y representa el mundo real tan fielmente como sea posible. La OOP proporciona las siguientes ventajas sobre otros lenguajes de programación:
s
s
o
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
Lecturas seleccionadas
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Glosario
• Uniformidad: la representación de los objetos lleva implícita tanto el análisis como el diseño y codificación de los mismos. Así todo el programa está compuesto de objetos que interaccionan entre sí.
• Comprensión: Los programas están escritos mediante definiciones de clases, que Recordatorio representan las entidades que son necesarias para resolver el problema que se esté modelando. Los programas son más fáciles de comprender porque las clases modelan los tipos de entidades involucradas en el problema a resolver, simulando ese problema. • Flexibilidad. Al tener relacionados los procedimientos que manipulan los datos con los datos a tratar, cualquier cambio que se realice sobre ellos quedará reflejado automáticamente en cualquier lugar donde éstos aparezcan. • Reusabilidad. La noción de objeto permite que programas que traten las mismas estructuras de datos reutilicen las definiciones de clases empeladas en otros programas e incluso los procedimientos que los manipulan. De forma ideal, el desarrollo de un programa “nuevo” debería poder llegar a ser una simple combinación de objetos ya definidos en otros programas que se desarrollaron anteriormente. La OOP no sustituye a ninguna metodología ni lenguaje de programación anterior, es un enfoque distinto. Todos los programas que se realizan según los principios de la OOP se pueden realizar igualmente mediante programación estructurada, aunque de forma más costosa, puesto que los lenguajes Orientados a Objetos soportan de forma natural la OOP. A la vez, las limitaciones observadas en el paradigma de programación estructurada son eliminadas (al menos, parcialmente), ya que un lenguaje Orientado a Objetos ya fuerza e invita a emplear los principios de la OOP.
Objetivos
Inicio
Actividades
Autoevaluación
AUTOEVALUACIÓN DE LA UNIDAD N° III INSTRUCCIONES: Lee detenidamente y responde las siguientes preguntas: Glosario
Anotaciones
1. Indique la línea de código que se debe escribir en el recuadro en blanco y que perBibliografía mite utilizar como tipo de dato a la siguiente codificación de una estructura (struct): struct domicilio{ char nombre[30]; char calle[30]; int num; char ciudad[20]; }; void main( ) { domicilio Oficina, casa; }
a) typedef struct Oficina; b) typedef casa struct; c) typedef struct domicilio; d) typedef domicilio struct casa; e) typedef struct casa; 2. Indique la definición de la estructura de datos UNION: a) Es una estructura de datos secuencial unidimensional con un tamaño Máximo. b) Es una estructura de datos de diferentes tipos que solo ingresa uno de los espacios
Anotaciones
Bibliografía
97
98
ollo nidos
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
definido. c) Es una estructura de datos de diferentes tipos que ingresa todos los espacios definidos. Anotaciones
d) Es una estructura de datos secuencial bidimensional con un tamaño Máximo. e) Es exactamente igual al STRUCT, no se diferencia de ninguna manera. 3. Indique las líneas de código que se debe escribir en la casilla (I) y en la casilla (II), para poder cambiar la edad de una persona según el siguiente programa: #include<iostream> using namespace std; typedef struct{ char nombres[25]; int edad; } Persona; void cambiarEdad( (II) { ed++; cout<<ed; } void main() { Persona pers; cout<<"Ingrese nombre"; cin>>pers.nombres; cout<<"Ingrese nombre"; cin>>pers.edad;
)
cout<<"---Cambiar Edad de Persona---"; cambiarEdad( }
(I)
);
a) (I) pers (II) Persona p b) (I) pers (II) int ed c) (I) pers.edad (II) Persona p d) (I) pers (II) Persona ed e) (I) pers.edad y (II) int ed 4. Indique si es Verdadero(V) o Falso(F) cada uno de los siguientes enunciados sobre el TDA Clase: - El constructor se nombra igual que la clase. - Puede haber más de un constructor en la clase. - El destructor se invoca para eliminar la clase creada. - Puede haber más de un destructor en la clase. a) VVVV. b) FVFV. c) FFFV. d) VFVF. e) VVVF. 5. Indique la alternativa con tres de los cinco fundamentos del orientado a objetos: a) Herencia, Clase, Objeto. b) Polimorfismo, Clase, Jerarquía. c) Herencia, Polimorfismo, Encapsulamiento. d) Encapsulamiento, Polimorfismo, Objeto.
Desarrollo UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL de contenidos
e) Mensaje, Jerarquía, Clase.
Lecturas seleccionadas
6. Indique la alternativa que corresponde a un adecuado ejemplo de clase con sus Recordatorio respectivos objetos: a) Salón de Clases: carpetas, pizarra. b) Universidad: Universidad Nacional, Universidad Particular. c) Colegio: CE San José, CE Santa María. d) Auto: Auto de Carrera, Auto Particular. e) Persona: Persona Natural, Persona Jurídica 7. Indique el enunciado que considere correcto para línea 3 y la línea 4 del siguiente código que declara a dos punteros de dirección de memoria: int *p; //línea 1 float *q; //línea 2 p = new int; //línea 3 q = new float; //línea 4
a) Línea 3 crea una variable estática de tipo int y hace que p apunte a ella y Línea 4 crea una variable estática de tipo float y hace que q apunte a ella. b) Línea 3 crea una variable dinámica de tipo int y hace que q apunte a ella y Línea 4 crea una variable dinámica de tipo float y hace que p apunte a ella. c) Línea 3 crea una variable estática de tipo int y hace que q apunte a ella y Línea 4 crea una variable estática de tipo float y hace que p apunte a ella. d) Línea 3 crea una variable dinámica de tipo int y hace que p apunte a ella y Línea 4 crea una variable dinámica de tipo float y hace que q apunte a ella. e) Línea 3 crea una variable estática de tipo float y hace que p apunte a ella y Línea 4 crea una variable estática de tipo int y hace que q apunte a ella. 8. Indique la alternativa con la adecuada definición de una lista simple enlazada: a) Es una estructura de datos estática, lineal y solo se puede ingresar un campo dato. b) Es una estructura de datos dinámica, lineal y se puede ingresar más de un campo dato. c) Es una estructura de datos dinámica, no lineal y se puede ingresar más de un campo dato. d) Es una estructura de datos estática, no lineal y solo se puede ingresar un campo dato. e) Es una estructura de datos estática, lineal y se puede ingresar más de un campo dato. 9. Indique si es Verdadero(V) o Falso(F) cada uno de los siguientes enunciados sobre las estructuras Cola y Pila: - La estructura Pila usa la técnica FIFO. - La estructura Pila realiza las inserciones por el extremo final. - La estructura Cola realiza las inserciones por el extremo final. - La estructura Cola usa la técnica LIFO. a) FVVF. b) FVFV. c) FFFV. d) VFVF. e) FFVV.
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Glosario
Anotaciones
Bibliografía
99
ollo nidos
100
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD III: ESTRUCTURAS DE DATOS DINÁMICAS LINEAL
10. Indique la alternativa que defina las operaciones que se pueden realizar en una lista simple enlazada: a) inserta al inicio y al final, elimina al inicio y al final. b) inserta al inicio y en cualquier otra posición, elimina al inicio y al final. c) inserta al inicio, en cualquier otra posición y al final, elimina al inicio y al final. d) inserta al final, elimina al inicio y al final. Diagrama
Objetivos
Inicio
Desarrollo de contenidos
Actividades
Autoevaluación
Lecturas seleccionadas
Glosario
e) inserta al inicio y al final, elimina al final.
GLOSARIO
Recordatorio
Bibliografía
Dirección de Memoria: es un identificador de una localización (ubicación) de un espacio de memoria del computador, generalmente nombrado por una variable para su posterior reutilización. Anotaciones
Dato Miembro: es un atributo (información) que se crea en el ámbito de una clase. Función Miembro: es un método (responsabilidad) que se crea en el ámbito de una clase. Programación Orientada a Objetos: es el conjunto de conceptos y técnicas que tiene su Inicio fundamento en el uso de clases y objetos, para escribir programas.
Diagrama
Objetivos
Desarrollo de contenidos
Actividades
Autoevaluación
Lecturas seleccionadas
Glosario
Bibliografía
BIBLIOGRAFÍA DE LA UNIDAD III:
Joyanes Aguilar, Luis. Fundamentos de Programación. 4ta. ed. España: McGraw-Hill; 2008. Recordatorio
Anotaciones
Laza Fidalgo Rosalía. García Pérez-Shofield Baltasar. Metodología y Tecnología de la Programación. 1raEd. Pearson; 2008.
Desarrollo de contenidos
Diagrama
Desarrollo de contenidos
Diagrama Lecturas seleccionadas
Objetivos
Inicio
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL Actividades
Autoevaluación
DIAGRAMA DE PRESENTACIÓN DE LA UNIDAD Objetivos Glosario
Inicio Bibliografía
CONTENIDO
Desarrollo de contenidos Recordatorio
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Actividades
EJEMPLOS
Autoevaluación
Anotaciones
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
BIBLIOGRAFÍA
ACTIVIDADES
AUTOEVALUACIÓN
Bibliografía
CONOCIMIENTOS
PROCEDIMIENTOS
ACTITUDES
Tema Nº 1: Árbol y Grafo
1. Aplica los algoritmos de creación y manipulación de datos de con el uso de árboles en construcción de programas.
1. Asume con responsabilidad sus actividades académicas asignadas.
1. Árbol General: Conceptos básicos y algoritmos de manipulación. 2. Árbol Binario: Recorridos: PreOrden, InOrden, PostOrden. 3. Árboles Binarios de Búsqueda( ABB )
2. Diferencia los algoritmos creación y manipulación de datos de con el uso de grafos en la construcción de programas.
4. Grafos: Conceptos y algoritmos de manipulación.
3. Aplica los algoritmos para acceso y manipulación de archivos.
Tema Nº 2: Archivo (Fichero)
Actividad N° 1:
1. Archivo: Conceptos y algoritmos de manipulación. Lectura Seleccionada N° 1: Operaciones con archivos – Jesús Carretero Pérez. García Carballena, Felix. Pérez Lobato José Autoevaluación de la Unidad IV
Comprobación de los algoritmos de recorridos de árbol, con ejercicios propuestos. Actividad N° 2: Comprobación de los programas de ficheros, presentados en el autoinstructivo. Tarea Académica Nº 2: Estructuras de Datos Dinámicas No Lineal.
2. Realiza con honestidad las evaluaciones asignadas
Bibliografía
101
ollo nidos
102
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
TEMA N° 1: ÁRBOL Y GRAFO 1 ÁRBOL GENERAL: CONCEPTOS BÁSICOS Y ALGORITMOS DE MA-
NIPULACIÓN. ¿Recuerda el concepto de árbol genealógico o árbol familiar? Es decir, ¿Recuerda que existe un padre inicial y a partir de allí se tiene descendencia en un siguiente nivel, y luego esa descendencia a su vez puede tener descendencia en otro nivel y así sucesivamente? Entonces se puede decir que conocemos la definición de un árbol. Un árbol es un conjunto de nodos, en el que existe un nodo distinguido llamado Raíz y cero o más subárboles, cada uno de los cuales tiene su raíz conectada a la raíz por medio de una arista.
Conceptos Básicos sobre Árboles Hoja: Todo nodo que no tiene hijos. Ejemplo: B, C, H, I, P, Q, K, L, M, N Peso del Árbol: Cantidad de Hojas. Ejemplo: 10 Camino: Enlace entre dos nodos consecutivos y rama es un camino que termina en hoja. Ejemplo: camino ( A , Q ) = A – E – J – Q Longitud del camino: Es la cantidad de aristas que conforman un camino. Ejemplo: longitud_camino ( A , Q ) = 3 Nivel: Cada nodo tiene asociado un nivel, determinado por la longitud de camino desde la raíz hasta el nodo especifico. Ejemplo: Nivel 0
A
Nivel 1
B,C,D,E,F,G
Nivel 2
H,I,J,K,L,M,N
Nivel 3
P,Q
Profundidad de un árbol: Es el número máximo de nodos en una rama. Es decir nivel más alto de los nodos más uno. Ejemplo:
profundidad = nivel +1 profundidad = 3 +1 = 4
Representación Primer Hijo – Siguiente Hermano Cada nodo del árbol solo tiene dos punteros, uno para apuntar a su primer hijo y otro para apuntar a su siguiente hermano.
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
Por ejemplo del gráfico anterior, se tiene:
#include <iostream> #define MAX 10 using namespace std; struct nodo { int dato; nodo * hijo; nodo * her; }; typedef nodo *pnodo; class arbol {public: pnodo rpri; public:
arbol();
~arbol();
pnodo buscar(pnodo aux, pnodo pos,int d);
void mostrar(pnodo aux);
void inserta_principal();
void inserta_hijo();
void inserta_hermano();
}; arbol::arbol() {rpri =NULL;} arbol::~arbol() {} pnodo arbol::buscar(pnodo aux, pnodo pos, int d) { pnodo aux2; if (aux==NULL) { pos=NULL; } else { if((*aux).dato ==d) { pos=aux; } else { aux2=(*aux).hijo;
do
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
103
ollo nidos
as nadas
torio
104
Actividades
Autoevaluación
Glosario
Bibliografía
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
{ while(aux2!=NULL && (*aux2).hijo ==NULL)
{
if((*aux2).dato==d)
Anotaciones
{
pos=aux2;
break;
}
aux2=(*aux2).her;
} if(aux2==NULL && pos==NULL)
return NULL;
if(aux2!=NULL)
{
pos=buscar(aux2,pos,d);
aux2=(*aux2).her;
}
else
break;
}while(aux2!=NULL);
} } return pos; } void arbol::mostrar(pnodo aux) {pnodo aux2,aux3; //usando recursion para mostrar if(aux==rpri)
{
cout<<aux->dato; cout<<endl<<"|";
cout<<endl<<"v"<<endl;
aux2=aux->hijo;
arbol::mostrar(aux2);
}
else { if(aux==NULL)
cout<<"NULL";
else
{
cout<<aux->dato;
cout<<"->";
aux2=aux->her;
if(aux2!=NULL)
arbol::mostrar(aux2);
else
arbol::mostrar(aux2);
aux3=aux->hijo;
cout<<endl<<"|";
cout<<endl<<"v"<<endl;
if(aux3!=NULL)
else
} } }
arbol::mostrar(aux3); arbol::mostrar(aux3);
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
void arbol::inserta_principal()
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
{ rpri = new nodo; cout<<"\t Ingresar la raiz: "; cin>>rpri->dato; cout<<endl; rpri->hijo=NULL; } void arbol::inserta_hijo() {nodo *hij,*pos=NULL; int num; hij=new nodo; cout<<"-- ***De que nodo desea que sea el hijo: "; cin>>num; pos=buscar(rpri,pos,num); if(pos==NULL)
cout<<"\t--** Arbol vacio o no se encontro nodo **--";
else { if(pos->hijo==NULL) { cout<<"\t Ingrese numero a insertar: "; cin>>hij->dato; pos->hijo=hij; hij->her=NULL; hij->hijo=NULL; } else cout<<"NO SE PUEDE INGRESAR UN HIJO. DEBE INGRESAR COMO HERMANO"<<endl; } } void arbol::inserta_hermano() {pnodo herma,pos=NULL; int num; herma=new nodo; cout<<"\t De que nodo desea que sea el hermano: "<<endl; cin>>num; if(num==rpri->dato) cout<<"NO SE PUEDE INGRESAR UN HERMANO A LA RAIZ PRINCIPAL"<<endl; else { pos=buscar(rpri,pos,num); if(pos==NULL) {
cout<<"\t Arbol vacio o no se encontro "<<endl; }
else {cout<<"\t Ingrese nro a insertar: "; cin>>herma->dato; pos->her=herma; herma->her=NULL; herma->hijo=NULL; } } } void main() {int opc;
Bibliografía
105
ollo nidos
as nadas
torio
106
Actividades
Autoevaluación
Glosario
Bibliografía
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
arbol p; bool band=false; cout<<endl; Anotaciones
cout<<"\t -----**** MENU ****----- "<<endl<<endl;
cout<<"\t Insertar raiz principal"<<endl;
p.inserta_principal();
band=true; do{
if(band==true) {
cout<<"\t -----**** MENU ****----- "<<endl<<endl;
cout<<"\t 1 -> insertar hijo"<<endl;
cout<<"\t 2 -> insertar hermano"<<endl;
cout<<"\t 3 -> Visualizar Arbol"<<endl;
cout<<"\t 4 -> Salir"<<endl;
do
{
cout<<"\t Seleccione opcion: "; cin>>opc;
}while(opc>4);
switch(opc)
{
case 1:p.inserta_hijo();break;
case 2:p.inserta_hermano();break;
}
case 3:p.mostrar(p.rpri);break;
}
else
cout<<"Debe insertar la raiz";
} while(opc!=4); } 2 ÁRBOL BINARIO: RECORRIDOS: PREORDEN, INORDEN, POSTORDEN. A. Árbol Binario Es un árbol, en el que cada uno de sus nodos puede tener 0, 1 o 2 hijos.
Ejemplo:
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
Recorrido de Árboles Binarios
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
a) Recorrido en Orden
- Recorrer el subárbol izquierdo en orden
- Visitar el nodo raíz
- Recorrer el subárbol derecho en orden
b) Recorrido en Pre-Orden
- Visitar el nodo raíz
- Recorrer el subárbol izquierdo en pre-orden
- Recorrer el subárbol derecho en pre-orden
c) Recorrido en Post-Orden
- Recorrer el subárbol izquierdo en post-orden
- Recorrer el subárbol derecho en post-orden
- Visitar el nodo raíz
B. Árbol de Expresión Es un árbol binario en el que las hojas contienen los operandos y los nodos internos los operadores de una expresión matemática. Ejemplo: ( a ^ ( b * c ) ) + ( ( d * e ) – f ) / g )
3 ÁRBOLES BINARIOS DE BÚSQUEDA ( ABB ) Un ABB es un árbol binario en el que para todos sus nodos (excepto sus hojas) se cumple que el dato almacenado en él, es mayor a todos los datos de los nodos del subárbol izquierdo pero menor a todos los datos de los nodos del subárbol derecho. Ejemplo:
Para poder tener acceso al árbol es necesario un puntero que contenga la dirección de la raíz.
Bibliografía
107
ollo nidos
as nadas
torio
108
Actividades
Autoevaluación
Glosario
Bibliografía
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
arbolabb.h #include<iostream> using namespace std; Anotaciones
struct nodoABB {
nodoABB *hizq;
int dato;
nodoABB *hder;
}; typedef nodoABB *pnodoABB; class abb {
private:
pnodoABB praiz;
public: abb(); ~abb(); pnodoABB getraiz(); pnodoABB buscar( int x ); void insertar( int x ); void imprimeenorden( pnodoABB p ); void imprimepreorden( pnodoABB p ); void imprimepostorden( pnodoABB p ); void eliminaarbol( pnodoABB p ); }; abb::abb() {
praiz = NULL; }
abb::~abb() {
eliminaarbol(praiz); praiz = NULL;
} pnodoABB abb::getraiz() { return praiz;} pnodoABB abb::buscar( int x ) {
pnodoABB p; int ok;
if ( praiz == NULL )
return NULL;
else
{
ok = 0;
p = praiz;
while ( p != NULL && ok == 0 )
if ( (*p).dato == x )
ok = 1;
else
if ( x < (*p).dato )
p = (*p).hizq;
else
p = (*p).hder;
return p; }
} void abb::insertar( int x ) {
pnodoABB p,q,r,pos;
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
char h;
p = new nodoABB;
(*p).dato = x;
(*p).hizq = NULL;
(*p).hder = NULL;
if ( praiz == NULL )
praiz = p;
else
{
pos=buscar(x);
if(pos!=NULL)
cout<<"Elemento ya existe"; else
{
q = praiz;
while ( q != NULL )
{
r = q;
if ( x < (*q).dato )
{
q = (*q).hizq; h = 'i';
}
else
{
q = (*q).hder; h = 'd';
}
}
if ( h == 'i' )
(*r).hizq = p; else (*r).hder = p;
}
}
} void abb::imprimeenorden( pnodoABB p ) {
pnodoABB Ai,Ad;
{
Ai = (*p).hizq;
Ad = (*p).hder;
imprimeenorden(Ai);
if ( p != NULL )
cout<<(*p).dato<<" ";
imprimeenorden(Ad); }
} void abb::imprimepreorden( pnodoABB p ) {
pnodoABB Ai,Ad;
if ( p != NULL )
{ Ai = (*p).hizq; Ad = (*p).hder; cout<<(*p).dato<<" ";
imprimepreorden(Ai); imprimepreorden(Ad); }
}
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
109
ollo nidos
as nadas
torio
110
Actividades
Autoevaluación
Glosario
Bibliografía
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
void abb::imprimepostorden( pnodoABB p )
Anotaciones
{
pnodoABB Ai,Ad;
if ( p != NULL )
{ Ai = (*p).hizq;
Ad = (*p).hder;
imprimepostorden(Ai);
imprimepostorden(Ad);
cout<<(*p).dato<<" ";
}
} void abb::eliminaarbol( pnodoABB p ) {
pnodoABB Ai,Ad;
if ( p != NULL )
{ Ai = (*p).hizq;
Ad = (*p).hder;
eliminaarbol(Ai);
eliminaarbol(Ad);
delete p;
} } ArbolBinario.cpp #include <iostream.h> #include "arbolabb.h" using namespace std; void main() {
abb A; pnodoABB b,r;
int i, x, sn, n, cn,opc; do
{ cout<<"\n Menu \n";
cout<<"\n1 insertar nodo";
cout<<"\n2 mostrar in orden";
cout<<"\n3 mostrar pre orden";
cout<<"\n4 mostrar post orden";
cout<<"\n5 Salir";
do
{
cout<<"\n\n Seleccione opcion: ";
} while(opc>5);
cin>>opc;
switch(opc)
{
case 1:{ cout<<"Ingrese hoja: ";
cin>>x;
A.insertar(x);
r = A.getraiz();
}break;
case 2:A.imprimeenorden(r);break;
case 3:A.imprimepreorden(r);;break;
case 4:A.imprimepostorden(r);break;
}
} } while(opc!=5);
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
4 GRAFOS: CONCEPTOS Y ALGORITMOS DE MANIPULACIÓN.
Lecturas seleccionadas
Imagine que tiene que dirigirse en auto, de su hogar a su centro de trabajo, Ud. tiene un acostumbrado camino para lograr ese objetivo, pero ocurre un imprevisto Recordatorio que bloquea el camino y le obliga en ese instante, a decidir optar por otro camino, UD. evalúa en función al tiempo, la distancia y su apuro en llegar cual camino optará optimizando sus recursos. A esto se denomina una red o grafo. Un grafo es un conjunto de objetos llamados vértices o nodos unidos por enlaces llamados aristas. Las aristas pueden tener dirección (grafo dirigido). 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. 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: estos son llamados grafos no dirigidos. Sin embargo, en ocasiones tenemos que las uniones son unidireccionales y definen un grafo dirigido. Cuando las aristas llevan un coste asociado (un entero al que se denomina peso) el grafo es ponderado. Grafo no dirigido:
a
Grafo dirigido:
a
b
b
Ejemplo: 6
5
4 3
1 2
A continuación, se muestra el programa desarrollado por un grupo de alumnos, estudiantes de esta misma asignatura en la modalidad presencial. Grafo.cpp #include<iostream> #include<string> #include<process.h> #include<ctype.h> using namespace std; #define MAX 10 struct nodo {
int v;
int p;
nodo *sgte;
}; int V,A; nodo *a[MAX],*z; bool ban=true; int leedatoO(int a,int b) {
int dato;
do
{
cout<<": ";
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Glosario
Anotaciones
Bibliografía
111
ollo nidos
as nadas
torio
112
Actividades
Autoevaluación
Glosario
Bibliografía
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
cin>>dato;
if(dato<=a||dato>b)
Anotaciones
cout<<"Error\n";
}while(dato<=a||dato>b);
return dato;
} int leedato(int a,int b) {
int dato;
do
{
cout<<": ";
cin>>dato;
if(dato<a||dato>b)
cout<<"Error\n";
}while(dato<a||dato>b);
return dato;
} char letra(int n) { switch(n+1) { case 1:return 'A';
case 2:return 'B';
case 3:return 'C';
case 4:return 'D';
case 5:return 'E';
case 6:return 'F';
case 7:return 'G';
case 8:return 'H';
case 9:return 'I';
case 10:return 'J';
default:return '*'; }
} int numero(char l) { switch(l) { case 'A':return 1;
case 'B':return 2;
case 'C':return 3;
case 'D':return 4;
case 'E':return 5;
case 'F':return 6;
case 'G':return 7;
case 'H':return 8;
case 'I':return 9;
case 'J':return 10;
default: return -1; }
} int leervertice() {
int n; char v1;
do
{
cout<<": "; cin>>v1;
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
v1=toupper(v1);
n=numero(v1);
n- -;
if(n>=V||a[n]==NULL)
cout<<"Error! vertice no valido\n";
} while(n>=V||a[n]==NULL);
return n;
} void vertices() {
int i;
cout<<"Ingrese numero de Vertices";
V=leedatoO(0,MAX);
z=new nodo;
z->sgte=z;
for (i=0; i<V; i++)
{
a[i]=z; cout<<" "<<letra(i);
}
cout<<"\n";
ban=false;
} bool pruebaarista(int n1,int n2) {
nodo *aux;
aux=a[n1];
while(aux!=z)
{
if(aux->v==n2)
return false; aux=aux->sgte;
}
return true;
} nodo *buscararista(int n1,int n2) {
nodo *aux,*pos=NULL;
bool band=true;
aux=a[n1];
while(aux!=z&&band)
{
if(aux->v==n2) {
pos=aux; band=false;
}
aux=aux->sgte;
}
return pos;
} void insertararista() {
int v1,v2,peso;
cout<<"Vertice 1";
v1=leervertice();
do
{
nodo *t;
cout<<"Vertice 2"; v2=leervertice();
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
113
ollo nidos
as nadas
torio
114
Actividades
Autoevaluación
Glosario
Bibliografía
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
if(v2==v1)
Anotaciones
cout<<"Error los dos vertices no pueden ser iguales!\n";
}while(v2==v1);
cout<<"Ingrese el peso de la arista";
peso=leedato(0,1000);
if(pruebaarista(v1,v2))
{
t=new nodo;
t->v=v2;
t->p=peso;
t->sgte=a[v1];
a[v1]=t;
t=new nodo;
t->v=v1;
t->p=peso;
t->sgte=a[v2];
a[v2]=t;
cout<<"Vinculado "<<letra(v1)<<"--"<<letra(v2);
}
else
cout<<"Ya estaba vinculado!\nVinculo"<<letra(v1)<<"-"<<letra(v2);
t=buscararista(v1,v2);
cout<<" Peso: "<<t->p<<"\n";
} void eliminarnodo(nodo *w,int n) { nodo *aux; aux=a[n]; if(aux->sgte==z)
a[n]=z;
else
{
while(aux->sgte!=w)
aux=aux->sgte;
aux->sgte=w->sgte;
} } void eliminararista() {
int v1,v2; nodo *posb1,*posb2;
cout<<"Vertice Inicial";
v1=leervertice();
do
{
cout<<"Vertice 2";
v2=leervertice();
if(v2==v1)
cout<<"Error los dos vertices no pueden ser iguales!\n";
}while(v2==v1);
posb1=buscararista(v1,v2);
posb2=buscararista(v2,v1);
if(posb1==NULL)
cout<<"No habia arista!\n";
else
{
eliminarnodo(posb1,v1); eliminarnodo(posb2,v2);
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
cout<<"Eliminado "<<letra(v1)<<"->"<<letra(v2)<<"\n"; delete posb1; delete posb2;
}
} void mostrargrafo() {
int i,num;
bool banari=true,banver=true;
nodo *aux;
for(i=0;i<V;i++)
if(a[i]!=z)
banari=false;
if(banari)
{
for(i=0;i<V;i++)
cout<<letra(i)<<"\n";
cout<<"No hay aristas disponibles, solo vertices!\n";
}
else
{
for(i=0;i<V;i++)
{
if(a[i]!=NULL)
{
aux=a[i];
banver=true;
{
while(aux!=z) num=aux->v;
if(num>i)
cout<<letra(i)<<"-"<<aux->p<<"-"<<letra(num)<<"\n";
aux=aux->sgte;
banver=false;
}
if(banver)
cout<<letra(i)<<"\n";
}
} }
} void visitar(int k,int val[MAX],int n) {
nodo *t;
val[k]=1;
for (t=a[k];t!=z;t=t->sgte)
if (val[t->v]==0)
{
cout<<"--"<<letra(t->v);
visitar(t->v,val,V); }
} void recorrer() {
int k,val[MAX];
for (k=0;k<V;k++)
val[k]=0;
k=0;
while(k<V)
{
if (val[k]==0&&a[k]!=NULL) {
cout<<"\n"<<letra(k);
Bibliografía
115
ollo nidos
as nadas
torio
116
Actividades
Autoevaluación
Glosario
Bibliografía
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
Anotaciones
visitar(k,val,V);
}
k++;
}cout<<"\n";
} void nuevovertice() {
int i,aux,lleno=0;
bool banver=true;
for(i=0;i<V;i++)
{
if(a[i]==NULL&&banver)
{
banver=false; aux=i;
}
if(a[i]!=NULL)
lleno++;
}
if(lleno<10)
{
if(banver)
{
a[V]=z; V++;
}
else
a[aux]=z;
cout<<"Usted tiene disponible los siguientes vertices:\n";
for(i=0;i<V;i++)
if(a[i]!=NULL) cout<<" "<<letra(i);
cout<<"\n";
}
else
cout<<"Ya no puede aumentar vertices!\n";
} void eliminarvertice() {
int i,ve;
bool banver=true;
nodo *pos;
for(i=0;i<V;i++)
if(a[i]!=NULL)
banver=false;
if(banver)
cout<<"Ya no puede eliminar vertices!\n";
else
{
cout<<"Indique el vertice a eliminar";
ve=leervertice();
a[ve]=NULL;
for(i=0;i<V;i++)
{
if(a[i]!=NULL) {
if(pos!=NULL)
pos=buscararista(i,ve); eliminarnodo(pos,i);
}
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
}
}
cout<<"Usted tiene disponible los siguientes vertices:\n";
for(i=0;i<V;i++)
if(a[i]!=NULL)
cout<<" "<<letra(i);
cout<<"\n";
} void main() {
int opc;
bool banopc=false;
system("color 0c");
do
{
if(ban) { cout<<"\nÛÛÛÛÛÛÛÛÛ M E N U ÛÛÛÛÛÛÛÛÛ";
cout<<"\n1 Ingresar numero de vertices";
cout<<"\n7 Salir"<<endl;
}
else
{cout<<"\nÛÛÛÛÛÛÛÛÛ M E N U ÛÛÛÛÛÛÛÛÛ";
cout<<"\n2 Ingresar Arista (Vincular)";
cout<<"\n3 Eliminar Arista";
cout<<"\n4 Mostrar Grafo";
cout<<"\n5 Insertar vertice";
cout<<"\n6 Eliminar vertice";
cout<<"\n7 Recorrer";
cout<<"\n8 Salir"<<endl;
}
do
{
cout<<"Seleccione una opcion :>\t";
cin>>opc;
if(ban)
{
if(opc!=8&&opc!=1) {cout<<"Opcion No valida\n";
banopc=true;
}
else
banopc=false;
}
else
{if(opc<2||opc>8)
{
cout<<"Opcion No valida\n"; banopc=true;
}
else
banopc=false;
}
}
while(banopc==true);
system("cls");
switch(opc)
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
117
ollo nidos
as nadas
torio
118
Actividades
Autoevaluación
Glosario
Bibliografía
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
Anotaciones
{
case 1:vertices();break;
case 2:insertararista();break;
case 3:eliminararista();break;
case 4:mostrargrafo();break;
case 5:nuevovertice();break;
case 6:eliminarvertice();break;
case 7:recorrer();break;
}
}
while(opc!=8);
}
Diagrama
Objetivos
Desarrollo de contenidos
Actividades
Inicio
ACTIVIDAD N° 1: Autoevaluación
Esta actividad puede consultarla en su aula virtual. Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
Tema N° 2: ARCHIVO (FICHERO) 1 ARCHIVO: CONCEPTOS Y ALGORITMOS DE MANIPULACIÓN
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Se ha revisado en este manual, estructuras de datos estáticas y dinámicas, que permiten sólo el almacenamiento temporal de la información, pero como Ud. mismo hace uso cotidiano, existen almacenamientos históricos, como los archivos (fichero) que crea en un computador.
Un archivo o fichero es un conjunto de datos estructurados en una colección de entidades elementales o básicas denominadas registros, que son de igual tipo y constan a su vez de diferentes entidades de nivel más bajo denominadas campos. (Luis Joyanes Aguilar, Fundamentos de Programación)
Es decir, la forma de almacenar nuestros datos en el computador se realiza a través de archivos que guardan información de diferente tipo, desde una hoja de cálculo, un procesador de texto, imágenes, sonido, de sistema operativo y tantos como puedan ser creados; además de que cada uno de ellos se almacenan con diferentes extensiones como .doc, .xls, .jpg, .mp3, .mp4, entre otros, tal como se puede apreciar en la siguiente figura:
Figura Nro 15: Ejemplo de Archivos en el computador. (Elaboración personal) a. Conceptos. • Campo: es un dato elemental de la realidad como nombre de persona, código de alumno, precio de producto, nombre de ciudad y todo lo que podamos abstraer. • Registro: es un conjunto de campos que tienen una común información del registro, otorgándole significado; como por ejemplo el Registro de Alumnos, que a su vez tiene los campos código, nombre, apellidos. • Archivo: es un conjunto de registros (datos estructurados) que tienen una relación de información entre sí; se da por ejemplo el registro de matrícula de alumnos al curso Matemática, que tiene un conjunto de registros de alumnos de dicho curso. • Base de Datos: es un conjunto de archivos, con datos relacionados, por ejemplo el archivo de registro de matrícula de alumnos al curso de Matemática y el registro de cursos que se pueden matricular los alumnos en una universidad. El ejemplo de estos conceptos se representa en la siguiente figura:
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Bibliografía
119
ollo nidos
120
Actividades
Autoevaluación
as nadas
Glosario
Bibliografía
torio
Anotaciones
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
Figura Nro 16: Conceptos de Archivos. (Elaboración personal) b. Algoritmos de Manipulación. En lenguaje C/ C++, se usa la librería: #include <fstream> Declaración de Variables de tipo "Fichero": ifstream nombrefichero; // Para ficheros de entrada ofstream nombrefichero; // Para ficheros de salida - Ficheros de Tipo Texto: Ejemplo 1: Crear Archivos1.cpp (para crear un fichero llamado “ejemplo.txt”)
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
#include<iostream> #include <fstream> using namespace std; void main() { fstream fichero; // Declaracion de la variable fichero char texto[200]; fichero.open("ejemplo.txt", ios::in); // Abrir para lectura fichero >> texto; // Leer una primera linea while (!fichero.eof()) // Mientras nos sea final de fichero { cout << texto << endl; // Mostrar lo leido fichero >> texto; // Volver a leer } fichero.close(); // Cerrar Fichero system("pause"); }
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Ejemplo 2: Crear Archivos1.cpp (para crear un fichero llamado “ejemplo.txt”)
#include<iostream> #include <fstream> using namespace std; void main() { ofstream fichero("ejemplo.txt"); //Fichero de salida fichero << "Hola" << endl; fichero << "Adios" << endl; fichero.close(); system("pause"); } - Ficheros de Tipo Binario: Tiene la información tal cual está en memoria, es decir, sin convertirla a texto. Para leer y escribir en ficheros binarios: read() y write(). in.open(nombre,ios::binary); // Apertura para Lectura out.open(nombre,ios::binary); // Apertura para Escritura, in.open(nombre, ios::binary |ios::in | ios:: out); // Apertura para Lectura y Escritura
Diagrama
Objetivos
Desarrollo de contenidos
Actividades
Inicio
ACTIVIDAD N° 2: Autoevaluación
Esta actividad puede consultarla en su aula virtual. Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Bibliografía
121
122
Inicio UNIDAD IV:Objetivos ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
Actividades
Autoevaluación
Diagrama
as nadas
Glosario
Bibliografía
Desarrollo de contenidos
torio
Anotaciones
ollo nidos
Actividades
Autoevaluación
LECTURA SELECCIONADA N° 1 Lecturas seleccionadas
Glosario
Bibliografía
OPERACIONES CON ARCHIVOS Carretero Pérez. García Carballena, Felix. Pérez Lobato José, 2007, Fundamentos de Programación. Pág. 236 Anotaciones
Recordatorio
En la biblioteca stdio.h se define el de datos FILE* para representar un archivo. Este tipo de datos se conoce como stream. Cuando se crea o se abre un archivo se crea un stream (flujo) en el que se almacena toda la información que necesitan las funciones de stio.h para poder operar. En la siguiente figura se muestran dos situaciones típicas: la escritura de datos en un archivo y la posterior lectura de los mismos. Para ambas situaciones se muestran los pasos habituales, indicando de forma genérica las operaciones que han de usarse de una biblioteca de entada/salida (en adelante E/S) y su relación con un stream. En las siguientes secciones se presentan las ideas asociadas a un stream de E/s, así como las funciones de la biblioteca stdio.h
Escritura de Datos
Lectura de Datos
1) Abrir (<nombre del archivo> <control de apertura> -> FILE*
1) Abrir (<nombre del archivo> <control de apertura> -> FILE*
2) SaltarA (FILE*, <posición x>)
2) SaltarA (FILE*, <posición x>)
3) Escribir (FILE* , <valores>)
3) Leer (FILE*, <valores>)
4) Cerrar (FILE*)
4) Cerrar (FILE*)
Pasos habituales en la escritura y lectura de archivos. Streams (flujos) de E/S Como se ha comentado anteriormente, el tipo de datos FILE* permite representar un archivo, guardándose toda la información necesaria. ¿qué tipo de información se guarda? Cuando se crea o abre un stream, la biblioteca stdio.h realiza la petición del servicio correspondiente al sistema operativo. El sistema operativo en respuesta genera un descriptor de archivo para poder identificarlo. Parte de la información del stream es descriptor asociado al archivo. Este descriptor es transparente, aunque hay una función para conocerlo (fileno). … Todo archivo abierto lleva asociado un puntero de posición que indica el lugar donde se realizará la siguiente lectura o escritura. Cuando se crea un archivo, el puntero de la posición es cero (comienzo del archivo). Según se escribe en el archivo, el punto donde se escribe es el mismo donde terminó la escritura anterior, salvo que se indique una nueva posición con la función fseek. Además de todo lo anterior, en el momento de abrir o crear un stream hay que indicar de qué tipo de archivo se trata. Se definen dos tipos de stream: • De texto: Formados por líneas de caracteres, cada una de las cuales está formada por cero o más caracteres terminados con un carácter de salto de línea. La última línea puede no terminar en un salto de línea.
s
s
o
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
Lecturas seleccionadas
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Glosario
• Binarios: Formados por una secuencia ordenada caracteres, sin separadores especiales, que pueden almacenar cualquier tipo de información.
Hay mas información asociada a un stream, como un indicador de error que indica siRecordatorio se ha producido un error de E/S y un indicador de fin de archivo (EOF, End Of File) que indica si se ha alcanzado el fin del archivo. Cuando se inicia un programa se abren, por defecto, tres streams de texto, por lo que no deben abrirse explícitamente con posterioridad, so pena de obtener un error. Estos streams son: • Entrada estándar (stdin), que permite leer de la entrada convencional del computador, suele ser el teclado. • Salida estándar (stdout), que permite escribir en la salida convencional del computador, suele ser la pantalla. • Salida de error estándar (stderr), que permite escribir en la salida convencional de error del computador, que suele ser también la pantalla, si bien en algunos casos existen otros dispositivos, como impresoras, asociados a estas salidas de error. Estos tres streams son tres variables globales que pueden usarse en cualquier archivo que incluya directa o indirectamente la biblioteca stdio.h
Objetivos
Inicio
Actividades
Autoevaluación
AUTOEVALUACIÓN DE LA UNIDAD N° IV INSTRUCCIONES: Lee detenidamente y responde las siguientes preguntas: Glosario
Bibliografía 1. Indique la alternativa que contenga la definición de: Hoja y de Camino en un Árbol General:
a) La hoja es el nodo que tiene otras ramificaciones de nodos y el Camino es la cantidad de aristas entre dos nodos. Anotaciones
b) La hoja es el nodo que tiene otros caminos de nodos y el Camino es la cantidad de vértices entre dos nodos. c) La hoja es el nodo que no tiene polimorfismo de nodos y el Camino es la cantidad de hojas entre dos nodos. d) La hoja es el nodo que tiene otros caminos de nodos y el Camino es la cantidad de polimorfismo entre dos nodos. e) La hoja es el nodo que no tiene otras ramificaciones de nodos y el Camino es la cantidad de aristas entre dos nodos. 2. Dado el siguiente árbol general, indique la alternativa que corresponda a los valores de los conceptos de árbol: Nivel, Hojas, Camino(B-R).
Anotaciones
Bibliografía
123
ollo nidos
as nadas
torio
124
Actividades
Autoevaluación
Glosario
Bibliografía
UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
a) Nivel=4; Hojas=E,J,K,R,M,N,S,H,P; Camino (B-R)=A-B-F-L-R. b) Nivel=4; Hojas=E,J,K,R,M,N,S,H,P; Camino (B-R)=B-F-L-R. c) Nivel=5; Hojas=E,J,K,R,M,N,S,H,P; Camino (B-R)=B-F-L-R. Anotaciones
d) Nivel=5; Hojas=R,S; Camino (B-R)=B-F-L-R. e) Nivel=4; Hojas=E,R,S,P; Camino (B-R)=A-B-F-L-R. 3. Indique la alternativa que contenga el orden de recorrido de un Arbol Binario de Búsqueda: a) Pre Orden(SAIzquierdo, SADerecho, Raíz), InOrden(SAIzquierdo, Raíz, SADerecho), PostOrden (Raíz , SAIzquierdo, SADerecho) b) Pre Orden(Raíz, SAIzquierdo, SADerecho), InOrden(SAIzquierdo, Raíz, SADerecho), PostOrden (Raíz , SAIzquierdo, SADerecho) c) Pre Orden(SAIzquierdo, Raíz, SADerecho), InOrden(SAIzquierdo, Raíz, SADerecho), PostOrden (, Raíz, SAIzquierdo, SADerecho) d) Pre Orden(Raíz, SAIzquierdo, SADerecho), InOrden(SAIzquierdo, Raíz, SADerecho), PostOrden (SAIzquierdo, SADerecho, Raíz) e) Pre Orden(SAIzquierdo, Raíz, SADerecho), InOrden(Raíz, SAIzquierdo, SADerecho), PostOrden (SAIzquierdo, SADerecho, Raíz)
4. Indique la alternativa que diferencie a un Árbol General (1) de un Árbol Binario (2): a) (1) sólo tiene de 0 hasta 2 hijos, y (2) puede tener más de 2 hijos. b) (1) puede tener más de 2 hijos, y (2) sólo tiene de 0 hasta 2 hijos. c) (1) sólo tiene de 0 hasta 1 hijo, y (2) puede tener hasta 4 hijos. d) (1) sólo tiene 1 hijo, y (2) sólo tiene de 0 hasta 2 hijos. e) (1) puede tener más de 2 hijos y (2) sólo tiene 2 hijos. 5. Dado el siguiente Árbol Binario de Búsqueda, seleccione la alternativa con la relación adecuada:
I. Los valores del árbol son adecuados.
a)
II. Los valores del árbol son inadecuados.
b) Se invalida todo resultado de recorrido.
a) I,a. b) II,c. c) I,c. d) II,b e) I,b.
El recorrido en PreOrden 37,24,16,31,33,74,52,86,68
es:
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
6. Indique si es Verdadero(V) o Falso(F) cada uno de los siguientes enunciados sobre grafo: - El grafo es una estructura de datos no lineal. - El grafo puede ser binario y tener recorrido pre orden. - El grafo tiene vértices y aristas. a) FFF. b) FVF. c) VVF. d) VFV. e) FFV.
7. Indique la alternativa que sugiera la estructura de datos que permita representar la red de transporte público de sus ciudad: a) Lista Doble b) Árbol c) Grafo d) Cola e) Lista Circular 8. En una arista de un grafo de red de transporte público, se puede considerar los siguientes valores de información: a) Sólo tiempo. b) Tiempo y distancia. c) Sólo distancia. d) Tiempo, distancia y costo. e) Sólo costo. 9. Indique la alternativa que contenga las dos librerías de fstream para crear Archivos: a) ifstream, ofstream b) ifstream, ostream c) istream, ofstream d) istream, ostream e) fstream, iostream 10. La diferencia entre un archivo de texto (1) y un archivo binario (2) es: a) (1) son líneas de caracteres, guardan cualquier tipo de información, y (2) son secuencia de caracteres que terminan en salto de línea. b) (1) son líneas de caracteres, terminados en un salto de línea, y (2) son secuencia de caracteres que terminan en salto de línea. c) (1) son líneas de caracteres, guardan cualquier tipo de información, y (2) son secuencia de caracteres sin separadores especiales. d) (1) son líneas de caracteres, sin separadores especiales, y (2) son secuencia de caracteres que guardan cualquier tipo de información. e) (1) son líneas de caracteres, terminados en un salto de línea, y (2) son secuencia de caracteres sin separadores especiales.
Bibliografía
125
126
UNIDAD IV:Inicio ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL
Actividades
Autoevaluación
Diagrama
Objetivos
as nadas
Glosario
Bibliografía
Desarrollo de contenidos
Actividades
Anotaciones
Lecturas seleccionadas
Glosario
torio
ollo nidos
Autoevaluación
GLOSARIO Bibliografía
Arista: es la conexión entre nodos ó vértices, y pueden contener información. Recordatorio
Stream: Anotaciones es el flujo de datos desde o hacia un programa.
Diagrama
Objetivos
Inicio
Desarrollo de contenidos
Actividades
Autoevaluación
Lecturas seleccionadas
Glosario
Bibliografía
Vértice: objeto o nodo que contiene información.
BIBLIOGRAFÍA DE LA UNIDAD IV:
Carretero Pérez, Jesús. García Carballena, Felix. Pérez Lobato José. Fundamentos de Programación. 1ra. ed. España: Thomson; 2007. Recordatorio
Anotaciones
Joyanes Aguilar, Luis. Fundamentos de Programación. 4ta. ed. España: McGraw-Hill; 2008. Carrasco Loli Angela. Principios de Programación. Junio 2005 Carretero Pérez, Jesús. García Carballena, Felix. Pérez Lobato José. Fundamentos de Programación. 1ra. ed. España: Thomson; 2007. Ceballos Sierra, Francisco. C / C++ curso de programación. 6ta ed. Mexico: AlfaOmega; 2006. Joyanes Aguilar, Luis. Fundamentos de Programación. 4ta. ed. España: McGraw-Hill; 2008. Joyanes Aguilar, Luis. Zahonero Martinez, Ignacio. Programación en C. Metodologías, Algoritmos y Estructura de Datos. 2da. ed. España: McGraw-Hill; 2005. Laza Fidalgo Rosalía. García Pérez-Shofield Baltasar. Metodología y Tecnología de la Programación. 1raEd. Pearson; 2008. Raffo Lecca, Eduardo. Turbo C++. 1 ed. Lima: Mundigraph; 2000.
Enlaces Web: • Baeza Yates, Ricardo. Algoritmia. Dpto. de Cs. de la Computación, Univ. de Chile: 2002. Disponible en www.dcc.uchile.cl/~rbaeza/inf/algoritmia.pdf • C++ con Clase. Disponible en http://c.conclase.net/curso/index.php • Manual de C. Disponible en http://www.programacionutn.com.ar/manuales • Zorrilla Marta. Fundamentos de Programación. Universidad de Zorrilla. Disponible en http://personales.unican.es/zorrillm/PDFs/Docencia/ProgramacionComputadoras/temario/Tema1-presentaci%C3%B3n.pdf
Desarrollo UNIDAD IV: ESTRUCTURAS DE DATOS DINÁMICAS NO LINEAL de contenidos
ANEXO CLAVES DE RESPUESTAS AUTOEVALUACIÓN DE LA UNIDAD I 1. C
6. C
2. A
7. D
3. D
8. C
4. B
9. B
5. E
10. C
CLAVES DE RESPUESTAS AUTOEVALUACIÓN DE LA UNIDAD II 1. D
6. E
2. C
7. B
3. B
8. E
4. D
9. B
5. A
10. B
CLAVES DE RESPUESTAS AUTOEVALUACIÓN DE LA UNIDAD III 1. C
6. C
2. B
7. D
3. E
8. B
4. E
9. A
5. C
10. C
CLAVES DE RESPUESTAS AUTOEVALUACIÓN DE LA UNIDAD IV 1. E
6. D
2. B
7. C
3. D
8. D
4. B
9. A
5. D
10. E
ALGORÍTMIA Y ESTRUCTURA DE DATOS Actividades Autoevaluación MANUAL AUTOFORMATIVO
Lecturas seleccionadas
Glosario
Recordatorio
Anotaciones
Bibliografía
127
128