Está en la página 1de 12

ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas

Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

GUÍA DE EJERCICIOS PRÁCTICOS # 4


“ESTRUCTURAS”

Resultados de aprendizaje

 Aplicar estructuras de datos en el desarrollo de aplicaciones

Estructuras de datos

Una estructura en C# es similar a una clase, pero las estructuras carecen de ciertas
características, como la herencia. Además, como una estructura es un tipo de valor,
normalmente se puede crear más rápido que una clase. Si utiliza bucles de pequeñas
dimensiones en los que se crean grandes cantidades de estructuras de datos nuevas, debe
considerar la posibilidad de utilizar una estructura en vez de una clase. Las estructuras también
se utilizan para encapsular grupos de campos de datos como las coordenadas de un punto en
una cuadrícula o las dimensiones de un rectángulo.

PILAS (stack)

Una pila (stack en inglés) es una estructura de


datos de tipo LIFO (del inglés Last In First Out,
último en entrar, primero en salir) que permite
almacenar y recuperar datos. Se aplica en multitud
de ocasiones en informática debido a su
simplicidad y ordenación implícita en la propia
estructura. Representación gráfica de una pila

Para el manejo de los datos se cuenta con dos


operaciones básicas: apilar (push), que coloca un
objeto en la pila, y su operación inversa, retirar (o
desapilar, pop), que retira el último elemento
apilado.

En cada momento sólo se tiene acceso a la parte


superior de la pila, es decir, al último objeto
apilado (denominado TOS, top of stack en inglés).
La operación retirar permite la obtención de este elemento, que es retirado de la pila
permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS.

Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un plato sobre
una pila de platos, y una operación retirar a retirarlo.

22
ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas
Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

En una pila lo último que entra es lo primero que sale. Necesitamos incluir la librería
System.Collections

EJEMPLO

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// TADS pila, colas, etc.
using System.Collections;

namespace EjemploPila
{
class Program
{
static void Main(string[] args)
{
string palabra;

Stack miPila = new Stack();


miPila.Push("hola");
miPila.Push("buenos");
miPila.Push("días");

for (byte i = 0; i < 3; i++)


{
palabra = (string)miPila.Pop();
Console.WriteLine(palabra);
}

Console.ReadKey();
}
}
}

Otros métodos, además del Push y Pop:

Peek Mira el valor de la cabeza pero sin desapilar


Clear Borra todo el contenido de la pila
Contains Indica si un cierto elemento está en la pila
GetType Para saber de qué tipo son los elementos almacenados en la pila
ToString Devuelve el elemento actual convertido en un string
ToArray Devuelve toda la pila convertida en un array
GetEnumerator Permite usar enumeradores para recorrer la pila
Count Indica cuantos elementos contiene

COLAS (STACK)

Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos
en la que la operación de inserción push se realiza por un extremo y la operación de
extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First

23
ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas
Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

Out), debido a que el primer elemento en entrar será también el primero en salir. El tipo
cola representa la idea que tenemos de cola en la vida real. La cola para subir al autobús
está compuesta de elementos (personas), que dispone de dos extremos comienzo y fin.
Por el comienzo se extraerá un elemento cuando haya comprado el billete para su viaje,
y si llega una nueva persona con intención de usar el autobús, tendrá que colocarse al
final y esperar que todos los elementos situados antes que él abandonen la cola.

EJEMPLO

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;

namespace EjemploCola
{
class Program
{
static void Main(string[] args)
{
string palabra;

Queue miCola = new Queue();


miCola.Enqueue("Hola ");
miCola.Enqueue("buenos ");
miCola.Enqueue("días.");

for (byte i = 0; i < 3; i++)


{
palabra = (string)miCola.Dequeue();
Console.WriteLine(palabra);
}

Console.ReadKey();
}
}
}

Otros métodos además del Enqueue y Dequeue:

Peek Mira el valor de la cabeza pero sin extraer


Clear Borra todo el contenido de la cola
Contains Indica si un cierto elemento está en la cola
GetType Para saber de qué tipo son los elementos almacenados en la cola
ToString Devuelve el elemento actual convertido en un string
ToArray Devuelve toda la cola convertida en un array
GetEnumerator Permite usar enumeradores para recorrer la cola
Count Indica cuantos elementos contiene

24
ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas
Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

EJEMPLO

Desarrolle un programa en consola con un menú para el usuario que permita agregar elementos
a una pila, eliminar elementos de la pila, vaciar la pila completa y mostrar la pila en pantalla, el
programa solo debe aceptar números enteros del 1 al 99. Si el usuario introduce una opción que
no existe o un valor erróneo el programa de avisar al usuario con un mensaje en pantalla y
continuar con el programa

Solución:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace conStack
{
class Program
{
static void Main(string[] args)
{
Stack miPila = new Stack();
int opcion;//opcion del menu
do
{
Console.Clear();//se limpia consola
opcion = menu();//muestra menu y espera opción
switch (opcion)
{
case 1:
agregar(ref miPila);
break;
case 2:
eliminar(ref miPila);
break;
case 3:
limpiar(ref miPila);
break;
case 4:
imprimir(miPila);
break;
case 5: break; //salir
default:
mensaje("ERROR: la opción no es válida. Intente de nuevo.");
break;
}
}
while (opcion != 5);
mensaje("El programa ha finalizado.");
}
/** añade un nuevo elemento a la pila */
static void agregar(ref Stack pila)
{
Console.Write("\n>Ingrese valor: ");
try
{
int valor = Convert.ToInt32(Console.ReadLine());

25
ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas
Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

if (valor > 99 || valor <= 0)


{
mensaje("Solo números del 1 al 99");
}
else
{
pila.Push(valor);
imprimir(pila);
}
}
catch
{
mensaje("Error: Solo números del 1 al 99");
}
}

//CREACION DE METODOS
/** Elimina todos los elementos de la pila */
static void limpiar(ref Stack pila)
{
pila.Clear();
imprimir(pila);
}
/** Elimina elemento de la pila */
static void eliminar(ref Stack pila)
{
if (pila.Count > 0)
{
int valor = (int)pila.Pop();
mensaje("Elemento " + valor + " eliminado");
}
else {
imprimir(pila);
}
}
/** muestra menu y retorna opción */
static int menu()
{
//Console.Clear();
Console.WriteLine("\n Stack Menu\n");
Console.WriteLine(" 1.- Agregar elemento");
Console.WriteLine(" 2.- Eliminar elemento");
Console.WriteLine(" 3.- Vaciar Pila");
Console.WriteLine(" 4.- Ver pila");
Console.WriteLine(" 5.- Termina programa");
Console.Write(" JJ:> Ingresa tu opción: ");
try
{
int valor = Convert.ToInt32(Console.ReadLine());
return valor;
}
catch
{
return 0;
}
}

/** Muestra mensaje del programa al usuario */


static void mensaje(String texto)
{
if (texto.Length > 0)

26
ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas
Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

{
Console.WriteLine("\n
=======================================================");
Console.WriteLine(" JJ:> {0}", texto);
Console.WriteLine("
=======================================================");
Console.WriteLine("\n JJ:>Presione cualquier tecla para
continuar...");
Console.ReadKey();
}
}

/** Imprime pila */


static void imprimir(Stack pila)
{
if (pila.Count > 0)
{
Console.WriteLine("");
foreach (int dato in pila)
{
Console.WriteLine(" | |");
if (dato < 10)
Console.WriteLine(" | 0{0} |", dato);
else
Console.WriteLine(" | {0} |", dato);
Console.WriteLine(" |______|");
}
Console.WriteLine("\nPresione cualquier tecla para continuar
...");
Console.ReadKey();
}
else
{
mensaje ("La Pila esta vacía");
}
}
}
}

COLECCIONES - LIST, ARRAYLIST


Las colecciones de clases de C# son un conjunto de clases diseñadas específicamente para
agrupar objetos y llevar a cabo tareas con ellos.

Tanto la list‹T› como la ArrayList y otras clases de la Collections tienen propiedades muy
similares a los arrays de C# (para más detalles sobre estos busquen nueva el tema Matrices y
confirmen). Una ventaja fundamental de estas clases sobre los arrays es que puedan crecer y
reducir el número de objetos almacenados.

La clase list‹T› está contenida en System.Collections.Generic, mientras que la


clase ArrayList figura en el System.Collections.

La sintaxis para crear una colección list‹T› es la siguiente:


List‹tipo› nombre = new List‹tipo›();

ArrayList es un objeto creado de una manera similar, aunque sin el argumento de tipo:
ArrayList nombre = new ArrayList ();

27
ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas
Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

Con esta sintaxis ahora podemos crear una list‹T› denominada listacolores:

using System;
using System.Collections.Generic;

public class Lists


{
static void Main()
{
List‹string› listacolores = new List‹string›();
}
}

Añadir artículos a las listas

Una vez que una lista se ha creado hay una serie de métodos que pueden ser llamados a realizar
tareas en la lista. En este caso para agregar elementos a la lista de objetos se utiliza el
método Add(). Ejemplo:

List‹string› ListaColores = new List‹string›();


ListaColores.Add ("Azul");
ListaColores.Add ("Rojo");
ListaColores.Add ("Verde");
ListaColores.Add ("Amarillo");
ListaColores.Add ("Morado");

Acceso a los elementos


A los elementos individuales en una lista se puede acceder mediante el índice del valor de la
partida (teniendo en cuenta que el primer punto del índice es 0, el segundo índice 1 y así
sucesivamente). El valor del índice se encuentra entre corchetes tras el nombre de la lista. Por
ejemplo, para acceder al segundo punto del objeto ListaColores:

Console.WriteLine (ListaColores[1]);

Un elemento de la lista puede cambiar su valor de manera similar usando el índice combinado
con el operador de asignación. Por ejemplo, para cambiar el color de verde a mamey:

ListaColores[2] = "mamey";

Todos los elementos de una lista se pueden acceder mediante un bucle foreach. Por ejemplo:

foreach (string color in ListaColores)


{
Console.WriteLine ( color );
}

Cuando compilado y ejecutado, el código de salida anterior mostrara todos los colores.

Inserción de artículos en una lista


Anteriormente se utilizó el método Add() para añadir elementos a una lista. El método Add(), sin
embargo, sólo añade elementos al final de una lista. A veces es necesario añadir un nuevo tema
en una ubicación específica en una lista. Insert() es el método para este fin específico. Insert()
recibe dos argumentos, un entero que indica el índice de localización de la inserción y el tema

28
ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas
Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

que se incluirá en ese lugar. Por ejemplo, para insertar un elemento en la posición 2 de la lista
sería:
ListaColores.Insert(2, "Blanco");

Ordenando Listas
No hay manera de decirle a C# que ordene automáticamente una lista de artículos después de
añadir. Si los elementos de una lista deben estar siempre ordenados se debe llamar al
metodo Sort una vez se añaden nuevos elementos:

ListaColores.Sort();

Búsqueda de elementos en una lista


Se proveen un buen número de métodos con las clases listas y ArrayList. El método más básico
es el Contains(), en el cual cuando se pide a un objeto ArrayList o List devuelve true si el tema
se encuentra en la lista, o false si no se encuentra.

El IndexOf() devuelve el valor de un índice de un elemento de la lista. Por ejemplo, el código


siguiente muestra el valor de salida de 2, que es el índice de la posición de "Amarillo" en la
cadena:

List‹string› ListaColores = new List‹string›();


ListaColores.Add ("Red");
ListaColores.Add ("Green");
ListaColores.Add ("Amarillo");
ListaColores.Add ("Morado");
ListaColores.Add ("Mamey");
Console.WriteLine(ListaColores.IndexOf("Amarillo"));

Si el elemento no se encuentra en la lista devuelve -1. Esta técnica podría utilizarse para
reemplazar un valor con otro. Por ejemplo, sin conocer de antemano el valor del índice del
"Amarillo" cadena podemos cambiar a "Negro":

ListaColores[ListaColores.IndexOf("Amarillo")] = "Negro";

El método LastIndexOf() devuelve el valor del índice del último elemento de la lista para que
coincida con el punto especificado. Esto es particularmente útil cuando la lista contiene
elementos duplicados.

Obtener información de una lista

Hay dos miembros de la clase que son útiles para obtener información acerca de una lista de C#
o colección de objetos ArrayList. La propiedad Capacity puede ser utilizada para identificar el
número de artículos que puede almacenar una colección sin tener que cambiar el tamaño.

La propiedad Count, por otra parte, identifica cuantos artículos se encuentran actualmente
almacenados en la lista. Por razones obvias, Capacity será siempre superior a Count.

En los casos en que existe una gran diferencia entre el Count y Capacity los elementos pueden
ser borrados con el método TrimExcess().

29
ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas
Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

Borrado de elementos

Todos los elementos de una lista podrán ser borrados mediante el método Clear():

ListaColores.Clear();

Clear() elimina los elementos de la lista y establece la propiedad Count a cero. La


propiedad Capacity, sin embargo, sigue siendo la misma. Para eliminar la Capacity después del
método Clear() hay que llamar a TrimExcess().

Ejemplo

1. Para este ejemplo necesitamos un formulario de tipo Windows Form de C#. Agregar
dos botones Insertar y Eliminar y un Listbox.

2. Iniciamos con la función Ramdon, se requiere que el número que se ingrese en el listbox
sea aleatorio y no escrito en una caja de texto, ubicamos el código en el botón insertar
para que ingrese uno a uno los números aleatorios, luego en el botón eliminar le
decimos que remueva uno por uno, de forma que el primero que entró sea el primero
en salir. de esta manera:

30
ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas
Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

Estructuras

Las estructuras se usan para agrupar distintas variables en torno a una unión común, sin aportar
ningún tipo de método para su manejo (esto las distingue directamente de las clases), pero a
diferencia de lenguajes más antiguos, permitiendo que tengan variables privadas y propiedades
para su manejo.

Ejemplo
1. Declaración de una estructura
public struct direccion{
string calle;
int numero;
char letra;

public string Calle{


get { return calle; }
set { calle = value; }
}

public int Numero{


get { return numero; }
set { numero = value; }
}

public char Letra{


get { return letra; }
set { letra = value; }
}
}

2. Como se emplean
direccion personal;
personal.Calle = "Avenida";
personal.Numero = 6;
personal.Letra = 'C'

Ejemplo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace EjemploStruct
{
public class Ejemplo
{
struct tipoPersona
{
public string nombre;
public char inicial;
public int edad;
public float nota;
}

public static void Main()


{
tipoPersona persona;

31
ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas
Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

persona.nombre = "Juan";
persona.inicial = 'J';
persona.edad = 20;
persona.nota = 7.5f;
Console.WriteLine("La edad de " + persona.nombre +" es " + persona.edad);
Console.ReadKey();
}
}
}
Ejemplo Estructuras de arreglos
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ArregloEstructura
{
public class Ejemplo
{

struct tipoPersona
{
public string nombre;
public char inicial;
public int edad;
public float nota;
}

public static void Main()


{
tipoPersona[] persona = new tipoPersona[100];

persona[0].nombre = "Juan";
persona[0].inicial = 'J';
persona[0].edad = 20;
persona[0].nota = 7.5f;
Console.WriteLine("La edad de " + persona[0].nombre + " es " + persona[0].edad);
Console.ReadKey();
persona[1].nombre = "Pedro";
persona[1].edad = 30;
Console.WriteLine("La edad de " + persona[1].nombre + " es " + persona[1].edad);
Console.ReadKey();
}
}
}

EJEMPLO ESTRUCTURAS ANIDADAS


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ArregloEstructura
{
public class Ejemplo
{

32
ESCUELA DE INGENIERÍA EN COMPUTACIÓN Carrera: Técnico en Ingeniería de Sistemas
Informáticos.
Modalidad: Presencial.
Materia: Desarrollo de Aplicaciones de Escritorio.

struct fechaNacimiento
{
public int dia;
public int mes;
public int anyo;
}

struct tipoPersona
{
public string nombre;
public char inicial;
public fechaNacimiento diaDeNacimiento;
public float nota;
}

public static void Main()


{
tipoPersona persona;

persona.nombre = "Juan";
persona.inicial = 'J';
persona.diaDeNacimiento.dia = 15;
persona.diaDeNacimiento.mes = 9;
persona.nota = 7.5f;
Console.Write(persona.nombre + " nació en el mes " + persona.diaDeNacimiento.mes);
Console.ReadKey();
}
}
}

EJERCICIOS PRÁCTICOS

1) Implementar una función que recibe una lista de enteros L y un número entero n de
forma que modifique la lista mediante el borrado de todos los elementos de la lista que
tengan este valor.
2) Escribir una función Reemplazar que tenga como argumentos una pila con tipo de
elemento int y dos valores int: nuevo y viejo de forma que si el segundo valor aparece
en algún lugar de la pila,sea reemplazado por el segundo.
3) Construir una función que sume los elementos de una lista de enteros recursivamente.
4) Construir una función imprimeInverso que imprima los elementos de una lista enlazada
de enteros en orden inverso a partir de una posición p.
5) Crear una estructura que almacene datos de una canción en formato MP3: Artista,
Título, Duración (en segundos), Tamaño del fichero (en KB). El programa debe pedir los
datos de una canción al usuario, almacenarlos en dicha estructura y después mostrarlos
en pantalla.
6) Crear un programa que pida el nombre, el apellido y la edad de una persona, los
almacene en un “struct” y luego muestre los tres datos en una misma línea, separados
por comas.
7) Crear un programa que pida datos de 2 personas: nombre, día de nacimiento, mes de
nacimiento, y año de nacimiento (que se deben almacenar en una tabla de structs).
Después deberá repetir lo siguiente: preguntar un número de mes y mostrar en pantalla
los datos de las personas que cumplan los años durante ese mes. Terminará de repetirse
cuando se teclee 0 como número de mes.

33

También podría gustarte