Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Tipos de datos, Apuntes de Diseño y Arquitectura de Sistemas Informáticos

Asignatura: Arquitectura de sistemas, Profesor: , Carrera: Ciències i Tecnologies de Telecomunicació, Universidad: UPC

Tipo: Apuntes

2014/2015

Subido el 23/10/2015

poliveir
poliveir 🇪🇸

4.2

(5)

23 documentos

1 / 12

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Arquitectura de sistemas
Abelardo Pardo
University of Sydney
School of Electrical and Information Engi neering
NSW, 2006, Aus tralia
Autor princi pal del curso de 2009 a 2012
Iria Estévez Ayres
Damaris Fuentes Lorenzo
Pablo Basanta Val
Pedro J. Muñoz Merino
Hugo A. Parada
Derick Leony
Universidad Carlos III de Madrid
Departament o de Ingeniería Tele mática
Avenida Universidad 30, E28911 Leganés (Madrid), España
© Universidad Carlos III de Madrid | Licencia Creative Commons
pf3
pf4
pf5
pf8
pf9
pfa

Vista previa parcial del texto

¡Descarga Tipos de datos y más Apuntes en PDF de Diseño y Arquitectura de Sistemas Informáticos solo en Docsity!

Arquitectura de sistemas

Abelardo Pardo

University of Sydney School of Electrical and Information Engineering NSW, 2006, Australia Autor principal del curso de 2009 a 2012

Iria Estévez Ayres

Damaris Fuentes Lorenzo

Pablo Basanta Val

Pedro J. Muñoz Merino

Hugo A. Parada

Derick Leony

Universidad Carlos III de Madrid Departamento de Ingeniería Telemática Avenida Universidad 30, E28911 Leganés (Madrid), España © Universidad Carlos III de Madrid | Licencia Creative Commons

Capítulo 2. Tipos de datos en C Parte I. Programación en C Capítulo 2. Tipos de datos en C Tabla de contenidos 2.1. Tipos de datos básicos 2.1.1. Enteros 2.1.2. Letras y cadenas 2.1.3. Números reales 2.1.4. Tablas 2.1.5. Tamaño de los tipos de datos básicos 2.2. Tipos de datos estructurados 2.3. Uniones 2.4. Enumeraciones 2.5. Bibliografía de apoyo 2.6. Ejercicios Las estructuras de datos del lenguaje C son más simples que las que ofrece Java porque no existe el concepto de “clase” ni de “objeto”. C ofrece tipos de datos básicos y dos construcciones para crear datos más complejos. El control de acceso a datos que ofrece Java (métodos y campos privados, públicos y protegidos) no existe en C. Las variable son globales, locales a un fichero, o locales a un bloque de código. 2.1. Tipos de datos básicos C ofrece tres tipos de datos básicos:

Números enteros definidos con la palabra clave int

Letras o caracteres definidos con la palabra clave char

Números reales o en coma flotante definidos con las palabras claves float o double

2.1.1. Enteros

Se definen con “int” y admiten de forma opcional dos prefijos modificadores:

“short” y “long”: Modifica el tamaño en bits del entero. Existen por tanto tres tipos de

enteros: “int”, “short int” (que se puede abreviar como “short”), y “long int” (que se

puede abreviar como “long”).

El lenguaje C no define tamaños fijos para sus tipos de datos básicos. Lo único que garantiza es

que un short int tiene un tamaño menor o igual que un int y este a su vez un tamaño

menor o igual a un long int. Esta característica del lenguaje ha complicado la creación de

programas que sean compatibles entre varias plataformas.

“unsigned”: define un número natural (mayor o igual a cero).

Sugerencia

En tu entorno de desarrollo crea un fichero de texto con la siguiente estructura (puedes simplemente copiar y pegar el texto del siguiente cuadro): int main()

2.1.2. Letras y cadenas

Las variables de tipo letra se declaran como “char”. Para referirse a una letra se rodea de comillas

simples: 'M'. Como las letras se representan internamente como números, el lenguaje C permite

realizar operaciones aritméticas como 'M' + 25.

Las cadenas de texto o strings son simplemente tablas de “char”. Las funciones de biblioteca para

manipular estas cadenas asumen que el último byte tiene valor cero. Las cadenas de texto se escriben en el programa rodeadas de dobles comillas y contienen el valor cero al final. A continuación se muestran dos definiciones: #define SIZE 6 char a = 'A'; char b[SIZE] = "hello"; ¿Por qué la segunda definición es una tabla de seis elementos si la palabra tiene sólo cinco letras?

Sugerencia

Reutiliza el programa de la sección anterior y añade definiciones de letras y cadenas. Para estas últimas prueba a poner diferentes tamaños de tabla (demasiado pequeños y demasiado grandes para la cadena). Escribe también expresiones aritméticas sobre las letras. Recuerda que si el compilador no emite mensaje alguno, el programa es correcto. Preguntas de autoevaluación

  1. Considera la siguiente declaración: #define SIZE 6 char m[SIZE] = 'strag'; Es incorrecta porque la cadena debe ir rodeada de dobles comillas. Verdadero Falso Es incorrecta porque el tamaño debe ser 5 (tiene cinco letras). Verdadero Falso Si te parece que las respuestas correctas están equivocadas, escribe esa declaración en un programa y compílalo.

2. Un programa C que imprime el resultado de la expresión 'M' + 25 es correcto e imprime una

“f”. Verdadero Falso

Te recomendamos que escribas ese programa. Para imprimir pon printf("%c\n", 'M' +

2.1.3. Números reales

Los números reales se definen con “float” o “double”. La diferencia entre ambas es la precisión

que ofrece su representación interna. Hay un número infinito de reales, pero se representan con un número finito de bits. A mayor número de bits, mayor número de reales se representan, y por tanto,

mayor precisión. Los reales definidos con “double” tienen un tamaño doble a los definidos con

“float”. Al igual que en el caso de los enteros, el tamaño de estas representaciones varía de una

plataforma a otra.

Algunas plataformas ofrecen números reales con tamaño mayor al “double” que se definen como

“long double”. Los tamaños típicos para los tipos “float”, “double” y “long double” son 4, 8 y

12 bytes respectivamente. A continuación se muestran varias definiciones de números reales. float a = 3.5; double b = -5.4e-12; long double c = 3.54e320;

Sugerencia

Añade al programa de los apartados anteriores definiciones de números reales. Prueba a definir números muy grandes o pequeños para ver la capacidad de representación de los tres tipos. Compila para ver si las definiciones son correctas.

2.1.4. Tablas

Las tablas en C son prácticamente idénticas a las de Java, con el tamaño entre corchetes a continuación del nombre. Al igual que en Java, los índices de la tabla comienzan por cero. A continuación se muestran algunos ejemplos: #define SIZE_TABLE 100 #define SIZE_SHORT 5 #define SIZE_LONG 3 #define SIZE_NAME 10 int table[SIZE_TABLE]; short st[SIZE_SHORT] = { 1, 2, 3, 4, 5 }; long lt[SIZE_LONG] = { 20, 30, 40}; char name[SIZE_NAME]; Los elementos de la tabla se acceden con el nombre de la tabla seguido del índice entre corchetes. Una de las diferencias entre C y Java es que el acceso a una tabla en C no se verifica. Cuando se ejecuta un programa en Java si se accede a una tabla con un índice incorrecto, se genera una

excepción de tipo “ArrayIndexOutOfBounds”. Estas comprobaciones no se hacen nunca en C (a no

ser que se escriban explícitamente en el programa). Si se accede a una tabla con un índice incorrecto se manipulan datos en una zona de memoria incorrecta y el programa continua su ejecución. Tras este acceso incorrecto pueden suceder dos cosas. La primera es que la memoria a la que ha accedido por error esté fuera de los límites del programa. En este caso la ejecución termina de manera abrupta y en el intérprete de comandos se muestra el mensaje “ segmentation fault ”. La otra posibilidad es que se acceda a otro lugar dentro de los datos del programa. Esta situación seguramente producirá un error cuyos síntomas sean difíciles de relacionar con el acceso incorrecto. Tablas de múltiples dimensiones

La construcción anterior sólo define un nuevo tipo de datos, no se declara variable alguna. Es decir,

la construcción anterior tiene la misma entidad que el tipo “int” o “float”. El nombre del nuevo tipo

estructurado definido es “struct nombre_de_la_estructura”. Por ejemplo:

#define FIRST_SIZE 100 #define LAST_SIZE 200 #define CONTACTS_NUM 100 /* Definición de la estructura / struct contact_information { char firstname[FIRST_SIZE]; char lastname[LAST_SIZE]; unsigned int homephone; unsigned int mobilephone; }; / Declaración de variables con esta estructura */ struct contact_information person1, person2, contacts[CONTACTS_NUM]; Las líneas 6 a 12 definen un nuevo tipo de datos estructurado que contiene cuatro campos, los dos primeros son tablas de letras y los dos últimos son enteros. A pesar de que estos campos tienen nombres y tamaños, hasta el momento no se ha declarado ninguna variable. Es en la línea 15 en la que se sí se declaran tres variables de este nuevo tipo estructurado. La última de ellas es una tabla de 100 de estas estructuras. Asegúrate de que tienes clara la diferencia entre la “definición” de un tipo de datos y la “declaración” de variables de ese tipo. La siguiente figura muestra estos conceptos para una estructura y un tipo básico.

Sugerencia

Copia y pega en un fichero de texto en tu entorno de trabajo el código del ejemplo anterior. Compila para comprobar que es correcto. Realiza cambios en la estructura: número de campos, tipos de datos, declaración de nuevas variables, etc. Comprueba que todos ellos mantienen el texto correcto utilizando el compilador. La definición de una estructura y la declaración de variables se pueden combinar en la misma construcción, pero preferimos que lo hagas por separado, por legibilidad: struct contact_information { char firstname[FIRST_SIZE]; char lastname[LAST_SIZE]; unsigned int homephone; unsigned int mobilephone; } person1, person2 contacts[CONTACTS_NUM]; El acceso a los campos de una variable estructurada se denota por el nombre de la variable seguido

de un punto y del nombre del campo tal y como se muestra en el siguiente ejemplo.. #define FIRST_SIZE 100 #define LAST_SIZE 200 #define CONTACTS_NUM 100 struct contact_information { char firstname[FIRST_SIZE]; char lastname[LAST_SIZE]; unsigned int homephone; unsigned int mobilephone; }; int main(int argc, char *argv[]) { struct contact_information person1; person1.firstname[0] = 'A'; person1.firstname[1] = 0; person1.lastname[0] = 'B'; person1.lastname[1] = 0; person1.homephone = 975556768; person1.mobilephone = 666555444; } Los tipos estructurados pueden anidarse. El único requisito es que la definición de un tipo preceda a su uso. Por ejemplo: 1 2 3 4 5 6 7 8 9 10 11 12 13 #define SIZE 100 struct point_data { int coord_x; int coord_y; }; struct polygon { char description[SIZE]; struct point_data points[SIZE; }; struct polygon p; ¿Cuántas variables se han declarado en el código anterior? ¿Cuántos tipos de datos se han definido? Imagínate que eres el compilador y que debes reservar memoria para almacenar los datos que se acaban de declarar. ¿Cuáles de estas líneas se traducirían en reserva de memoria? ¿De qué tamaño? 2.3. Uniones En una estructura, cada campo tiene espacio en memoria para almacenar su valor. Pero hay situaciones especiales en la que las estructuras de datos pueden desperdiciar memoria. Supongamos que una aplicación puede identificar a los usuarios mediante uno de los siguientes posibles cinco datos: NIF: ocho dígitos seguidos de una letra.

A partir de esta definición existe un nuevo tipo de datos enum type_of_connection que puede

ser utilizado como cualquier otro: enum type_of_connection connection_type; connection_type = GPRS; connection_type = Bluetooth; 2.5. Bibliografía de apoyo Tipos numéricos (teoría y ejemplos) : “The GNU tutorial”, páginas 19-22. Arrays (teoría y ejemplos) : “The GNU tutorial”, páginas 91-100. Strings, funciones para su manejo (teoría y ejemplos) : “Practical C Programming”: En línea: sección 5.2. Libro: páginas 37-39. “The GNU tutorial”, páginas 105-111. Structs y Unions (teoría y ejemplos) : “Programación en C: Metodología, algoritmos y estructura de datos”, páginas 380-401. “The GNU tutorial”, páginas 205-114. Problemas resueltos : “Problemas resueltos de Programación en lenguaje C”, problemas 2.10, 2.12, 2.13, 2.15. 2.6. Ejercicios Para resolver los siguientes ejercicios te recomendamos que crees un fichero de texto en tu entorno de trabajo y que escribas en él las soluciones. Compila y (si procede) ejecuta el programa para verificar que realiza las operaciones esperadas. Puedes utilizar el siguiente esqueleto: #include <stdio.h> int main() { /* Escribe aquí tu código */ return 0; }

  1. Escribe la definición de una estructura que almacene una tabla de 10 enteros, una cadena de 20 letras, un número real de precisión simple y uno de precisión doble. A continuación, en una línea separada, declara dos variables de este tipo. Compila el programa para verificar que la sintaxis es la correcta.
  2. Un programador ha escrito las siguientes definiciones: #define SIZE 100 struct map_annotation { char note[SIZE];

char note[SIZE]; struct coordinates point; }; struct coordinates { float longitude; float latitude; }; struct map_annotation annotations[SIZE]; ¿Qué problema tienen? (siempre puedes cortar y pegarlas en tu programa y utilizar el compilador para comprobar)

3. Incluye en tu programa la variable cadena para almacenar una cadena de texto de 10 letras

definida como char cadena[SIZE];, donde SIZE es 11. Se quiere procesar esa cadena de

forma que cada letra pase a valer una letra que está cuatro posiciones mas avanzadas en el abecedario. Escribe el código para ejecutar esta operación (no te preocupes por las letras “w”, “x”, “y” y “z”. Al final del programa incluye la siguiente línea para imprimir la cadena por pantalla: printf("%s\n", cadena);

4. Descarga el programa enum.c en tu entorno de desarrollo Linux. Abre una ventana con un

intérprete de comandos, compílalo con el comando gcc -Wall -o enum enum.c y ejecútalo con el comando ./enum. #include <stdio.h> int main(int argc, char argv[]) { enum status { ON = 0, OFF = 1 }; enum status a, b; a = 0; a++; a = 20; b = a++; / Imprime a y luego b en la misma linea / / Print a and then b in the same line */ printf("%d %d\n", a, b); return 0; } ¿Qué valores imprime por pantalla? A la vista del resultado, ¿qué conclusión se deriva del funcionamiento de los tipos de datos enumerados en C?

  1. Define una estructura de datos para almacenar el resultado de un sorteo de la Lotería Primitiva. Es decir, un grupo de seis números, un número complementario y un número de reintegro, todos ellos diferentes y entre los valores del 1 al 49. Calcula el tamaño que ocupa tu estructura de datos con los tamaños mostrados en la sección 2.1.5 (ver las Normas del juego).
  2. Declara una tabla de 100 enteros y rellena su contenido con un valor cualquiera. Declara una segunda tabla también de 100 enteros. Escribe el código que almacena en cada elemento de la