Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estructuras de Datos Con VB Net PDF
Estructuras de Datos Con VB Net PDF
INTRODUCCIN.
El presente trabajo pretende servir como referencia a los alumnos (y docentes) de las carreras de Ingeniera
en Sistemas Computacionales e Ingeniera en Informtica que oferta la DGEST (retculas 2010). Se asume que
el estudiante tiene cierta experiencia en el manejo del lenguaje VB.NET. En esta institucin, cuando he tenido
oportunidad, he impartido las materias que son competencias previas a Estructura de Datos (Fundamentos de
Programacin y Programacin Orientada a Objetos) usando el lenguaje de programacin Visual Basic .NET .
De manera que el trnsito por la materia objeto de este libro es bastante amigable.
Se ha usado una extraa mezcla de ingles espaol con el fin de no usar la traduccin literal de las palabras
reservadas del lenguaje para tratar de evitar confusiones en los alumnos.
Es claro que en la prctica real, las estructuras de datos juegan un papel preponderante, as que la
importancia de esta materia en la formacin de futures desarrolladores de software no tiene lugar a dudas.
Muchos de los casos aqu expuestos han sido tomados de la prctica profesional personal a lo largo de muchos
de los sistemas que he tenido la fortuna de implementar. Otros casos son revisiones del material de varios de
los autores clsicos de esta materia.
El enfoque por competencias que se ha pretendido dar hace que el enfoque sea mucho ms prctico que
terico, el estudiante deber escribir los programas aqu presentados con el fin de alcanzar las competencias
especficas que establece el programa de la materia y as mismo, realizar los ejercicios propuestos.
Es recomendable, cuando sea posible, que los estudiantes asistan a las exposiciones con una lap, al menos
una por grupo de trabajo, dadas las limitaciones, que como en el caso nuestro, existen en los laboratorios de
cmputo. En esos equipos debe estar instalado al menos la ltima version VBEE [edicin express] (que es
gratuita) disponible en los sitios de Microsoft.
La idea es que el estudiante escriba todos los programas que se muestran en este texto, tratando de evitar la
nociva prctica de copiar pegar, razn por la cual no se proporciona el cdigo fuente de estos. Habr que
teclear lnea por lnea.
DEDICATORIAS:
El trabajo diario de un programador trae consigo una serie de privaciones sobre todo en la familia, quiero
dedicar este trabajo a mi esposa Susana, a mis hijos Ricardo y Sandra quienes soportaron privaciones sobre
todo en el tiempo que deb dedicarles. A mi nieta Carolina quien vino a darme una nueva oportunidad de
reponer ese tiempo y ha sido una nueva luz en mi vida. Quiz tarde he comprendido la importancia de
administrar el tiempo en la tarea del desarrollo de sistemas evitando la obsesion de terminar alguna tarea a
como d lugar y nunca quitar tiempo de dedicacin a la familia.
Ricardo Alfonso Almanza Mrquez
Tabla de contenido
Introduccin a las Estructuras de Datos ................................................................ 5
Definiciones ...................................................................................................... 5
Tipos de datos abstractos (TDA) .................................................................... 6
Arreglos ....................................................................................................... 21
Recursividad....................................................................................................... 67
Estructuras Lineales............................................................................................ 73
Listas .............................................................................................................. 73
Lista ligada simple ....................................................................................... 74
Lista ligada doble ......................................................................................... 82
Lista circular ................................................................................................ 94
Pilas .............................................................................................................. 103
Estructuras No Lineales .................................................................................... 127
rboles ...................................................................................................... 127
rboles Binarios ......................................................................................... 128
rboles balanceados .................................................................................. 139
Grafos........................................................................................................ 141
Mtodos de Ordenamiento ............................................................................... 151
Ordemamiento por seleccin ..................................................................... 153
Ordenamiento de la burbuja ...................................................................... 157
Ordenamiento rpido (Quick Sort ............................................................... 159
Ordenamiento por acumulacin (Heap Sort) ............................................... 162
Ordenamiento por mezcla (Merge Sort) ...................................................... 167
Ordenamiento externo ............................................................................... 169
Mtodos de Bsqueda ...................................................................................... 177
Bsqeda secuencial .................................................................................... 177
3
algoritmo proviene del nombre del matemtico Mohamed ibn-Musa al-Khwarizmi que form parte
de la corte real en Bagdad aproximadamente entre los aos 750 a 850 DC. Es fuente adems de la
palabra algebra.
Enciclopedia Britnica:
Estructura de datos.-
Comprender el problema.
2.
estructuras de datos.
Relacin con algoritmos.
Un algoritmo es una especificacin concisa de un mtodo para resolver un problema. Una estructura
de datos puede verse como un conjunto de algoritmos para realizar operaciones sobre los datos que
almacena. As, los algoritmos son parte de lo que constituye una estructura de datos. En la
construccin de la solucin a un problema, una estructura de datos debe ser elegida de manera que
permita que los datos sean manipulados fcilmente de la manera que el algoritmo lo requiere.
2.
3.
4.
Un algoritmo puede requerir colocar datos nuevos en una coleccin existente de los mismos,
removerlos o acceder a una coleccin de datos para propsitos especficos.
Tipos de datos abstractos (TDA).
Un tipo de dato abstracto (TDA), abstract data type (ADT), es un modelo matemtico que puede
usarse para capturar lo esencial del dominio de un problema con el fin de traducirlo a un lenguaje
de programacin.
Es una entidad matemtica que consiste en un conjunto de valores (el conjunto portador) y una
coleccin de operaciones que los manipule. Por ejemplo, el tipo de dato abstracto entero consiste de
un conjunto portador que contiene los nmero enteros negativos y positivos adems del 0 y una
coleccin de operaciones que los manipula como pueden ser la suma, la resta, la multiplicacin, la
comparacin de igualdad y la comparacin de orden (Algebra abstracta).
Abstraccin.
Abstraccin es ignorar el detalle de algunas cosas a favor de otras. La abstraccin es importante en
la solucin de problemas porque permite a quien los resuelve enfocarse en los detalles esenciales
en tanto ignora los no esenciales, simplificando as el problema y concentrando su atencin en
aquellos aspectos del mismo que involucran su solucin. Los tipos de datos abstractos son
importantes en ciencias de la computacin porque proporcionan una manera clara y precisa para
especificar que datos debe manipular un programa (y cmo debe manejarlos) sin considerar los
detalles sobre cmo los datos son representados cmo se implementan las operaciones. Una vez
comprendidos los tipos de datos abstractos y documentados, sirven como una especificacin que
los programadores pueden usar para guiar su decisin sobre la implementacin y operacin de los
datos y como un estndar para asegurar la exactitud del programa.
Tales especificaciones de los tipos de datos abstractos proporcionan las bases para su realizacin
en programas. Los programadores conocen que valores de datos necesitan ser representados, que
operaciones sern requeridas y qu limitaciones deben satisfacerse. El estudio cuidadoso del cdigo
desarrollado y la apropiada seleccin de pruebas ayudan a asegurar que el programa est correcto.
Finalmente las especificaciones de tipos de datos abstractos pueden usarse para investigar y
demostrar de los tipos de datos abstractos mismos, llevando a un mejor entendimiento de los
programas y finalmente a un software de alta calidad.
mtodos) las operaciones. Los objetos que manejan el mismo tipo de datos y realizan las mismas
operaciones forman una clase.
Los valores de datos abstractos estn separados de sus operaciones. Si los valores del conjunto
portador de un tipo de dato abstracto se pueden reconceptualizar para incluir no slo valores de
datos sino tambin operaciones abstractas, entonces los elementos del conjunto portador se vuelve
una entidad que incorpora tanto datos como operaciones, como objetos, y el conjunto portador en
s es mucho ms parecido a una clase. El paradigma orientado a objetos puede verse como una
extensin del uso de tipos de datos abstractos.
Modularidad.
Es la propiedad que permite subdividir una aplicacin en partes ms pequeas llamadas mdulos
con el fin de hacerla ms comprensible y manejable. Histricamente es una evolucin de la
Uso de TDA.
Planteamiento del problema:
6
5
4
3
2
1
0
1
.
La distancia entre ambos puntos est definida por:
[1]
Desarrollar una aplicacin que utilice un TDA que lea los dos puntos, encuentre la distancia entre
ambos y muestre la ecuacin de la recta resultante usando el paradigma orientado a objetos.
Al principio de esta unidad se estableci que la determinacin exacta de un problema implica, ante
todo, la comprensin del mismo. Se puede afirmar que si se es capaz de resolverlo manualmente tal
comprensin se ha alcanzado:
Solucin (manual):
Pendiente:
Una vez que se entiende el problema el primer paso es la abstraccin del mismo lo que requiere
identificar:
1.
2.
3.
4.
Datos de entrada:
P1 y P2 definidos por
pares
de
Distancia entre P1 y P2
Recta
(d).
valores
Ecuacin: y = mx + b
Esta es una abstraccin simple, as para el ejemplo considerado la solucin se representa como:
x = 1, y =
d=
Recta
m=1
x = 5, y
=5
y=x
Algoritmos
Recta
Propiedades
Nombre
Mtodos
Tipo de dato
Nombre
Tipo de dato
Propsito
X1
Distancia
Real simple
Calcula distancia
X2
Pendiente
Real simple
Obtiene m
Y1
Ecuacin (Ec)
Cadena
Ecuacin resultante
Y2
En el diseo de clases de este texto seguimos la metodologa propuesta por Deborah Kurata1
As, una vez creada la clase que representar al objeto Recta, el algoritmo general de solucin puede
plantearse de la siguiente manera:
1.
10
3.
4.
A partir de las ecuaciones [4] [5] obtener la ecuacin de la recta como una cadena de
caracteres.
5.
Mostrar resultados.
Imports System.Math
Public Class CTDA_Recta
Private mvarX1 As Single
Private mvarX2 As Single
Private mvarY1 As Single
Private mvarY2 As Single
Private mvarm As Single
Property X1() As Single
Get
Return mvarX1
End Get
Set(ByVal value As Single)
mvarX1 = value
End Set
End Property
Property X2() As Single
Get
Return mvarX2
End Get
Set(ByVal value As Single)
mvarX2 = value
End Set
End Property
Property Y1() As Single
Get
Return mvarY1
End Get
Set(ByVal value As Single)
mvarY1 = value
End Set
End Property
Property Y2() As Single
Get
Return mvarY2
End Get
Set(ByVal value As Single)
mvarY2 = value
End Set
End Property
P
r
o
p
i
e
d
a
d
e
s
11
t
o
d
o
s
Uso en consola:
Imports System.Console
Module Module1
Private MiTDA As New CTDA_Recta
Sub Main()
BackgroundColor = ConsoleColor.White
ForegroundColor = ConsoleColor.Black
Clear()
WriteLine("Punto P1:")
Write("X1 = ")
MiTDA.X1 = ReadLine()
Write("Y1 = ")
MiTDA.Y1 = ReadLine()
WriteLine()
WriteLine("Punto P2:")
Write("X2 = ")
MiTDA.X2 = ReadLine()
Write("Y2 = ")
MiTDA.Y2 = ReadLine()
WriteLine()
WriteLine("RESULTADOS")
WriteLine("Distancia = " + MiTDA.Distancia.ToString("n4"))
WriteLine("Pendiente m = " + MiTDA.m.ToString("n2"))
WriteLine("La ecuacin es:")
WriteLine()
WriteLine(MiTDA.Ec)
ReadKey()
End Sub
End Module
Ejecucin:
12
El uso de consolas permite una rpida revisin de la solucin que se trata de implementar. Despus
de probar con diferentes valores con resultados conocidos, la solucin se transporta fcilmente al
entorno Windows.
Para crear la solucin usando las capacidades de VB.NET se puede crear la siguiente forma bsica:
Tipo
Form
txtX1, txtY1
txtX1, txtY2
btnResult
labD, labM
Textbox
TextBox
Buttton
Label
Propiedades
MaximizeBox = False
StartPosition = CenterScreen
TextAlign = Center
TextAlign = Center
AutoSize = False
13
Propsito
Capturar X1
Capturar Y2
Iniciar mtodos
Mostrar distancia y
labEc
Label
BackColor = White
Text = 0
TextAlign = MiddleRight
AutoSize = False
BackColor = White
Text =
TextAlign = MiddleCenter
Pendiente.
Mostrar la ecuacin.
Ejecucin:
14
rea:
[2]
15
Casos de prueba:
h=4
d=2
Entonces de [1] :
Y de [2]
Si
h=4yA=
Obteniendo el radio de [2]:
r = 1, luego el dimetro es 2r = 2
Por ltimo si se conocen los valores de d y de A:
Entonces h 4 .
Prueba del programa:
16
valor
numrico
consecutivo en su propiedad
la
caja
correspondiente.
texto
Dimetro
(Tag = 1) Tag = 0 en la
caja de texto. Altura (Tag = 2)
Tag = 1 en la caja de texto
del dimetro. Todos tienen su
propiedad Chcked en False y
17
estn
contenidos
GroupBox.
en
un
Tag en RadioButton
Nombre
Tag
rbVol
rbV
rbAltura
Cada vez que el usuario selecciona una opcin el valor de la propiedad Tag es asignado a un objeto
de tipo entero corto, (iModo),
seleccionar
esta
opcin,
los
rea
son
desactivados
18
El botn
desencadena los
mtodos
(operaciones)
Caso
3:
conocidos.
19
Dimetro
altura
Ejercicio #2: Para el cuerpo geomtrico denominado cono circular (recto) se tienen las siguientes
frmulas4:
[1]
[2]
[3]
[4]
[5]
20
Arreglos.
El arreglo es la estructura de datos ms comn y existe desde los primeros lenguajes de
programacin. Un arreglo permite almacenar un conjunto de elementos ordenndolos por posicin,
generalmente la primera posicin tiene el valor de cero y, normalmente, debe conocerse el nmero
de elementos N que se van a almacenar.
0
Posiciones
Ei
En
Elementos
El uso de esta estructura requiere reservar ubicaciones de memoria RAM contiguas en tiempo de
compilacin y esta asignacin puede ser esttica o dinmica. Dependiendo de cmo sea declarado,
un arreglo puede existir (ser accesible) en:
Todo el programa.
En un mdulo
En un procedimiento.
La memoria asignada
termina de otro modo el arreglo deja de existir al terminar la ejecucin del mdulo o el
procedimiento donde fue creado.
En VB.NET, un arreglo es una instancia de la clase Array misma que proporciona un conjunto de
mtodos tales como ordenacin y bsqueda que en el pasado se tenan que desarrollar. Sin
embargo eso no impide que se analicen los diferentes algoritmos para tales procesos.
Este lenguaje (y todos los que usan el marco .NET) tienen una clase nueva denominada ArrayList
que es un arreglo que obtiene ms espacio de forma dinmica a medida que lo requiere. En
situaciones donde no se conoce con exactitud el tamao del arreglo o cuando ste puede cambiar
durante el ciclo de vida de un programa un ArrayList puede ser una mejor eleccin que un arreglo
simple.
21
tipo entero) y estableciendo que tipo de datos manejar. Esta accin se representa como A[N], a
cada elemento del arreglo se le asigna un valor (del tipo adecuado) usando un apuntador i.
Un arreglo de una dimensin se puede declarar a nivel mdulo como:
Private Arreglo(), si no se especifica su tamao N, se dice que el arreglo es dinmico y puede
modificar su tamao en cualquier parte del mdulo usando la instruccin ReDim.
Ejemplo:
Imports System.Console
Module Module1
Private Arreglo() As Integer, N As Short
Sub Main()
ForegroundColor = ConsoleColor.Black
BackgroundColor = ConsoleColor.White
Clear()
Dim i As Short
Write("N = ")
N = ReadLine()
'Se forma el arreglo, si existiera uno previo ser reemplazado
'El valor de cada uno de sus elementos es cero
ReDim Arreglo(N)
For i = 0 To N - 1
Write("A[" + i.ToString + "] = ")
Arreglo(i) = ReadLine()
Next
WriteLine()
WriteLine("El arreglo es:")
WriteLine()
For i = 0 To N - 1
Write(Arreglo(i).ToString + " ")
Next
WriteLine()
ReadKey()
End Sub
End Module
22
Ejecucin:
23
El mismo programa en las versiones de VB.NET 2008 y posteriores se puede escribir as:
24
mantener
O tambin:
Listado #3.
Imports System.Console
Module Module1
Sub Main()
ForegroundColor = ConsoleColor.Black
BackgroundColor = ConsoleColor.White
Clear()
Dim A() As Short
A = New Short() {3, 5, 7, 1, 2}
WriteLine("El arreglo es:")
For Each Numero As Short In A
Write(Numero.ToString + " ")
Next
WriteLine()
ReadKey()
End Sub
End Module
Priivate, lo que significa que el arreglo permanece durante la ejecucin del mdulo y al ser declarado
inicialmente sin dimensin se dice que es un arreglo dinmico. Cada vez que se establece un valor
numrico para N el arreglo se crea usando ReDim que adems inicializa todos sus elementos en
cero.
25
Para el anlisis de algoritmos que involucran arreglos de un tamao relativamente grande, el uso de
consolas resulta bastante tedioso. Es conveniente crear una forma general que maneje arreglos de
una manera eficiente y permita desarrollar y probar diferentes algoritmos.
Forma bsica para arreglos de una dimensin:
GetLowerBound(k) regresa el lmite inferior del arreglo k = 0 para arreglos de una dimensin.
GetUpperBound(k) el lmite superior de un arreglo, k =0 para renglones y k = 1 para columnas en una matriz.
26
Descripcin de la aplicacin:
Permite establecer el valor del tamao del arreglo (N). Al
aceptarlo ste ser creado y se prepara su interfaz para la
asignacin de sus valores.
Los controles de esta seccin estn contenidos en un GroupBox cuya propiedad Name se establece
como GpoN. Un control numrico (NumericUpDown) con propiedades Maximum = 200 y Minimum =
27
Multiline
establecida
en
True.
SrollBars
Both,
La primera fase de desarrollo debe permitir crear arreglos, asignar sus valores (numricos),
guardarlo y recuperarlo
Este es el primer cdigo a escribir.
Public Class frmArray
Private Arreglo() As Integer, N
Private Sub frmArray_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim sRuta As String = My.Application.Info.DirectoryPath + "\Arreglos"
'Si esta ruta no existe, se crea
If Not My.Computer.FileSystem.DirectoryExists(sRuta) Then
My.Computer.FileSystem.CreateDirectory(sRuta)
End If
'Ruta inicial para los cuadros de dilogo de archivos
SaveFD.InitialDirectory = sRuta
OpenFD.InitialDirectory = sRuta
End Sub
28
En este procedimiento se asigna el valor de N, se forma un arreglo nuevo y se prepara DGVA para
representarlo y manejarlo.
Private Sub CreaArreglo()
N = NumN.Value
ReDim Arreglo(N)
With DGVA
.RowCount = 1
'Siempre un slo rengln
.ColumnCount = Arreglo.GetUpperBound(0) 'Columnas = Tamao del arreglo
For Each Kol As DataGridViewColumn In DGVA.Columns
Kol.HeaderText = Kol.Index 'Posicin
Kol.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells 'Autoajuste de
celdas
Kol.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter
'Alineado al centro
Next
End With
Valores()
btnSave.Enabled = True
End Sub
Si el valor ingresado en la celda actual es numrico lo convierte a tipo entero de otro modo lo
establece en cero.
Private Sub DGVA_CellEndEdit(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVA.CellEndEdit
If IsNumeric(DGVA.CurrentCell.Value) Then
Arreglo(e.ColumnIndex) = CInt(DGVA.CurrentCell.Value)
Else
MsgBox("Valor no permitido", MsgBoxStyle.Exclamation)
DGVA.CurrentCell.Value = 0
End If
End Sub
29
Aplicacin de arreglos.
Ejemplo:
La compresin de un arreglo a veces implica eliminar los elementos que se repiten y mostrar los
valores que permanecen en la misma secuencia.
Si el arreglo es:
15
10
15
10
15
20
10
20
30
2.
3.
4.
5.
6.
Mostrarlo.
los
datos
de
arreglo
directamente.
Nuevo botn
agregado.
Arreglo inicial.
Es
importante
expresar
el
31
Usando un arreglo para los coeficientes ai, encontrar el valor de una expresin y diferentes valores
de X (X1, X2, )
Solucin:
Sea
-2
32
Lo primero que debe plantearse es que tamao de arreglo usar. Una vez que los coeficientes son
asignados usando los valores de sus posiciones se puede resolver la expresin para valores de X
dados.
La solucin puede presentarse como:
Algoritmo.
1.
2.
3.
4.
5.
6.
Mostrar resultado.
33
P As Long = 0
m, i, k As Integer
N - 1
i = 0 To Arreglo.GetUpperBound(0)
k = m - i
P += Arreglo(i) * X ^ k
Next
Dim Salida As String = "P(" + X.ToString + ") = " + P.ToString
With txtSol
.SelectionStart = .Text.Length
.SelectedText = Salida + vbCrLf
End With
End If
End Sub
Ejercicios propuestos:
1.- Un nmero entero positivo en base decimal se puede convertir a su base binaria u octal con
divisiones sucesivas entre la base (2 u 8) y acumulando los residuos en un arreglo hasta que el
cociente se cero.
Por ejemplo: Sea Nmero 1024
Dividendo
Divisor
Cociente
Residuo
Arreglo de residuos
1024
512
512
256
256
128
178
64
64
32
32
16
16
10
34
RadioButtons
rbBin, propiedad Checked = True
rbOctal.
Dado que estas conversiones de base son utilizadas frecuentemente en otras soluciones es
conveniente crear este procedimiento en una funcin pblica dentro de un mdulo:
Agregar un mdulo a esta aplicacin (Men Proyecto Agregar mdulo) dndole un nombre a ste:
Module ModMisMetodos
Public Function BaseN(ByVal Num As Long, ByVal Base As Short, ByRef Arr() As Object) As
String
Dim Salida() As Char
Dim N As Short = 16
Dim Cociente As Long = 0, P As Short = -1, Res As Short
ReDim Salida(N)
'Solucin al problema:
Salida() es un arreglo temporal de tipo
Cdigo a desarrollar
Do
ToString..
N representa el tamao del arreglo
anterior y no afecta a los objetos
La funcin BaseN recibe la informacin necesaria para convertir un nmero decimal a su equivalente
en binario u octal.
35
Tipo
Uso
Num
Entero
El nmero decimal que se va a usar. Se pasa como una copia del valor
largo
Base
Entero
corto
Arr()
Objeto
Ejecucin8 :
36
Estos son algunos de los mtodos y propiedades que incluye la clase ArrayList:
Add()
AddRange
Capacity
Clear()
Contains()
CopyTo()
Count
GetEnnumerator
GetRange()
IndexOf()
Insert
37
Item()
Remove()
RemoveAt()
Reverse()
Sort()
ToArray()
TrimToSize()
Ejemplo uso.- Se desea ayudar al profesor con el manejo de su grupo. Donde se requiere un objeto
Tipo
Nombre
Texto
Apellido
Texto
Calif
Mtodos
MiNombre
La lista del curso es una Coleccin de alumnos que luego se pasa a un ArrayList para su mejor
manejo. Crear una clase que agregue algunos mtodos al ArrayList para:
Crear una lista de alumnos aprobados y otra de alumnos reprobados y mostrar sus
promedios.
38
(TextBox,
CharacterCasing
=Upper)
txtNom (igual a la anterior)
NumCalif
(NumericUpDown
Maximum
=100)
btnOK (Button).
txtLoc (igual las anteriores)
btnFind (Button
(opcionales).
Francesco Balena. Programming Microsoft Visual Basic 2005: The Languaje. Microft Press.
39
(Button)
btnMenor
(Button)
btnRepro (Button)
btnApro (Button)
labCalMayot (Label, BorderStyle = Fixed3D, AutoSie =False)
labCalMento (copia de la anterior)
La ventana de propiedades de
un DataGridView se abre con
un clic en la esquina superior
derecha:
El
valor
numrico
de
la
DefaultCellStyle.
Funcionamiento:
40
propiedades
El botn
Selecciona de la lista anterior aquellos alumnos con calificacin menor a 70
(calificacin reprobatoria y los muestra en DGVR.
10
En este ejemplo no se agregaron botones para edicin o para eliminar algn objeto de la coleccin. Puede
agregarlos si lo desea.
41
El botn
Hace lo mismo pero para los alumnos que aprobaron el curso (Calif >=70).
CODIGO:
Clase Alumno:
<System.Serializable()> Public Class CAlumno
Private mvarApellido As String
Private mvarNombre As String
Private mvarCalif As Short
Property Apellido() As String
Get
Return mvarApellido
End Get
Set(ByVal value As String)
mvarApellido = value
End Set
42
43
Forma (frmArrayList):
Public Class frmArrayList
Private ColDeAl As Collection, Alumno As CAlumno
Private ElArregloL As ArrayList, ObjetoArr As New CMiListaArreglo
Public Sub New()
' Llamada necesaria para el Diseador de Windows Forms.
InitializeComponent()
' Agregue cualquier inicializacin despus de la llamada a InitializeComponent().
Dim sRuta As String = My.Application.Info.DirectoryPath + "\Colecciones"
If Not My.Computer.FileSystem.DirectoryExists(sRuta) Then
My.Computer.FileSystem.CreateDirectory(sRuta)
End If
'Solo en caso de implementar serializacin (Filter Archivos binarios (*.bi)
SaveFD.InitialDirectory = sRuta
OpenFD.InitialDirectory = sRuta
End Sub
Private Sub frmArrayList_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
ElArregloL = New ArrayList
ColDeAl = New Collection
End Sub
44
45
A=
a11
a12
ain
a21
a22
a2n
an1
an2
ann
46
En VB.NET para crear arreglos con dos dimensiones se usa la instruccin Dim Matriz( , ) para su
manejo dinmico. Una vez conocidos N y M se forma el arreglo:
Dim Matriz(N M, ) As [Tipo] crea una matriz A(N, M) en donde (al igual que en los arreglos de una
dimensin) el primer rengln y la primera columna tienen el ndice 0.
As:
N=3 y M = 3
0
47
Elementos de la forma:
numricos
(NumericIpDown) de nombre NumN. Crear primero este control y despus copiarlo y pegarlo en la
forma modificando luego sus propiedades Name a NumM y NumK.
Propiedades del control numricos NumN.
Propiedad
Valor
Maximum
10
Minimum
TextAlign
Center
48
DGVA,
se
establecen
sus
True.
Valor
En
AllowUserToAddRows
False
AllowUserToResizeRows
False
manejo de
AutCellsColumnMode
AllCells
MultiSelect
False
Tag11
esta
ventana
se
podrn
probar
en otro momento.
A para DGVA, B para DGVB
Esta forma manejar tres matrices:
btnSuma
btnProd
que se realice.
btnInvA
GroupBox
Name = GpoOp
Enabled = False
btnGuardar
btnAbrir
11
Sin comillas.
49
Suma
Multiplicacin
Inversa
Por ejemplo:
12
Por ejemplo:
Funcionalidad de la forma:
En todos los problemas desarrollados a lo largo de este texto se guardarn los datos en archivos
que se localizarn siempre en una carpeta especialmente creada dentro del directorio donde reside
12
Es matriz resultante.
50
El siguiente procedimiento ajusta las propiedades de los controles de datos (DataGridView) para
usarlos tanto pata ingresar los datos de las matrices A y B como para mostrar resultados en R:
El procedimiento CreaGrid recibe por referencia13 el control que se va modificar (DataGridView) as
como el nmero de renglones y columnas requeridos; Se pasan como parmetros como ElGrid ,
iRows,e iCols. De esta manera opera sobre los controles DGVA, DGVB y DGVR.
El procedimiento VerMatriz cualquier matriz (LaMatriz) en uno de los DatagridView (ElGrid) de la
forma.
Private Sub CreaGrid(ByRef ElGrid As DataGridView, ByVal iRows As Short, ByVal iCols As
Short)
With ElGrid
.RowCount = iRows
.ColumnCount = iCols
For Each Kol As DataGridViewColumn In ElGrid.Columns
Kol.HeaderText = Kol.Index
Kol.DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter
Next
End With
End Sub
Private Sub VerMatriz(ByRef LaMatriz(,) As Single, ByRef ElGrid As DataGridView)
Dim i, j As Short
For i = 0 To LaMatriz.GetUpperBound(0)
'Limite de renglones
For j = 0 To LaMatriz.GetUpperBound(1)
'Limite de columnas
ElGrid.Rows(i).Cells(j).Value = LaMatriz(i, j)
Next
Next
End Sub
13
51
Hasta este punto, al ejecutar la aplicacin debe verse as al hacer clic en [Aceptar]:
Validacin de los datos de entrada: Todo valor ingresado debe ser numrico.
El procedimiento de evento opera sobre DGVA y/o DGVB y asigna el valor ingresado a la matriz que
representa (A B).
Private Sub DGVA_CellEndEdit(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVA.CellEndEdit _
, DGVB.CellEndEdit
Dim ElGrid As DataGridView = sender
If Not IsNumeric(ElGrid.CurrentCell.Value) Then
MsgBox("Valor no permitido", MsgBoxStyle.Exclamation)
ElGrid.CurrentCell.Value = 0
52
Procedimientos para guardar y abrir matrices (en y desde archivos).- Las matrices pueden
almacenarse tambin en archivos secuenciales.
Ya que el cdigo necesario para guardar las matrices A y B es repetitivo, se crea un procedimiento
comn:
Private Sub SaveMatrix(ByRef LaMatriz(,) As Single, ByVal NA As Short)
Dim i, j As Short
For i = 0 To LaMatriz.GetUpperBound(0)
For j = 0 To LaMatriz.GetUpperBound(1)
PrintLine(NA, LaMatriz(i, j))
Next
Next
End Sub
Entonces
53
Todas las matrices se pasan por referencia para que los cambios en ellas se reflejen en la ventana
desde donde se invoca el procedimiento.
En la forma principal:
Prueba:
54
Producto A x B.
Al igual que la suma, este procedimiento se crea en el mdulo para su uso en el futuro.
Public Sub ProdAB(ByRef A(,) As Single, ByRef B(,) As Single, ByRef R(,) As Single)
Dim i, j, c As Short
For i = 0 To A.GetUpperBound(0)
For c = 0 To B.GetUpperBound(1)
For j = 0 To A.GetUpperBound(1)
R(i, c) += A(i, j) * B(j, c)
Next
Next
Next
End Sub
55
Problemas:
1.- Transpuesta. La transpuesta de una matriz se obtiene intercambiando renglones por columas:
Su transpuesta es:
2.- La inversa de una matriz A(N, M) en donde N = M y denotada como A -1 es una matriz del mismo
orden tal que:
56
Investigar diferentes mtodos para encontrar la inversa de una matriz A. Implementar uno en el
Mdulo. La inversa (si existe) debe guardarse en el arreglo B, de manera que se pueda verificar por
medio del producto AxB.
57
3.- Aplicaciones: Modelo de Regresin Lineal Mltiple. En estadstica, cuando se considera que el
resultado de alguna variable (Y) depende del valor de otros valores (X j) es posible desarrollar un
modelo que explique esa relacin. El modelo ms sencillo se conoce como el modelo de regresin
lineal mltiple. Definido como:
Y un mtodo muy efectivo para obtener esta ecuacin a partir de un conjunto de observaciones (en
algn experimento) es usando matrices:
Ejemplo: Se tienen los siguientes datos (observados):
Y
X1
X2
El mtodo14 consiste en crear una matriz X con los datos Xi,j agregando una columna inicial cuyos
valores sern siempre 1.
Matriz X:
1
14
58
Luego el vector Xy de Xt Y:
59
Descripcin de la forma:
El proyecto de denomin RegresinLinealMultiple, la forma de denomin
frmRLM y se import el mdulo ModMisMetodos desarrollado en la
aplicacin previa.
15
Llevar a este programa al mdulo con las operaciones de multiplicacin, inversa de una matriz desarrollado
en el programa anterior.
60
False
AutoSizeColumnMode
AllCells
MultiSelect = False
Aqu se capturan los datos.
Control DataGridView:
Nombre= DGVX
Mismas propiedades que el anterior ms ReadOnly = True
Muestra el arreglo X.
Control DataGridView:
Nombre = DGVY
Propiedades iguales al anterior.
Muestra el vector Y.
61
Es un TextBox con nombre txtEc, TextAlign = Center y ReadOnly = True. Sirve para mostrar la
ecuacin resultante.
1.
2.
btSave.- Guarda los datos iniciales (los arreglos X y Y). Enabled = False
3.
4.
Operacin:
Se ingresa el nmero de datos observados y el total de variables x.
5 observaciones con dos variables X.
Al aceptar se crean los arreglos iniciales y se preparan
los DataGridView:
Se asignan los valores de 1 en la primera colimna (que adems se establece
como slo lectura).
Aqu se capturan los datos.
62
cuando se selecciona
se mostrarn los
Se declaran loa arreglos ms importantes y el constructor de la forma, crea un directorio por defecto
para guardar datos:
Public Class frmRLM
Private X(,), XX(,) As Single
Private Y(), XY(), B() As Single
Private N, M As Integer
Public Sub New()
' Llamada necesaria para el Diseador de Windows Forms.
InitializeComponent()
' Agregue cualquier inicializacin despus de la llamada a InitializeComponent().
Dim sRuta As String = My.Application.Info.DirectoryPath + "\RLM"
If Not My.Computer.FileSystem.DirectoryExists(sRuta) Then
My.Computer.FileSystem.CreateDirectory(sRuta)
End If
SaveFD.InitialDirectory = sRuta
OpenFD.InitialDirectory = sRuta
End Sub
Aqu se dimensionan algunos de los arreglos y se forman los DataGridView para visualizarlos y para
capturar los datos:
Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnOK.Click
With DGV
N = NumN.Value
M = NumM.Value
.RowCount = N
.ColumnCount = M + 2
ReDim X(N - 1, M), Y(N - 1)
Dim i, j As Integer
For i = 0 To X.GetUpperBound(0)
X(i, 0) = 1
Next
For j = 0 To DGV.ColumnCount - 2
.Columns(j).HeaderText = "X" + j.ToString
.Columns(j).DefaultCellStyle.Alignment =
DataGridViewContentAlignment.TopRight
63
Valores de N y M.
2.
El arreglo X.
3.
El arreglo Y.
Los datos se leen en la misma secuencia en que se guardaron y se invoca al procedimiento del botn
Aceptar para crear los arreglos y formar los DataGridView iniciales. Al leer los datos, stos son
asignados a sus arreglos y mostrados en DataGridView de datos (DGV).
Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnOpen.Click
If OpenFD.ShowDialog = Windows.Forms.DialogResult.OK Then
Dim NA As Short = FreeFile()
FileOpen(NA, OpenFD.FileName, OpenMode.Input)
N = LineInput(NA)
64
Crea la transpuesta de X.
2.
3.
4.
5.
Forma los DatagridVew necesarios para mostrar resultados intermedios y el resultado final
el arreglo B.
6.
65
Se asume que los procedimientos utilizados ya fueron creados y probados en la aplicacin anterior.
En caso de que falte alguno (por ejemplo la multiplicacin de un arreglo de dos dimensiones por
uno de una un vector, habr que desarrollarlo en ese mdulo - ProdMatArr(InvXX, XY, B)
Realiza la multiplicacin de la inversa de XX por el vector XY y el resultado lo coloca en B.
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnStart.Click
'Transpuesta:
Dim XT(M - 1, N - 1) As Single
ReDim XX(M, M)
Dim InvXX(M, M) As Single
ReDim B(M)
TranspuestaA(X, XT)
'Producto Transpuesta * arreglo X para obtener XX.
ProdAB(XT, X, XX)
ReDim XY(M)
'Transpuesta * Y para obtener Xy
ProdMatArr(XT, Y, XY)
DGVXX.RowCount = M + 1
DGVXX.ColumnCount = M + 1
DGVInv.RowCount = M + 1
DGVInv.ColumnCount = M + 1
'Clculo de la inversa de XX.
InversaA(XX, InvXX)
VerArreglo(DGVXX, XX)
VerArreglo(DGVInv, InvXX)
DGVXy.RowCount = M + 1
DGVXy.ColumnCount = 1
DGVB.ColumnCount = 1
DGVB.RowCount = M + 1
'Producto de Inversa * XY para obtener el arreglo B
ProdMatArr(InvXX, XY, B)
VerVector(DGVXy, XY)
VerVector(DGVB, B)
'Mostrar el resultado.
ShoResult()
End Sub
Private Sub ShoResult()
Dim sEc As String = "Yc = " + B(0).ToString("N2")
Dim i As Short
For i = 1 To B.GetUpperBound(0)
If Math.Sign(B(i)) = 1 Then
sEc += " + "
End If
sEc += B(i).ToString("N2") + "X" + i.ToString
Next
txtEc.Text = sEc
End Sub
66
2 Recursividad.
Competencia especifica.- Comprender y aplicar la recursividad como herramienta de programacin
en el manejo de las estructuras de datos.
DEFINICIN.- Se denomina recursividad a la capacidad de un procedimiento de llamarse a s mismo.
Es el nombre que se da a la tcnica de definir un conjunto o un proceso en trminos de s mismo 16.
La funcin factorial cuyo dominio son los nmeros naturales puede ser definida recursivamente
como:
En donde Factorial(N) est definida en trminos de Factorial(N-1) que luego se vuelve en trminos
de Factorial(N-2), etc., hasta que finalmente se alcanza Factorial (0) y su valor es entonces 1. Una
definicin recursiva de un conjunto de procesos debe contener una definicin explcita para los
valores particulares de sus argumentos de otro modo la definicin podra nunca converger. La idea
bsica es definir una funcin para todos sus argumentos de una manera constructiva usando
induccin. El valor de una funcin para un valor especfico de su argumento puede calcularse en un
nmero finito de pasos usando la definicin recursiva donde en cada paso de la recursin se acerca
ms a la solucin.
Ejemplo 1:
Imports System.Console
Module Module1
Sub Main()
ForegroundColor = ConsoleColor.Black
BackgroundColor = ConsoleColor.White
Clear()
Dim N As Integer, F As Long
Write("N = ")
N = ReadLine()
16
67
Este tipo de recursin de conoce como funcin definida recursivamente ( funciones recursivas
Ejemplo 2.
Imports System.Console
Module Module1
Sub Main()
BackgroundColor = ConsoleColor.White
ForegroundColor = ConsoleColor.Black
Clear()
Dim N, M As Short
Write("N =")
N = ReadLine()
Write("M = ")
M = ReadLine()
Write("Valor de la funcin A =")
WriteLine(Ackerman(M, N))
ReadKey()
End Sub
Private Function Ackerman(ByVal M As Short, ByVal N As Short) As Integer
If M = 0 Then
Ackerman = N + 1
ElseIf N = 0 Then
Ackerman = Ackerman(M - 1, 1)
Else
68
Ejemplo 3.
Escribir una funcin recursiva para convertir enteros decimales a su representacin en otra base (B)
por medio de divisiones sucesivas. El nombre de esta funcin debe ser CONVERT con dos
parmetros formales Nmero y Base donde el primero denota al entero que se va a convertir y el
segundo es la base. El resultado se regresa como una cadena (texto).
Por ejemplo, para encontrar la representacin en base 6 de 184 implica que se dividir
repetidamente entre 6 y los residuos obtenidos son concatenados:
184 6 4
306 0
56 5
El resultado es entonces 504
MaximizeBox = False
69
Propiedades
Descripcin
TextBox
NumericUpDown
Minimum
La base.
TextAlign =Center
Button
Name = btnConvert
Button
Name = btnNew
Label
Name
labResult,
Inicia el clculo.
Nuevo cmputo.
BorderStyle
Fixed3D,
Ejercicios:
1.- El mximo comn divisor de dos enteros se define como (Algoritmo de Euclides):
17
70
2.- Escribir una funcin recursiva para calcular la raz cuadrada de un nmero. Leer una tripleta de
de nmeros N, A y E, donde N es el nmero para el cual debe encontrarse la raz cuadrada, A es una
aproximacin de la raz cuadrada y E es el error permitido en el resultado.
1.0
0.001
1.5
0.001
2.5
0.001
225
14.2
.001
71
entonces el nmero de
72
3 Estructuras Lineales.
Competencia especifica.- Conocer, Identificar y aplicar as estructuras no lineales en la solucin de
problemas del mundo real.
LISTAS.
Lista Ligada Simple.- Coleccin de una clase de objetos llamados nodos. Cada nodo est ligado a su
nodo sucesor en la lista usando una referencia (apuntador). Un nodo consiste en un campo para
almacenar datos y el campo para la referencia del nodo (apuntador liga).
Encabezado
Alicia
Juan
Olga
Nada
El arreglo es la estructura natural que se usa cuando se trabaja con listas. Los arreglos proporcionan
un acceso rpido a los elementos almacenados y se puede iterar fcilmente sobre ellos. No obstante,
el arreglo no es la estructura perfecta ya que la bsqueda de un tem en un arreglo desordenado
puede tomar tiempo ya que deben visitarse cada uno de lo elementos del arreglo. Los arreglos
ordenados son mucho ms eficientes para las bsquedas, pero las inserciones y remociones toman
ms tiempo porque deben cambiarse los elementos hacia arriba hacia abajo para obtener el
espacio para una insercin o eliminar espacio en una remocin. Adems en un arreglo ordenado
debe buscarse el espacio apropiado para insertar un elemento.
La mayor diferencia entre un arreglo y una lista ligada es que mientras que en arreglo los elementos
se referencian por su posicin (un ndice) los elementos de una lista ligada lo hace por una
referencia (apuntador) a otros elementos en el arreglo, as se dice que Juan sigue de Alicia y no que
Juan est en la segunda posicin. Moverse a travs de una lista ligada involucra seguir las ligas
desde el principio hasta el final (nodo inicial, nodo final).
Adems las listas son marcadas al final apuntando a un valor especial que se llama Nothing (nada).
Dado que se trabaja con clases de objetos en memoria, se utiliza el objeto equivalente nulo Nothing,
para denotar el final de una lista. Tambin es recomendable marcar el inicio de una lista con un
nodo llamado encabezado (Header).
La insercin en una lista ligada se vuelve muy eficiente ya que todo lo que implica es cambiar la liga
del nodo previo al nodo insertado y establecer la liga del nodo nuevo al punto que el nodo previo
apuntaba antes de la insercin.
73
Alicia
Juan
Olga
Nothing
Carolina
La remocin de un nodo es igualmente sencilla ya que implica direccionar la liga del nodo antes de
removerlo al nodo que apunta actualmente y establecer la liga del nodo removido a Nothing.
Header
Alicia
Carolina
Juan
Olga
Nothing
18
Michael McMillan. DataStructures and Algorithms Using Visual Basic .NET. Cambridge.
74
75
76
Ejemplo de implementacin:
Agregar al proyecto actual una forma:
77
Objeto
de
Propiedades
Descripcin
TextBox
Name = txtDato
Captura de datos
Button
Name = btnInserta
ListBox
Name = LaLista
Button
Name=btnRemove
inters
de la lista.
Button
Name=New
Button
Name=btnSave
Button
Name=btnOpen
Button
Name=btnClose
Cierra la ventana
Label
Name=labTL
Para
OpenFileDialog
Name=SaveFD,
mostrar
el
total
de
elementos en la lista.
Filter=Archivo
de
datos
(*.dat)|*.dat
DefaultExt=dat
SaveFileDialog
Selecciona
anterior.
almacenada.
una
lista
78
79
Ejecucin:
Las inserciones se hacen en el orden
de captura, pero si se hace un clic
doble sobre cualquier elemento de la
lista ste se vuelve el elemento actual
y la siguiente insercin colocar al
dato despus de tal elemento.
Para eliminar un elemento de la lista,
debe seleccionarse (con un clic) en la
lista y luego seleccionar
Cuente lo elementos en la lista (no debe usarse el control LaLista (ListBox)) de la aplicacin.
80
Crear un mtodo (en la misma clase) que permita modificar la informacin de un nodo por
otro valor (z)19. Por ejemplo que cambie la informacin del nodo Juan por Diana.
Pero puede hacerse como se quiera siempre y cuando los cambios en el cdigo se hagan en la clase.
19
Z es un parmetro.
81
Header
Alicia
Juan
Olga
Nothing
Nothin
g
Se copia el cdigo de CNodo al la clase recin creada y se hacen las siguientes modificaciones:
Public Class CNodoDoble
Public Elemento As Object
Public LigaS As CNodo
'Liga al siguiente
Public LigaA As CNodo
'Liga al anterior
Public Sub New()
Elemento = Nothing
LigaS = Nothing
LigaA = Nothing
End Sub
'Sobrecarga
Public Sub New(ByVal ElElemento As Object)
Elemento = ElElemento
LigaS = Nothing
LigaA = Nothing
End Sub
End Class
Y la insercin en este tipo de lista es parecida a la que se hace en una lista simple excepto que se
tienen que establecer dos apuntadores:
Agregar una clase nueva al proyecto:
82
2.
Si la lista est vaca entonces insertar el nodo y actualizar sus ligas derecha e izquierda.
3.
Si el nodo a insertar est al frente de la lista, entonces insertar el nodo y actualizar sus
apuntadores.
4.
b.
c.
Actualizar ligas:
NodoNuevo.LigaS U.LigaS
NodoNuevo.LigaA U
U.LigaS NodoNuevo
2.
Insercin despus de un elemento en la lista (Nuevo, DespuesDe).- Donde los parmetros Nuevo y
DespuesDe son objetos:
a.
Crear un nodo nuevo para ubicar al elemento despus del cual se insertar el nodo nuevo (U).
b.
c.
Buscar U.
d.
Actualizar apuntadores:
NodoNuevo.LigaS U.LigaS
NodoNuevo.LigaA U
NodoNuevo.LigaS.LigaA NodoNuevo
U.LigaS NodoNuevo
20
83
84
85
Alicia
Header
Juan
Alicia
Header
Alicia
Carolina
Juan
Ejemplo:
Agregar una forma nueva al proyecto21:
21
La propiedad image de los controles es opcional y no necesariamente con las imgenes mostradas, en su
86
(con
elementos
almacenados-
txtDato
btnDel
btnModificar
btnSave
btnOpen
Tres cuadros de dilogo.
btnNew
btnClose
Las tres listas son controles ListBox.
Vista del proyecto:
87
de
una
lista)
Insercin de datos en secuencia despus de un elemento de la lista, seleccionado con doble clic
den ListaA (ListBox). La insercin se realiza al pulsar ENTER en txtDato.
Private Sub txtDato_KeyPress(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles txtDato.KeyPress
If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then
If txtDato.Text.Trim.Length > 0 Then
Dim Elemento As New Object
Elemento = txtDato.Text.Trim
If oActual Is Nothing Then
ListaD.Insertar(Elemento)
Else
ListaD.Insertar(Elemento, oActual)
oActual = Nothing
End If
ListaD.VistaListaD(ListaA)
ListaD.VistaRev(ListaR)
labTotal.Text = ListaD.CuentaItems
txtDato.Clear()
Else
MsgBox("Falta dato", MsgBoxStyle.Information)
End If
End If
End Sub
Private Sub ListaA_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs)
Handles ListaA.DoubleClick _
, ListaR.DoubleClick
Dim Lista As ListBox = sender
If Not Lista.SelectedItem Is Nothing Then
oActual = Lista.SelectedItem
MsgBox("La siguiente insercin ser despus de: " + oActual.ToString)
txtDato.Focus()
End If
End Sub
88
Este procedimiento cambia algunas propiedades de los cuadros de dilogo de acuerdo al tipo de
archivo requerido. Ms adelante, los agregados a esta forma como ejercicio, requieren guardar los
datos como texto, las listas normales se guardan en archivos de datos (.dat).
Private Sub SetDialogo(ByVal sExt As String)
SaveFD.DefaultExt = sExt
If sExt = "txt" Then
SaveFD.Filter = "Archivos de texto (*.txt)|*.txt"
SaveFD.InitialDirectory = RutaPal
Else
SaveFD.Filter = "Archivos de datos (*.dat)|*.dat"
SaveFD.InitialDirectory = sRuta
End If
SaveFD.FileName = ""
OpenFD.InitialDirectory = SaveFD.InitialDirectory
OpenFD.DefaultExt = sExt
OpenFD.Filter = SaveFD.Filter
End Sub
Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnOpen.Click
SetDialogo("dat")
If Not ListArchivos.SelectedItem Is Nothing Then
OpenFD.FileName = ListArchivos.SelectedItem
End If
OpenFD.InitialDirectory = sRuta
If OpenFD.ShowDialog = Windows.Forms.DialogResult.OK Then
Dim sFile As String = OpenFD.FileName
Dim FI As System.IO.FileInfo
FI = My.Computer.FileSystem.GetFileInfo(sFile)
If FI.Length > 0 Then
ListaD = New CListaD
ListaD.AbreDatos(sFile, ListaD)
ListaD.VistaListaD(ListaA)
ListaD.VistaRev(ListaR)
labTotal.Text = ListaD.CuentaItems
End If
End If
End Sub
Para remover un elemento de la lista:
Private Sub btnRem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnRem.Click
'Elemento seleccionado en ListaA (a remover)
If Not ListaA.SelectedItem Is Nothing Then
Dim Borra As Object = ListaA.SelectedItem
ListaD.RemoverD(Borra)
ListaD.VistaListaD(ListaA)
ListaD.VistaRev(ListaR)
labTotal.Text = ListaD.CuentaItems
End If
End Sub
89
90
Y al pulsar ENTER:
91
Ejercicio.- Un palndromo es una frase o palabra que se le igual de izquierda a derecha que de
derecha a izquierda. Estos son algunos ejemplos:
Somos o no somos
Luz azul
La ruta natural
Modificar la ventana de listas ligadas dobles para determinar si una palabra frase es no un
palndromo usando la clase CListaD.
Sugerencias:
Ampliar el ancho de la forma y agregar un control contenedor Panel con las siguientes propiedades:
Name = pnlEj
92
Como se observa, es necesario quitar espacios en la frase y escribirla sin acentos, por ejemplo, la
frase dbale arroz a la zorra el abad, se escribe sin acentos. Adems sus letras son slo minsculas
(el control de texto est configurado as).
sera el siguiente:
93
Aqu, primero se verifica que la palabra sea de longitud mayor 1. Luego se prepara la forma para
una lista doble nueva ejecutando programticamente un clic al botn btnNew.
El proceso comienza extrayendo cada letra de la palabra o frase ingresada recorrindola letra por
letra como se muestra en el ciclo for del procedimiento y usando la funcin Mid de VB.NET.
La instruccin:
L = Mid(Palabra, i, 1)
Extrae la letra del objeto Palabra que se encuentra en la posicin i y tomando nicamente 1
carcter.
Para insertar nicamente letras sin espacios en blanco en la frase:
If CStr(L) <> " " Then
ListaD.Insertar(L)
End If
Finalmente se muestran las listas hacia adelante y hacia atrs y se ejecuta el procedimiento
EsPalindrome objeto del ejercicio.
Para guardar y abrir frases que demuestren la validez del cdigo escrito, se crea un directorio especial:
94
Header
Header
Alicia
Olga
Laura
El modelo usado para la lista ligada simple puede usarse como base para crear una clase para este
tipo de listas:
En el proyecto actual, agregamos una clase nueva:
95
La insercin puede hacerse al principio de la lista o despus de algn otro elemento, por defecto el
ltimo.
Public Sub Insertar(ByVal X As Object, ByVal DespuesDe As Object)
Dim Actual As New CNodo
Dim NodoN As New CNodo(X)
Actual = Buscar(DespuesDe)
NodoN.Liga = Actual.Liga
Actual.Liga = NodoN
CuentaNodos += 1
End Sub
Public Sub InsertarPrimero(ByVal X As Object)
Dim Actual As New CNodo(X)
Actual.Liga = Header
Header.Liga = Actual
CuentaNodos += 1
End Sub
Remocin:
Public Sub Remover(ByVal X As Object)
Dim NodoP As CNodo = BuscaPrev(X)
If Not NodoP.Liga Is Nothing Then
NodoP.Liga = NodoP.Liga.Liga
End If
CuentaNodos -= 1
96
(NumericUpDown,
Maximum = 10)
txtArchivo (TextBox)
ListaArchivos (ListBox)
Los botones son:
btnDel
btnMove
btnSave
btnOpen
97
Minimum
=0,
98
Finalmente, para guardar una lista, debe introducirse el nombre del archivo, el cual si existe ser
reemplazado con la lista actual.
99
As:
La siguiente insercin se har despus de Alicia, por
ejemplo.
100
22
101
Crear una lista circular de N elementos (N>10) con los nombres de los que sern
ejecutados.
2.
3.
4.
a.
b.
c.
d.
Vaciar el ArrayList.
e.
FIN
Puede usarse la ventana actual agregando una seccin para resolver el ejercicio:
Panel1
NumM
(NumericUpDown
102
PILAS
La Pila es una de las estructuras lineales de tamao variable ms importantes.
De forma general, en una lista lineal se pueden realizar inserciones o remociones en cualquier parte
esta. Una clase importante de listas permite que la insercin y remocin de un elemento se realice
nicamente al final de la lista. Este tipo de clase se conoce como una Pila. A la operacin de insertar
un elemento al final de la lista se le conoce como PUSH y a la operacin de eliminar el elemento al
final de la lista como POP. El primer y ltimo elemento de una pila debe ser accesible y se conocen
como el fondo y el tope de la pila. As la remocin se hace siempre en el orden inverso a como
fueron agregados los elementos de una pila.
103
POP
Pila Vaca
Tope 0
PUSH1
Tope 1
PUSH2
Tope 2
1
PUSH3
Tope 3
2
2 Tope
Puesto que como generalmente no se conoce el tamao de una pila, lo mejor es usar una estructura
dinmica como el ArrayList.
La Clase PILA (Agregar al proyecto actual) :
Public Class CPila
Private Tope As Integer
Private L As New ArrayList
Public Sub New()
Tope = -1
End Sub
ReadOnly Property Count() As Integer
Get
Return L.Count
End Get
End Property
Public Sub PUSH(ByVal X As Object)
L.Add(X)
Tope += 1
End Sub
Public Function POP() As Object
If L.Count > 0 Then
Dim x As Object = L.Item(Tope)
L.RemoveAt(Tope)
Tope -= 1
Return x
Else
Return Nothing
End If
End Function
Public Sub CLEAR()
L.Clear()
End Sub
Public Function PEEK() As Object
'Regresa el elemento en el tope de la pila
If Not Tope = -1 Then
Return L.Item(Tope)
Else
'Pila vaca
Return Nothing
End If
End Function
Public Sub VerPila(ByRef LB As ListBox)
LB.Items.Clear()
If L.Count > 0 Then
L.Reverse()
For Each X As Object In L
LB.Items.Add(X)
Next
104
txtDato (TextBox)
btnPush (Button)
LaPila (ListBox)
btnPop (Button)
btnTope (Button)
btnCLS (Button)
ListaPOP (ListBox)
labCount (Label).
105
Ejecucin:
Secuencia de insercin: 150, 417, 515, 800, 90:
Tope de la pila:
106
Aplicacin:
El problema del Palndromo23 puede resolverse usando una pila y usando esta misma forma:
Panel1:
txtFrase (TextBox, CharacterCasing = Lower)
btnPal (Button):
23
107
La Clase Stack.
La clase Stack es una implementacin de la interfaz ICollection que representa a una pila. Esta clase
est implementada como un buffer circular que permite obtener espacio dinmicamente para los
elementos insertados en la pila. Esta clase forma parte del marco (Framework) .NET.
La clase Stack incluye mtodos Push, Pop y Peek. Tiene tambin mtodos para determinar el nmero
de elementos en la pila, limpiarla y regresar los valores en la pila como un arreglo.
Mtodos Constructores de la clase Stack.
Existen tres maneras de instanciar un objeto Stack. El constructor por defecto instancia una pila
vaca que inicialmente tiene una capacidad de 10 elementos y puede invocarse como:
Ejemplo:
24
109
Comprobacin:
110
Precedencia
Rango
+, -
-1
*, /
-1
a, b, c,
Se asume que el contenido de la pila para evaluar esta expresin se inicializa con el smbolo # que
tiene un valor de precedencia menor que los dems smbolos dados en la tabla.
El algoritmo general para esta tarea sera:
1.
2.
3.
4.
Remover y sacar todos los smbolos en la pila cuya precedencia sea mayor o igual al valor de
precedencia del valor del smbolo actual.
5.
6.
actual).
Algoritmo Expresiones si parntesis
25
25
111
cuando es invocada regresa el siguiente carcter (de izquierda a derecha) de la cadena de entrada,
este algoritmo convierte INFIJA a su correspondiente cadena POLACA. RANGO contiene el valor de
cada smbolo en la expresin polaca. ACTUAL contiene el smbolo actualmente examinado y TEMP
es el elemento que se saca de la pila. Se asume que la cadena de entrada termina con el smbolo
especial #.
1.
Inicializar la PILA:
PILA.PUSH(#)
2.
3.
4.
5.
6.
7.
8.
Es vlida la expresin?
Si Rango = 1, entonces
Expresin es vlida
De otro modo
Expresin no es vlida
112
Implementacin:
Public Class CPolaca
Public POLACA As String = ""
Private mvarINFIJA As String = ""
Private Actual As String = ""
Private TEMP As String = ""
Private X As Short
Public Sub New()
X = 0
End Sub
Property INFIJA() As String
Get
Return mvarINFIJA
End Get
Set(ByVal value As String)
mvarINFIJA = value + "#"
End Set
End Property
Private Function RSP(ByVal C As Char) As Short
'Expresin sin parntesis
Select Case C
Case "+", "-"
Return -1
Case "*", "/"
Return -1
Case "a" To "z"
Return 1
Case "#"
Return 0
Case Else
Return 0
End Select
End Function
Private Function FSP(ByVal C As Char) As Short
'Expresin sin parntesis
Select Case C
Case "+", "-"
Return 1
Case "*", "/"
Return 2
Case "a" To "z"
Return 3
Case "#"
Return 0
Case Else
Return 0
End Select
End Function
Private Function SIGUIENTE() As Char
If X < mvarINFIJA.Length Then
Dim L As Char = mvarINFIJA.Substring(X, 1)
X += 1
Return L
Else
Return vbNullChar
End If
End Function
Public Function POLACASP() As String
Dim Pila As New Stack
Pila.Push("#") '...........................................[1]
Dim Rango As Short = 0 '...................................[2]
POLACA = ""
INFIJA += "#"
113
114
Precedencia de entrada
Funcinde Rango
+, -
-1
*,-
-1
-1
a,b,c,
Dada una cadena infija de entrada (INFIJA) que representa a una expresin infija la cual termina con
) y cuyos smbolos tienen los valores de precedencia que se muestran en la tabla 2, una PILA y una
funcin SIGUIENTE que cuando es invocada regresa el siguiente carcter a ser evaluado, este
algoritmo convierte la expresin infija a su polaca equivalente. La variable entera Rango acumula el
rango de la expresin. Finalmente TEMP almacena temporalmente el elemento apilado.
1.
Inicializar PILA:
PILA.PUSH(()
2.
26
Tremblay
115
4.
5.
6.
Se encuentran parntesis?
Si Actual PILA.TOPE entonces
PILA.PUSH(Actual)
De otro modo
PILA.POP
7.
8.
Es vlida la expresin?
Si PILA.TOPE 0 Rango 1 entonces
Error Expresin invlida
[FIN]
De otro modo, RETURN POLACA
116
117
'[1]
'[2]
'[2]
'[3]
'[4]
'5]
'[6]
'[7]
'[8]
Cambios en la forma:
Ejecucin:
(1)
(3)
Donde z es el resultado numrico final y las variables a, b, c,, z son valores numricos.
118
2.
3.
El siguiente smbolo es tambin un operador, luego se extraen dos elemento y se realiza la operacin:
R2 a + R1 (5 + 3 = 8) y se apila:
R2
R2
R1 d e (4 2 = 2) y se apila
R1
R2
R1
R1
Operador *
R2 R1 * h (2 * 5 = 10)
R2
10
R1
-2
119
4.
Ejercicio:
Construir una calculadora de expresiones algebraicas infijas que las convierta a su equivalente
polaca, y sea capaz de asignar valores numricos a las variables para mostrar el resultado numrico
final. Algo como esto:
TxtINIFJA (TextBox, CharacterCasing = Lower) permite ingresar una expresin infija directamente o
desde el teclado alfanumrico.
Ejemplo:
es una expresin vlida se activa el botn (btnRes, Enabled = False como valor inicial).
120
El conjunto de operadores:
121
En donde se hizo una ligera modificacin a la clase CPolaca con el fin de saber si la expresin fue o
no vlida.
Public Function POLACACP(Optional ByVal bValid As Boolean = False) As String
Dim PILA As New Stack
INFIJA += ")"
PILA.Push("(")
'[1]
POLACA = ""
'[2]
Dim Rango As Short = 0
'[2]
Actual = SIGUIENTE()
'[3]
Do While Actual <> vbNullChar
'[4]
If PILA.Count = 0 Then
POLACACP = "Expresin invlida"
Exit Function
End If
Do While FCP(Actual) < G(PILA.Peek)
'5]
TEMP = PILA.Pop
POLACA += TEMP
Rango += RCP(TEMP)
If Rango < 1 Then
POLACACP = "Expresin invlida"
Exit Function
End If
Loop
If FCP(Actual) <> G(PILA.Peek) Then
'[6]
PILA.Push(Actual)
Else
PILA.Pop()
End If
Actual = SIGUIENTE()
'[7]
Loop
If PILA.Count <> 0 Or Rango <> 1 Then
'[8]
122
Exit Function
End If
Loop
Pila.Push(Actual) '....................................[6]
Actual = SIGUIENTE()
Loop
Do While Pila.Peek <> "#" '................................[7]
TEMP = Pila.Pop
POLACA += TEMP
Rango += RSP(TEMP)
Loop
If Rango = 1 Then '........................................[8]
POLACASP = POLACA
bValid = True
Else
POLACASP = "EXPRESION NO VALIDA"
bValid = False
Exit Function
End If
End Function
Para extraer las variables de una expresin polaca vlida usamos una coleccin que est declarada
como privada y las muestra en el DGV:
Public Class frmCalc
Private Variables As New Collection
123
Luego deben introducirse directamente los valores numricos de cada variable en la celda
correspondiente:
Finalmente:
Calcula el resultado final numrico y lo muestra:
Escribir este procedimiento de evento siguiendo la metodologa descrita antes para obtenerlo.
Private Sub btnCalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnCalc.Click
'Ejercicio de evaluacin
End Sub
Esta solucin no es la nica, puede intentar otra para alcanzar este objetivo usando cualquier otra
estructura de datos que considere pertinente.
Resultado:
124
siguiente ejemplo:
En la unidad II se mostr el algoritmo recursivo para la funcin Factorial:
Unidad II.
28
J.P. Tremblay.
125
1.
2.
3.
Calcular N!
FACTORIAL N * FACTORIAL
4.
126
4 Estructuras no lineales.
Competencia especifica.- Conocer y aplicar las estructuras no lineales en solucin de problemas del
mundo real.
rboles.
Definicin.- Un rbol es una estructura de datos no lineal que se usa para almacenar datos de una
manera jerrquica. Un rbol es una estructura jerrquica que se aplica sobre una coleccin de de
elementos u objetos llamados nodos, uno de los cuales es llamado Raz. Adems se crea una
relacin de parentesco entre los nodos dando lugar a trminos como padre, hijo, hermano, sucesor,
ancestro, etc.29
Un rbol es pues un conjunto de nodos conectados por ramas. Un ejemplo de un rbol es el
organigrama de organizacin de una empresa.
Raz
Gerente General
Director de
Director de
Direccin de
Finanzas
Produccin
Ventas
F
Fig. 4. 1
29
Jefe de operaciones
127
Soporte tcnico
T
C
F
E
Sub-rbol
Fig 4.2
Si un nodo est conectado a otros nodos por debajo de l, se denomina nodo padre y a los nodos
por debajo de l se les denomina nodos hijos. Un nodo puede tener cero, uno ms nodos
conectados a l. Existe una clase especial de rboles llamados rboles Binarios que restringen el
nmero de hijos a no ms de dos. Los rboles binarios tienen ciertas propiedades computacionales
que los hacen muy eficientes para muchas operaciones
En la figura 2 se puede observar que se pueden visitar ciertos nodos que no estn directamente
conectados siguiendo una Ruta de conexiones. Por ejemplo para llegar al nodo R, la ruta sera M
T R. El visitar todos los nodos de un rbol se denomina travesa.
Un rbol puede dividirse en dos niveles. El nodo raz es el nivel 0, su hijo el nivel 1, sus hijos seran
el nivel 3 y as sucesivamente. Un nodo en cualquier nivel se considera la raz de un sub-rbol el
cual consiste de esa raz y sus hijos y los hijos de sus hijos. Se define la profundidad de un rbol
como nmero de capas en l.
Por ltimo, cada nodo en el rbol tiene un valor algunas veces referido como el valor clave.
ARBOLES BINARIOS.
Un rbol binario se define como un rbol en el cual cada nodo no tiene ms de dos hijos. Los nodos
hijos de un nodo padre son referidos como nodo izquierdo y nodo derecho. Para ciertas
128
53
30
17
80
75
40
90
Fig. 4.3
En este rbol los valores menores (a la raz) se almacenan a la izquierda y los mayores a la derecha.
Recorridos en un rbol binario.
Se llama recorrido del rbol al procedimiento de visitar todos los nodos del mismo de diferentes
maneras. Existen tres mtodos de recorridos sobre el rbol: inorder, preorder y postorder. El
recorrido inorder visita todos los nodos en orden ascendente de sus valores. Un recorrido en
preorder primero visita la raz seguido de los nodos en los sub rboles del hijo izquierdo de la raz.
Este procedimiento puede escribirse de manera recursiva. Puesto que el mtodo visita cada nodo de
manera ascendente, debe adems visitar tanto el hijo izquierdo como el derecho de cada sub rbol
siguiendo con los rboles a la izquierda de la raz antes de continuar con los de la derecha.
En el recorrido en preorder la nica diferencia entre ambos son tres lneas de cdigo. La llamada al
procedimiento para visualizar un nodo est colocada entre las dos llamadas recursivas del mtodo
inorder.
En el mtodo postorder la diferencia con los dos anteriores es donde se coloca la
llamada al
129
Nodo a eliminar
5
0
4
Fig. 4.4
Otro caso especial es la remocin de un nodo con dos hijos:
En el primer caso la solucin es mover el sucesor inorder al lugar del nodo que se elimina (50). Esto
funciona bien a menos
que el sucesor mismo tenga hijos. Para encontrar al sucesor del nodo
original hay que ir al nodo derecho original. Por definicin, este nodo no debera ser mayor que el
nodo original. Luego se comienzan a seguir las rutas del hijo izquierdo. Puesto que el valor ms
130
2.
Asignar el hijo derecho del nodo a remover al nodo hijo derecho del nodo sucesor.
3.
Remover el nodo actual del hijo derecho de su padre y apuntarlo al nodo sucesor.
4.
Remover el nodo hijo izquierdo del nodo actual y asignarlo al nodo hijo izquierdo del nodo
sucesor.
Aplicacin:
Crear un proyecto de Windows (con el nombre WinBTree).
131
132
La forma (frmBTree):
133
Fig. 4.5
Controles en la forma:
Nombre
Tipo
Descripcin
txtDato
btnOK
Acepta el dato.
Indica que los datos que se ingresan son
nmeros.
Muestra los datos del rbol.
lstDatos
ListBox
txtSalida
btnDel
TextBox
Multiline,
ScrollBars = Both,
WordWrap = False
Button
btnCLS
Button
Limpia el rbol.
btnSave
Button
btnOpen
Button
Button
Button
Button
Button
Cierra la aplicacin.
Button
Button
SaveFileDialog. DefaultExt =
dat, Filter = Archivos de
datos (*.dat)|*.dat
OpenFileDialog,
con
las
mismas especificaciones que
el anterior.
btnPostOrder
btnInOrder
btnPreOrder
btnClose
btnMax
btnMin
134
135
Ejecucin:
136
Fig. 4.6.
Dato no numricos:
137
FERNANDE
Z
LOPEZ
ALVAREZ
DIAZ
BERNAL
CANALES
Fig. 4.8.
138
Ejercicios:
1.
Agregar una funcin a la clase CArbolB que cuente el nmero de ramas en el rbol.
2.
Escribir un programa que lea un archivo de texto que almacene en el rbol y despliegue todas
las palabras en el archivo y encuentre el nmero de veces que aparecen en el archivo.
3.
Una expresin aritmtica como 3 + 4 * 5 / 6 puede ser evaluada usando la correcta precedencia
de operadores. Modifique la clase CArbolB para hacer esto.
4
0
3
0
139
4
0
3
0
1
0
Fig. 4.10.
El sub rbol izquierdo tiene un tamao de 2 pero el derecho lo tiene de cero, violando las reglas de
los rboles balanceados. El rbol se balancea realizando una rotacin simple derecha, moviendo 40
abajo a la derecha y el 30 arriba a la derecha resultando:
3
0
4
3
0
4
0
2
5
140
Fig.
141
poco conectado. Si un grafo tiene una rama entre cada conjunto de vrtices se dice que es un grafo
completo.
Sistemas del Mundo Real modelados con Grafos.
Los grafos son usados para modelar diferentes tipos de sistemas del mundo real. Un ejemplo es el
flujo de trfico. Los vrtices representan intersecciones entre calles y las ramas representan a las
calles mismas. Grafos ponderados pueden usarse para representar los lmites de velocidad o el
nmero de carriles o callejones.
Los modeladores pueden usar el sistema para determinar las mejores rutas y las mejores calles
alternas para navegar en trfico denso.
Cualquier tipo de sistema de transporte puede modelarse usando un grafo. Por ejemplo, una lnea
area puede modelar su sistema de vuelos usando un grafo. Cada aeropuerto en un vrtice y cada
vuelo de un vrtice a otro es una rama. Una rama ponderada puede representar el costo de un vuelo
desde un aeropuerto a otro, o la distancia entre uno y otro.
LA CLASE GRAFO.
Representacin de Vrtices:
Matriz adyacente. Donde se representan los vrtices visitados (valores booleanos).- Arreglo de dos
dimensiones (matriz) donde los elementos indican si existe una rama entre dos vrtices.
142
V0
V1
V2
V3
V4
V0
V1
V2
V3
V4
143
debe
tomar
para
un
estudiante
debe
haber
cursado (y aprobado) :
Fundamentos
de
Programacin
Matemticas
computadora
Fundamentos
Fundamentos
de
de Bases de
Programacin
OO
Datos
Estructuras
Programacin
de Datos
Matemticas
Lenguaje
para Comp.
Ensamblador
144
para
2.
3.
4.
Repetir desde el paso #1 hasta que todos los vrtices sean removidos.
FP
OOP
ED
LE
FP
OOP
ED
2
3
LE
A(0, 1) = 1
A(1, 2) = 1
A(2, 3) = 1
Vrtices:
FP
OOP
ED
LE
A(0, 1) Rama
Se quita:
OOP
ED
LE
LE
FP
30
OOP
ED
LE
LE
145
ED
LE
LE
Fig.
En un alto nivel, la bsqueda en profundidad trabaja as: Primero se marca un punto de inicio el cual
puede ser cualquier vrtice. Visitar el vrtice, apilarlo y marcarlo como visitado. Luego ir al siguiente
vrtice no visitado, apilarlo y marcarlo. Esto contina hasta alcanzar el ltimo vrtice. Luego se
verifica si el vrtice en el tope tiene algunos vrtices adyacentes no visitados. Si no lo hay entonces
se vaca la pila y se verifican los siguientes vrtices. Si se encuentra uno, se comienzan a visitar
vrtices adyacentes hasta que no existan ms sin ser visitados. Cuando finalmente se alcanza el
ltimo vrtice en la pila y no hay ms vrtices adyacentes no visitados se ha completado una
bsqueda en profundidad.
31
146
147
Otro ejemplo:
148
149
Plan reticular.
150
5 Mtodos de Ordenamiento.
Competencia especifica.- Aplicar el mtodo de ordenamiento pertinente en la solucin de un
problema real.
Definicin.- Se denomina ordenamiento (sort) al proceso de ordenar una serie de datos que
generalmente estn en un arreglo. Este proceso y la bsqueda (search) de algn dato en particular
son probablemente
principio de su era. Muchas de las estructuras que se han desarrollado en este libro fueron
diseadas principalmente para ordenar y buscar datos y hacer ms eficiente el almacenamiento de
datos en ellas.
Aunque los investigadores en esta ciencia han desarrollado varios algoritmos sofisticados para
ordenar datos, existen algunos muy simples que el estudiante debe analizar. Estos son: El sort de la
burbuja y el sort por seleccin.
Para probar estos algoritmos, se propone construir la siguiente aplicacin:
151
152
Tipo
Propiedades
Forma
MaximizeBox = False
NumericUpDown
Button
TextBox
NumericUpDown
txtMin, txtMax
NumTest
prueba).
Minimum = 10 (El tamao mnimo del arreglo).
chkTest
btnCrear
CheckBox
Button
DataGridView.
DGVA
PB
PregressBar
Visible = False
TextBox
txtArreglo
WordWrap = False.
Button
Button
btnBSort, btnSSel
btnQSort, btnShell
Canales
Puente
Lpez
Acevedo
Bernal
153
Luego se toma la siguiente (de la pila original), que en este caso es Prez y se acomoda en la
segunda pila de manera que queden ordenadas:
Canales
Canales
Canales
Acevedo
Acevedo
Garca
Garca
Canales
Bernal
Puente
Lpez
Garca
Canales
Puente
Lpez
Garca
Puente
Lpez
Puente
64
49
53
27
28
70
29
69
64
49
64
53
27
28
70
29
59
64
27
64
23
49
28
70
29
59
64
64
23
49
28
70
27
29
59
64
59
64
Siguiente recorrido de i (i 1)
i
64
23
23
64
49
49
28
70
27
29
28
70
i 2
27
29
59
64
28
70
27
23
64
49
23
49
64
29
59
64
28
70
i 3
27
29
69
64
23
49
64
28
70
27
29
69
64
23
49
28
64
70
27
29
69
64
23
49
27
64
70
28
29
69
64
70
28
29
59
64
64
29
59
64
64
29
59
64
i 4
En i 3, ocurren intercambios en j 4 y 6.
23
49
27
64
j
3
23
49
27
28
70
i 5
23
49
27
28
70
j
3
23
49
27
28
64
70
29
59
64
23
49
27
28
29
i 6
70
64
59
64
154
23
49
27
28
29
70
64
59
64
23
49
27
28
29
64
70
59
64
23
49
27
28
29
i 7
59
70
64
64
23
49
27
28
59
70
64
64
29
23
49
27
28
29
59
64
70
64
23
49
27
28
29
59
64
64
70
Implementacin:
Imports System.Console
Module Module1
Sub Main()
BackgroundColor = ConsoleColor.White
ForegroundColor = ConsoleColor.Black
Clear()
Dim Arreglo() As Integer = {64, 49, 53, 27, 28, 70, 3, 29, 59, 64}
Dim i, j, Temp, N As Integer
N = 9
WriteLine("Arreglo desordenado:")
VerArreglo(Arreglo, N)
WriteLine("Valores intermedios en el arreglo:")
ReadKey()
For i = 0 To N - 1
For j = i + 1 To N
If Arreglo(j) < Arreglo(i) Then
Temp = Arreglo(i)
Arreglo(i) = Arreglo(j)
Arreglo(j) = Temp
End If
Next
VerArreglo(Arreglo, N)
Next
WriteLine()
WriteLine("Arreglo ordenado:")
VerArreglo(Arreglo, N)
ReadKey()
End Sub
Private Sub VerArreglo(ByRef Arr() As Integer, ByRef N As Integer)
For i As Integer = 0 To N
Write(Arr(i).ToString.PadLeft(2) & " ")
Next
WriteLine()
End Sub
End Module
Ejecucin:
155
As con algunas ligeras modificaciones (quitando las relativas a la consola), se pasa este
procedimiento al la forma de Windows .
As
System.Object,
For i = 0 To N - 1
For j = i + 1 To N
If Arreglo(j) < Arreglo(i) Then
Temp = Arreglo(i)
Arreglo(i) = Arreglo(j)
Arreglo(j) = Temp
End If
Next
Next
If chkTest.Checked Then
VerEnGrid()
VerArreglo()
Else
VerArreglo()
End If
End Sub
156
ByVal
As
System.EventArgs)
Imports System.Console
Module Module1
Sub Main()
BackgroundColor = ConsoleColor.White
ForegroundColor = ConsoleColor.Black
Clear()
Dim Arreglo() As Integer = {64, 49, 53, 27, 28, 70, 3, 29, 59, 64}
Dim N As Integer
N = Arreglo.GetUpperBound(0)
WriteLine("Arreglo desordenado:")
VerArreglo(Arreglo, N)
WriteLine("Valores intermedios en el arreglo:")
ReadKey()
Bubble(Arreglo, N)
WriteLine()
WriteLine("Arreglo ordenado:")
VerArreglo(Arreglo, N)
ReadKey()
End Sub
Private Sub Bubble(ByRef Arr() As Integer, ByVal N As Integer)
Dim U, i, Temp, Cta As Integer
157
Y en la forma:
158
159
33 .
inferior y superior de la particin que est siendo procesada. La variable K contiene el valor que ha
de colocarse en su posicin final dentro de una particin. F es una variable lgica que indica el final
del proceso que coloca un registro en su posicin final. Cuando se hace falso, la tabla de entrada ha
sido particionada en dos partes desunidas.
1.
Inicio.
F Verdadero
2.
Efectuar ordenamiento:
Si LI LS, entonces
i LI
j LS + 1
K A[LI]
Repetir mientras F
i i + 1
Repetir mientras A[i] < K
(moverse de izquierda a derecha)
i i + 1
[Fin Mientras]
j j -1
Repetir mientras A[j] > K
j j- 1
[Fin Mientras]
Si i < j entonces
A[i] A[j] (se intercambian registros)
De otro modo
F Falso
[Fin Si]
[Fin Mientras]
A[LI] A[j]
(intercambio de registros)
Llamada recursiva QuicSort(LI, j -1)
Llamada recursiva QuickSort(j+1, LS)
3.
Termina.
32
Tremblay.
33
160
Arreglo desordenado:
161
Un heap debe estar completo, lo que significa que cada rengln debe estar lleno.
2.
Cada nodo contiene datos que son mayores o iguales que los datos en los nodos hijos.
Por ejemplo:
10
162
10
00
Repetir hasta el paso 7 mientras an exista un registro que deba ser colocado en el
acumulamiento (heap).
2.
3.
4.
Repetir hasta el paso 6 mientras el hijo tenga un padre y el valor clave del hijo se mayor que
su padre.
5.
6.
7.
Este es el cdigo:
Private Sub CrearHeap()
Dim i, j, Q, K As Integer
For Q = 1 To N
i = Q
K = Arreglo(Q)
j = i \ 2
Do While i > 0 And K > Arreglo(j)
Swap(i, j)
i = j
j = i \ 2
If j < 0 Then
j = 0
End If
Loop
34
Tremblay.
163
'[1]
'[2]
'[3]
'[4]
'[5]
'[6]
'[7]
2.
3.
4.
5.
6.
7.
8.
Arreglo desordenado:
164
Arreglo grande:
165
Ejemplo:
As, corriendo los diferentes mtodos para arreglos de tamao 5000 y agregando las instrucciones
mostradas arriba en cada uno:
Burbuja:
Seleccin:
Quick Sort:
Heap Sort:
35
La velocidad de cada mtodo depende de las capacidades del equipo donde se ejecuta.
166
El ordenamiento por mezcla produce un tercer arreglo C con tamao N + M: C[N + M] que contiene
los elementos de A y B ordenados:
1
167
A[N]
0 1 2
1.
Iniciar ndices: (i 0, j 0, k 0
2.
De otro modo
2
j
C[k] B[j]
B[M]
0 1
Fin Si
K k +1
3.
C[N + M]
1 2 3 4
4.
5
6
5.
Imports System.Console
Module Module1
Sub Main()
BackgroundColor = ConsoleColor.White
ForegroundColor = ConsoleColor.Black
Clear()
Dim A1() As Integer = {1, 3, 5, 7, 9, 11}
Dim A2() As Integer = {2, 4, 6, 8, 10}
Dim M As Integer = A1.GetUpperBound(0) + A2.GetUpperBound(0) + 1
Dim B(M) As Integer
WriteLine("Arreglo 1:")
VerArreglo(A1)
WriteLine("Arreglo 2:")
VerArreglo(A2)
MergeSort(A1, A2, B)
WriteLine("Mezcla:")
VerArreglo(B)
ReadKey()
End Sub
Private Sub MergeSort(ByRef Arr1() As Integer, ByVal Arr2() As Integer, ByVal ArrM() As
Integer)
Dim i, j, k As Integer
Dim N1, N2, M As Integer
N1 = Arr1.GetUpperBound(0)
N2 = Arr2.GetUpperBound(0)
M = ArrM.GetUpperBound(0)
i = 0 : j = 0
k = 0
Do While i <= N1 And j <= N2
If Arr1(i) < Arr2(j) Then
ArrM(k) = Arr1(i)
i += 1
Else
ArrM(k) = Arr2(j)
j += 1
End If
k += 1
Loop
If i <= N1 Then
168
Ordenamiento Externo.
Son algoritmos que se aplican para ordenar datos que estn almacenados en la memoria secundaria
del equipo. Puede usarse cualquiera de los mtodos vistos aqu ya que un archivo puede
considerarse como un arreglo en la memoria secundaria.
Para mostrar estos procedimientos, se usarn archivos directos que tienen como principal
caracterstica que sus registros pueden leerse o escribirse directamente en cualquier rengln.
Archivo desordenado
N de Registro
Valor
10
Sort Externo
169
Valor
10
Proyecto:
Objeto
Tipo
Propiedades
Uso
NumN1
NumericUpDown
Establecer el tamao
Increment =10
Establecer el tamao
Increment =10
NumN2
lstSerieA
NumericUpDown
ListBox
Mostrar
datos
del
datos
del
archivo 1
lstSerieB
ListBox
Mostrar
archivo 2
labN1
Label
Text=0
Muestra el n de datos
labN2
Label
Text=0
Datos en el archivo 2
lamM
Label
Text=0
Muestra el n de datos
del archivo 1
de
170
la
mezcla
ListBox
txtFileA
TextBox
Muestra la mezcla de
archivos.
Para
establecer
nombre
del
el
1er
archivo.
txtFileB
TextBox
Para
establecer
el
Button
programa
para
Enabled = False
btnCrear
los
dos
archivos
aleatoriamente.
Button
Enabled = False
Mezcla
btnMerge
los
dos
archivos.
lstFiles
ListBox
btnDel
Button
Elimina
el
archivo
seleccionado.
btnO
Button
Abre
pen
el
archivo
seleccionado
lo
RadioButton
rblstA.Checked = True
rblstB
Determina la lista en
donde se mostrar un
archivo.
btnCLS
Button
171
172
173
174
2.
Seleccionar
3.
4.
Mezclar archivos.
previo).
5.
Cuando se abre un archivo, previamente debe seleccionarse la lista donde ser desplegado.
175
Ejercicio:
Modifique el mtodo de ordenamiento usado en esta aplicacin y cmbielo por:
QuickSort
HeapSort
176
6 Mtodos de Bsqueda.
Competencia especifica.- Aplicar el mtodo de bsqueda pertinente en la solucin de un problema
real.
Competencia especfica: Aplicar el mtodo de bsqueda pertinente en la solucin de un problema
real.
Introduccin.- La bsqueda y recuperacin de datos es una tarea fundamental en programacin y es
una de las que ms ha sido estudiada.
Existen bsicamente dos formas de buscar datos en una lista (o arreglo); la bsqueda secuencial y la
bsqueda binaria. La primera se usa cuando los datos no estn ordenados, la segunda es usada
cuando los datos estn ordenados.
Bsqueda Secuencial.
Este mtodo es bastante fcil de implementar ya que consiste en recorrer el arreglo hasta encontrar
el elemento que se busca:
Para ejemplificar lo anterior, se utilizar la misma aplicacin de la Unidad V (Ordenamiento),
agregando los siguientes controles en la parte inferior
de la forma:
Objeto
Tipo
txtLoc
TextBox
btnBSec
btnBBins
labTB
Propiedades
Button
Button
Enabled = False
Label
177
Arreglo desordenado:
Buscar x = 3:
Bsqueda Binaria.
Se aplica nicamente sobre arreglos ordenados. La idea es seguir un procedimiento similar a buscar
un telfono especfico en un directorio telefnico. As si se desea buscar el telfono de Prez Alcocer
Alicia no se busca pgina por pgina sino que se van abriendo pginas de la A-Z, luego se parte a la
mitad esa seccin, resultando por ejemplo M Z, descartando la primera mitad y se repite el
proceso, por ejemplo M R hasta llegar a la P. Luego en esos apellidos no leemos
178
10
179
Arreglo ordenado:
McMillan.
180
181
Para localizar una clave, slo se invoca a la funcin hash y se compara el valor de esa celda con el
dato a buscar:
Private Function HashSearch(ByVal s As String, ByVal Arr() As String) As Boolean
Dim H As Integer
H = HashSimple(s, Arr)
If Arr(H) = s Then
Return True
Else
Return False
End If
End Function
182
El tamao que finalmente sea elegido depende del nmero de registros que se van almacenar en la
tabla hash, un nmero seguro parece ser 10, 007 que es primo y los requerimientos de memoria no
son lo suficientemente grandes como para afectar el rendimiento del programa:
Dim Nombres(10007) As String, Nombre As String
Con la misma idea de usar el cmputo de los valores ASCII de la clave, el siguiente algoritmo
proporciona un mejor hash:
Private Function Hash2(ByVal s As String, ByVal Arr() As String) As Integer
Dim i As Integer, T As Long
For i = 0 To s.Length - 1
T += 37 * T + Asc(s.Chars(i))
Next
T = T Mod Arr.GetUpperBound(0)
If T < 0 Then
183
Esta funcin utiliza la regla de Horner37 para calcular la funcin polinomial de 37.
Lneas que se modifica:
HashVal = Hash2(Nombre, Nombres)
H = Hash2(s, Arr)
Cuando se almacenan ms datos la probabilidad de que ocurran colisiones es alta, para resolver este
problema se pueden usar cubos (buckets). Un cubo es una estructura de datos simple almacenada
en un elemento de una tabla hash que puede almacenar tems mltiples. En la mayora de las
implementaciones esta estructura es a su vez un arreglo pero es mejor usar un arreglo lista
(ArrayList), as se evita el problema de requerir ms memoria en caso de ser necesario.
Para insertar un tem, primero se usa la funcin para determinar en qu ubicacin del arreglo lista
ha de almacenarse, luego se verifica si esa ubicacin ya est ocupada. Si lo est no se hace nada, si
no se invoca al mtodo Add del arreglo lista.
Para remover un tem, de nuevo se obtiene su valor hash y se revisa el arreglo lista para asegurarse
que ese tem existe y liego se elimina.
37
http://www.physics.utah.edu/~detar/lessons/c++/array/node4.html
184
Cuando
se
usan
cubos,
el
el
arreglo
lista
debe
tems de la tabla
En
este
cdigo,
se
estableciendo
el
valor
inicial a 1 en el constructor.
Luego, una vez que se tienen
colisiones
la
capacidad
del
duplicndose
cada
vez.
El
radio
del
nmero
de
factor
denomina
de
Diferentes
estudios
demostrado
que
un
carga.
han
mejor
de
la
tabla
es
Option Strict On
Imports System.Console
Module Module1
Private MiHash As New CBucketHash
Sub Main()
ForegroundColor = ConsoleColor.Black
BackgroundColor = ConsoleColor.White
Clear()
Dim Nombres(99) As String, Nombre As String
Dim VariosNombres() As String = {"Ricardo", "Ana", "Teresa", "Susana", "Sandra",
"Carolina", "Martha", "Julian", "Yolanda", "Margarita"}
Dim i As Integer
For i = 0 To VariosNombres.GetUpperBound(0)
Nombre = VariosNombres(i)
MiHash.Insertar(Nombre)
Next
MiHash.VerDist(VariosNombres)
ReadKey()
End Sub
End Module
185
Colisiones.
La primera lnea crea una tabla hash con su capacidad y factor de carga por defecto. La segunda
lnea crea una tabla hash con capacidad para 71 elementos y un factor de carga por defecto. Y la
tercera lnea crea una tabla hash con una capacidad inicial de 23 elementos y un factor de carga de
3.0.
Uso:
Option Strict On
Imports System.Collections
Imports System.Console
Module Module1
186
187
Una vez que se cambie el nombre a la forma por defecto, debe guardarse
el proyecto en una ubicacin conocida.
Option Strict On
Imports System.IO
Imports System.Collections
Public Class frmGlosario
Inherits System.Windows.Forms.Form
Private Glosario As New Hashtable
188
Ejecucin:
Ejercicios:
189
Re escribir este programa pero usando la clase CBucketHash desarrollada antes en esta unidad.
2.
Usando la clase HashTable escribir un programa que verifique la ortografa de algunas palabras,
que las lea desde un archivo de texto y verifique errores ortogrficos. El lmite del diccionario
debe ser slo de algunas palabras comunes. La ortografa es para palabras en espaol.
190
Tiempo (ms)
Seleccin
246
Burbuja
318
QuickSort
100
HeapSort
38
Unidad V.
191
1/3
1/5
1/8
La complejidad en el tiempo depende de cmo se resuelva este problema (por ejemplo una funcin
iterativa una recursiva).
Imports System.Console
Module Module1
Module Module1
Sub Main()
ForegroundColor = ConsoleColor.Black
BackgroundColor = ConsoleColor.White
Clear()
Dim T As New Stopwatch
Dim N As Integer = 37
T.Start()
WriteLine("Iterativa_")
Dim FBNI As Long = FiboIter(N)
WriteLine(T.ElapsedMilliseconds)
T.Stop()
WriteLine(FBNI)
WriteLine()
WriteLine("Recursiva")
T.Start()
Dim FBR As Long = FiboRec(N)
T.Stop()
WriteLine(FBR)
WriteLine(T.ElapsedMilliseconds)
192
El tiempo requerido para completar cada tarea depende del valor N (en este caso
37) que se va a calcular (adems de la potencia del equipo donde se ejecuta).
Otra medida de la complejidad son el nmero de instrucciones necesarias que un algoritmo necesita
para completar su tarea:
193
39
Ingeniera de Software.
194
Ciertos autores sealan que la complejidad de algoritmos es muy til en el nivel terico pero que no
es conveniente obsesionarse demasiado en un nivel prctico.
Para cada algoritmo existe un par de medidas generales:
En general es imprescindible conocer el peor de los casos ya que proporciona una visin de lo que
puede pasar cuando las cosas van realmente mal.
Ejemplo:
Para una cierta cantidad de datos n, la desviacin estndar de estos puede medirse por:
Debe modificarse el programa (unas pocas lneas) para medir este tiempo.
195
Con la segunda:
(2)
Este es el cdigo:
196
Este proceso puede mejorarse si, por ejemplo se calcula x2 al momento de ingresar los datos:
197
desviacin estndar se
reduce,
adems,
considerablemente.
As, el primer intento con la ecuacin 1 repesentara el peor de los casos, y la ltima modificacin
ser el mejor de los casos.
Ejercicio: Para el problema de encontrar una ecuacin de ajuste con regresin lineal mltiple41, se
tiene el siguiente mtodo42:
Ecuacin general de ajuste:
Para J variables independientes (X1, X2, , Xj), la varia dependiente Y. Para la ecuacin anterior utilizando a como
una estimacin de y bj como una estimacin de j , las ecuaciones normales son:
..
41
Unidad I.
42
198
A=
X1
X2
...
Xj
X1
X12
X1X2
...
X1Xj
X2
X1X2
X22
...
X2Xj
...
...
...
...
...
Xj
X1Xj
X1Xj
...
Xj2
b1
Z=
YX1
b2
Yd=
YX2
bj
YXj
Precio de
Precio del
de carne
la carne
cerdo.
X1
X2
Clculos preliminares:
199
YX2
X1
X2
X1X2
36
10
25
16
28
63
49
16
81
25
10
15
53
89
135
26
91
1
2
2
4
36
45
X1
X2
YX1
A=
5
10
15
10
26
45
15
45
91
d=
25
53
89
Escribir un programa que lea los valores de muestra (Y, X1, X2) y obtenga los valores de Z siguiendo esta
metodologa y luego comprelo con el mostrado en la pgina 58. Cul algoritmo es ms eficiente?
200