TEMA 9
Mediante la definición de tipos de datos por el
programador se consigue que cada información
que maneja el computador tenga su sentido
específico.
El tipo establece los posibles valores que puede
Definición de Tipos
El tipo establece los posibles valores que puede
tomar ese dato. Además, al igual que sucedía con
los tipos predefinidos, a cada nuevo tipo que se
define se asocian un conjunto de operaciones que
se pueden realizar con él. Por tanto, la definición
de tipos supone crear un nuevo nivel de
Aunque los tipos simples predefinidos vistos son útiles para cualquier propósito (que no requiera tipos estructurados), es conveniente que el programador
pueda definir sus propios tipos simples por dos razones principalmente:
1) Interpretación de cada valor. Si una variable representa un número de naranjas y otra un número de personas, y representamos ambas variables con tipo “int”
podríamos sumar naranjas y personas, lo cual no tiene mucho sentido. Sería mejor poder definir un tipo NARANJAS y otro PERSONAS.
2) Dejar claro el rango de los posibles valores. Si sabemos a priori que para resolver
Definición de Tipos
2) Dejar claro el rango de los posibles valores. Si sabemos a priori que para resolver cierto problema el valor de una variable nunca va a salirse de cierto rango, es
conveniente declarar la variable con un nuevo tipo que se corresponda a dicho rango para que, en el caso de que por error tome un valor fuera de este rango, el
compilador nos avise de ello.
La especificación de nuevos tipos se realiza usando una declaración de tipo. Por ejemplo:
typedef int TipoEdad; typedef char TipoSexo;
Tipos enumerados. Definición
Consiste en una enumeración de todos los posibles valores que
puede tomar una variable de dicho tipo encerrados entre llaves. Una variable de tipo enumerado sólo podrá tomar, en un determinado momento, uno de esos valores.
Para crear un nuevo tipo de dato se enumeran todos los posibles
valores que puede tomar separados por comas (,) y encerrados entre llaves .
llaves .
Cada posible valor se describe mediante un identificador (que al mismo tiempo quedan declarados como valores constantes).
typedef enum TpoEnum {id1, id2, ..., idN};
La enumeración implica un orden que se establece entre los valores enumerados. Este orden se define de forma implícita e impone que el primer elemento de la lista ocupa la posición 0, el siguiente la 1, y así sucesivamente hasta el último, que ocupa la posición N-1, siendo N el número de elementos enumerados.
Los tipos enumerados se emplean de manera similar a los tipos predefinidos. El identificador de tipo se puede emplear para definir variables de ese tipo, y los
identificadores de los valores enumerados se emplean como las constantes con nombre.
Uso de tipos enumerados
Función Uso
Un dato de tipo enumerado se puede pasar como
argumento de procedimientos o funciones y puede ser el resultado de una función.
Función Uso
int( X ) Posición que ocupa X en la lista de su enumeración TipoEnumerado( N) Valor en la posición N del tipo TipoEnumerado
No existen operaciones aritméticas definidas para los tipos enumerados. Por lo tanto, es INVÁLIDO:
typedef enum Color {Rojo, Azul, Verde}; Color Color1 = Rojo;
Color1 = Color1 + 1;
Sí se pueden utilizar, en cambio, el procedimiento general
Uso de tipos enumerados
Sí se pueden utilizar, en cambio, el procedimiento general
int() o TipoEnumerado() para pasar de un valor a otro en
la enumeración.
Color1 = Color(int(Color1) +1);
Hay que tener en cuenta que se pueden producir errores al emplear los procedimientos al sumar o restar tipos enumerados si se excede el rango del
El tipo predefinido bool
El tipo predefinido bool es el identificador del tipo, y las constantes simbólicas TRUE y FALSE corresponden a los valores de verdad cierto y falso, respectivamente.
typedef enum bool {false, true};
Por lo tanto se pueden declarar variables de tipo bool, y Por lo tanto se pueden declarar variables de tipo bool, y estas a su vez se pueden usar tanto en funciones y
procedimientos, pasándolas como argumento o devolviéndolas como resultado.
Existen diferentes funciones predefinidas que devuelven un valor de tipo booleano. A estas funciones se les llama predicados.
Expresiones lógicas:
El tipo predefinido bool
Operador Operación lógica
&& Conjunción || Disyunción
! Negación
Resultado de las expresiones lógicas:
A B A && B A || B !A
TRUE TRUE TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE
Los tipos de datos vistos hasta el momento se
denominan escalares, y son datos simples, en el
sentido de que no se pueden descomponer.
Un tipo estructurado de datos, o estructura de datos,
es un tipo cuyos valores se construyen agrupando
Tipos estructurados
es un tipo cuyos valores se construyen agrupando
datos de otros tipos más sencillos. A sus elementos
se les denominan componentes.
Todos los tipos estructurados se definen a partir de
tipos simples combinados.
Sirven para permitir la generalización de la
declaración, referencia y manipulación de
datos del mismo tipo.
Un vector está constituido por una serie de
valores, todos ellos del mismo tipo, a los
Tipo formación y su necesidad
valores, todos ellos del mismo tipo, a los
que se les da un nombre común que
identifica a toda la estructura globalmente.
Cada valor concreto dentro de la
estructura se distingue por su índice o
número de orden que ocupa en la serie.
Una estructura de tipo vector se declara de la siguiente forma:
typedef TpoEle TpoVec [Nelem]; En donde:
TpoVec: Es el nombre del nuevo tipo de vector que se declara.
Declaración e inicialización de vectores
Nelem: Es el número de elementos que constituye el vector. TpoEle: Puede ser cualquier tipo y corresponde al tipo de dato que constituye cada uno de los elementos del vector.
La inicialización de un vector afecta a todos sus elementos, por tanto la notación será tal que así:
Al manejar datos estructurados de tipo vector se puede operar con cada elemento por separado.
Referencia a un elemento:
vector [ índice ];
Un elemento de un vector puede formar parte de cualquier
Operaciones con elementos de vectores
Un elemento de un vector puede formar parte de cualquier expresión con constantes, variables u otros elementos.
Como indice para designar un elemento de un vector se puede utilizar una variable o expresión, siempre que sean de tipo entero.
Al usar los vectores en el paso de argumentos en
procedimientos o funciones, se pasan por defecto por referencia.
void LeerVector (TipoVector v) {…} …
LeerVector (vectorUno);
Paso de argumentos de tipo vector
Al llamar al procedimiento la variable que se pase se hará por referencia, cambiando totalmente si esta se modificara dentro de él.
Si no queremos que se modifiquen los valores del vector, deberemos definir la función o procedimiento tal que así:
Cualquier vector cuya declaración sea de la forma
siguiente se considera una cadena o String con
independencia de su longitud particular (N):
typedef char Nombre [N];
Características:
Vector de caracteres: Cadena (String)
Características:
El primer elemento de una cadena siempre es el de índice igual a cero.
En un vector de esta clase se pueden almacenar textos de diferentes longitudes (si caben). Para distinguir la longitud útil en cada momento se reserva siempre espacio para un carácter más, y se hace que toda ristra termine con un
Vector de caracteres: Cadena (String)
Para inicializar la cadena se haría de la siguiente forma:
TipoCadena idioma = “ingles”;
Se pueden poner menos caracteres de los que tiene por defecto la cadena, pero nunca más.
Como la utilización de cadenas es muy habitual se dispone de la librería string (<string.h>) que posee varias funciones como las siguientes:
siguientes:
Función Uso
strcpy (c1, c2) Copia c2 en c1
strcat (c1, c2) Concatena c2 a continuación de c1 strlen (c1) Devuelve la longitud de c1
strcmp (c1, c2) Devuelve un resultado cero si c1 y c2 son iguales; menor que cero si c1 precede a c2 en orden alfabético, y mayor que cero si c2
En el procedimiento de escritura printf podemos
usar constantes o valores de cadena empleando
el formato de escritura %s para string o cadena.
printf(“Datos: %s - %s\n”, “Jose”, apellido);
Tambien podemos usar las cadenas con el
Vector de caracteres: Cadena (String)
Tambien podemos usar las cadenas con el
procedimiento de lectura scanf utilizando
tambien el formato de lectura %s para string o
cadena.
printf(“Nombre y Apellido? “);
Es un dato estructurado que contiene
varios elementos de información, que son
sus componentes, cada uno de los cuales
pueden ser de un tipo diferente.
Los esquemas de tupla pueden usarse
El esquema tupla
Los esquemas de tupla pueden usarse
definiéndolos como estructuras de tipo
registro. Un registro es una estructura de
datos formada por una colección de
elementos de información llamados
Definición de registros:
La declaración se hace utilizando la palabra clave struct. typedef struct Tipo-registro {
Tipo-campo-1 nombre-campo-1; Tipo-campo-2 nombre-campo-2;
...
Tipo registro (struct)
Tipo-campo-N nombre-campo-N;
}; Ej.:
typedef struct TipoFecha { int dia;
TipoMes mes; int anno;
Uso de registros:
Inicialización:
TipoFecha hoy = { 12, Marzo, 2009 } ;
Al manejar datos estructurados de tipo registro se
Tipo registro (struct)
Al manejar datos estructurados de tipo registro se dispone de dos posibilidades: operar con el dato
completo, o bien operar con cada campo por separado.
Asignación:
registro1 = registro2
Referencia a un campo: