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;
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.
#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};
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.
#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));
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: