63 - Declaración de enumeraciones


Una enumeración es un tipo de dato que creamos asociando un conjunto de enteros con un conjunto de literales.

Veamos ejemplos de declaración de enumeraciones:

enum operaciones {SUMA, RESTA, MULTIPLICACION, DIVISION};
enum respuesta {NO, SI};
enum diassemana {LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO};
enum tipoventa {MAYORISTAS, MINORISTAS};
enum dispositivos {TECLADO, MOUSE, CAMARA};
enum boolean {FALSE, TRUE};

Como vemos la declaración de un tipo de dato enumerado se declara mediante la palabra clave enum y seguidamente el nombre del tipo de datos , luego entre llaves indicamos todas los valores que puede almacenar una variable de ese tipo. La primer constante o literal indicado toma el valor cero, la segunda el valor 1 y así sucesivamente.

Podemos declarar la enumeración con la sintaxis:

enum operaciones {SUMA=0, RESTA=1, MULTIPLICACION=2, DIVISION=3};

Pero es opcional si queremos iniciar a partir de cero la enumeración el propio compilador lo hace.

Luego para definir una variable de tipo enumeración utilizamos la sintaxis:

    enum operaciones op;

Definimos la variable op de tipo operaciones. Luego en la variable op podemos almacenar cualquiera de los cuatro literales definidos en la enumeración:

    op=MULTIPLICACION;

Las enumeraciones tienen por objetivo que el programa sea más legible para cuando tengamos que hacer cambios. Si no existieran las enumeraciones podemos definir una variable entera y recordar que el 0=suma, 1=resta, 2=multiplicacion y 3=division.

int op; //si guardo 0=suma, 1=resta, 2=multiplicacion y 3=division
op=2; 

Problema 1:

Crear y cargar un vector de 10 elementos con valores aleatorios entre 1 y 100. Ingresar por teclado un entero y mostrar un mensaje si el número esta dentro del vector.

Programa: programa204.c

Ver video

#include<stdio.h>
#include<conio.h>
#include <time.h>
#include <stdlib.h>

#define CANTIDAD 10

enum texiste {NO, SI};

void cargar(int vec[CANTIDAD])
{
    int f;
    srand(time(NULL));
    for(f=0;f<CANTIDAD;f++)
        vec[f]=rand()%100 + 1;
}

void imprimir(int vec[CANTIDAD])
{
    int f;
    for(f=0;f<CANTIDAD;f++)
        printf("%i ",vec[f]);
    printf("\n\n");
}

void consulta(int vec[CANTIDAD])
{
    int f;
    int valor;
    printf("Ingrese el valor a buscar dentro del vector:");
    scanf("%i",&valor);
    enum texiste existe=NO;
    for(f=0;f<CANTIDAD;f++)
        if (valor==vec[f])
            existe=SI;
    if (existe==SI)
        printf("El valor ingresado esta dentro del vector");
    else
        printf("El valor ingresado no esta dentro del vector");
}


int main()
{
    int vec[CANTIDAD];
    cargar(vec);
    imprimir(vec);
    consulta(vec);
    getch();
    return 0;
}

En este problema declaramos un tipo de dato enumerado texiste con dos constantes:

enum texiste {NO, SI};

Para el algoritmo que verifica si un entero esta dentro del vector definimos una variable de tipo texiste y la inicializamos con el literal NO:

void consulta(int vec[CANTIDAD])
{
    int f;
    int valor;
    printf("Ingrese el valor a buscar dentro del vector:");
    scanf("%i",&valor);
    enum texiste existe=NO;

Si dentro del for encontramos el valor a buscar cambiamos el valor almacenado en la variable existe por el literal SI:

    for(f=0;f<CANTIDAD;f++)
        if (valor==vec[f])
            existe=SI;

Al finalizar el for si la variable existe tiene el valor SI significa que el valor fue encontrado dentro del vector y mostramos el mensaje respectivo:

    if (existe==SI)
        printf("El valor ingresado esta dentro del vector");
    else
        printf("El valor ingresado no esta dentro del vector");

El if también podría haber sido dispuesto con la sintaxis:

    if (existe)

El if se verifica verdadero si la variable existe almacena el valor SI que como sabemos tiene asociado el valor 1:

enum texiste {NO=0, SI=1};

Problema 2:

Confeccionar una función que retorne la suma, resta, multiplicación o división de dos enteros, le pasamos como parámetro los dos valores y un tipo de dato enumerado que indique que operación efectuar.

Programa: programa205.c

Ver video

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

enum operacion {SUMAR, RESTAR, MULTIPLICAR, DIVIDIR};


int operar(int v1,int v2, enum operacion op)
{
    switch(op) {
        case SUMAR:return v1+v2;
        case RESTAR:return v1-v2;
        case MULTIPLICAR:return v1*v2;
        case DIVIDIR:return v1/v2;
        default:printf("El programa se detiene por operacion no valida");
                exit(1);
    }
}

int main()
{
    int valor1=10;
    int valor2=5;
    printf("La suma de %i y %i es %i\n", valor1, valor2, operar(valor1,valor2,SUMAR));
    printf("La resta de %i y %i es %i\n", valor1, valor2, operar(valor1,valor2,RESTAR));
    printf("La multiplicacion de %i y %i es %i\n", valor1, valor2, operar(valor1,valor2,MULTIPLICAR));
    printf("La division de %i y %i es %i\n", valor1, valor2, operar(valor1,valor2,DIVIDIR));
    getch();
    return 0;
}

Declaramos el tipo de dato operacion con cuatro literales posibles (recordemos que tienen asociados los valores 0,1,2 y 3)

La función operar recibe como parámetros los dos enteros y el tipo de dato enumerado:

int operar(int v1,int v2, enum operacion op)

Mediante un switch identificamos la operación a efectuar y retornamos la operación respectiva:

    switch(op) {
        case SUMAR:return v1+v2;
        case RESTAR:return v1-v2;
        case MULTIPLICAR:return v1*v2;
        case DIVIDIR:return v1/v2;
        default:printf("El programa se detiene por operacion no valida");
                exit(1);
    }

Desde la main llamamos a la función operar y le pasamos los valores a operar y la operación que queremos que se efectúe:

int main()
{
    int valor1=10;
    int valor2=5;
    printf("La suma de %i y %i es %i\n", valor1, valor2, operar(valor1,valor2,SUMAR));
    printf("La resta de %i y %i es %i\n", valor1, valor2, operar(valor1,valor2,RESTAR));
    printf("La multiplicacion de %i y %i es %i\n", valor1, valor2, operar(valor1,valor2,MULTIPLICAR));
    printf("La division de %i y %i es %i\n", valor1, valor2, operar(valor1,valor2,DIVIDIR));

Si bien podemos pasar el entero en lugar del literal perdería el sentido de hacer más legible nuestro programa:

    printf("La suma de %i y %i es %i\n", valor1, valor2, operar(valor1,valor2,0));

Asignación de otros valores a los literales.

Podemos iniciar los literales a partir de otro valor y no de cero:

enum diassemana {LUNES=1, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO};

Con la asignación de un 1 al literal LUNES los demás toman valores consecutivos a partir de 1, es decir MARTES toma un valor 2, MIERCOLES toma un valor 3 y así sucesivamente.

Podemos asignar valores no consecutivos a cada uno:

enum dispositivos {TECLADO=1, MOUSE=10, CAMARA=100};

Si consultamos el código fuente del sistema operativo Linux en muchos de sus archivos encontraremos declaraciones de enumeraciones:

declaración de enumeraciones en el código fuente linux

Retornar