You are on page 1of 156

Guía Básica Estructuras de Datos

Marisol Gómez Ramírez. Msc. Ingeniería de Sistemas

Cali, febrero 2019


TABLA DE CONTENIDO

1. CONCEPTOS DE PROGRAMACION ORIENTADA OBJETOS


2. METODOLOGIA PARA LA SOLUCIÓN DE PROBLEMAS
3. ARREGLOS UNIDIMENSIONALES

4. METODOS DE ORDENAMIENTO USANDO ARREGLOS

5. ARREGLOS DE OBJETOS

6. ARREGLOS BIDIMENSIONALES O MATRICES

7. LISTAS

8. PILAS

9. COLAS

10. RECURSION

11. ÁRBOLES
INTRODUCCION

El siguiente material va dirigido a los estudiantes que quieren aprender la solución


de problemas computacionales usando diferentes estructuras de datos y siguiendo
una metodología de solución de problemas que les permitirá desarrollar
habilidades para formular los requerimientos del problema hasta hacer las pruebas
del programa. Esta metodología se aplicará en cada tema.

Se inicia con la presentación de los conceptos de programación orientada objetos,


que es el paradigma en el que se programara, en el capítulo 2 se explica la
metodología para la solución de problemas, en el capítulo 3 se inicia con los temas
de estructuras de datos como son los arreglos unidimensionales, en el capítulo 4
se explican los métodos de ordenamiento usando arreglos, en el capítulo 5 se
habla de los arreglos de objetos, en el capítulo 6 se aborda el tema de arreglos
bidimensionales o matrices, a partir del capítulo 7 se explican las estructuras
dinámicas como las listas, en el capítulo 8 el tema de cola, en el capítulo 9 el
tema de pilas y en el 10 se explica una forma alternativa para resolver problemas
repetitivos que es la recursión y se finaliza el capítulo 11 con el tema de árboles

Cada tema contiene un ejemplo donde se sigue cada paso de la metodología y al


final se dejan ejercicios del tema visto al estudiante. También se acompañará este
libro con los códigos completos de los programas de cada ejemplo. Espero este
material sea de gran ayuda a los estudiantes de programación.
CONCEPTOS DE PROGRAMACIÓN ORIENTADA OBJETOS

¿Qué es un objeto?

Un objeto representa alguna entidad de la vida real. Un objeto es una entidad que
encapsula datos (atributos) y acciones o funciones que los manejan (métodos)

Un objeto se identifica por un nombre o un identificador único que lo diferencia de


los demás.

Por ejemplo, el objeto cuenta de Ahorros número 12345 es diferente al objeto


Cuenta de Ahorros número 25789. En este caso el atributo o identificador que los
hace únicos es el número de la cuenta.

¿Qué es una clase?


Es una agrupación o colección de objetos que comparten una estructura común y
un comportamiento común. Es una plantilla que contiene la descripción general de
una colección de objetos. Consta de atributos y métodos los cuales resumen las
características y el comportamiento comunes de un conjunto de objetos.

Todo objeto (también llamado instancia de una clase), pertenece a alguna clase

Todos los objetos de una clase tienen los mismos atributos y comportamiento. Son
diferentes únicamente en los valores que contienen sus atributos.

Todos los objetos con el mismo estado interno e interfase se agrupan en una
clase.

Las clases son para los objetos lo que los tipos para los datos primitivos. Ejemplo:
Tipo de objetos
Tipo de datos (clase )
Persona
Alfonso Objetos
int Datos
numero_de_dias luisa
dia_del_mes jose_fernando

Atributos
Son los datos o variables que caracterizan al objeto y cuyos valores en un
momento dado indican su estado
Mediante los atributos se define información oculta dentro de un objeto, la cual
es manipulada solamente por los métodos definidos sobre dicho objeto

Métodos
Son las operaciones (acciones o funciones) que se aplican sobre los objetos y
que permiten crearlos, cambiar su estado o consultar el valor de sus atributos.

Ejemplo: Un rectángulo particular es un objeto caracterizado por los atributos


largo y ancho, y por varios métodos, como calcular su área y calcular su
perímetro.

Las clases no se construyen para que trabajen de manera aislada, la idea es


que ellas se puedan relacionar entre sí, de manera que puedan compartir
atributos y métodos sin necesidad de reescribirlos.

Las jerarquías entre las clases permiten extender y reutilizar el código existente
sin tener que reescribirlo cada vez que se necesite.

Las relaciones entre clases son:

• Agregación (todo / parte o forma-parte-de)


• Composición (es parte elemental de)
• Asociación (usa a )
Herencia (Generalización / Especialización, Es un) Es un tipo de jerarquía de
clases, en la que cada subclase contiene los atributos y métodos de una (herencia
simple) o más superclases (herencia múltiple).

Animal
-color: String
-patas: int
+comer()
+dormir()

Tigre Loro
-bigotes -alas

Agregación (Todo / Parte, Forma parte de) Es una relación que representa a los
objetos compuestos por otros objetos. Indica objetos que a su vez están formados
por otros. El objeto en el nivel superior de la jerarquía es el todo y los que están en
los niveles inferiores son sus partes o componentes.
Como la puerta forma parte del aula, el diamante va pegado a Aula

Composición
Un componente es parte esencial de un elemento. Si el componente es eliminado
o desaparece, la clase mayor deja de existir.

Persona
-nombre: String
+emorcionarse()
+tranquilizarse()

Corazon
-ritmo: int
+cambiarRitmo()
+leerRitmo()
Asociación («uso», usa, cualquier otra relación) Es una asociación que se
establece cuando dos clases tienen una dependencia de utilización, es decir, una
clase utiliza atributos y/o métodos de otra para funcionar

Estudiante Portaminas

Propiedades de los objetos

Encapsulación: los objetos muestran hacia afuera una interfase, pero ocultan la
implementación y el estado interno.

Abstracción: Ignorar detalles específicos buscando generalidades que ofrezcan


una perspectiva distinta, más favorable a su resolución.

Polimorfismo: una interfaz, varias implementaciones.

Un programa OO es una colección de objetos diciéndose unos a otros lo que


deben hacer por medio de paso de mensajes. Cada objeto tiene su propia zona
privada (estado interno), posiblemente conteniendo otros objetos.

Cada objeto es de un tipo (es decir pertenece a una clase). Las clases agrupan
objetos que manejan (reciben) el mismo tipo de mensajes.
Cada objeto tiene una interfase, que define el tipo de mensajes que puede recibir.
A su vez, cada objeto tiene una implementación oculta para el resto del mundo

Ejemplo de diagrama de clases de una orden en un restaurante


METODOLOGIA PARA LA SOLUCIÓN DE PROBLEMAS

La resolución de un problema mediante un ordenador consiste en el proceso que,


a partir de la descripción de un problema, expresado habitualmente en lenguaje
natural y en términos propios del dominio del problema, permite desarrollar un
programa que resuelva dicho problema.

Proceso en la solución de un problema

Fuente: Fundamentos de programación Aprendizaje activo, basado en casos


Pasos en la solución de un problema

Fuente: proyecto Cupido2 UNIANDES

1. Análisis: entender el problema de aquí salen los requerimientos funcionales


Un requerimiento funcional es una operación que el programa que se va a
construir debe proveer al usuario, y que está directamente relacionada con el
problema que se quiere resolver.

Un requerimiento funcional se describe a través de cuatro elementos:

• Un identificador y un nombre.

• Un resumen de la operación.

• Las entradas (datos) que debe dar el usuario para que el programa pueda
realizar la operación.

• El resultado esperado de la operación


2. Modelo del problema: se debe entender el mundo en que se necesita el
problema. De aquí sale el diagrama de clase, y para relaizar este diagrama
previamente se debe:
• Identificar las entidades del mundo: Las Entidades son los elementos del
mundo que intervienen en el problema. Dichos elementos pueden ser
concretos (una persona, un vehículo) o abstractos (una cuenta bancaria).
En programación orientada a objetos, las entidades del mundo se
denominan clases

• Documentar las características de cada una de ellas

• Definir las relaciones que existen entre las distintas entidades

3. Programa de prueba: Se asume que todo funciona y se muestra como


sería la secuencia lógica de pasos para ejecutar la solución (algoritmos)

4. Modelo de la solución, se crean los diagramas EPS (entrada, proceso y


salida) y los algoritmos, usando método de refinamiento iterativo.

Forma de un diagrama EPS

proceso

entrada salida

5. Codificación en el lenguaje de programación


En el diagrama EPS la entrada contiene los datos necesarios para calcular la
salida. La salida es lo que se quiere calcular o mostrar. Y el proceso son las
instrucciones que procesan las entradas para obtener la salida.
El refinamiento iterativo es la forma natural de programar para todos los
programadores. Se piensa en una idea, general, luego se va adicionando o
detallando más instrucciones.

Refinamiento iterativo

La construcción de la interfaz gráfica: No la trataremos

Ejemplo

Calcule el tiempo que se demora en llenar un tanque de agua con una llave
abierta cuya velocidad es vel (cm3/seg). El tanque tiene dimensiones de radio r
y altura h
Solución

1. Análisis- Requerimientos Funcionales


Nombre R1:Calcular el tiempo de llenado de un
tanque
Descripción Calcular el tiempo que tarda en llenarse un
tanque de forma cilíndrico, con base a su
radio, altura y velocidad con la que sale el
agua de la llave
Entrada El radio, la altura y la velocidad de salida del
agua
Resultado Se muestra el tiempo en que tarde en
llenarse el tanque.
2. Modelo del problema
Tanque
r: real
h: real
vel: real
calcularTiempo( )
3. Programa de prueba
Se asume que el programa Tanque ya se creó y que su método
calcularTiempo() funciona perfectamente y que hace el cálculo del tiempo de
llenado

Inicio
real tiempo=0.0
real r=leer (“Digite el valor del radio”)
real h=leer (“Digite el valor de la altura”)
real v=leer (“Digite el valor de la velocidad en cm 3/seg [real]”)
Tanque t= nuevo Tanque ( r, h, vel )
tiempo= t.calcularTiempo ( )
mostrar(“El tiempo que tarda el tanque en llenarse es: + tiempo”)
Fin

4. Modelo de la solución
Refinamiento 1: Diagrama EPS

Refinamiento 2: Algoritmo

real calcularTiempo ( )
Inicio
real vol=0.0
vol =PI*(r*r)*h
t=vol/vel
retorne t
fin

5. Codificación

Public class Tanque


{
double r;
double h; Atributos
double vel;
public double calcularTiempo ()

{
Nombre del método
double vol= Math.PI*r*r*h;
double t=vol/vel;
return t;
}
} Tipo de datos que retorna

Codificación del main

public class PruebaTanque {


Public static void main (String [] args) {
double r=0.0;
double h=0.0;
double vel=0.0;
double t=0.0;
r= leer("Digite el radio del tanque");
h= leer ("Digite la altura del tanque");
vel= leer ("Digite la velocidad de lallave");
Tanque ta = new Tanque (r,h,vel);
t= ta.calcularTiempo ();
mostrar ("Tiempo = "+t);
}
}

6. Pruebas
r h vel vol t

200 500 5 62800000 12560000


TALLER PROGRAMACION ORIENTADA OBJETOS

Resuelva los siguientes problemas, siguiendo la metodología antes vista.

1. La presión, el volumen y la temperatura de una masa de aire se relacionan por


la fórmula: Masa=(presion*volumen)/ (0.37 * (temperatura+460)). Realizar un
programa que permita hallar la masa conociendo la formula anterior.

2. Hacer un programa que calcule el nuevo salario de un obrero si se sabe


que obtuvo un incremento del 25% sobre su salario anterior. El programa debe
mostrar el nombre del empleado, el salario anterior y el nuevo salario.

3. Hacer un programa para calcular la distancia de un punto al origen. Dado

y
¿
por la formula ¿
¿
√¿

4. Realizar un programa que permita imprimir en pantalla la cantidad de números


múltiplos de 3 que se encuentran en la serie 1 a n, siendo n un número
digitado por un usuario.

5. Para ingresar al curso de Producción Cinematográfica se realizó una prueba


clasificatoria. Se tiene los resultados de dicho examen por aspirante (una nota
está comprendida entre 0.0 y 5.0) y se desea saber cuántos aspirantes
aprobaron el examen, cuántos lo perdieron (nota menor que 3.0) y cuál fue el
promedio de todo grupo de aspirantes. No se sabe cuántos aspirantes son, pero
sabemos que cuando se quiera indicar que se finalizó el ingreso de notas se
digitará un valor negativo. (use ciclo do-while)
ARREGLOS UNIDIMENSIONALES

Un arreglo es una estructura de datos que permite el almacenamiento de varios


datos del mismo tipo, bajo el mismo nombre de variable

Características de los arreglos


• Almacenan los elementos en posiciones contiguas de la memoria.
• Todos los elementos del arreglo se representan con un mismo nombre.
• Los arreglos pueden ser de tipo: int, long, float, double, char entre
otros.
• Para hacer referencia a los valores almacenados en el arreglo se
necesita de un índice.

Tipos de arreglos
•Arreglos unidimensionales o vectores: una dimensión, 1 índice
•Arreglos bidimensionales o matrices: dos dimensiones, 2 índices
•Multidimensionales: Más de 2 dimensiones.

Declaración de un vector

La sintaxis para la declaración de un vector es:


Tipo_dato [ ] identificador; o Tipo_dato identificador [ ];

Para declarar un vector que almacena números de tipo entero seria:


int [ ] numeros; o int números [ ];

Para declarar un vector que almacena el valor de las ventas de un


almacen.seria:
float [ ] ventas; o float ventas[];

Para declarar un vector que almacena caracteres seria:


char [ ] letras; o char letras[];

La sintaxis para la inicialización de un vector es:


Identificador = new tipoDato [tamaño];

Para declarar e inicializar un vector que almacena 10 números de tipo entero


int [ ] numeros;
numeros = new int [10];

Inicialización de un vector con valores fijos


int numeros[]; //primero se declara
numeros = {10, 20, 30, 40, 50, 60, 70, 80,90, 100}; //luego se inicializa de esta
forma.

Declaración e Inicialización de un vector de tipo char


char dato [] = {‘h’, ‘o’, ‘l’, ‘a’}; // Aquí la declaración e inicialización se hicieron en un
solo paso, esto es recomendable dentro de los métodos no en la clase.

Asignar un valor a una posición del vector


numeros[2] = 25;

Declaración e inicialización de un arreglo tipo String


String nombres;
nombres= new String[5]; //Por defecto todas las posiciones se inicializan con “ ”
(cadena vacía)

Luego en cada posición del arreglo se almacena un valor de tipo String


nombres[0] = “Victor”;
nombres[1] = “Nathalie”;
nombres[2] = “Veronica”;
nombres[3] = “Luz Estela”;
nombres[4] = “Juan Manuel”;

Lo anterior también puede hacerse así:


String nombres[ ] = {“Victor”, “Nathalie”, “Veronica”, “Luz Estela”, “Juan Manuel” };

Ejemplo problema con arreglos


Se requiere un programa para registrar los puntajes de los participantes en una
competencia de natación. El programa debe permitir:
 Registrar los puntajes de los participantes
 Modificar los puntajes
 Mostrar todos los puntajes
 Sumar los puntajes de un participante
 Mostrar el menor puntaje en la competencia.
Solución

1. Análisis R1-Registrar puntajes

Nombre
Resumen Permite guardar los puntajes de la competencia

Entradas Cantidad de datos a registrar, puntajes de los participantes

Resultado o salida Todos los puntajes almacenados

1. Análisis - Listado de Requerimientos

Nombre R2 - Modificar puntajes

Resumen Permite modificar un puntaje de un participante

Entradas Valor del puntaje a modificar y a cual participante se le


modifica.
Resultado o salida Puntaje actualizado

Nombre R3 – Mostrar puntajes

Resumen Permite mostrar todos los puntajes

Entradas Puntajes.

Resultado o Mensaje con todos los valores de los puntajes


salida
Nombre R4 – Obtener menor puntaje

Resumen Obtiene el puntaje menor de todos los puntajes

Entradas Puntajes.

Resultado El elemento menor del arreglo


o salida

Nombre R5 – Sumar puntajes

Resumen Permite sumar todos los puntajes almacenados

Entradas puntajes

Resultado El resultado de la suma de los puntajes


o salida

2. Modelo del problema: Diagrama de clase

3. Programa de Prueba
Inicio

Competencia objCompetencia=nuevo Competencia()

entero t=leer(“Digite la cantidad máxima de participantes”)


objCompetencia.setTamanho(t)

entero t=leer(“Digite cuantos participantes va a registrar”)

objCompetencia.registrarPuntaje(t)

mostrar (“Los puntajes ingresados son”, objCompetencia.mostrarPuntajes())

mostrar (“El puntaje menor es” ,objCompetencia.menorPuntaje())


objCompetencia.insertarNuevo()

objCompetencia.sumarPuntaje()

Fin

4. Modelo de la solución
Refinamiento 1: Diagrama EPS R1: registrar puntajes
Proceso
Entrada Salida
Cantidad, puntaje de
cada participante A través de un ciclo desde o hasta la
cantidad de participantes, se pide el Puntajes
puntaje obtenido por cada participante registrados
y se registra en el arreglo de
participantes

Refinamiento 2

Algoritmo registrarPuntajes
Inicio
para i =0 hasta que i<cantidad
puntajes[i]=leer(ingrese el puntaje del participante (i+1))
fin para
Fin
Diagrama EPS R2: modificar puntajes

Entrada Proceso Salida

dato, posicion
Se valida que la posición sea válida, es
decir sea mayor que 0 y menor que la puntajes
última posición.
Si es válido se guarda el dato en el arreglo
en la posición indicada

Refinamiento 2

Algoritmo modificarPuntajes
Inicio
Si posición>0 y posicion<posUltimo
puntajes[posicion]=dato

Fin
Diagrama EPS R4: mostrar puntajes

Entrada Proceso Salida

puntajes Se recorre el vector desde la posición


0 hasta la última posición, y en una mensajes con
variable de tipo String se va puntajes
concatenando el contenido de cada
posición del arreglo

Algoritmo mostrarPuntajes
Inicio
Cadena mensaje
para i =0 hasta que i<posUltimo
mensajes=mensaje + puntajes[i]
fin para
Fin
Diagrama EPS R3: Obtener menor puntaje

Proceso

Entrada Se asume que el menor es el que está en la primera


Salida
posición y se guarda en una variable llamada menor.
Se recorre el vector desde la posición 1 hasta la
última posición, y se va comparando la variable
puntajes menor con cada uno de los valores contenidos en el menor
arreglo, en caso de haber uno más pequeño, la
variable menor se actualiza con este valor. Al final se
muestra el menor

Refinamiento 2

Algoritmo menorPuntajes
Inicio
menor= puntajes[i]
para i =1 hasta que i<posUltimo
Si puntajes[i]<menor
menor = puntajes[i]
fin para
Fin Diagrama EPS R4: sumar puntajes

Proceso Salida
Entrada

Se inicializa una variable llamada suma


puntajes para acumular la suma de los puntajes, se
recorre el arreglo desde la posición 0 hasta
la última posición y el valor de cada suma
posición se va acumulado en la variable
suma.
Refinamiento 2

Algoritmo sumarPuntajes
Inicio
suma= puntajes[0]
Hacer para i =0 hasta que i<posUltimo
suma=suma+puntajes[i]

fin hacer para


Fin
5. Codificación

Clase y Método constructor

Codificación método registrarPuntajes


Codificación método modificar

Codificación método mostrarPuntajes

Codificación método menorPuntaje


Codificación método sumaPuntajes
6. Pruebas

Pruebas método registrarPuntajes

posUl i cantid i<cantida salida ppuntajes


timo ad d
0 0 3 0<3 Digite el puntaje 50 0 0
verdadero del participante
1

1 1 1<3 Digite el puntaje 50 60 0


verdadero del participante
2

2 2 2<3 Digite el puntaje 50 60 70


verdadero del participante
3

3 3 3<3
falso //fin
ciclo
Pruebas método mostrarPuntajes

mensaje i<posUltimo

“” 0<3 verdadero
puntajes[0]=50 1<3 verdadero

puntajes[0]=50 2<3 verdadero


puntajes[1]=60
puntajes[0]=50 3<3 falso
puntajes[1]=60
puntajes[2]=70
Pruebas método sumaPuntajes

suma i i<posUltimo puntajes

0 0 0<3 verdadero 50 60 70

0+50=50

1 1<3 verdadero

50+60=110

2 2<3 verdadero

110+70=180

3 3<3 falso
Fin ciclo
TALLER ARREGLOS

1. Se requiere un programa para manejar los sueldos de n empleados de una


empresa, de los cuales se desea:

a) Registrar la información de los salarios

b) Saber cuántos empleados ganan más del salario mínimo

c) Saber cuántos empleados ganan menos que el sueldo mínimo

d) Calcular los sueldos de cada empleado menos el 10% de su sueldo.

e) Ordenar los sueldos de mayor a menor.

2. Se requiere un programa para almacenar las opciones del menú de


almuerzo en un restaurante para los 7 días de la semana, el programa debe
permitir

a) Guardar el nombre del menú para cada día


b) Dado el número del día mostrar que se prepara ese día.

c)Dado en nombre del menú decir en qué día se prepara este plato.
METODOS DE ORDENAMIENTO USANDO ARREGLO

El propósito principal de un ordenamiento es el de facilitar las búsquedas de


los elementos del conjunto ordenado.

Método de selección

Consiste en encontrar el menor de todos los elementos del arreglo e intercambiar


con el que está en la primera posición. Luego el segundo más pequeño y así
sucesivamente hasta ordenar todo el arreglo.

Método de la Burbuja

• Se basa en la idea de intercambiar todo par de elementos consecutivos que


no se encuentran en orden. Al final de cada pasada haciendo ese
intercambio, un nuevo elemento queda ordenado y todos los demás
elementos se acercan a su posición final.

• El método se llama burbuja, porque hace que los elementos vayan


subiendo poco a poco (como las burbujas de agua) hasta ocupar su
posición final.

• Al final de la primera iteración el último elemento se encuentra ya ordenado.

• Al final de cada iteración, en la parte final del arreglo están los elementos ya
ordenados, los cuales además son mayores que todos los elementos que
faltan por ordenar.

1. Análisis: listado de requerimientos

Nombre R1-Inicializar arreglo

Resumen Permite llenar un vector de números


con datos ingresados por el usuario
Entradas Arreglo vacío

Resultado o salida Vector lleno de números


Nombre R2- Mostrar arreglo
Resumen Permite mostrar el contenido de todo
el vector
Entradas Vector de números
Resultado o salida Cadena con todos los valore del vector

Nombre R3:Ordenar un arreglo por selección

Resumen Permite ordenar los elementos de un


vector de números
Entradas Vector de números

Resultado o salida Vector ordenado

Nombre R4:Ordenar un arreglo por burbuja

Resumen Permite ordenar los elementos de un


vector de números
Entradas Vector de números

Resultado o salida Vector ordenado

2. Modelo del problema: diagrama de clase


3.Programa de prueba

Inicio

Ordenamiento objOrdenamiento=nuevo Ordenamiento


objOrdenamiento.inicializarVector()

objOrdenamiento.mostrarVector

objOrdenamiento.ordenarSeleccion

objOrdenamiento.ordenarBurbuja

fin

3. Modelo de la solución

Dado que ya se explicó en el capítulo anterior solo se va a realizar los modelos de


los métodos de ordenamiento que es lo importante en este capitulo.
R3: Ordenar un arreglo por selección

Algoritmo ordenamientoSeleccion

Inicio

entero menos, pos, aux

para i=0 hasta i<tamaño-1

menor=numeros[i]

pos=i

para j=i+1 hasta j<=tamaño

si numeros[i]<menor

menor=numeros[i]

pos= j

fin si

fin para

aux=numero

numero[i]=menor
numeros[pos]=aux

fin para

fin

R4: Ordenar un arreglo por Burbuja

Algoritmo burbuja

Inicio

entero temp

para i=0 hasta i<tamaño-1

para j=0 hasta j<=tamaño -1

si numeros[j]>numeros[j+1]

temp=numeros[j]

numeros[j]=numeros[j+1]

numeros[j+1]=temp

fin si

fin para

fin para
fin

4. Código del método ordenarSelección


Código método de la ordenarBurbuja
5. Prueba método ordenarSelección
Prueba del método ordenarBurbuja
ARREGLOS DE OBJETOS

Ejemplo: El profesor del curso de matemáticas, requiere un programa para


manejar la información de las notas de sus estudiantes: La información requerida
es: Nombre, código, nota del primer parcial (30%), nota del segundo parcial (30%)
y nota del tercer parcial (40%).
El profesor quiere que el programa le permita:
• Ingresar la información de un estudiante
• Calcular la nota definitiva de un estudiante dado su código.
Dado el nombre del estudiante, mostrar toda la información de este estudiante
 Conocer el promedio del curso. (este se calcula teniendo en cuenta la nota
definitiva de cada estudiante)

1. Análisis- Requerimientos funcionales


Nombre R1-Registrar la información de un estudiante
Resumen Permite guardar la información de un estudiante
Entrada Nombre, código, nota del parcial 1, nota del parcial 2, nota del
parcial 3
Resultado o Un estudiante registrado en el sistema
salida
Nombre R2-Calcular definitiva de un estudiante
Resumen Permite calcular la nota definitiva de un estudiante, dado su
código.
Entrada Código de un estudiante, y las notas de parciales de los
estudiantes.
Resultado o Se muestra mensaje con la nota definitiva
salida
Nombre R3- Mostrar la información del estudiante
Resumen Dado el nombre de un estudiante, muestra toda la información
para ese estudiante.
Entrada nombre de un estudiante, información de los estudiantes.

Resultado o Se muestra mensaje con la nota la información del estudiante


salida
Nombre R4-Calcular promedio grupal
Resumen Calcula el promedio del todo el curso
Entrada Notas de los estudiantes
Resultado o Se muestra el promedio de todo el curso.
salida
Nombre R4-Mostrar nota más alta dado código
Resumen Dado el código de un estudiante, mostrar la nota más alta de
este estudiante y decir a que evaluación pertenece.
Entrada Código, y las notas de todos los estudiantes
Resultado o Se muestra mensaje con la nota más alta y la evaluación a la
salida que pertenece,
2. Modelo del problema - Diagrama de Clase

Si son varios
estudiantes, ¿Cómo
se representan?
3. Programa de Prueba

Inicio

Curso objCurso=new Curso(); //se crea el objeto

entero t=leer("Digite La cantidad máxima de estudiantes");

objCurso.DarTamaño(t);

Estudiante objEstudiante=nuevo Estudiante();

objCurso.registrarEstudiantes();

String cod=leer("ingrese el código del estudiante para saber su nota definitiva")

objCurso.definitivaDadoCodigo(cod)
mostrar("los datos son:"+ objCurso.mostrarDatos())
mostrar("El promedio del grupo es:"+ objCurso.calcularPromedio())
mostrar("los datos son:"+ objCurso.mostrarDatos())

4.Modelo de la solución
EPS A partir de R1-Registrar la información de un estudiante

Proceso
Entrada Salida

Nombre, Codigo, Se crea un estudiante y Se pide al


parcial1, parcial2 2, usuario cada uno de los datos de estudiante
parcial 3 un estudiante y se almacenan en registrado
cada uno de los campos del
estudiante
Refinamiento 2

Algoritmo registrarEstudiante
Inicio
Estudiante objEstudiante=nuevo Estudiante();
Se llenan los datos para ese estudiante
se almacena este estudiante en el arreglo
Fin

Refinamiento 3

Algoritmo registrarEstudiante
Inicio
dsfeses Estudiante objEstudiante=nuevo Estudiante(); //se crea un estudiante
objEstudiante.guardardatos(); // hace un algoritmo para pedir los datos
si posUltimo<tamanho //se verifica que quede espacio en el vector
estudiantes[posUltimo]=objEstudiante; //se guarda el objeto en el vector
posUltimo++;
Fin

Refinamiento 4: Se realiza otro algoritmo para pedir los datos del estudiante

Algoritmo guardarDatos
Inicio
nombre=leer (“Ingrese nombre del estudiante”)
codigo=Leer (“Ingrese el código del estudiante”)
parcial1=Leer “Ingrese la nota del primer parcial”)
parcial2=Leer “Ingrese la nota del primer parcial”)
parcial3=Leer “Ingrese la nota del primer parcial”)
Fin

EPS A partir de R2-Calcular definitiva de un estudiante


Proceso
Entrada
Salida
Se lee el código de un estudiante,
cod, conjunto de
este se busca dentro del conjunto
estudiantes. de estudiantes y cuando se
encuentre un estudiante con este
código, entonces se calcula la nota
de este estudiante con la formula: notaFinal
notaFinal=parcial1*0.3 +
parcial2*0.3+parcial3*0.4

Refinamiento 2

Algoritmo definitivaDadoCodigo(entero cod)


Inicio
para i desde la posición 0 hasta ultimo dato guardado
Comparar cod con el código de cada posición en el vector
Si son iguales calcular la nota final para este código.
Fin

Refinamiento 3

Algoritmo definitivaDadoCodigo(entero cod)


Inicio
para i desde la posición 0 hasta ultimo
si cod=estudiantes[i].codigo
notafinal=estudiantes[i].definitiva()
Fin
Refinamiento 4 se hace otro algoritmo para calcular la nota definitiva de un
estudiante

Algoritmo definitiva
Inicio
notaFinal=parcial1*0.3 + parcial2*0.3+parcial3*0.4
devolver notaFinal
Fin

EPS A partir de R3-Mostrar la información del estudiante

Proceso
Salida
Entrada
Se lee el nombre de un estudiante,
nom, conjunto de este se busca dentro del conjunto de Nombre, codigo,
estudiantes y cuando se encuentre un
estudiantes. estudiante con este nombre, entonces
parcial1, parcial2,
se muestra la información para ese parcial3
estudiante

Algoritmo mostrarDatos
Inicio
nom=leer (“Ingrese el nombre del estudiante”)
para i desde la posición 0 hasta ultimo dato guardado
si nom=estudiantes[i].nombre
mostrar estudiantes[i].nombre
Fin
EPS A partir de R4 Calcular promedio grupal

Proceso
Entrada Salida

Se recorre el conjunto de estudiantes y para cada


conjunto de uno se va acumulando la suma de sus notas
definitivas Después de recorrer todos los estudiantes
estudiantes. se divide la suma de las notas definitivas entre la promedio
variable posUltimo

Refinamiento 2

Algoritmo promedio
Inicio
para i desde la posición 0 hasta último dato guardado
suma= suma+ estudiantes[i].definitiva() // se llama al algoritmo anterior
promedio=suma/posUltimo
devolver promedio
Fin

5. Codificación registrarEstudiante
Codificación método guardarDatos
Codificación método definitivaDadoCodigo

Codificación método definitiva


Codificación mostrarPorNombre

Codificación método promedio


5.Pruebas

Método promedio

promedio i posUltimo i<posUlti estudiantes


mo

0.0 0 3 0<3 v “Juan “Jaime “Sandra


Pérez”- Gómez”- Tamayo”-
01- 3 - 02- 4 - 4 - 03 - 3.5 - 5
4- 5 4 -2

0.0+4.1=4.1 1 1<3 v

4.1+4=8.1 2 2<3 v

8.1+3.35=11.45 3 3<3 f

11.45/3=3.81

Prueba método definitiva

parcial1 parcial2 parcial3 notaDefinitiva

3 4 5 4.1

4 4 4 4

3.5 5 2 3.35

Las otras pruebas se dejan al estudiante


TALLER ARREGLOS DE OBJETOS

Resuelva los siguientes problemas siguiendo la metodología de solución de


problemas explicada por el profesor.

1. Una empresa requiere un programa para manejar la información de sus


empleados, Nombre, número de cédula, salario base, comisiones, cargo que
ocupa en la empresa. El programa debe contener operaciones para:
 Registrar la información de los empleados
 Calcular el salario total de un empleado que es igual a la suma del salario
básico más las comisiones.
 Conocer cuánto gasta la empresa en pago de nómina.
 Mostrar los datos de un empleado dado su número de cédula.
 Mostrar el nombre de todos los empleados de la empresa.
 Dado un cargo, decir cuántas personas tienen ese cargo en la empresa.

2. Un almacén requiere un programa para manejar la información de los artículos


que vende.

Los artículos manejan la información de nombre, código, precio de venta,


existencia del artículo (que representa la cantidad de este artículo que hay en el
almacén)

Se necesita que el programa realice las siguientes operaciones:

a) Registrar la información de los artículos

b) Conocer el nombre del artículo que tienen mayor cantidad de existencias


en el almacén.

c) Dado el código de un artículo mostrar el resto de la información del articulo


d) Mostrar el total de artículos del almacén (la suma de todas las existencias
de cada artículo).

e) Cuánto dinero se espera recaudar al vender todos los artículos de


determinado código.

f) Cuál es el nombre del artículo con menor existencia en el almacén.

Nota: Usted puede agregar los métodos que considere necesarios dentro del
programa.
ARREGLOS BIDIMENSIONALES O MATRICES

Definición

También conocidos como tablas o matrices Se caracteriza por manejar dos


dimensiones, es decir que requiere de dos subíndices, uno para manejar las filas y
otro para el manejo de las columnas. M[f][c]

Representación de una matriz de 3 filas, 3 columnas

Columnas

(0,0) (0,1) (0,2)


Filas (1,0) (1,1) (1,2)

(2,0) (2,1) (2,2)

Posiciones Posiciones
dentro de la
matriz
Declaración e inicialización de la matriz en Java

Utilizando la palabra clave new:


TipoDato nombreArreglo[ ][ ]; //primero se declara

nombreArreglo=new tipo_dato[numfilas][numcolumnas]; //Inicialización

Ejemplo:
double temperatura [ ][ ]; //declaración
temperatura = new double[2][3]; //Inicialización, con 2 filas y 3 columnas

Cuando no se define el número de columnas


TipoDato nombreArreglo[ ][ ];
NombreArreglo= new tipo_dato[numfilas][ ];

Ejemplo:
int m [ ][ ];
m= new int[3][]; //se inicializa con dos filas,

En este caso a cada fila se le puede asignar un número distinto de columnas:


m[0] = new int[3]; //la fila 0 se inicializa con 3 columnas
m[1] = new int[5]; //la fila 1 se inicializa con 5 columnas
m[2] = new int[2]; //la fila 2 se inicializa con 2 columnas

Inicializar la matriz con valores establecidos

TipoDato nombreArreglo[][];
nombreArreglo= new tipoDato[][] {{fila0},{fila1},…};
Ejemplo:

double temperatura[ ][ ];
temperatura = new double[ ][ ] {{20.5, 30.6, 28.3 }, {38.7,10.3,16.2 } };
Lo anterior también se puede hacer asi:
temperatura [0][0] = 20.5; temperatura [0][1] = 30.6; temperatura [0][2] = 28.3;
temperatura [1][0] = 38.7; temperatura [1][1] = 10.3; temperatura [1][2] = 16.2;

Para actualizar el valor de una posición en el arreglo


temperatura [0] [1] =18.3; remplaza 30.6 por 18.3

Acceder a los datos la matriz

NombreArreglo[indiceFila][indiceColumna]

Ejemplo:
System.out.print(temperatura[1][2]); imprime 16,2

Ejemplo de Matrices

Se requiere un programa para manejar los puntajes de los participantes en una


competencia de natación. El número de participantes puede variar y la
competencia dura 4 días (lunes, martes, miércoles y jueves).
El programa debe permitir además de registrar la información, mostrar todos los
puntajes, mostrar el valor menor de los puntajes, sacar el promedio de los
puntajes.

Solución
El problema anterior requiere el uso de matrices, ya que si lo resolvemos con
vectores (arreglos en una dimensión), tendríamos que crear vectores uno por cada
día o por cada participante, lo cual es ineficiente, pues requeriría crear muchas
variables.

Para resolver el problema se va a crear una matriz donde las filas representan los
participantes y las columnas representan cada uno de los días.

1. Análisis: Listado de requerimientos

Nombre R1-Registrar puntajes

Resumen Permite ingresar los puntajes de los participantes

Entradas Cantidad de participante y puntajes de los


participantes.

Resultado o salida Puntajes de los participantes registrados

Nombre R2-Mostrar puntajes

Resumen Permite mostrar los puntajes de los participantes

Entradas puntajes

Resultado o salida Mensaje con todos los puntajes

Nombre R3-Calcular promedio


Resumen Permite calcular promedio de la matriz de puntajes.

Entradas puntajes

Resultado o salida Se muestra promedio de puntajes

Nombre R4-Calcular el puntaje más bajo

Resumen
Permite calcular el menor puntaje de todos los
participantes.

Entradas puntajes

Resultado o salida Se muestra el puntaje menor.

2. Modelo del problema: Diagrama de clase

3. Programa de prueba

Inicio
Entero cantidadJugadores=0 cantidadJugadores=leer(“Ingrese cantidad de jugadores”)
Competencia objCompetencia=nuevo Competencia(cantidadJugadores)
objCompetencia.registrarPuntaje()
Mostrar (“Los puntajes ingresados son”, objCompetencia.mostrarPuntajes())
Mostrar (“el puntaje promedio es ” , objCompetencia.calcularPromedio())
Mostrar (“El puntaje menor es” , objCompetencia.calcularMenor())
Fin

4. Modelo de la solución

Diagrama EPS de R1 Registrar puntajes

proceso

se pide ingresar para cada salida


entrada
participante en cada día el valor
puntaje1, puntaje2, del puntaje, se usan dos ciclos puntajes
puntajeN, uno para las filas y otro para
las columnas.

Refinamiento 2

Inicio
para fil=0 hasta fil<numFilas
para col=0 hasta col<numColumnas
puntajes[fil][col]=leer(“Digite puntaje”, fil, col)
fin para
fin para
fin
Diagrama EPS de R2 Mostrar puntajes
Entrada Proceso

Se recorre la matriz de puntajes con Salida


dos ciclos uno para las filas y otro
puntajes[][] para las columnas de cada fila y se mensaje
va concatenando en una variable de
tipo cadena los puntajes de cada
posición de la matriz

Inicio
cadena mensaje=“ ”
para fil=0 hasta fil<numFilas
para col=0 hasta col<numColumnas
mensaje= mensaje ,fil, col, es, puntaje [fil][col]
fin para
fin para
devolver mensaje
fin
Diagrama EPS de R3 Calcular promedio

Entrada Proceso

Salida
Se recorre la matriz de puntajes a través
de dos ciclos uno para las filas y otro para
puntajes[][] promedio
las columnas, y se va sumando cada uno
de los elementos, Al final se divide el
resultado de la suma entre la cantidad de
puntajes.

Inicio
real promedio=0.0
para fil=0 hasta fil<numFilas
para col=0 hasta col<numColumnas
promedio=promedio+ puntaje [fil][col]
fin para
fin para
promedio=promedio/(numFilas*numColumnas)
devolver promedio
fin
Diagrama EPS de R4 Calcular menor

Proceso

Se asume que el elemento menor está en la posición 0,


Entrada este valor se almacena en la variable masBajo, luego se Salida
recorre la matriz de puntajes y se va comparando cada
elemento con la variable masBajo, si se encuentra que es masBajo
puntajes[][] más pequeño el valor de que hay en la matriz entonces la
variable masBajo se actualiza con este valor.

Inicio
real masBajo=0.0
para fil=0 hasta fil<numFilas
para col=0 hasta col<numColumnas
si (puntaje[fil][col]<masBajo)
masBajo=puntaje[fil][col]
fin para
fin para
devolver masBajo
fin
5.Codificación

Clase y Método Constructor

Método registrarPuntajes()
Método mostarPuntajes

Método calcularPromedio
Método calcularMenor
6.Pruebas
Método registrarPuntajes

fil fil<numFilas co col<numColumn salida puntajes


fil fil<numFilas col col<numColumnas mensaje puntajes
l as
“” 20 30
00 0<2
0<2 verdadero0 0 0<2
0<2 verdadero
verdadero Digite
0,0 es 20 el502060

verdadero puntaje 0,0


1 1<2 verdadero 0,0 es 20
20
0,1 es 30
2 2<2 false fin ciclo
1 1<2 verdadero Digite el 20 30
1 1<2 0 0<2 verdadero 0,0 es 20
puntaje 0,1 30
0,1 es 30
verdadero
2 2<2 false fin ciclo 1,0 es 50
1 1<2 verdadero 0,0 es 20
1 1<2 verdadero 0 0<2 verdadero Digite
0,1 es 30 el 20 30
puntaje
1,0 es 50 1,0
50
1,1 es 60
50
2 2<2 falso
2 2<2 falso fin 1 1<2 verdadero Digite el 20 30
puntaje 1,1
60
2 2<2 falso 50 60

2 2<2 falso fin

Método mostrarPuntajes
Método calcularPromedio

fil fil<numFilas col col<numColumnas promedio puntajes

0 0.0 20 30
0 0<2 verdadero 0 0<2 verdadero 20 50 60

1 1<2 verdadero 50
2 2<2 false fin ciclo
1 1<2 verdadero 0 0<2 verdadero 100

fil fil<numFilas col


1 1<2 verdadero
col<numColumnas masBajo if
160 puntajes

2 2<2 falso (puntajes[fil][col]<masBajo)


0 20 20 30
2 2<2 falso fin
0 0<2 0 0<2 verdadero 20<20 falso 50 60
verdadero 40
1 1<2 verdadero 30<20 falso

2 2<2 false fin ciclo

1 1<2 0 0<2 verdadero 50<20 falso


verdadero
1 1<2 verdadero 60<20 falso

2 2<2 falso
2 2<2 falso
fin

Método calcularMenor
TALLER MATRICES

Modifique el programa del ejemplo de la competencia, para manejar la información


de los puntajes obtenidos por los jugadores de una competencia, donde las
columnas representan cada día de la competencia. (lunes, martes, miércoles,
jueves) y las filas corresponden a cada jugador, en total n jugadores. Los nombres
de los jugadores se almacenan en un vector, al igual que el nombre de los días.

Permitir que el programa contenga métodos para:

a) Calcular el promedio de puntajes.


b) Mostrar el nombre del jugador que obtuvo el puntaje más alto.
c) Mostar el día en que se obtuvo la competencia con menos puntaje (de
toda la matriz).
LISTAS

Es una estructura de datos dinámica que contiene una colección de elementos


homogéneos, con una relación lineal entre ellos.

Primer nodo
Ultimo nodo

 Cada elemento (a excepción del primero) tiene un precedente y cada


elemento (a excepción del último) tiene un sucesor.
 Una lista enlazada puede reemplazar a los arreglos como base para otras
estructuras de almacenamiento como pilas y colas.
 La ventaja permite optimizar el uso de la memoria, pues no desperdiciamos
el espacio de localidades vacías. Son ampliamente utilizadas.
 La desventaja: deben ser recorridas desde su inicio para localizar un dato
particular. Es decir, no hay forma de acceder al i-ésimo dato de la lista,
como lo haríamos en un arreglo

Elementos de una lista

Una lista se conforma de:

 Primer Nodo: inicio de la lista


 Un conjunto de métodos para operarla.

Los nodos son cada uno de los elementos que conforman la lista enlazada y este
nodo está formado mínimo por los campos: información que es el valor que
almacena y el enlace que indican la ubicación al siguiente nodo. Al primer nodo se
le llama el tope de la lista o cabeza de la lista.

Operaciones sobre listas

Insertar, eliminar u obtener un dato en cualquier posición de la lista.

Ejemplo con Listas Enlazadas

Se requiere implementar un programa para manejar las ventas de varios


vendedores en un almacén. De cada vendedor es importante registrar su nombre,
cédula y el valor de la venta.

Solución

1. Análisis - Listado de requerimientos


Nombre R1-Ingresar vendedor al inicio

Resumen Permite guardar la información de un vendedor o


varios al inicio de las lista
Entradas Nombre del vendedor, cédula y valor de venta y
la lista
Resultado o salida La lista con un nuevo vendedor

Nombre R2-Mostrar la información de la lista

Resumen Muestra la información de los vendedores en la


lista
Entradas Todo los vendedores

Resultado o salida Un mensaje con la información de todos los


vendedores

Nombre R3-Ingresar vendedor al final

Resumen Permite ingresar uno o varios vendedores al final


de la lista

Entradas Nombre del vendedor, cédula, valor de venta y la


lista
Resultado o salida Un nuevo vendedor almacenado al final de la
lista
Nombre R4-Calcular el total de ventas en el almacén

Resumen Permite calcular el total de ventas que realizaron


todos los vendedores

Entradas Lista de vendedores

Resultado o salida Suma total de las ventas de todos los vendedores

Modelo del mundo del problema- Diagrama de Clases


3. Programa de prueba

Inicio
ListaVendedor objLista=nuevo ListaVendedor()
entero cantidad=leer (“¿Cuantos vendedores va a ingresar?”)
objLista.insertarInicio(cantidad)
mostrar (“Los vendedores ingresados son”, objLista.mostrarLista())
mostrar (“La suma total es:”,objLista.totalVentas())
objLista.insertarInicio(cantidad)
mostrar (“Los vendedores ingresados son”, objLista.mostrarLista())

Fin

4.Modelo de la solución
Diagrama EPS de R1-Ingresar vendedor al inicio

Se hace un ciclo desde 1 hasta la Salida


Entrada cantidad de vendedores, dentro del
cual se crea un vendedor vacío, se
piden los datos al usuario para este
nombreVendedor , vendedor y se inserta al inicio de la lista, ListaVendedores
cedula, valor de enlazando el nuevo vendedor con el con el nuevo
venta y primer elemento de la lista y se vendedor al inicio
ListaVendedor actualiza la variable primero con el
nuevo vendedor.

Iteracion 2

Algoritmo InsertarInicio(entero cantidad)


inicio
para i=1 hasta i<=cantidad
Vendedor nuevoVendedor=nuevo Vendedor()
nuevoVendedor.pedirDatos()
nuevoVendedor.enlace=primero
primero=nuevoVendedor
fin para
fin

Iteración 3
Algoritmo pedirDatos
inicio
nombre=leer("Ingrese el nombre del vendedor")
cedula=leer("Ingrese el número de cédula del vendedor")
valorVenta=leer("Ingrese el valor de la venta")
fin

Diagrama EPS de R2-Mostrar la información de la lista

Se crea una variable auxiliar y se le asigna Salida


Entrada
al primer elemento de la lista. Se recorre la lista
actualizando la variable auxiliar a través del campo
enlace, se obtiene los datos del vendedor y se van
mensaje
ListaVendedores concatenando en una variable de tipo String. Esto se
vacia repite hasta que la variable auxiliar sea null
.

Iteración 2
Algoritmo cadena mostrarLista
inicio
Cadena mensaje=” ”
Vendedor auxiliar=primero
mientras (auxiliar<>null)
mensaje=mensaje+auxiliar.mostarDatos()
auxiliar=auxiliar.enlace
devolver mensaje
fin
Diagrama EPS de R3-Ingresar vendedor al final de la lista
Proceso

Salida
Entrada Dentro de un ciclo que va desde 1
hasta la cantidad de vendedores,
nombreVendedor , Se crea un vendedor vacío y se
piden los datos para este ListaVendedores
cedula, valor de
vendedor, se recorre la lista hasta
venta y Lista llegar al final y se inserta el
Vendedores vendedor al final de la lista,
enlazando el ultimo nodo con el
nuevo vendedor.
piden los

Iteración 2

Algoritmo InsertarFinal (entero cantidad)


Inicio
Vendedor ultimo, nuevoVendedor
para i=1 hasta i<cantidad
ultimo=primero
nuevoVendedor= nuevo Vendedor()
nuevoVendedor.pedirDatos()
si primero<>null
mientras ultimo.enlace<>null
ultimo=ultimo.enlace
ultimo.enlace=nuevoVendedor
si no
primero=nuevoVendedor
finsi
fin
Diagrama EPS de R4-Calcular el total de ventas en el almacén

Salida
Entrada Se crea una variable auxiliar ,
se asigna el primer elemento de
la lista ,se va recorriendo la lista
a través del campo enlace de la suma
ListaVendedor variable auxiliar, mientras que la
variable auxiliar sea diferente de
nulo y cada valor de venta del
nodo vendedor se acumula en la
variable suma.

Algoritmo totalVentas
Inicio
Vendedor auxiliar=primero
doublé suma=0
mientras (auxiliar<>nulo)
suma=suma+auxiliar.valorventa
auxiliar=auxiliar.enlace
fin mientras
return suma
fin

5. Codificación

Método insertarInicio
Método pedirDatos

Método mostrarLista

Método insertarFinal
Método totalventas
6.Prueba
Método mostrar

lista mensaje auxiliar!=null

Juan Pedro Ana null “” verdadero


1 2 3
100000 80000 200000
auxiliar
Juan 1 100000

Juan Pedro Ana null Juan 1 100000 verdadero


1 2 3
100000 80000 200000 Pedro 2 80000
auxiliar

Juan Pedro Ana null Juan 1 100000 verdadero


1 2 3 Pedro 2 80000
100000 80000 200000
Ana 3 200000
auxiliar

auxiliar ->null Falso

Se dejan las otras pruebas al estudiante


TALLER LISTAS ENLAZADAS

1. Realice un programa que contenga una lista de estudiantes donde cada


estudiante (nodo estudiante) contiene la información de: nombre, código, nota
primer parcial, nota segundo parcial, nota de tercer parcial, definitiva de talleres
y nota de proyecto. Observe la clase Estudiante y su constructor mostrados a
continuación.

public class Estudiante {

private String nombre;


private String codigo;
private double notaParcial1;
private double notaParcial2;
private double notaParcial3;
private double defTalleres;
private double proyecto;
private Estudiante enlace;

Implemente esta clase Estudiante (nodo), y un método que calcule la nota


definitiva para un estudiante, sabiendo que la nota primer parcial vale 20%, la nota
del segundo parcial vale 20%, la nota de tercer parcial 25%, la definitiva de talleres
15% y la nota de proyecto 20%.

Implemente la clase ListaEstudiante (lista).


public class ListaEstudiante {

private Estudiante primero;

public ListaEstudiante() {
//constructor
primero = null;
}

Incluya métodos para:

a) Ingresar varios elementos al inicio de la lista

b) Mostrar todos los estudiantes de la lista.

c) Calcule el promedio de todo el curso

d) Dado el código retorne la nota final del estudiante

e) Muestre toda la información para un estudiante dado su código.

f) Dado el código elimine este estudiante de la lista.

g) Incluya un menú para la elección de la opción a realizar.

Otros que considere.

2. Un jardín infantil necesita un aplicativo para el registro y control de los niños


matriculados, los datos de cada niño son: nombre, código, fecha de nacimiento,
nombre del acudiente, cedula del acudiente, teléfono y dirección.
La aplicación debe permitir:
a) Registrar los niños

b) Mostrar los nombres de todos los niños

c) Dada la fecha mostrar los nombres de los niños nacidos en esa fecha.

d) Dada la cedula del acudiente mostrar los datos del niño


COLAS

FIFO (First in, First Out) el primero en llegar, es el primero en salir.

.
Una cola es una estructura de datos similar a una lista con restricciones
especiales. Los elementos son agregados en la parte posterior de la cola y
son eliminados por el frente

Operaciones con Colas

Agregar: Todos los elementos en una cola se insertan por el final.


Eliminar o sacar: Todos los elementos se eliminan por el inicio de la cola.

Utilización de las Colas

Colas de impresión: Como una impresora normalmente es más lenta que un


ordenador, un sistema operativo maneja los trabajos de impresión en un
subsistema de impresión, que inserta esos trabajos de impresión en una cola. El
primer trabajo en esa cola se imprime primero, y así sucesivamente.

Colas de tareas de un procesador: La mayoría de los computadores tienen solo


un procesador, por lo que solo pueden atender una aplicación a la vez. Cada
aplicación que requiere tiempo del procesador se coloca en la cola. La aplicación
al frente de la cola es la siguiente en recibir atención. Cada aplicación avanza
gradualmente al frente de la cola.

Ejemplo: Cola en un banco

Se requiere implementar un programa para simular los tiempos de los clientes en


la cola de un banco. Cada cliente tiene un nombre, número de cedula y nombre de
la transacción que va a realizar y cada transacción tiene un tiempo asignado. Si es
consulta el tiempo que tarda esta transacción es de dos minutos, si la transacción
es retiro, el tiempo es de 3 minutos y si la transacción es consignación el tiempo
es de 4 minutos.
Se debe realizar operaciones para:
• Verificar cuando la cola está vacía
• Ingresar uno o varios clientes en la cola
• Mostrar la información de los clientes en la cola
• Sacar o atender un cliente de la cola.

Solución

1. Análisis: Listado de requerimientos

Nombre R1-Ingresar uno varios clientes

Resumen Permite ingresar uno o varios clientes en la cola


Entradas Nombre , cédula, nombre de la transacción de cada
cliente que se va a ingresar a la cola y la cola

Resultado o salida Varios clientes ingresados en la cola

Nombre R2-Verificar si la cola está vacía

Resumen Verifica si la cola contiene elementos

Entradas Cola de clientes

Resultado o salida Devuelve verdadero si la cola está vacía y falso si tiene


elementos

Nombre R3-Mostrar la información de la cola


Resumen Muestra la información de los cliente de la cola

Entradas Cola de clientes del banco

Resultado o salida Un mensaje con la información de cada cliente

Nombre R4-Sacar un cliente de la cola

Resumen Elimina un cliente de la cola


Entradas Cola de clientes

Resultado o salida Cola de clientes sin el primer cliente

2. Modelo del problema- Diagrama de Clase

3. Programa de prueba

inicio

ColaCliente objColaAVVillas= nuevo ColaCliente();//

entero cant=Lectura.leerEntero("Cuantos clientes va a ingresar a la cola?");

objColaAVVillas.agregarClientes(cant);

mostrar("Los clientes de la cola son: \n" + objColaAVVillas.mostrarCola());

objColaAVVillas.sacarCliente();

mostrar("Se atendio un cliente, los clientes que quedan son: \n"+


objColaAVVillas.mostrarCola());

fin
4. Modelo de la solución

Diagrama EPS de R1-Verificar si la cola está vacía

Proceso

Salida
Entrada Verifica si el primer elemento de la
cola es nulo, en este caso la cola
esta vacía y se devuelve true o false
Cola de clientes
verdadero. En caso contrario se
devuelve falso

Refinamiento 2

Algoritmo esVacia

Inicio

si primero=nulo

devuelve verdadero

si no

devuelve falso

fin si

fin

Diagrama EPS de R2- Ingresar uno varios clientes en la cola


Proceso

Salida
Entrada Se hace un ciclo que vaya desde 1 hasta
la cantidad de clientes que se van a crear
nombre, cedula, dentro del ciclo se va creando un cliente cliente
transacción nuevo, luego se pide los datos para ese
cliente y se enlaza el cliente creado a la
cola.

Refinamiento 2
Algoritmo agregarClientes
Inicio
para i=1 hasta i<=cantidad
clienteNuevo=nuevo Cliente()
clienteNuevo.pedirDatos()
si la clienteNuevo.esVacia=verdadero
primero=nuevo
ultimo=nuevo
si no
ultimo.enlace=nuevo
ultimo=nuevo
fin si

fin para
fin

Refinamiento 3
Se implementa el método para pedir los datos del cliente

Algoritmo pedirDatos
Inicio
nombre=leer(“Ingrese el nombre”)
cedula=leer(“Ingrese el número de cedula”)
transaccion=leer(“Ingrese la transacción”)
si transacción=”consulta”
tiempo=2
si no
si transacción=”retiro”
tiempo=3
si no
si transacción=”consignacion”
tiempo=4
fin si
fin si
fin si
fin

Diagrama EPS de R3-Mostrar la información de la cola

Proceso

Se crea una variable auxiliar a la cual Salida


Entrada se le asigna el primer elemento de la cola. Se
recorre la cola actualizando la variable auxiliar
con el campo enlace. Se obtienen los datos de mensaje
ColaClientes cada cliente y se van concatenando en una
variable de tipo String. Esto se repite hasta
que la variable auxiliar. sea null.

Refinamiento 2
Algoritmo cadena mostrarCola
inicio
Cliente clienteAux
Cadena mensaje=” ”
clienteAux=primero
mientras (clienteAux<>nulo)
mensaje=mensaje + clienteAux.mostrarDatos
clienteAux=clienteAux.enlace
fin mientras
devolver mensaje
fin

Diagrama EPS de R4-Sacar un cliente de la cola

Proceso

Salida
Entrada Verifica si la cola está vacía, si es
así se muestra mensajes de que
Cola de clientes no hay elementos en la cola, en
caso contrario el primer elemento Cola Clientes
lo enlaza con el que esta después
del primero. Si después de esto la
cola queda vacía entones el último
de la cola se debe poner a null

Refinamiento 2
Algoritmo sacarCliente

Cliente auxiliar=nuevo Cliente

Si esVacia()=verdadero

mostrar (“No hay elementos en la cola”)

si no

auxiliar=primero

primero=primero.enlace

si esVacia=verdadero

ultimo=nulo

devolver auxiliar

fin
5. Codificación

Método esVacia

Método agregarClientes
Método pedirdatos

Método mostrarCola
Método sacarCliente

Pruebas Se dejan al estudiante dado la similitud con el tema de listas


TALLER COLAS

1. Basado en el ejemplo de los clientes en el banco, crear un método que dado el


número de cedula de un cliente, muestre el tiempo total de este cliente en la cola.
Tenga en cuenta que el tiempo de un cliente en la cola es la suma del tiempo que
tardaron en atender los clientes que estaban delante de él más el tiempo que se
demora en atender a este cliente.

2. La cafetería de la universidad requiere un programa para conocer los tiempos


de espera diaria por parte de los usuarios en una cola para la venta de
comidas:
En promedio vender un producto tarda 30 segundos. El cajero debe registrar la
cantidad de productos vendidos de cada persona y el valor de la venta.

El programa debe calcular:

a) El tiempo que tardo cada persona en ser atendido por el cajero.

b) El tiempo que se demoró cada persona en la cola, teniendo en cuenta el


tiempo en tener que esperar a que atendieran los otros clientes en la cola.

c) El total de tiempo que tardo la cola. (suma de todos los tiempos de atención
de cada cliente)

d) El valor de la venta del cliente que más se demoró en la cola.


3. Se tiene una cola de canciones, los datos de la canción son: el nombre de
la canción, duración, autor, código.

El programa debe tener Métodos para:


a) Consultar el autor de una canción dado el titulo

b) Mostrar el nombre de la canción más larga.

c) Calcular la duración promedio de las canciones

4. Se tiene una cola de documentos de impresión donde cada nodo


documento tiene los campos: número de hojas del documento, código del
documento, y nombre del documento.

a) Hacer método para calcular el total de tiempo que se demora la impresora


en imprimir los documentos, si cada hoja se demora 5 segundos.

b) Implemente un método que muestre el documento con mayor cantidad de


hojas.

c) Hacer método para consultar un documento dado el código.


PILAS

Pila (Stack):Es una estructura LIFO (Last In First Out-ultimo en llegar primero en
salir).

Una pila, es una particularización de las listas y se puede definir como una
estructura en la cual los elementos son agregados y eliminados por el tope de la
lista

Operaciones con Pilas

Push o meter inserta un elemento por el tope de la pila

Crear un nuevo nodo

Enlazar el nuevo nodo a la pila

Actualizar el tope
Pop o sacar Equivale a eliminar por el frente.

En una variable auxiliar se guarda


el tope de la pila

Se actualiza el tope con el siguiente

Usos de las Pilas

 Llamada a métodos:
Cuando el código llama a un método, la dirección de la primera instrucción que
sigue a la llamada se inserta en la parte superior de la pila de llamadas del
método actual. Cuando el método llamado ejecuta la instrucción return, se saca la
dirección de la parte superior de la pila y la ejecución continua. Como resultado
una pila “recuerda” las direcciones de retorno de los métodos llamados.
• Almacenamiento temporal de páginas Web: Los navegadores de Internet
almacenan las direcciones de las páginas recientemente visitadas en una
pila.
• Los compiladores utilizan pilas: para evaluar expresiones aritméticas y generar
código en el lenguaje máquina para procesar las expresiones.
• El mecanismo de “deshacer-rehacer” en los editores de texto: Los editores
de texto utilizan usualmente un mecanismo de “deshacer” (undo) que cancela
las operaciones editadas actualmente para volver a las operaciones previas,
para ello se utiliza una pila.
Implementación de Pilas

Es posible implementar una pila utilizando un arreglo unidimensional, donde una


variable entera, típicamente llamada tope, contiene el índice de la parte superior
de la pila. (Ver anexo 1)

También es posible implementarla con una lista enlazada, en donde una variable
de referencia, nombrada como tope, referencia el nodo superior de la lista
Dado que se van a implementar sobre listas, veremos que es retomar lo que ya se
había hecho en el capítulo de listas.
A continuación, se presenta un ejemplo de una pila de números enteros.

1. Análisis- Listado de requerimientos


Nombre R1-Ingresar elementos en la pila

Resumen Permite ingresar una cantidad dada de elementos en la


pila
Entradas Valor del elemento a ingresar

Resultado o salida Varios elementos ingresados en la pila

Nombre R2-Mostrar elementos

Resumen Permite mostrar los valores de los elementos


almacenados
Entradas Pila de números

Resultado o salida Mensaje con los valores de los elementos de la pila

Nombre R3-Sacar un elemento de la pila

Resumen Permite eliminar un elemento en la pila

Entradas Pila de números

Resultado o salida Pila sin el elemento del tope de la pila

2. Modelo del problema- Diagrama de Clase

3. Programa de prueba

Inicio
Pila objPila=nuevo Pila()

entero cantidad=leer(“¿Cuantos elementos va a ingresar?”)

objPila.agregar(cantidad)

mostrar(“los elementos de la pila son +objPila.mostrarPila())

objPila.sacar)

mostrar(“los elementos de la pila son +objPila.mostrarPila())

fin
4. Modelo de la solución

Diagrama EPS de R1- Ingresar elementos en la pila

Proceso

Salida
Entrada Se hace un ciclo que vaya desde 1 hasta
la cantidad de elementos que se van a
ingresar, dentro del ciclo se crea un Pila con nuevos
valor nuevo nodo, se pide el valor a elementos
almacenar, se ingresa por el tope de la
pila y se actualiza el tope.

Algoritmo agregar(entero cantidad)


inicio
entero x=0
Nodo nuevoDato
para i=1 hasta i<=cantidad
x=leer(“Digite valor”)
nuevoDato=nuevo Nodo(x)
nuevodato.enlace=tope
tope=nuevoDato
fin para
fin

Diagrama EPS de R2- Mostrar elementos


Proceso

Salida
Entrada A una variable se le asigna el tope de la
pila, se va recorriendo la pila hasta llegar
al último elemento y en una variable Mensaje
Pila de numeros mensaje de tipo string se van
concatenando los valores de la pila

Refinamiento 2

Algoritmo cadena mostrarPila


inicio
Nodo aux
Cadena mensaje=” ”
mientras (aux!=null)
mensaje=mensaje+aux.informacion
aux=aux.enlace
devolver mensaje
Fin

Diagrama EPS R3-Sacar un elemento de la pila

Proceso

Salida
Entrada
A una variable aux se le asigna el tope
de la pila se actualiza el tope de la pila
y se muestra el valor del elemento que aux.informacion
Pila de numeros se elimino
Algoritmo sacar

inicio

Nodo aux=tope

tope=tope.enlace

devolver aux.informacion

Fin

5. Codificación

Método agregar
Método mostraPila

Método sacar

Las pruebas se dejan al estudiante.


EXPRESIONES ESCRITAS EN POSTFIJO

Existen tres formas diferentes de escribir una expresión algebraica:

Notación prefija, notación infija y notación postfija.

• + A B Notación prefija

• A + B Notación infija

• A B + Notación postfija

Conversión de expresiones escritas en infijo a expresiones en postfijo

La conversión entre la expresión en notación infija y postfija se puede realizar de


forma sencilla mediante la utilización de una pila y considerando las prioridades
entre los operadores que aparecen en la expresión.

Expresión de infijo a postfijo


1. Iniciamos la pila a vacía (pila = <>.)

2. Obtenemos el primer elemento de la expresión


2.1 Si el elemento es operando, pasa automáticamente a la salida.
2.2 Si el elemento es un operador, se compara su prioridad con la del último
operador apilado en la pila

Si la pila está vacía, el operador se apila en la pila.

Si la prioridad del operador de la expresión es mayor que la


prioridad del de la cima de la pila, entonces el operador de la
expresión se mete a la pila.

Si la prioridad del operador de la expresión es menor o igual que el


operador de la pila, el operador de la cima de la pila, pasa a la
salida.
Se sigue comparando el operador con los otros elementos de la pila
(vuelve a 2.2)

Se repite 2, hasta que se termina de recorrer la expresión, si quedo algo

Si queda algo en la pila, esta se debe desapilar totalmente.

Pasar una expresión de infijo a postfijo

Ejemplo: pasar una expresión de infijo a posfijo


Expresión Pila Salida

13 + 7 *3 - 5 < >

13

<+ >

13 7

pr *> pr + <+ >

<* +>

13 7 3

Pr - < pr * < + > 13 7 3 *

P - == p + < > 13 7 3 *+

< - > 13 7 3 *+ 5

13 7 3 * + 5 -

Evaluar una expresión en postfijo

• Una vez transformada la expresión a notación postfija se realizará un algoritmo


que la evalué y calculé el resultado. La idea básica del algoritmo es ir apilando los
operandos y resultados parciales en una pila e ir desapilándolos a medida que van
siendo necesarios (cuando encontremos en la expresión un cierto operador.)

Evaluar una expresión en postfijo

La manera de evaluarla será:

1. Iniciamos la pila a vacía (pila = <>)

2. Obtenemos el primer valor. Si es número, se mete en la pila.

3. Si es operador se sacan los dos últimos operandos de la pila, se operan y


se mete el resultado a la pila (operando2 operador operando1), donde
operando1 es el primero en salir de la pila).

4. Al terminar de recorrer la expresión el resultado de la operación es lo que


esté en la cima de la pila.

Ejemplo: evaluar la expresión en postfijo del ejemplo anterior


Expresión pila operando1 operando2 Operando2
operador
operando 1

13 7 3 * +5 -

<7 13>

<3 7 13>

<13> 3 7 7 *3=21

<13>

<21 13> 21 13 13 +21=34

< >

<34>

<5 34>

5 34 34 - 5=29

<29>

TALLER SOBRE PILAS

1. a) Investigue a) ventajas y desventajas de la notación Postfijo.

b) Que calculadoras usan la notación postfija.

2. Al programa entregado por el profesor, adicione un método que elimine


todos los elementos de la pila, hasta encontrar un valor dado y devuelva el
resultado de la suma de los elementos eliminados.

3. Crear un programa que maneje una pila de string


a) Implemente los métodos básicos para esta clase y para la clase nodo.

b) Realice un método para que reconozca si el carácter es operador

( + - * /) o es un número.

4. Lea y entienda el código pasado por el profesor, de notación Postfija


(usando Pilas sobre vectores)

5. Realice su implementación usando Pilas sobre listas.

6. Implementar un método que evalué una expresión postfija y muestre el


resultado

7. (opcional) Si la expresión infija contiene paréntesis, adecue los métodos


para que convierta la expresión infija con paréntesis en postfija.
RECURSION

Resolver un problema mediante recursión significa que la solución depende de las


soluciones de pequeñas instancias del mismo problema.

La mayoría de los lenguajes de programación dan soporte a la recursión


permitiendo a una función llamarse a sí misma desde el cuerpo de la función.

Partes de una función recursiva

En un programa recursivo siempre existe:

• Una condición de parada o finalización de la recursión.

• Un llamado recursivo, es decir un llamado a la misma función.

Ejemplo: el siguiente método que imprime la serie de los números de 1 hasta un n


dado es una función recursiva

Condición de
parada

Llamada recursiva
Aplicando la metodología anterior

1. Análisis –Listado de requerimiento

Nombre R1-Imprimir serie

Resumen Permite mostrar la serie de los números de 1 hasta n,


dado un valor cualquiera para n
Entradas n

Resultado o salida Impresión de los números de n hasta 1

2. Modelo del problema – Diagrama de clases

3.Programa de prueba
Inicio
m= leer(“Ingrese un numero)
Recursion objOperacion =nuevo Recursion(m)
objOperacion.serie(m)
fin

4.Modelo de la solución

Para resolver una función recursiva debemos como tal descubrir cuál es la
condición de parada y tratar de descomponer la solución de un problema en la
solución de un problema más pequeño.

Si n es por ejemplo 6, entonces nuestra función debería mostrar 6 5 4 3 2 1

Si n es 5 la función debería mostrar 5 4 3 2 1

Si el valor de n es 4, la función debería mostrar 4 3 2 1,

Si el valor de n es 3 la función debería mostrar 3 2 1

Si el valor de n es 2 la función debería mostrar 2 1

Si n es 1 se muestra 1

Si revisamos nos podemos dar cuenta que calcular serie de 6 es lo mismo que
imprimir el 6 y mostrar la serie de 5. Así mismo calcular la serie de 5 es
equivalente a mostrar el 5 y mostrar o calcular la serie de 4.

De la misma forma hallar la serie de 4 es lo mismo que imprimir el 4 y mostrar la


serie de 3. Y la serie de 3 es imprimir 2 y calcular la serie de 1.
Finalmente hallar la serie de 1 es igual a imprimir el 1, nada más.

De aquí se puede concluir que

La serie de n es igual a imprimir n y calcular la serie de ( n-1)

Es decir serie(n)= imprimir n serie(n-1) a esto le llamamos formula recursiva.

Como vemos la solución de calcular serie de n se convierte en una solución más


pequeña que es calcular de serie de ( n-1), por eso decimos que es un problema
recursivo.

Y la condición de parada es cuando n=1 el resultado es 1

serie(1)= imprimir 1, se llama condición de parada porque aquí no hay más


descomposiciones.

En resumen

n Que se debe imprimir En que se descompone


6 6 5 4 3 2 1 Serie(6)=imprimir 6 serie(5)
5 5 4 3 2 1 Serie(5)=imprimir 5 serie(4)
4 4 3 2 1 Serie(4)=imprimir 4 serie(3)
3 3 2 1 Serie(3)=imprimir 3 serie(2)
2 21 Serie(2)=imprimir 2 serie(1)
1 1 Serie(1)=imprimir 1
Iteración 2

Proceso

La función va a recibir un numero n, Salida


Entrada
si el número es 1 lo imprime y
termina, pero si no, entonces se Impresión de cada uno
imprime n y se manda a calcular la de los valores que
n serie de n-1 toma n

Algoritmo serie(entero n)
Inicio
Si n=1
Imprimir n
devolver 1
Si no
Imprimir n
devolver serie(n-1)
fin si
fin

5.Codificación
6.Prueba

serie (n ) n If(n==1) salida

serie( 4) 4 If (4==1) falso 4 serie(3)

serie(3) 3 If (3==1) falso 3 serie (2)

serie(2) 2 If (2==1) falso 2 serie(1)

serie(1) 1 If(1==1) verdadero 1

Ejemplo: suma recursiva de los términos de n hasta 1

1. Análisis –Listado de requerimiento


Nombre R1-Calcular sumatoria

Resumen R1-Calcular la sumatoria de los numero de n hasta 1

Entradas n

Resultado o salida Impresión de los números de n hasta 1

2. Modelo del problema – Diagrama de clases

3.Programa de prueba

Inicio
n= leer(“Ingrese un numero)
Recursion objOperacion =nuevo Recursion(n)
objOperacion.sumatoria(n)
fin

4.Modelo de la solución

Para resolver una función recursiva debemos como tal descubrir cuál es la
condición de parada y tratar de descomponer la solución de un problema en la
solución de un problema más pequeño.

Si n es por ejemplo 6, entonces nuestra función debería mostrar 6 + 5 + 4 + 3 + 2


+1

Si n es 5 la función debería mostrar 5 +4 +3+ 2+ 1

Si el valor de n es 4, la función debería mostrar 4+ 3+ 2+ 1,

Si el valor de n es 3 la función debería mostrar 3 +2+ 1

Si el valor de n es 2 la función debería mostrar 2 +1

Si n es 1 se muestra 1

Si revisamos nos podemos dar cuenta que calcular la sumatoria de 6 es lo mismo


que suma 6 con la sumatoria de 5. Así mismo calcular la sumatoria de 5 es
equivalente a suma 5 con la sumatoria de 4. De la misma forma hallar la sumatoria
de 4 es lo mismo que suma 4 con la sumatoria de 3. Y la sumatoria de 3 es sumar
3 con la sumatoria de 2. Y la sumatoria de 2 es igual a sumar 2 con la sumatoria
de 1. Finalmente, la sumatoria de 1 es igual a 1.

En resumen
n Que se debe hacer En que se descompone
6 6 + 5+4+3+2+1 sumatoria(6)= 6 + sumatoria(5)
5 5+4+3+2+1 sumatoria (5)= 5 + sumatoria (4)
4 4+ 3+2+1 sumatoria(4)= 4+sumatoria(3)
3 3+2+1 sumatoria(3)= 3 +sumatoria(2)
2 2+1 sumatoria (2)= 2+ sumatoria(1)
1 1 sumatoria (1)= 1

Proceso

La función va a recibir un numero n, Salida


Entrada
si el número es 1 devuelve 1 y
termina, pero si no, entonces se sumatoria
debe suma n con el resultado del
n llamado de la función sumatoria
con parámetro ( n-1 )

Algoritmo sumatoria(entero n)
Inicio
Si n=1
devolver 1
Si no
devolver n+ sumatoria(n-1)
fin si
fin

5.Codificación
Prueba del método sumatoria
sumatoria (n ) n If(n==1) salida

sumatoria( 4) 4 If (4==1) falso 4 + sumatoria (3)


sumatoria(3) 3 If (3==1) falso 3 +sumatoria (2)

sumatoria(2) 2 If (2==1) falso 2+ sumatoria (1)

sumatoria(1) 1 If(1==1) 1
verdadero
10

Ejemplo calcular el factorial de un número

1. Análisis –Listado de requerimiento

Nombre R1-Calcular factorial

Resumen R1-Calcular el factorial de un numero n

Entradas n

Resultado o salida Factorial de n

3. Modelo del problema – Diagrama de clases


3.Programa de prueba

Inicio
n= leer(“Ingrese un numero)
Recursion objOperacion =nuevo Recursion(n)
objOperacion.factorial(n)
fin

4.Modelo de la solución

Para resolver una función recursiva debemos como tal descubrir cuál es la
condición de parada y tratar de descomponer la solución de un problema en la
solución de un problema más pequeño.

Si n es por ejemplo 6, entonces nuestra función debería mostrar el resultado de


calcular 6 x 5 x 4 x 3 x 2 x 1

Si n es 5 la función debería mostrar el resultado de 5 x4 x3x 2x 1


Si el valor de n es 4, la función debería mostrar resultado de 4x 3x 2x 1,

Si el valor de n es 3 la función debería mostrar resultado de 3 x2x 1

Si el valor de n es 2 la función debería mostrar resultado de 2 x1

Si n es 1 se muestra 1

Si revisamos nos podemos dar cuenta que calcular el factorial de 6 es lo mismo


que multiplicar 6 con el resultado del factorial de 5. Así mismo calcular el factorial
de 5 es equivalente a multiplicar 5 con el resultado de hallar el factorial de 4. De la
misma forma hallar el factorial de 4 es lo mismo que multiplicar 4 el resultado del
factorial de 3. Y el factorial de 3 es multiplicar 3 con el resultado del factorial de 2.
Y el factorial de 2 es multiplicar 2 con el factorial de 1. Finalmente, el factorial de 1
es igual a 1.

En resumen

n Que se debe hacer En que se descompone


6 6 x5x4x3x2x1 factorial (6)= 6 + factorial (5)
5 5x4x3x2x1 factorial (5)= 5 + factorial (4)
4 4x3x2x1 factorial (4)= 4+ factorial (3)
3 3x2x1 factorial (3)= 3 + factorial (2)
2 2x1 factorial (2)= 2+ factorial 1)
1 1 factorial (1)= 1

Proceso

La función va a recibir un numero n, Salida


Entrada
si el número es 1 devuelve 1 y
termina, pero si no, entonces se factorial
debe multiplicar n con el resultado
n del llamado de la función factorial
con parámetro ( n-1 )
Algoritmo factorial(entero n)
Inicio
Si n=1
devolver 1
Si no
devolver n x factorial(n-1)
fin si
fin

5.Codificación

Factorial de la forma n x n-1 x n-2 x … x 1

6. La prueba de deja como ejercicio al estudiante

Otra solución Recursiva del factorial


Como vimos en el ejemplo anterior los termino tanto para las sumatoria como para
el factorial se calcula de forma descendente, cada vez que se llama la función esta
se decrementa y solo requerimos de un parámetro de entrada dentro de la función,
pero que se debe hacer si se quiere por ejemplo que la serie de los números se
muestre en orden ascendente, es decir serie(6)= 6 5 4 3 2 1. O que en el factorial
las multiplicaciones se realicen de la forma 1x 2 x3 x4 x5 x6, para el caso de
factorial(6)

En estos casos se va a requerir de dos variables una que va a indicar el punto


inicial de partida y el otro el límite, por ejemplo para el ejercicio del factorial,
siempre se parte de 1, entonces debe haber una variable cuyo valor inicial es 1,
pero que en cada llamado de la función va a ir cambiando, la segunda variable
será el numero al que se le va a calcular el factorial y a la vez el valor hasta el cual
la primera variable puede llegar.

Se presenta el código de la función, programa los demás pasos no cambian.

Factorial de la forma 1
x 2 x 3 x ..x n
Ejemplo para determinar si un número es primo o no

2. Análisis –Listado de requerimiento

Nombre R1-Determinar si un número es primo

Resumen R1-dado un numero muestra un mensaje diciendo si el


número es primo o no n
Entradas n

Resultado o salida mensaje

4. Modelo del problema – Diagrama de clases


3.Programa de prueba

Inicio
n= leer(“Ingrese un numero)
Recursion objOperacion =nuevo Recursion(n)
Mostrar(objOperacion.primol(n))
fin

4.Modelo de la solución

Proceso

La idea es mirar si el número n tiene


divisores, cada divisor se guarda en una
variable i, la cual empieza en 2. I divide a n Salida
Entrada
cuando el residuo de i con 2 es 0, en cuyo
caso se devuelve un mensaje que si es factorial
primo. Si no la función se vuelve a llamar
n pero el valor de la variable i se incrementa,
si en algún momento i alcanza el valor de n
es porque no tiene divisores.

Algoritmo cadena primo (entero i, entero n)


Inicio
Si i==n
devolver “Es primo”
Si no
Si (n%i==0)
devolver “No es primo
sino
devolver primo(i+1,n)”
fin si
fin si
fin

5.Codificación

Prueba del método primo

primo ( i , n) ( i = = n) ((n % i=) 0) salida


primo (2, 5) ( 2== 5) ((5%2)==0) primo(3, 5)
falso falso
primo(3, 5) ( 3 == 5) falso ((5%3)==0) primo(4, 5)
falso
primo(4, 5) ( 4 == 5) falso ((5%4)==0) primo(5, 5)
falso
primo(5, 5) ( 5 == 5) “es primo”
verdadero
TALLER RECURSIVIDAD

1. La sucesión de Fibonacci es la sucesión de números:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Donde el primer término es el 0, el segundo término el 1 y así sucesivamente.


Cada término se calcula sumando los dos términos anteriores a él.

Por ejemplo, el cuarto termino (2) se calcula sumando el segundo término (1)
más el tercer término (1).

a) Realizar una función que dado un término muestre el valor del término. Por
ejemplo, si el dato de entrada es 4, quiere decir que se pide el cuarto
término y la función debe retornar 2 (que corresponde al cuarto término en
la sucesión).

b) Hacer otra función muestre la sucesión completa hasta un término dado.


Por ejemplo, si el dato de entrada es 4, se debe mostrar toda la serie hasta
ese término: 0 1 1 2.

2. Realizar una función que calcule el cociente de la división entre dos números
por medio del método se restas sucesivas. (investigar)

3. Hacer programa que muestre la tabla de multiplicar de un número n hasta 10.

4. La siguiente serie de números: 1, 4, 7, 10, 13, 16, 19, 22, 25


Tiene una diferencia de 3 entre cada dos términos. La regla es xn = 3n-2. Hacer
una función que reciba el valor del término y muestra la serie de los términos. Por
ejemplo si n e 5, se genera la serie 1, 4, 7, 10, 13.
ÁRBOLES

Representación de los arboles


Raiz

Definición

Un árbol es una estructura de datos dinámica no lineal, jerárquica, aplicada


sobre una colección de elementos u objetos llamados nodos.
El árbol consta de un conjunto finito de elementos, denominados nodos y de
un conjunto finito de líneas dirigidas, denominada ramas, que conectan los
nodos.

Ejemplo de un árbol
Utilización de los arboles

Se utilizan para representar fórmulas algebraicas, para organizar objetos en orden


de tal forma que las búsquedas sean muy eficientes y en aplicaciones diversas
tales como inteligencia artificial o algoritmos de cifrado. Casi todos los sistemas
operativos almacenan sus archivos en árboles o estructuras similares a árboles.
Además de las aplicaciones citadas, los árboles se utilizan en diseño de
compiladores, procesadores de texto y algoritmos de búsqueda.

Ejemplo de árbol genealógico

En la anterior gráfica, Carlos es el padre de Bertha, Pedro y Oscar, y a su vez


Bertha es la madre de Flor y Luis y Flor es la madre de Jefferson, Julieth y Oscar
Conceptos

Padre: es el antecesor inmediato de un nodo Hijo: cualquiera de sus


descendientes inmediatos.
Hermano de un nodo: es otro nodo con el mismo padre.

Nivel de un nodo: es su distancia al nodo raíz. La raíz tiene una distancia cero de
sí misma, por ello se dice que está en el nivel 0.

Raíz: único nodo que no tiene antecesor, es decir, sin padre.

Rama: arista formada entre dos nodos.

Antecesor: un nodo A es el antecesor de un nodo B si por alguna de las ramas se


llega de A a B.

Sucesor: un nodo X es sucesor de un nodo Y si por alguna de las ramas de Y se


puede llegar a X.

Grado de un nodo: número de descendientes directos que tiene un nodo.

Subárbol: árbol formado por un nodo y sus descendientes

Generación: es un conjunto de nodos con la misma profundidad.

Grado del árbol: es el mayor grado entre sus nodos.

Nodo interno: es aquel nodo que tiene al menos un descendiente o nodo hijo.
Nodo hoja (externo): nodo que no tiene descendientes o no tiene hijos.

Arboles Binarios

Un Árbol Binario es un conjunto finito de elementos que bien puede estar vacío o
está formado por una raíz con dos árboles binarios llamados subárbol izquierdo y
subárbol derecho.

Recorrido de un árbol

Recorrer un árbol consiste en acceder una sola vez a todos sus nodos.

Esta operación es básica en el tratamiento de árboles y nos permite, por ejemplo,


imprimir toda la información almacenada en el árbol, o bien eliminar toda esta
información etc.

Tipos de Recorridos
Recorrido preorden
 Visitar la raíz
 Recorrer el subárbol izquierdo en preorden
 Recorrer el subárbol derecho en preorden

Recorrido inorden

 Recorrer el subárbol izquierdo en inorden


 Visitar la raíz
 Recorrer el subárbol derecho en inorden

Recorrido postorden
 Recorrer el subárbol izquierdo en postorden
 Recorrer el subárbol derecho en postorden
 Visitar la raíz

Ejemplo: recorrer el siguiente árbol

Los recorridos son:

Preorden: A B C D E F G H S T U J K L
Inorden: D C E B F A T S U H G K J L
Postorden: D E C F B T U S H K L J G A

Ejercicio en clase

Escriba cada uno de los recorridos, para el árbol anterior

Implementación de un árbol binario

Para implementar un árbol binario primero se define la estructura de los nodos,


donde cada nodo del árbol estará formado por tres partes así:

La información contenida en el nodo, la cual puede ser un tipo primitivo (int, char,
double) o puede ser cualquier tipo de objeto.

Un enlace al hijo derecho (raíz del subárbol derecho).

Un enlace al hijo izquierdo (raíz del subárbol izquierdo

La clase nodo y constructor


Los métodos get y set del nodo
La clase Árbol y el constructor
Crear un árbol binario

Prueba de escritorio crear el árbol


Prueba de escritorio crear el árbol
Recorrido en Inorden

Recorrido en Preorden
Recorrido en Postorden
Árbol binario de búsqueda

• Son arboles binarios que tienen los datos ordenados de tal manera que todos los
datos que están en el subárbol izquierdo son menores que la raíz y todos los
datos que están en el subárbol derecho son mayores o iguales que la raíz

Ejemplos de árbol binario de búsqueda

Crear árbol binario de búsqueda

Programación III
Métodos insertarIzquierda e insertarDerecha

Programación III
Método buscarElemento

Anexar un nodo

Programación III
Insertar nodo por la izquierda y por la derecha

Programación III
TALLER SOBRE ARBOLES

1. a) Presente por escrito la inserción de los siguientes números en un árbol binario


de búsqueda.

50,60, 70, -100,-201,-6,-8,-50,3/4,10/5,21,100,200,3,50,8

b) El árbol resultante recórralo en inorden

c) El árbol resultante recórralo en preorden

d) El árbol resultante recórralo en postorden

2. En una Universidad tienen un Listado de N estudiantes, los datos del


estudiante están compuestos por:

CODIGO NOMBRE TELEFONO

52 CARLOS 2520555

11 JUANA 552255

22 CARLOS 887788

44 JAIRO 777997

12 FERNANDO 442232

101 PILAR 8799

Programación III
.. …. ….

.. ….. ….

Se necesita guardar los datos de los estudiantes en un árbol binario de búsqueda, los
nodos del árbol deben contemplar el código, nombre y teléfono del estudiante, la llave
principal del árbol es el código del estudiante.

El programa de estudiantes debe tener un menú con:

d) Insertar estudiante
e) Consultar estudiante por su código
f) Mostrar los estudiantes(postorden)
g) Actualizar nombre
h) Salir

3. Se requiere un programa para manejar la información de los empleados de

una empresa (nombre, numero de cedula, salario, dirección).Utilice un árbol

binario de búsqueda para su implementación.

El programa debe tener un menú con las opciones de:

i) Ingresar empleados

j) Consultar empleado por el número de cedula


k) Mostrar los empleados (siguiendo cualquier recorrido)
l) Salir

Programación III

You might also like