domingo, 4 de diciembre de 2011

Tipos en C+-

Pequeño esquema resumen con los tipos más importantes en el lenguajes de programación C + -:

Tipos definidos:

          Tipos predefinidos: int, char y float.

          La definición de tipos supone crear un nuevo nivel de abstracción dentro del programa.

          En C+- la declaración de cada nuevo tipo siempre se inicia con la palabra clave typedef. Ejemplo:

                    typedef int TipoEdad;

Tipo enumerado:

          Una manera sencilla de definir un nuevo tipo de dato es enumerar todos los posibles valores que pueden tomar. En C+- el nuevo tipo enumerado se define det´ras de la palabra clave enum mediante un identificador del tipo y a continuación se detalla la lista con los valores separados por comas (,) y encerrados entre llaves {…}. Cada posible valor también se describe mediante un idenfiticador. Estos identificadores al mismo tiempo quedan declarados como valores constantes. Ejemplo:

                    typedef enum TipoDia {

                              Lunes, Martes, Miercoles, Jueves,

                              Viernes, Sabado, Domingo

                    };

          Los tipos de datos enumerados forman parte de una clase de tipos de C+- denominados tipos ordinales, a la cual pertenecen también los tipos int y char, pero no el tipo float.

Uso de tipos enumerados:

          Los tipos enumerados se emplean de manera similar a los tipos predefinidos. El identificador de tipo se puede emplear para definir variables de este tipo, y los identificadores de los valores enumerados se emplean como las constantes con nombre. Al igual que para el resto de los tipos ordinales, con los tipos enumerados se puede utilizar la notación int(e) para obtener la posición de un valor en la lista de valores del tipo. La operación inversa, que permita conocer qué valor enumerado ocupa una determinada posición, se consigue mediante la notación inversa que hace uso del identificador del tipo enumerado y que se invoca de la siguiente forma: TipoEnumerado(N) que devuelve el valor que ocupa la posición N en la colección de valores del tipo TipoEnumerado.

El tipo predefinido bool:

          Bool responde a la siguiente definición, análoga a la de un tipo enumerado: typedef enum boll { false, true};. El nombre bool es el identificador del tipo y las constante simbólicas false y true corresponde a los valores de verdad falso y cierto, respectivamente. Es posible realizar operaciones entre ellas. En concreto, entre operandos booleanos (variables o no) es posible realizar las operaciones lógicas para formas expresiones lógicas cuyos operadores son: && para y, || para o y ! para no.

          Es frecuente definir funciones cuyo resultado es un valor booleano cuando se quiere realizar un test sobre los argumentos de la función. Este tipo de funciones se denominan predicados.

Tipos estructurados:

          Un tipo estructurado de datos, o estructura de datos, es un tipo cuyos valores se construyen agrupando datos de otros tipos más sencillas. Los elementos de información que integran un valor estructurado se denominan componentes. Todos los tipos estructurados se definen, en último término, a partir de tipos simples combinados.

Tipo formación:

          Las estructuras de datos de tipo formación son quizá las más básicas, o al menos las que se introdujeron primero en los lenguajes de programción imperativos. Estas estructuras se denominan genéricamente formaciones y permiten la generalización de la declaración, referencia y manipulación de colecciones de datos todos del mismo tipo.

Tipo vector:

          Un vector está constituido por una serie de 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.

Declaración de vectores:

          typedef TipoElemento TipoVector[NumeroElementos];

Para poder utilizar los tipos declarados es necesario declarar a su vez, posteriormente, las correspondientes variables, pues sino no podremos utilizarlas.

Es obligatorio que todas las variables se declaren precedidas del identificador de un tipo predefinido del lenguaje o bien definido previamente en el programa. Tanto en la sintaxis de C+- como en el Manual de Estilo está expresamente prohibido la declaración de variables de tipo anónimo.

Inicialización de un vector:

          En C+- cuando se declara una única variable de cualquier tipo simper es posible darle un valor inicial. En el caso de un vector la inicialización afecta a todos sus elementos y por tanto la notación es algo especial y en ella se indica el valor inicial de todos los elementos agrupándolos entre llaves {…} y separándolos por comas (,).

Operaciones con elementos de vectores:

          La mayoría de las operaciones interesantes con vectores hay que realizarlas operando con sus elementos uno por uno. La referencia a un elemento concreto de un vector se hace mediante el nombre del vector seguido, entre corchetes, del índice del elemento referenciado.

Como índice para designar un elemento de un vector se puede utilizar una variable o expresión, siempre que sea de tipo entero.

La comprobación de que el índice para acceder a un elemnto de vector está dentro del rango permitido es responsabilidad del programador. Muchos ataques informáticos aprovechan la falta de previsión de esta comprobación para alterar el funcionamiento normal de un programa suministrándole datos de mayor tamaño que el previsto y provocar lo que se denomina en inglés buffer overrum.

Operaciones globales con vectores: para realizar una operación global con vectores la operación se tiene que programar explícitamente mediante un bucle que realice la operación elemento a elemento.

Paso de argumentos de tipo vector: en C+- el modo por defecto de paso de argumentos de tipo formación, y más concretamente de tipo vector, es el paso por referencia. En C+- cuando se utilizan argumentos de tipo formación y no se quiere que se modifiquen los parámetros reales en la llamada al procedimiento, los argumentos formales deben ir precedidos de la palabra clave const.

Vectores de caracteres: Cadena (String)

          En C+- cualquier tipo vector cuya declaración sea de la forma: typedef char Nombre[N] se considera una cadena o string, con independencia de su longitud particular, esto es, del valor de N

Una cadena de caracters (en inglés string) es un vector en el que 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 cadena termine con un carácter nulo ‘\0’ situado al final. Por tanto, para declarar una cadena de un máximo de veinte caracteres se debe hacer de la siguiente forma: typedef char Cadena20[21]

Tipo tupla: otra forma de construir un dato estructurado consiste en agrupar elementos de información usando el esquema de tupla o agregado. En este esquema el dato estructurado está formado por una colección de componentes, cada uno de los cuales puede ser de un tipo diferente. Podemos definir tupla como colección de elementos componentes, de diferentes tipos, cada uno de los cuales se identifica por un nombre.

Tipo registro (struct):

          Los esquemas de tupla pueden usarse en programs en C+- definiéndolos como estructuras del tipo registro o struct. Un resgistro o struct es una estructura de datos formada por una colección de leemtnos de información llamados campos.

Definición de registros: la declaración de un tipo registro en C+- se hace utilizando la palabra clave struct de la siguiente forma:

                    Typedef struct TipoFecha {

                              int dia;

                              tipoMes mes;

                              int anno;

Variables de tipo registro y su inicialización: para declarar variables de tipo registro es necesario haber realizado previamente la definición del tipo del registro. También estas variables se pueden inicializar en la declaración de una manera semejante a las formaciones agrupando los valores iniciales entre llaves {…} y separándolos por una coma (,), pero teniendo en cuenta el tipo de dato de cada campo.

Uso de registros: 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. Las posibilidades de operar con el dato completo son bastante limitadas. La única operación admisible es la de asignación. La forma de hacer referencia a un campo es mediante la notación: registro.campo

No hay comentarios:

Publicar un comentario