Académique Documents
Professionnel Documents
Culture Documents
Unidad VI
Estructuras de Datos
I.
Introduccin
En esta unidad se hace nfasis en el uso y la importancia que tienen las estructuras de datos:
como vectores, arreglos, cadenas de caracteres, estructuras y enumeraciones. Los arreglos son
estructuras de datos que se fundamentan en elementos de datos del mismo tipo y que alguna
relacin entre ellos existe. Los arreglos son otro tipo de formas siempre de longitud fija;
conservan la misma longitud una vez que se crean, aunque puede reasignarse una variable tipo
arreglo de tal forma que haga referencia a un nuevo arreglo de distinta longitud.
II.
Vectores
Qu es un vector?
Es una estructura de datos que permite almacenar un CONJUNTO de datos del MISMO tipo
(enteros, bolanos, fechas); un vector tambin es llamado Array unidimensional
Estas estructuras de datos son adecuadas para situaciones en las que el acceso a los datos se
realice de forma aleatoria e impredecible, por ejemplo, cuando tenemos un conjunto de
nmeros desordenados o una lista de nombres.
Por el contrario, si los elementos pueden estar ordenados y se va a utilizar acceso secuencial
no sera adecuado utilizar esta estructura.
Declaracin:
Cuando se declara un vector en C# se debe colocar los corchetes despus de tipo de dato
seguido del nombre del vector
Inicializacin:
Hay varias formas de inicializar los vectores:
Para declarar e inicializar el vector de una sola ves solamente se debe especificar de qu tipo
sern los elementos del vector seguida del nombre y utilizando la palabra reservada new
seguido del tamao del vector de esta forma:
<tipo> [] <nombre> = new <tipo> [<tamao>];
El operador new se utiliza para crear el vector e inicializar sus elementos con valores
predeterminados aunque se puede omitir; las dos declaraciones siguientes son equivalentes:
string[] nombres = new string[] {"Carlos", " Raquel", "Mariana"};
Es equivalente a:
string[] nombres = {"Carlos", " Raquel", "Mariana"};
Por ejemplo, si se desea crear un nuevo vector de 8 nmeros enteros:
int [] numeros = new int [8];
int es para decir que son enteros los que se van a almacenar, nmeros es el nombre del vector
o array y new es el operador que indica al compilador que cree un nuevo vector con una
capacidad de 8 elementos.
Si se quiere establecer los 8 nmeros enteros desde un principio, se deber incluir entre llaves,
los elementos separados por coma como en el ejemplo:
int [] a = {6,1,5,6,4,8,6,9};
Una cadena se puede inicializar del mismo modo. A continuacin, se muestra una declaracin
de un vector de cadena en la que cada elemento del vector se inicializa con el nombre:
string[] nombres = new string[] {"Carlos", " Raquel", "Mariana"};
Acceder a los elementos de un vector
Para acceder a un elemento en una posicin i solo hay que hacer de la siguiente manera (si el
array se llama mi_array): mi_array[i]
Aqui otros ejemplos:
Es importante mencionar que para referirse al elemento de la posicin n del array, hay que
escribirlo como mi_array[n-1] ya que mi_array[0] devuelve el primer elemento del array.
Para recorrer un vector se puede hace uso de un lazo for, como se muestra a continuacin:
int[] valores = { 5, 5, 5 };
int respuesta = 0;
for (int i = 0; i < valores.Length; i++)
{
respuesta += valores[i];
}
Console.WriteLine("Resultado de la suma: "+respuesta);
Console.ReadLine();
En C# tambin podemos utilizar la sentencia foreach, es una manera simple de acceder a los
valores de un arreglo (esta es una manera ms eficiente de recorrerlo).
int longitud=otroArray.GetLength(0);
Sort y Reverse: Estos mtodos permiten ordenar un array de modo ascendente o descendente.
Son mtodos estticos. Por ejemplo:
Array.Sort(unArray);
o bien:
Array.Reverse(unArray);
Otros ejemplos son:
Ejemplo 1
Realizar un mtodo que diga si un nmero entero est o no dentro de un array.
Ejemplo 2
Crear un mtodo que reciba un array de nmeros enteros y devuelva un nmero entero, que
ser el mayor de los elementos del array.
III.
Cadenas de caracteres
Las cadenas de caracteres son muy importantes en el desarrollo de software. Todos los
lenguajes de programacin tienen herramientas para la manipulacin primitiva de caracteres,
pero C# cuenta con una coleccin de mtodos especialmente til.
En esta seccin se analizan todas las herramientas para trabajar con cadenas que hemos
utilizado hasta este momento, y ampliaremos nuestro conocimiento al estudiar el conjunto de
mtodos disponibles para el procesamiento de cadenas.
Las siguientes son algunas situaciones en las que se utilizan cadenas de caracteres:
Mostrar mensajes en pantalla (quiz mediante la colocacin de texto en etiquetas).
Recibir texto del usuario. A menudo esto se hace mediante un cuadro de texto, pero
en una aplicacin de consola el usuario podra introducir texto a travs de la lnea de
comando.
Almacenar datos en archivos. Cuando trabajemos con archivos en el captulo 18,
veremos que el contenido de muchos tipos de archivo puede considerarse como una
secuencia de cadenas. Adems, los nombres de los archivos y las carpetas son cadenas
de caracteres.
Realizar bsquedas en pginas Web.
Guardar texto en memoria, de manera que pueda ser empleado por los procesadores
y editores de texto.
N
1
F
2
O
3
R
4
M
5
A
6
T
7
I
8
C
9
A
10
Como puede ver, el valor mximo del ndice es 10 y la longitud de la cadena (el nmero de
caracteres que contiene) es 11.
Una regla que se tiene, en esta asignatura es que se valora como ms importante la claridad de
un programa que su velocidad de ejecucin. Sin embargo, algunas veces enfrentaremos
situaciones, por ejemplo, el caso en que nuestras cadenas slo contienen un carcter. C#
cuenta con un tipo de datos llamado char, el cual almacena cada elemento como carcter
Unicode de 16 bits; en consecuencia, podemos realizar comparaciones entre valores char con
la misma rapidez que con enteros. He aqu algunos ejemplos:
char inicial = 'M';
char marcador = '\n';
char letra;
letra=inicial;
if (letra== 'B')
{ // etc... }
Observe el uso de la comilla sencilla en vez de la comilla doble que utilizamos para las cadenas
de caracteres. Estas comillas slo pueden contener un carcter (aunque parezca que \n consta
de dos caracteres, se reemplaza en tiempo de compilacin por el carcter individual de nueva
lnea). Para hacer conversiones entre char y string podemos usar esta instruccin:
inicial = Convert.ToChar("x");
string letraComoCadena = Convert.ToString(letra);
El tipo char se utiliza muy poco, pero algunas veces es necesario emplearlo
Comparacin de cadenas
Siempre podemos comparar cadenas mediante los operadores == y !=. Sin embargo, a menudo
se necesita colocar las cadenas en orden alfabtico, para lo cual debemos poder determinar si
una cadena va antes que otra. Ahora bien, antes se mencion que cada carcter tiene un
cdigo numrico propio. Imagine que a es el menor, b es el siguiente, etctera. Despus de z
tenemos A, B, etctera. Las cadenas se comparan empezando desde el carcter ubicado en el
extremo izquierdo. He aqu algunos ejemplos:
antena va antes que barco
ancho va antes que antena
algo va antes que algoritmo
ANTENA va antes que BARCO
antena va antes que INSECTO
insecto va antes que INSECTO
El mtodo CompareTo devuelve un resultado entero con el siguiente significado:
Si utilizamos:
n = "antena".CompareTo("barco");
n recibir un -1.
Correccin de cadenas
En esta seccin veremos mtodos para modificar cadenas de caracteres. Estos mtodos en
realidad crean una nueva cadena, en vez de modificar la original.
ToLower El mtodo ToLower convierte cualquier letra mayscula que se encuentre en una
cadena en letra minscula. En el siguiente ejemplo:
cadena1 = "Versin 1.1";
cadenaResultante = cadena1.ToLower();
Coloca la cadena "versin 1.1" en cadenaResultante
ToUpper El mtodo ToUpper realiza una operacin similar a la de ToLower, pero cambia las
letras minsculas por sus equivalentes en mayscula. Por ejemplo:
cadena1 = "C Sharp";
cadenaResultante = cadena1.ToUpper();
El resultado sera que cadenaResultante tomara el valor "C SHARP".
Trim El mtodo Trim elimina espacios a ambos extremos de una cadena. Si utilizamos:
cadena1 = " Centro ";
cadenaResultante = cadena1.Trim();
cadenaResultado se convertir en "Centro".
Insert Este mtodo nos permite insertar caracteres en una posicin especfica de la cadena,
como en:
cadena1 = "Programacin en C Sharp";
cadenaResultante = cadena1.Insert(16, "Visual ");
El resultado es "Programacin en Visual C Sharp"
Para un listado completo de los mtodos que se pueden utilizar con las cadenas de caracteres
https://msdn.microsoft.com/es-es/library/system.string_methods(v=vs.110).aspx
IV.
Arreglos
Supongamos que se tiene las siguientes calificaciones de los alumnos arreglados de la siguiente
manera
Carmen
Miguel
Definicin:
MATRIZ o arreglo bidimensional es un arreglo de arreglos, que representan una tabla, tiene
filas y columnas. Los datos de una matriz son todos del mismo tipo y son accedidos mediante
dos ndices o posiciones: uno para filas y otro para columnas.
Por ejemplo
1
1
(1,2)
(1,3)
(2,1)
(2,2)
(2,3)
(3,1)
(3,2)
(3,3)
(1,1)
Donde:
double [ , ] matriz ;
int [ , ] ubicacin ;
En la declaracin, el espacio entre los corchetes est vaco. Esto se debe a que, durante dicha
operacin, no se reserva espacio en la memoria.
Si deseamos especificar el nmero de filas y columnas de la matriz simplemente se lo
colocamos en los corchetes:
matriz = new double [2, 3] ; // Se crea el arreglo matriz, con 6 elementos de tipo punto flotante
y precisin doble .
ubicacion = new int[ 4,2] ; //Se crea el arreglo ubicacin, con 8 elementos de tipo entero de 32
bits .
Las operaciones de declaracin y creacin anteriores se pueden agrupar en una sola
instruccin, como se muestra enseguida:
Adems de leer, escribir y procesar matrices, tambin podemos inicializarlas con valores para
evitar leerlos desde el teclado u otro dispositivo de E/S.
int tabla[2][3]={{10,20,30},{40,50,60}};
Inicializacin
Si el tipo del arreglo es numrico, a sus elementos se les asigna el valor cero.
Si el tipo del arreglo es char, a sus elementos se les asigna el valor '\u0000'.
Si el tipo del arreglo es bool, a sus elementos se les asigna el valor false.
Si el tipo del arreglo es una clase, a sus elementos se les asigna el valor nul
M[ 0 ][ 0 ]
M[ 1 ][ 2 ]
Sea la matriz M[3][4]
M [5][6].
La lectura de una matriz se realiza por medio de dos ciclos anidados, uno que recorra la filas y
otro las columnas, es decir,
para fila = 0 hasta 4 hacer
para columna = 0 hasta 4 hacer
Leer M[fila][columna]
fin_para_columna
fin_para_fila
Si una matriz tiene igual nmero de filas y columnas decimos que es una matriz cuadrada.
V.
Estructuras
Las estructuras (Struct en C#) Es un tipo de dato definido por el usuario que normalmente se
usa para encapsular pequeos grupos de variables relacionadas, como las coordenadas de un
rectngulo o las caractersticas de un elemento en un inventario.
Al definir una estructura para los datos todo el grupo puede ser procesado con un solo nombre
de estructura, sin importar el nmero de variables que contenga la estructura.
Algunas de las variables declaradas en el cdigo C# pueden tener una relacin lgica con otras
variables ya declaradas. Ejemplo Se quiere escribir un cdigo que trabaje con un punto de la
pantalla.
Int CoordenadaX;
Int CoordenadaY;
El punto tiene dos valores, la coordenada X y la coordenada Y, que funcionan juntas para
escribir el punto.
Aunque se puede escribir el cdigo C# de esta manera, es bastante pesado. Los dos valores
deben poder usarse en cualquier cdigo que quiera trabajar con el punto; para que un mtodo
trabaje con el punto tendr que pasar los valores uno a uno.
La situacin resulta incluso ms complicadas cuando varias variables trabajan juntas para
describir una sola entidad.
Por ejemplo un empleado de una base de datos de RR.HH puede tener variables que
representen un
Nombre, Apellido, direccin, telfono, salario, etc.
Controlar todas estas variables por separado y asegurarse de que todas se usan como un grupo
puede volverse complicado; e aqu la importancia de las estructuras
Casi todas los structs comparten la misma sintaxis que las clases, aunque estn ms limitadas
que stas:
Dentro de una declaracin de struct, los campos no se pueden inicializar a menos que se
declaren como constantes o estticos.
Un struct no puede declarar un constructor predeterminado (es decir, un constructor sin
parmetros) ni un destructor.
Caractersticas de las Estructuras
A diferencia de las clases (se ver los concepto sobre esto ms adelante en la materia), es
posible crear instancias de los structs sin utilizar un operador new.
Los structs pueden declarar constructores que tienen parmetros.
Un struct no puede heredar de otro struct o clase, ni puede ser la base de una clase. Todos los
structs heredan directamente de System.ValueType, que hereda de System.Object.
Los structs son tipos de valor y las clases son tipos de referencia.
Un struct se puede utilizar como tipo que acepta valores null y se le puede asignar un
valor null.
La declaracin de una estructura que defina un punto en un plano puede ser como se muestra
a continuacin:
struct Punto
{
public int X;
public int Y;
}
class DistanciaDosPuntos
{
struct Punto{
public int X;
public int Y;
Tambin se pueden escribir mtodos en las estructuras. Estos mtodos siguen las mismas
reglas que los mtodos de clase:
Las propiedades de una estructura permiten leer, escribir y calcular valores usando
descriptores de acceso. A diferencia de los campos las propiedades no se consideran variables;
por tanto no designan espacios de almacenamiento; debido a esto no pueden ser pasadas
como parmetros ref o out.
Class DistanciaDosPuntos
{
Struct Punto
{
Private int X;
Public int X;
{
Get
{
Return X;
}
Set
{
X=value;
}
}
}
VI.
Enumeraciones
Si no se especifica valor inicial para cada constante, el compilador les dar por defecto valores
que empiecen desde 0 y se incrementen en una unidad para cada constante segn su orden de
aparicin en la definicin de la enumeracin:
El valor asociado a Pequeo ser 0, el asociado a Mediano ser 5, y el asociado a Grande ser 6
ya que como no se le indica explcitamente ningn otro se considera que este valor es el de la
constante anterior ms 1.
Las variables de tipos enumerados se definen como cualquier otra variable
<nombreTipo> <nombreVariable>
Por ejemplo:
Tamao t;
Uso de las enumeraciones
Se puede declarar una enumeracin en C# usando la siguiente sintaxis:
La palabra clave enum
Un identificador de enumeracin
Un tipo base opcional
Identificadores de valor de enumeracin separados por comas y entre llaves
Todas las asignaciones explicitas de valor deben usar valores que estn incluidos dentro de los
lmites validos del tipo subyacente de la enumeracin; por ejemplo:
enum Fecha: uint
{
dia = 1;
mes = -2;
}
Esta declaracin es un error porque el tipo subyacente es uint y las asignaciones usan valores
negativos que estn fuera de los valores legales de uint.
Para hacer referencia a los literales de una enumeracin se usa la sintaxis:
<nombreEnumeracin>.<nombreLiteral>
Dado que los valores de una enumeracin son enteros, es posible aplicarles muchas de las
operaciones que se pueden aplicar a los mismos: ==, !=, <, >, <=, >=, +, -, ^, &, |, ~, ++, - y sizeof. Sin embargo, hay que concretar que los operadores binarios +y no pueden
aplicarse entre dos operandos de enumeraciones, sino que al menos uno de ellos ha de ser un
tipo entero; y que |, & y^ slo pueden aplicarse entre enumeraciones.
La clase System.Enum
Todos los tipos enumerados derivan de System.Enum, que deriva de System.ValueType y sta
a su vez deriva de la clase primigenia System.Object. Aparte de los mtodos heredados de
estas clases padres ya estudiados, toda enumeracin tambin dispone de otros mtodos
heredados de System.Enum, los principales de los cuales son:
static Type getUnderlyingType(Type enum): Devuelve un objeto System.Type con informacin
sobre el tipo base de la enumeracin representada por el objeto System.Type que se le pasa
como parmetro.
string ToString(string formato): Cuando a un objeto de un tipo enumerado se le aplica el
mtodo ToString() heredado de object, lo que se muestra es una cadena con el nombre del
literal almacenado en ese objeto.
Console.WriteLine(t.ToString("X"));
static string Format(Type enum, object valorLiteral, string formato): Funciona de forma
parecida a la sobrecarga de ToString(), slo que ahora no es necesario disponer de ningn
objeto del tipo enumerado cuya representacin de literal se desea obtener sino que basta
indicar el objeto Type que lo representa y el nmero del literal a obtener. Por ejemplo:
Console.Write(Enum.Format(typeof(Tamao), 0, "G");
static object Parse(Type enum, string nombre, bool mayusculas): Crea un objeto de un tipo
enumerado cuyo valor es el correspondiente al literal de nombre asociado nombre. Si la
enumeracin no tuviese ningn literal con ese nombre se lanzara una ArgumentException, y
para determinar cmo se ha de buscar el nombre entre los literales de la enumeracin se
utiliza el tercer parmetro que indica si se ha de ignorar la capitalizacin al buscarlo. Un
ejemplo del uso de este mtodo es:
Tamao t = (Tamao) Enum.Parse(typeof(Tamao), "Pequeo");
Console.WriteLine(t) // Muestra Pequeo
Aparte de crear objetos a partir del nombre del literal que almacenarn, Parse() tambin
permite crearlos a partir del valor numrico del mismo. Por ejemplo:
Tamao t = (Tamao) Enum.Parse(typeof(Tamao), "0");
Console.WriteLine(t) // Muestra Pequeo
En este caso, si el valor indicado no se correspondiese con el de ninguno de los literales de la
enumeracin no saltara ninguna excepcin, pero el objeto creado no almacenara ningn
literal vlido. Por ejemplo:
Tamao t = (Tamao) Enum.Parse(typeof(Tamao), "255");
Console.WriteLine(t) // Muestra 255
static object[] GetValues(Type enum): Devuelve una tabla con los valores de todos los literales
de la enumeracin representada por el objeto System.Type que se le pasa como parmetro.
Por ejemplo:
object[] tabla = Enum.GetValues(typeof(Tamao));
Console.WriteLine(tabla[0]); // Muestra 0, pues Pequeo = 0
Console.WriteLine(tabla[1]); // Muestra 1, pues Mediano = 1
Console.WriteLine(tabla[2]); // Muestra 1, pues Grande =
Pequeo+Mediano
static string GetName(Type enum, object valor): Devuelve una cadena con el nombre del
literal de la enumeracin representada por enum que tenga el valor especificado en valor. Por
ejemplo:
Console.WriteLine(Enum.GetName(typeof(Tamao),0)); //Imprime Pequeo
Si la enumeracin no contiene ningn literal con ese valor devuelve null, y si tuviese varios con
ese mismo valor devolvera slo el nombre del ltimo. Si se quiere obtener el de todos es
mejor usar GetNames(), que se usa como GetName()
pero devuelve unstring[] con los
nombres de todos los literales que tengan el valor indicado ordenados segn su orden de
definicin en la enumeracin.
static bool isDefined (Type enum, object valor): Devuelve un booleano que indica si algn
literal de la enumeracin indicada tiene el valor indicado.