Algoritmia y estructura de datos

Page 1

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


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.