






Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Arquitectura de sistemas, Profesor: , Carrera: Ciències i Tecnologies de Telecomunicació, Universidad: UPC
Tipo: Apuntes
1 / 12
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!







University of Sydney School of Electrical and Information Engineering NSW, 2006, Australia Autor principal del curso de 2009 a 2012
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:
El lenguaje C no define tamaños fijos para sus tipos de datos básicos. Lo único que garantiza es
programas que sean compatibles entre varias plataformas.
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()
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?
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
“f”. Verdadero Falso
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,
plataforma a otra.
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;
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.
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
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,
#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.
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.
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; }
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)
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);
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?