72 - Enumeraciones


Una enumeración es un conjunto de constantes enteras que tienen asociado un nombre para cada valor.

El objetivo fundamental de implementar una enumeración es facilitar la legibilidad de un programa.
Supongamos que necesitamos almacenar en un juego de cartas el tipo de carta actual (oro, basto, copa o espada), podemos definir una variable entera y almacenar un 1 si es oro, un 2 si es basto y así sucesivamente.

Luego mediante if podemos analizar el valor de esa variable y proceder de acuerdo al valor existente.

Problema 1:

Definir un tipo de dato enumerado para cada tipo de carta de una baraja española.

Programa:

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

namespace Enumeracion1
{
    class JuegoDeCartas
    {
        public enum TipoCarta { oro, basto, copa, espada };

        private TipoCarta cartaActual;

        public void Imprimir()
        {
            cartaActual = TipoCarta.oro;
            Console.WriteLine("El valor actual es:" + cartaActual);
            cartaActual = TipoCarta.espada;
            Console.WriteLine("El valor actual es:" + cartaActual);
            Console.ReadKey();
        }

        static void Main(string[] args)
        {
            JuegoDeCartas jc = new JuegoDeCartas();
            jc.Imprimir();
        }
    }
}

Para definir un tipo de dato enumerado utilizamos la palabra clave enum y entre paréntesis escribimos todos los valores que puede almacenar una variable de dicho tipo:

        public enum TipoCarta { oro, basto, copa, espada };

Internamente el primer valor esta asociado con el número cero (oro), el segundo se asocia con el 1 y así sucesivamente.

Para definir una variable lo hacemos como cuando definimos cualquier tipo de variable, le antecedemos el nuevo tipo de dato creado (en nuestro caso hemos creado el TipoCarta):

        private TipoCarta cartaActual;

El atributo cartaActual puede almacenar cualquiera de los cuatro valores y para inicializar utilizamos la sintaxis:

            cartaActual = TipoCarta.oro;

No es posible asignarle un valor entero a una variable tipo enumerada:

            cartaActual = 2; // error

Asignación de valores a las constantes de una enumeración.

Podemos especificar los valores para cada constante de la enumeración:

        public enum TipoProcesador { bits16 = 16, bits32 = 32, bits64 = 64 };

Tengamos en cuenta que si no le asignamos un valor a la constante comienzan a asignarse un valor a partir de cero en forma correlativa:

        public enum TipoProcesador { bits16, bits32, bits64 };

Con esto bits16 tiene asociado el entero 0, bits32 tiene asociado el valor 1 y bits54 tiene asociado el valor 2.

Podemos asignarle valores a algunas constantes y otras no:

        public enum TipoProcesador { bits16=16, bits32, bits64 };

Con esto bits16 tiene asociado el entero 16, bits32 tiene asociado el valor 17 y bits54 tiene asociado el valor 18.

Si necesitamos el valor entero de una variable de tipo enumeración debemos utilizar el operador cast (es decir anteceder entre paréntesis el tipo de dato que necesitamos que la convierta):

            Console.Write((int)cartaActual);

Especificación del tipo de dato en la enumeración.

Por defecto cuando definimos una enumeración se trabaja con tipos int, pero podemos especificar otro tipo de enteros con otros tamaños:

        public enum TipoCarta: byte { oro=1, basto, copa, espada };

Problema propuesto

  1. Elaborar una calculadora para trabajar con valores enteros(utilizar objetos de la clase Button y un objeto de la clase Label donde se muestra el valor ingresado) definir un tipo de dato enumerado para las cuatro operaciones básicas. Cuando se presione algunos de los botones de operaciones almacenar en una memoria el valor ingresado y el tipo de operación pendiente en una variable del tipo de dato enumerado creado. Cuando se presione el botón igual verificar el tipo de operación pendiente y proceder a obtener el resultado y mostrarlo en la Label.
Solución

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CalculadoraEnumeracion
{
    public partial class Form1 : Form
    {
        public enum TipoOperacion { ninguna ,suma, resta, multiplicacion, division };

        private TipoOperacion operacion=TipoOperacion.ninguna;
        private int memoria;

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonborrar_Click(object sender, EventArgs e)
        {
            label1.Text = "";
            operacion = TipoOperacion.ninguna;
        }

        private void button0_Click(object sender, EventArgs e)
        {
            if (label1.Text.Length < 12)
            {
                label1.Text = label1.Text + button0.Text;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (label1.Text.Length < 12)
            {
                label1.Text = label1.Text + button1.Text;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (label1.Text.Length < 12)
            {
                label1.Text = label1.Text + button2.Text;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (label1.Text.Length < 12)
            {
                label1.Text = label1.Text + button3.Text;
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (label1.Text.Length < 12)
            {
                label1.Text = label1.Text + button4.Text;
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (label1.Text.Length < 12)
            {
                label1.Text = label1.Text + button5.Text;
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (label1.Text.Length < 12)
            {
                label1.Text = label1.Text + button6.Text;
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (label1.Text.Length < 12)
            {
                label1.Text = label1.Text + button7.Text;
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            if (label1.Text.Length < 12)
            {
                label1.Text = label1.Text + button8.Text;
            }
        }

        private void button9_Click(object sender, EventArgs e)
        {
            if (label1.Text.Length < 12)
            {
                label1.Text = label1.Text + button9.Text;
            }
        }

        private void buttonmas_Click(object sender, EventArgs e)
        {
            memoria = int.Parse(label1.Text);
            operacion = TipoOperacion.suma;
            label1.Text = "";
        }

        private void buttonmenos_Click(object sender, EventArgs e)
        {
            memoria = int.Parse(label1.Text);
            operacion = TipoOperacion.resta;
            label1.Text = "";
        }

        private void buttonpor_Click(object sender, EventArgs e)
        {
            memoria = int.Parse(label1.Text);
            operacion = TipoOperacion.multiplicacion;
            label1.Text = "";
        }

        private void buttondiv_Click(object sender, EventArgs e)
        {
            memoria = int.Parse(label1.Text);
            operacion = TipoOperacion.division;
            label1.Text = "";
        }

        private void buttonigual_Click(object sender, EventArgs e)
        {
            int valor = int.Parse(label1.Text);
            switch (operacion)
            {
                case TipoOperacion.suma: 
                    int suma = valor + memoria;
                    label1.Text = suma.ToString();
                    break;
                case TipoOperacion.resta:
                    int resta = memoria - valor;
                    label1.Text = resta.ToString();
                    break;
                case TipoOperacion.multiplicacion:
                    int multi = memoria * valor;
                    label1.Text = multi.ToString();
                    break;
                case TipoOperacion.division:
                    int divi = memoria / valor;
                    label1.Text = divi.ToString();
                    break;
            }
            operacion = TipoOperacion.ninguna;
        }
    }
}

Retornar