Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

Creación y Manipulación de Pilas con Punteros en Microsoft Visual C++ 2005 (página 2)




Enviado por jaimemontoya



Partes: 1, 2

Formulario y Objetos en Tiempo de
Diseño

Ejemplo del Programa en
Ejecución

Para comprender mejor el funcionamiento del programa, se
hará un ejemplo y se irán mostrando las pantallas
de ejecución:

Creando Pila:

Se acaba de crear un nodo, que a la vez es el "nodo
top".

Agregando un nodo a la pila (haciendo clic en
"Push"):

El nodo que era primero pasó a ser segundo, y
ahora el nuevo "nodo top" es el de "Melissa Ann
Burchell".

Agregando un tercer nodo a la pila (haciendo clic en
"Push"):

El nodo recién agregado (el de Steven Hall) se
convierte en el nuevo "nodo top" y ahora hay 3 nodos en la
pila.

Agregando un cuarto nodo a la pila (haciendo clic en
"Push"):

El nodo recién agregado (el de Glenda Maritza
Espana) se convierte en el nuevo "nodo top" y ahora hay 4 nodos
en la pila.

Agregando un quinto nodo a la pila (haciendo clic en
"Push"):

El nodo recién agregado (el de Jennifer Esmeralda
Chacon) se convierte en el nuevo "nodo top" y ahora hay 5 nodos
en la pila.

Eliminando un nodo de la pila (haciendo clic en
"Pop"):

Ahora el nuevo "nodo top" es el de Glenda Maritza
Espana, pues al hacer clic en "Pop" se eliminó el que era
antes el "nodo top" (el nodo de Jennifer Esmeralda Chacon). Ahora
hay solamente 4 nodos en la pila.

Eliminando un nodo de la pila (haciendo clic en
"Pop"):

Ahora el nuevo "nodo top" es el de Steven Hall, pues al
hacer clic en "Pop" se eliminó el que era antes el "nodo
top" (el nodo de Glenda Maritza Espana). Ahora hay solamente 3
nodos en la pila.

Eliminando un nodo de la pila (haciendo clic en
"Pop"):

Ahora el nuevo "nodo top" es el de Melissa Ann Burchel,
pues al hacer clic en "Pop" se eliminó el que era antes el
"nodo top" (el nodo de Steven Hall). Ahora hay solamente 2 nodos
en la pila.

Eliminando un nodo de la pila (haciendo clic en
"Pop"):

Ahora el nuevo "nodo top" es el de Jaime Montoya (y por
cierto el único nodo que tiene la pila en este momento),
pues al hacer clic en "Pop" se eliminó el que era antes el
"nodo top" (el nodo de Melissa Ann Burchell). Como ya se dijo, la
pila tiene ahora solamente un nodo.

Eliminando un nodo de la pila (haciendo clic en
"Pop"):

La pila no tiene ningún nodo en este momento. Al
hacer clic en "Pop" se eliminó el que era antes el "nodo
top" (el nodo de Jaime Montoya).

En este momento ya no es posible eliminar nodos porque
ya no hay ninguno, pero se pueden agregar nuevamente nodos (con
el botón "Push") y luego volver a eliminarlos (con el
botón "Pop") las veces que se desee.

Código del Programa

Estando en tiempo de diseño,
hacemos doble clic al formulario y luego nos vamos a las primeras
líneas de código
que aparecen, e identificamos las siguientes líneas de
código que ya deben aparecer así
predeterminadamente:

using namespace System;

using namespace
System::ComponentModel;

using namespace System::Collections;

using namespace System::Windows::Forms;

using namespace System::Data;

using namespace System::Drawing;

Justo abajo de las líneas anteriores, creamos
nuestra estructura de
datos:

//Se crea una estructura
personalizada.

struct
nodo{

char
nombreyapellidos[100];//El
nombre y apellidos podrán tener como máximo 100
caracteres.

int
edad;

double
salario;

nodo *abajo;//Utilizando
recursividad, se declara un apuntador del tipo "nodopila", que
servirá para saber el nodo al que apunta otro determinado
nodo.

};

nodo *current, *temporary, *top;//Se crean tres punteros/apuntadores. El primero para
apuntar a el "nodo actual", el segundo para el "nodo temporal" y
el último para el "nodo que está en el 'top' o
parte superior de la pila".

Luego se crearán dos funciones para no
tener que estar escribiendo el mismo código varias veces.
Esta funciones deben ubicarse justo arriba de la parte del
código en la que aparece predeterminadamente la siguiente
línea:

#pragma endregion

Las funciones son las siguientes:

Función 1:
mostrarnodossuperioresdelapila()

//La función
que se crea a continuación es para que cuando el usuario
haga clic en el botón "Crear Pila", "Push" o "Pop"; que el
programa muestre/imprima actualizadamente los "TRES NODOS
SUPERIORES DE LA PILA".

int
mostrarnodossuperioresdelapila(){

//Se borra lo que hay en los textBox que
muestran los "TRES NODOS SUPERIORES DE LA PILA" para que no
queden impresos resultados de procesos
anteriores.

textBox7->Text = "";

textBox8->Text = "";

textBox9->Text = "";

textBox10->Text = "";

textBox11->Text = "";

textBox12->Text = "";

textBox13->Text = "";

textBox14->Text = "";

textBox15->Text = "";

if (top !=
0){//Si en la pila hay por lo menos
un nodo, muestra el "nodo
top" de la pila en los textBox correspondientes.

for
(int i=0;
i<100; i++)//Hace 100
iteraciones, pues es el máximo que se ha programado que
puede tener de posiciones el arreglo tipo "char" donde se
almacena el nombre y los apellidos.

textBox7->Text +=
Char::ToString(top->nombreyapellidos[i]);//En cada iteración va concatenando, de modo que
toma las posiciones tipo "char" y las va poniendo como una sola
palabra/palabras de tipo "String" para ir a imprimir al
textBox.

textBox8->Text =
Convert::ToString(top->edad);//Imprime el valor
almacenado en el campo "Edad" del "nodo top".

textBox9->Text =
Convert::ToString(top->salario);//Imprime el valor almacenado en el campo "Salario" del
"nodo top".

if
(top->abajo != 0){//Si en
la pila hay por lo menos dos nodos, muestra el nodo 2 (contando
desde arriba hacia abajo) o el nodo que está abajo del
"nodo top", en los textBox correspondientes.

for
(int i=0;
i<100; i++)//Hace 100
iteraciones, pues es el máximo que se ha programado que
puede tener de posiciones el arreglo tipo "char" donde se
almacena el nombre y los apellidos.

textBox10->Text +=
Char::ToString(top->abajo->nombreyapellidos[i]);//En
cada iteración va concatenando, de modo que toma las
posiciones tipo "char" y las va poniendo como una sola
palabra/palabras de tipo "String" para ir a imprimir al
textBox.

textBox11->Text =
Convert::ToString(top->abajo->edad);//Imprime el valor almacenado en el campo "Edad" del
nodo 2 (contando desde arriba o desde el "top" hacia
abajo).

textBox12->Text =
Convert::ToString(top->abajo->salario);//Imprime el valor almacenado en el campo "Salario del
nodo 2 (contando desde arriba o desde el "top" hacia
abajo).

if
(top->abajo->abajo != 0){//Si en la pila hay por lo menos tres nodos, muestra el
valor del nodo 3 (contando desde arriba hacia abajo) o el nodo
que está dos posiciones abajo del "nodo top", en los
textBox correspondientes.

for
(int i=0;
i<100; i++)//Hace 100
iteraciones, pues es el máximo que se ha programado que
puede tener de posiciones el arreglo tipo "char" donde se
almacena el nombre y los apellidos.

textBox13->Text +=
Char::ToString(top->abajo->abajo->nombreyapellidos[i]);//En
cada iteración va concatenando, de modo que toma las
posiciones tipo "char" y las va poniendo como una sola
palabra/palabras de tipo "String" para ir a imprimir al
textBox.

textBox14->Text =
Convert::ToString(top->abajo->abajo->edad);//Imprime
el valor almacenado en el campo "Edad" del nodo 3 (contando desde
arriba o desde el "top" hacia abajo).

textBox15->Text =
Convert::ToString(top->abajo->abajo->salario);//Imprime
el valor almacenado en el campo "Salario del nodo 3 (contando
desde arriba o desde el "top" hacia abajo).

}

}

}

return
0;//Necesario porque la
función tiene que retornar un valor. Aunque en vez de "0"
pudo haber sido "-99.6", "-6", "0.3", "3", "140" o cualquier otro
número (siempre y cuando no se ponga uno exageradamente
grande ni exageradamente pequeño ni con exagerada cantidad
de dígitos decimales).

}

Función 2:
totaldenodosenlapila()

//La función que se crea a
continuación es para que cuando el usuario haga clic en el
botón "Crear Pila", "Push" o "Pop"; que el programa
muestre/imprima el "Total de Nodos en la Pila".

int
totaldenodosenlapila(){

int totaldenodos =
0;//La variable "totaldenodos" se
inicializa con el valor de 0.

if (top !=
0){//Para que "totaldenodos" llegue
a ser mayor que cero, obviamente debe existir por lo menos un
nodo. Entonces si todavía no ningún nodo, por lo
tanto no habría ningún "nodo top" y en consecuencia
no se entraría al "if" y "totaldenodos" continuaría
valiendo cero.

current = top;//Debido a
que se quiere contar el número total de nodos que hay, se
debe comenzar desde el "nodo top" hasta el último nodo de
la pila (hasta el que esté en el fondo de la pila o hasta
abajo).

totaldenodos += 1;//Debido
a que antes de llegar a esta línea se confirmó con
el "if (top != 0){" que ya existe un "nodo top", entonces
"totaldenodos" tendrá que valer 1 (es decir 0 que
valía anteriormente más 1).

while
(current->abajo != 0){//Mientras exista un nodo abajo del nodo actual,
seguirán las iteraciones (recuérdese que el nodo
actual en la primera iteración es el "nodo
top".

totaldenodos += 1;//En cada
iteración se le va sumando 1 a la variable
"totaldenodos".

current = current->abajo;//En cada iteración el nodo actual ("current")
pasa a ser el nodo que está abajo del que era actual, es
decir que va bajando una posición. Por ejemplo, si hay 3
nodos en la pila, contando de arriba hacia abajo, en la primera
iteración el nodo actual ("current") será el nodo
de hasta arriba ("nodo top"), en la segunda iteración el
nodo de en medio y en la tercera iteración el nodo de
hasta abajo (bottom).

}

}

textBox16->Text =
Convert::ToString(totaldenodos);//Convierte el número entero que contiene la
variable "totaldenodos" al tipo String (para que sea posible
imprimirlo en un textBox) e imprime ese valor en el
textBox16.

return 0;

}

Debajo de las dos funciones anteriores que se
programaron, debe aparecer la siguiente línea de
código predeterminada por Visual C++
2005:

#pragma endregion

Debajo de esa línea viene el código para
cada uno de los botones. Sin embargo no es necesario estar
buscando esa línea para comenzar a darle código al
evento Clic de cada botón, pues basta darle doble clic a
cada botón que se quiere programar, estando en tiempo de
diseño. El código completo para cada uno de los
botones es el siguiente:

Código del Botón
Push

private: System::Void
button1_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Push" (que es el botón para que se
agregue un nodo y se ponga "encima" de todos los otros nodos de
la pila, es decir en el "top").

if (top !=
0){//Para que si no existe
ningún nodo (si no se ha creado todavía
ningún nodo), que el programa simplemente no haga
nada.

//Se dertermina hacia
dónde va a apuntar la variable apuntadora llamada
"top".

current = new
nodo;//Se crea un nuevo nodo
utilizando la estructura creada anteriormente.

//Con las próximas 6
líneas se llenan de información o datos los
espacios de memoria a los que
se encuentra apuntando el apuntador "top".

for(int i=0;i<100;i++)//Para llenar cada posición del arreglo de
espacios en blanco y que así imprima espacios en blanco en
vez de cualquier otra cosa en los espacios que sobren en el caso
que el nombre y apellidos tengan menos de 100 caracteres. Por
ejemplo si el nombre y los apellidos ocupan 50 caracteres, los
otros 50 se llenarán de espacios en blanco y eso no
afectará el programa porque el usuario no percibirá
ninguna diferencia visualmente.

current->nombreyapellidos[i]=' ';//En cada
iteración se llena una posición de un espacio en
blanco, de modo que luego de las 100 iteraciones del ciclo "for",
las 100 posiciones estarán llenas de espacios en
blanco.

//Con las próximas 2
líneas se llena cada posición del arreglo tipo
"char" con datos tomados del textBox1 y pasados de "String" a
"char".

for(int
i=0;i<textBox1->Text->Length;i++)//Si
la longitud del texto
introducido en el textBox1 tiene 20 caracteres, el ciclo "for"
hará 20 iteraciones, pues la condición que se ha
puesto para que el ciclo continúe es que la
iteración actual (controlada por la variable "i") sea
menor que la longitud de caracteres que tiene el texto
introducido por el usuario en el textBox1.

current->nombreyapellidos[i] =
textBox1->Text[i];

current->edad =
Convert::ToInt64(textBox2->Text);//La edad "String" del textBox2 se convierte a tipo
entero ("int") y se manda a la variable correspondiente dentro de
la estructura creada.

current->salario =
Convert::ToDouble(textBox3->Text);//El salario "String" del textBox3 se convierte a tipo
"double" y manda a la variable correspondiente dentro de la
estructura creada.

current->abajo = top;//Para que el apuntador del nodo recién creado
(que se iría a ubicar encima de toda la pila), apunte
hacia el nodo que hasta este momento era el "top" (pero que
pasará a ser el segundo nodo de la pila contando de arriba
hacia abajo).

top = current;//El nodo
recién creado se convierte en el nuevo "top" de la pila o
el que está hasta arriba (encima de todos los otros
nodos).

mostrarnodossuperioresdelapila();//Se invoca la función que se creó
anteriormente y que sirve para mostrar/imprimir actualizadamente
los "TRES NODOS SUPERIORES DE LA FILA", aunque puede mostrar
solamente 2, 1 e incluso 0 nodos, dependiendo de cuántos
tenga la pila.

totaldenodosenlapila();//Se
invoca la función que se creó anteriormente y que
sirve para mostrar/imprimir actualizadamente el "Total de Nodos
en la Pila".

}

}

Código del Botón
Crear Pila

private: System::Void
button3_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Crear Pila".

//Se dertermina hacia
dónde va a apuntar la variable apuntadora llamada
"top".

top = new
nodo;//Se crea un nuevo nodo
utilizando la estructura creada anteriormente.

//Con las próximas 6
líneas se llenan de información o datos los
espacios de memoria a los que se encuentra apuntando el apuntador
"top".

for(int i=0;i<100;i++)//Para llenar cada posición del arreglo de
espacios en blanco y que así imprima espacios en blanco en
vez de cualquier otra cosa en los espacios que sobren en el caso
que el nombre y apellidos tengan menos de 100 caracteres. Por
ejemplo si el nombre y los apellidos ocupan 50 caracteres, los
otros 50 se llenarán de espacios en blanco y eso no
afectará el programa porque el usuario no percibirá
ninguna diferencia visualmente.

top->nombreyapellidos[i]=' ';//En cada
iteración se llena una posición de un espacio en
blanco, de modo que luego de las 100 iteraciones del ciclo "for",
las 100 posiciones estarán llenas de espacios en
blanco.

//Con las próximas 2
líneas se llena cada posición del arreglo tipo
"char" con datos tomados del textBox1 y pasados de "String" a
"char".

for(int
i=0;i<textBox1->Text->Length;i++)//Si
la longitud del texto introducido en el textBox1 tiene 20
caracteres, el ciclo "for" hará 20 iteraciones, pues la
condición que se ha puesto para que el ciclo
continúe es que la iteración actual (controlada por
la variable "i") sea menor que la longitud de caracteres que
tiene el texto introducido por el usuario en el
textBox1.

top->nombreyapellidos[i] =
textBox1->Text[i];

top->edad =
Convert::ToInt64(textBox2->Text);//La edad "String" del textBox2 se convierte a tipo
entero ("int") y se manda a la variable correspondiente dentro de
la estructura creada.

top->salario =
Convert::ToDouble(textBox3->Text);//El salario "String" del textBox3 se convierte a tipo
"double" y manda a la variable correspondiente dentro de la
estructura creada.

top->abajo = 0;//Por ser
nodo que está hasta abajo en la pila, apunta hacia cero y
como es el único existente, es el "top" y a la vez el
"bottom".

mostrarnodossuperioresdelapila();//Se invoca la función que se creó
anteriormente y que sirve para mostrar/imprimir actualizadamente
los "TRES NODOS SUPERIORES DE LA FILA", aunque puede mostrar
solamente 2, 1 e incluso 0 nodos, dependiendo de cuántos
tenga la pila.

totaldenodosenlapila();//Se
invoca la función que se creó anteriormente y que
sirve para mostrar/imprimir actualizadamente el "Total de Nodos
en la Pila".

}

Código del Botón
Pop

private: System::Void
button2_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Pop" (que es el botón para que se
elimine el nodo que está "encima" de todos los otros nodos
de la pila, es decir el del "top").

textBox4->Text =
textBox7->Text;//El nombre y
apellidos del "nodo top" aparecen en el textBox4, pero al hacer
clic en el botón "Pop" (eliminar nodo "top"), es el "nodo
top" el que se elimina (tal como se ha programado dentro de la la
condición "if" que viene a continuación), de modo
que en el textBox7 aparece el nombre y apellidos del nodo
eliminado.

textBox5->Text =
textBox8->Text;//La edad del
"nodo top" aparece en el textBox5, pero al hacer clic en el
botón "Pop" (eliminar nodo "top"), es el "nodo top" el que
se elimina (tal como se ha programado dentro de la
condición "if" que viene a continuación), de modo
que en el textBox8 aparece la edad del nodo eliminado.

textBox6->Text =
textBox9->Text;//El salario del
"nodo top" aparece en el textBox6, pero al hacer clic en el
botón "Pop" (eliminar nodo "top"), es el "nodo top" el que
se elimina (tal como se ha programado dentro de la
condición "if" que viene a continuación), de modo
que en el textBox9 aparece el salario del nodo
eliminado.

if (top !=
0){//Porque cuando el "top" sea cero
significa que no hay ningún nodo en la fila, y esta
condición se pone porque si no se pusiera, la línea
"top = top->abajo;" daría error porque se
estaría haciendo referencia a algo que no existe, pues si
el "top" es cero ya no existe nada abajo del cero (ningún
nodo).

temporary = top;//Debido a
que el nodo "top" es el que se va a eliminar, se almacena en la
variable "temporary" para luego asignarle el "top" al nodo que
quedará como nuevo "top" de la pila y hasta entonces
eliminar con toda libertad el
nodo que hasta este momento es todavía "top".

top = top->abajo;//Debido a que se eliminará el nodo "top", con
esto se asigna quién será el nuevo nodo
"top".

delete(temporary);//Se elimina el primer nodo de la pila (contando desde
arriba hacia abajo), el que anteriormente era el nodo "top" pero
que ya no lo es más y que será
eliminado.

mostrarnodossuperioresdelapila();//Se invoca la función que se creó
anteriormente y que sirve para mostrar/imprimir actualizadamente
los "TRES NODOS SUPERIORES DE LA PILA", aunque puede mostrar
solamente 2, 1 e incluso 0 nodos, dependiendo de cuántos
tenga la pila.

totaldenodosenlapila();//Se
invoca la función que se creó anteriormente y que
sirve para mostrar/imprimir actualizadamente el "Total de Nodos
en la Pila".

}

}

Código del Botón
Limpiar

rivate: System::Void
button4_Click(System::Object^ sender, System::EventArgs^ e)
{//Código para el evento
Click del botón "Limpiar".

//Se limpian los textBox de
los campos desde los que se agregar registros a un
nodo.

textBox1->Text = "";

textBox2->Text = "";

textBox3->Text = "";

}

 

AUTOR

Jaime Oswaldo Montoya Guzmán,

estudiante de Ingeniería en Sistemas
Informáticos de la Universidad
Católica de Occidente.

Santa Ana, 2 de junio de 2007.

Universidad Católica de Occidente
(UNICO).

El Salvador.

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter