Вы находитесь на странице: 1из 2

Elementos de Programacin 1A E.T.S.I.

Informtica Gestin

Prctica 8: Enumerados y Registros en C++.


Tipos Enumerados.
Aunque los tipos de datos predefinidos son tericamente adecuados para cualquier propsito, existe un gran nmero de situaciones en las cuales es conveniente que el programador pueda definir sus propios tipos de manera que especifique literalmente los valores que una variable de ese tipo puede tomar. Estos son los llamados tipos enumerados. Si , por ejemplo, quisiramos definir una variable para que represente una situacin de un problema en el que hay cinco posibles colores, (rojo, amarillo, verde, azul y naranja) podramos hacer lo siguiente: const int rojo const int azul const int verde = 0 ; = 1 ; = 2 ;

int color1, color2; Sin embargo, en C++ podemos definir un nuevo tipo ordinal que conste de esos cinco valores exactamente: typedef enum { rojo, azul, verde } TColor; Tcolor color1, color2; La declaracin de un tipo de esta ndole consiste en asociar a un identificador una enumeracin de los posibles valores que una variable de ese tipo puede tomar, por lo que una misma constante no puede aparecer en dos definiciones de tipo. El orden de los valores de estos nuevos tipos declarados por el programador ser aquel en que aparecen dentro de la lista de enumeracin de los elementos del tipo. El tipo enumerado es tambin un tipo escalar y ordinal, por lo que permite calcular su ordinal y valor. Expresin Valor Expresin Valor 0 TColor(0) Rojo int(rojo) 1 TColor(1) Azul int(azul) 2 TColor(2) Verde int(verde) Sin embargo, al no estar definidos sobre ellos las operaciones de suma y resta, cmo obtener su sucesor o predecesor? La solucin consiste en la definicin de una funcin que calcule su ordinal, incremente este, y posteriormente lo retorne a enumerado. Veamos un ejemplo: TColor SUC (TColor c) { int ord; TColor res; ord = int(c) + 1; res = TColor(ord); return res; } } TColor PRED (TColor c) { int ord; TColor res; ord = int(c) - 1; res = TColor(ord); return res;

Esta solucin, tiene el problema de que es responsabilidad del usuario el no utilizarlas sobre el primer o ltimo elemento, pero tiene la ventaja de que permite tambin, que el implementador realice un modelo circular de sucesin como el siguiente: const int MAX_COLOR = 3; TColor SUC (TColor c) { int ord; TColor res; ord = (int(c) + 1)% MAX_COLOR; res = TColor(ord); return res; } } TColor PRED (TColor c) { int ord; TColor res; ord = (MAX_COLOR + int(c) - 1) % MAX_COLOR ; res = TColor(ord); return res;

Otro problema del uso de enumerados reside en que no pueden ser ledos y escritos directamente por pantalla/teclado, sin embargo, no es difcil realizar funciones de conversin entre enumerados y cadenas o viceversa. (Ver apuntes). Jos Luis Pastrana Brincones @ 2002 1

Elementos de Programacin 1A E.T.S.I. Informtica Gestin

Registros
Un registro es una estructura cuyos componentes pueden ser de diferente tipo. Para declarar un tipo registro se debe incluir el nombre y el tipo de cada componente del mismo. En C++ se usa la palabra reservada struct para indicar que el tipo que se est definiendo es un registro o estructura. Los campos de un registro pueden ser de cualquier tipo, incluyendo arrays y registros y son llamados campos o variables miembro que pueden ser accedidas individualmente mediante notacin '.' Formalmente, podemos definir un registro de la siguiente manera: <TipoRegistro>::= struct <nombreTipo> '{' { <tipo> <nomVar> {, <tipo> <nomVar>}; } '}'; Algunos Ejemplos: const char FINCAD = char(0); const int MAXCAD = 20; typedef char TCadena[MAXCAD+1]; // MAXCAD caracteres + FINCAD struct Tfecha { int dia, mes, anho; }; struct TPersona { TCadena nombre, apellido1, apellido2; int edad; TCadena nif; Tfecha fecha_nacimiento; } Las declaraciones de variables se realizan normalmente, es decir: TPersona per; Tfecha f1; Los nombres de los campos de un registro son locales a l, por lo que no hay conflicto con otros nombres usados en el mdulo. Una referencia a un campo de un registro consiste en el nombre de la variable registro y el nombre del campo, separados por un punto, por ejemplo: per.edad = 30; Un registro completo puede aparecer en cualquier parte de una sentencia de asignacin y como parmetros de procedimientos, por ejemplo: per.fecha_nacimiento = f1;

Prctica
La empresa Los Planes Reformados S.A., ha decidido informatizar la gestin de sus trabajadores. Dicha empresa tiene un mximo de 10 trabajadores en plantilla, debindose almacenar la siguiente informacin de cada trabajador: nombre, apellidos (ambos son cadenas de un mximo de 80 caracteres), y turno (matinal, tarde, noche) que debe implementarse obligatoriamente con un tipo enumerado. La aplicacin deber mostrar en pantalla un men con las siguientes opciones: A. Insertar Trabajador. Se pedir el nmero de trabajador, que debe ser un nmero entre el 1 y el 10 y se comprobar que no hay ningn trabajador almacenado con ese nmero. Si el nmero de trabajador no fuera vlido (no est entre 1 y 10) o ya estuviera algn trabajador almacenado con ese nmero, se informar del pertinente error y se volver al programa principal. En cambio, si el nmero es vlido, se pedirn el resto de los datos (nombre, apellidos y turno) y se insertar dicho trabajador en la estructura. B. Buscar Trabajador. Se pedir por teclado el nmero de trabajador. Si el nmero de trabajador no fuera vlido (no est entre 1 y 10) o no hubiera algn trabajador almacenado con ese nmero, se informar del pertinente error y se volver al programa principal. En cambio, si el nmero es vlido, se mostrar por pantalla todos los datos (nombre, apellidos y turno) de dicho trabajador. C. Listar Trabajadores. Se mostrar por pantalla todos los datos (nombre, apellidos y turno) de los trabajadores que estn almacenados en la estructura precedidos de su nmero de trabajador. D. Borrar Trabajador. Se pedir por teclado el nmero de trabajador. Si el nmero de trabajador no fuera vlido (no est entre 1 y 10) o no hubiera algn trabajador almacenado con ese nmero, se informar del pertinente error y se volver al programa principal. En cambio, si el nmero es vlido, se mostrar por pantalla todos los datos (nombre, apellidos y turno) de dicho trabajador y se informar de que va a ser borrado, pasndose a eliminarlo de la estructura (sin pedir conformidad). X. Salir del Programa. Se pedir al usuario una confirmacin de abandono del programa, saliendo del mismo en caso de que sea afirmativa y mostrando el nombre, apellidos y curso del autor del programa o volviendo al men principal si no lo es. Jos Luis Pastrana Brincones @ 2002 2

Вам также может понравиться