UnidadVI- Estrcuturas de Datos

download UnidadVI- Estrcuturas de Datos

of 23

Transcript of UnidadVI- Estrcuturas de Datos

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    1/23

    UNIVERSIDAD DE EL SALVADOR

    FACULTAD DE INGENIERIA Y ARQUITECTURA

    ESCUELA DE INGENIERIA DE SISTEMAS INFORMATICOS

    INTRODUCCION A LA INFORMATICA

    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 tipoarreglo 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:

    [] = new [];

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    2/23

    El operador newse 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 newes el operador que indica al compilador que cree un nuevo vector con unacapacidad 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:

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    3/23

    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).

    Arrays o vectores se trabajan como objetos en C#

    En C#, los arrays son objetos. Adems, todos los arrays, de cualquier tipo derivan de la clase

    System.Array,que es el tipo base abstracto de todos los tipos de arrays.

    La clase System.Arrayproporciona muchos mtodos y propiedades para manipular arrays

    Es importante tener en cuenta que el tipo System.Arrayno es un tipo array, sino un tipo del

    cual derivan todos los tipos array.

    Las propiedades y mtodos ms importantes son las siguientes:

    Length: devuelve el nmero de elementos de un array. Por ejemplo:

    Int []unArray = {1, 2, 3, 4, 5};

    int longitudDelArray = unArray.Length;

    Devolver el valor de 5

    GetLength: obtiene la longitud de una determinada dimensin cuando el array es

    multidimensional. Por ejemplo, para obtener el nmero de elementos de la primeradimensin:

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    4/23

    int longitud=otroArray.GetLength(0);

    Sorty 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:

    Se pueden consultar todos los mtodos en el siguiente enlace:

    https://msdn.microsoft.com/es-es/library/system.array(v=vs.110).aspx?cs-save-lang=1&cs-

    lang=csharp#code-snippet-1

    Ejemplo 1

    Realizar un mtodo que diga si un nmero entero est o no dentro de un array.

    https://msdn.microsoft.com/es-es/library/system.array(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1https://msdn.microsoft.com/es-es/library/system.array(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1https://msdn.microsoft.com/es-es/library/system.array(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1https://msdn.microsoft.com/es-es/library/system.array(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1https://msdn.microsoft.com/es-es/library/system.array(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1
  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    5/23

    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).

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    6/23

    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 cadenasde caracteres.

    Realizar bsquedas en pginas Web.

    Guardar texto en memoria, de manera que pueda ser empleado por los procesadores

    y editores de texto.

    Se puede declarar variables y proveer un valor inicial, como en el siguiente ejemplo:

    string x;

    string y = "El Salvador";

    Tambin podemos asignar una cadena a otra, como en:

    x = "UES";

    y = "FIA";

    y = x;

    x = ""; // una cadena de longitud cero

    Y crear arreglos de cadenas de caracteres (con ndices que empiezan en 0), como en el

    siguiente ejemplo:

    string [] ciudades = new string[10]; // 0 a 9

    Podemos convertir cadenas de caracteres a nmeros, y viceversa; para ello empleamos los

    mtodos de la clase Convert. Esto es til cuando recibimos cadenas a partir de un cuadro de

    texto (o de un archivo, como veremos ms adelante). Por ejemplo, podramos utilizar el

    siguiente cdigo:

    int n = 3;

    double d;

    x = Convert.ToString(n);

    y = "123";

    n = Convert.ToInt32(y);

    d = Convert.ToDouble("12.345");

    Si una cadena no se puede convertir en nmero se produce una excepcin.

    Cada uno de los caracteres que conforman una cadena de caracteres tiene un ndice numrico,

    empezando desde cero. Pero cuidado: es fcil confundir la longitud de una cadena con el valor

    mximo del ndice. Para comprender esta situacin veamos el siguiente diagrama, que

    muestra la cadena informtica:

    I N F O R M A T I C A

    0 1 2 3 4 5 6 7 8 9 10

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    7/23

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    8/23

    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.

    ToLowerEl mtodo ToLowerconvierte 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

    ToUpperEl mtodo ToUpperrealiza 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".

    TrimEl mtodo Trimelimina espacios a ambos extremos de una cadena. Si utilizamos:

    cadena1 = " Centro ";cadenaResultante = cadena1.Trim();

    cadenaResultado se convertir en "Centro".

    InsertEste 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

    https://msdn.microsoft.com/es-es/library/system.string_methods(v=vs.110).aspxhttps://msdn.microsoft.com/es-es/library/system.string_methods(v=vs.110).aspxhttps://msdn.microsoft.com/es-es/library/system.string_methods(v=vs.110).aspx
  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    9/23

    Alumno

    Parcial 1

    Parcial 2

    Parcial 3

    Luis 9 8 8

    Carmen

    0

    6

    9

    Miguel

    9

    9

    9

    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 2 3

    1 9 (1,1) 8 (1,2) 8 (1,3)

    2 0 (2,1) 9 (2,2) 9 (2,3)

    3

    9 (3,1)

    9 (3,2)

    9 (3,3)

    Una Matriz desde el punto de vista matemtico

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    10/23

    Vista conceptual de una matriz

    En este caso tenemos una matriz de dimensin (o tamao) M x N, donde M es el nmero de

    filas y N el nmero de columnas. Aqu M=2 y N=4

    De la misma forma que los arreglos, una matriz debe tener tambin un nombre, digamos M.

    Declaracin de una matriz en C#

    tipo NombreMatriz [ No. filas ][No. columnas];

    Ejemplo:

    int Tabla [ 3 ] [ 5 ];

    Declaracin

    La declaracin de un arreglo consiste en establecer las caractersticas del arreglo y sus

    elementos, por medio de la siguiente sintaxis:

    < identificador > = new [ dim1, dim2 ] ;

    Donde:

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    11/23

    newes el operador para gestionar espacio de memoria, en tiempo de ejecucin,

    dim1 y dim2 son valores enteros que representan las dimensiones del arreglo

    El par de corchetes y la coma, [ , ], representan las dimensiones del arreglo y encierra dos

    nmeros enteros, cuyo producto corresponde al nmero de elementos del arreglo.

    Ejemplos:

    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 solainstruccin, como se muestra enseguida:

    double [ , ] matriz = new double [2,3] ;

    int [ , ] ubicacin = new int[4, 2] ;

    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

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    12/23

    Un arreglo es un objeto que, cuando es creado por el compilador, se le asignan

    automticamente valores iniciales predeterminados a cada uno de sus elementos, de

    acuerdo a los siguientes criterios:

    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 valornul

    Cuando se requiere asignar valores iniciales diferentes de los predeterminados, es posible

    agrupar las operaciones de declaracin, creacin e inicializacin en una sola instruccin, por

    ejemplo:

    double [ , ] matriz = { {1.5, 0, 4, -6.5, 2 } , {2.3, 9, 3.5, 4.8, 6.2} };int [ , ] ubicacin = { {2, 4} , {6, 8} , {9, 10}, {5 , 1}};

    string [ , ] funcionario = { {"Hugo", "jefe"} ,

    { "Paco", "operador "},

    { "Lus","ayudante"} };

    Acceso a los elementos de una Matriz.

    Acceder a los elementos de una matriz significa, ser capaces de almacenar valores yrecuperarlos de cada elemento de la matriz.

    Cada elemento de la matriz tiene asignado una posicin denotada por su fila y su columna. Por

    ejemplo:

    M[ 0 ][ 0 ]

    M[ 1 ][ 2 ]

    Sea la matriz M[3][4]

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    13/23

    La fila y la columna inician desde cero.

    Tener cuidado de no exceder los lmites de la matriz.

    Cualquier elemento individual de una matriz, puede ser utilizado como una variable

    normal.

    Dimensionar y leer una matriz

    Para dimensionar o declarar una matriz hacemos 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

    El recorrido de la matriz M para su lectura se hace de la siguiente manera:

    Si una matriz tiene igual nmero de filas y columnas decimos que es una matriz cuadrada.

    Ejemplo: Calcular el promedio de los elementos de una matriz.

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    14/23

    Escriba un algoritmo que lea una matriz de 10x10 y sume los

    Elementos de la diagonal principal

    1. Inicio

    2. Var entero f,c,suma=0

    entero M[10][10]

    3. para f= 0 hasta 9 hacer

    para c= 0 hasta 9 hacerLeer M[f][c]

    fin_para_c

    fin_para_f

    4. para f= 0 hasta 9 hacer

    para c= 0 hasta 9 hacer

    suma= suma + M[f][f]

    fin_para_c

    fin_para_f

    5. Escribir La suma de ladiagonal es,suma

    6. Fin

    C# dispone de la instruccin foreach. Esta instruccin proporciona un modo simple y

    limpio de iterar en los elementos de una matriz. Por ejemplo, el siguiente cdigo crea

    una matriz denominada numbers y la recorre mediante la instruccin foreach:

    int[,] numbers = new int[3, 2] {{9, 99}, {3, 33}, {5, 55}};

    foreach(int i in numbers)

    {

    Console.Write("{0} ", i);

    }

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    15/23

    Otros mtodos de la clase System.Object>System.Array

    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.

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    16/23

    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 sinparmetros) 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 puede implementar interfaces.

    Un struct se puede utilizar como tipo que acepta valores null y se le puede asignar un

    valor null.

    Declarar una estructura en c#

    Los contenidos de una estructura se declaran usando la palabra clave struct.

    Para dar un nombre a una estructura se coloca el identificador despus de la palabra clave

    struct.

    La lista de variables que forman la estructura se encierra entre llaves a continuacin del

    identificador de la estructura.

    Las declaraciones de miembro de la estructura suelen llevar antepuesta la palabra clave public.

    Por ejemplo:

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    17/23

    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;

    }

    En el ejemplo los miembros de la estructura X e Y, tienen el mismo tipo. Las estructuras

    pueden estar formadas por variables de distinto tipo.

    Como con todas las instrucciones C#, solo puede declararse una estructura desde el interior de

    una clase. C# no permite inicializar miembros de estructuras en el momento de declararse.

    Usar estructuras en el cdigo

    Para usar la estructura en el cdigo se indica el identificador de la estructura seguido del

    identificador de la variable de la estructura; ejemplo:

    Punto MiPunto;

    Esta declaracin declara una variable llamada MiPunto cuyo tipo es el de la estructura Punto

    Esta variable se puede usar igual que cualquier otra variable.

    Usar mtodos constructores

    Una estructura puede incluir un mtodo especial llamado constructor, tambin las estructuras

    pueden tener varios constructores o ninguno.

    Las declaraciones de constructores de estructuras son muy parecidas a las declaraciones de

    mtodos de clase. Con las siguientes excepciones:

    Los constructores no devuelven ningn valor. No se pueden usar palabras clave de tipo de

    devolucin, ni siquiera void.

    Los identificadores de constructores tienen el mismo nombre que la estructura.Los constructores deben tener al menos un parmetro. C# no permite definir un constructor

    sin parmetros.

    Ejemplo de uso de constructores:

    class DistanciaDosPuntos

    {

    struct Punto{

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    18/23

    public int X;

    public int Y;

    public Punto(int InicialX){X=InicialX;

    Y=1000;

    }

    }

    }

    LLAMAR A MTODOS DESDE ESTRUCTURAS

    Tambin se pueden escribir mtodos en las estructuras. Estos mtodos siguen las mismas

    reglas que los mtodos de clase:

    Deben especificar un tipo de devolucin(o void).

    Tener un identificador y una lista de argumentos que pueden estar vaca.

    Para llamar a un mtodo en una estructura se usa la misma notacin de puntos que

    para acceder a un mtodo 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;

    }

    }

    }

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    19/23

    En el ejemplo anterior se asigna un valor al miembro X de la estructura Punto y luego retorna

    este valor.

    El uso de propiedades es una forma de leer, escribir y calcular datos dentro de una estructura.

    No hace falta incluir mtodos voluminosos para que realicen los clculos y se puede definir

    como y cuando pueden actuar los descriptores de acceso get y set.

    VI. Enumeraciones

    Un tipo de enumeracin (o enum) proporciona una manera eficaz de definir un conjunto de

    constantes integrales con nombre que pueden asignarse a una variable.

    Por ejemplo, supongamos que tenemos que definir una variable cuyo valor representar unda de la semana. Slo hay siete valores significativos que almacenar dicha variable. Para

    definir esos valores, se puede utilizar un tipo de enumeracin, que se declara mediante la

    palabra clave enum:

    enum Dias { Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo };

    enum Meses : byte { Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dec };

    Para entender bien la principal utilidad de las enumeraciones vamos a ver antes un problema

    muy tpico en programacin:

    Si queremos definir un mtodo que pueda imprimir por pantalla un cierto texto con diferentes

    tamaos, una primera posibilidad sera dotarlo de un parmetro de algn tipo entero que

    indique el tamao con el que se desea mostrar el texto.

    La sintaxis completa que se puede usar para definir una enumeracin es:

    En realidad una enumeracin es un tipo especial de estructura donde System.ValueType es

    padre de ella, que slo puede tener como miembros campos pblicos constantes y estticos.

    El tipo por defecto de las constantes que forman una enumeracin es int, aunque puede

    drseles cualquier otro tipo bsico entero (byte, sbyte, short, ushort, uint, int, long o ulong)

    indicndolo en .

    Al hacer esto se debe tener muy presente que el compilador de C# slo admite que se

    indiquen as los alias de estos tipos bsicos, pero no sus nombres reales

    (System.Byte,System.SByte, etc.)

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    20/23

    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

    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:

    .

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    21/23

    El nico sitio donde no es necesario preceder el nombre del literal de

    . es en la propia definicin de la enumeracin, como tambin ocurre

    con cualquier constante esttica.

    Los literales de una enumeracin son constantes de tipos enteros y las variables de tipoenumerado son variables del tipo entero base de la enumeracin. Por eso es posible

    almacenar valores de enumeraciones en variables de tipos enteros y valores de tipos enteros

    en variables de enumeraciones.

    Por Ejemplo:

    Tamao t = (Tamao) 0;

    Tamao.Pequeo (=0)

    t = (Tamao) 100;

    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 +yno 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");

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    22/23

    Si el valorLiteral indicado no estuviese asociado a ningn literal del tipo enumerador

    representado por enum, se devolvera una cadena con dicho nmero. Por el contrario, si

    hubiese varios literales en la enumeracin con el mismo valor numrico asociado, lo que se

    devolvera sera el nombre del declarado en ltimo lugar al definir la enumeracin

    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 esmejor usar GetNames(), que se usa como GetName() pero devuelve unstring[] con los

  • 7/25/2019 UnidadVI- Estrcuturas de Datos

    23/23

    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.