25 de marzo de 2010

Tipos de datos

DATOS

Para que podamos hacernos a una idea de como se almacena la información en C, voy a dar una breve explicación de los tipos de datos que hay, como mostrarlos mediante la función printf, como definirlos y como declarar su valor.
No voy a hablar de todos los tipos de datos que hay ni voy a detallar cada tipo perfectamente, pero nos servirá para nuestro propósito.

El esquema que se sigue es:
  •  Tipo de dato - nombre en C
    • Forma de mostrarlo con printf
    • Declaración
    • Definición del valor en la declaración
      Definición tras la declaración
  • Entero sin signo - unsigned
    • %d
    • unsigned int num;
    • unsigned int num=4;
      num=4;
  • Entero con signo - int
    • %d
    • int num;
    • int num=4;
      num=4;
  • Número en coma flotante - float
    • %f
    • float num;
    • float num=3.15;
      num=3.15;
  • Caracter - char
    • %c // %d
    • char let;
    • char let='s'; // char let=45;
      let='s'; // let=45;
*Notar que un char realmente es un número entero que almacena el valor ASCII del caracter almacenado. Por tanto, ocupa poco espacio en la memoria y es a veces utilizado para almacenar números pequeños, como es el caso de un contador.

OTROS "TIPOS"

A continuación voy a explicar otras formas de decidir datos, aunque no son propiamente tipos de datos (ni mucho menos).

ARRAYS

¿Habéis pensado como almacenar una palabra de más de un caracter? Sencillo: una cadena de caracteres. Una cadena de caracteres es un un conjunto de variables de tipo char que se almacenan en "celdas" contiguas de la memoria. De este modo C lee todo el conjunto de caracteres y lo muestra por pantalla.
Una cadena de caracteres se denomina en C array de caracteres.
Se define mediante char nombre[10]; donde char indica que el array es de caracteres, nombre seria el nombre del array (realmente es un puntero al array, pero lo veremos más adelante) y [10] indica el numero de caracteres que tendrá la cadena; es decir, el número de char que se crean.

Para que lo entendais mejor:
  1. //declaro un array de caracteres de 10 caracteres
  2. char minombre[10];
  3. //le asigno mi nombre al array entero
  4. minombre="sylvia";
  5. muestro el nombre por pantalla
  6. printf("me llamo %s\n", minombre);  
En la linea 2 declaro el array de 10 caracteres.
En la linea 4 le asigno sylvia al array. Como son más de un caracter, se usan dobles comillas " en lugar de la ' que se usaba para asignar un caracter a un char. A efectos del programa, esto se almacenara asi:
0 - s
1 - y
2 - l
3 - v
4 - i
5 - a
6 - \0
Los numeros representan el número de celda que se ocupa. En la 0 (la primera), la s; en la 1, la y... El \0 indica que se termina el array, es decir, es el último "caracter" de una cadena.
En la linea 6 mostramos por pantalla el contenido del array: sylvia. Para ello usamos %s ya que lo que queremos mostrar no es un solo caracter si no todos los del array. La s sale de string, cadena en inglés.

Si solo quisieramos mostrar un caracter de mi nombre, por ejemplo, el tercero (l) usariamos: printf("la tercera letra es %c\n", minombre[2]);. En este caso usamos de nuevo %c porque solo queremos mostrar un caracter. minombre[2] hace referencia al caracter almacenado en la celda 2 del array, es decir, la l. Hay que tener especial cuidado con esto, ya que tendemos a empezar a contar desde el 1 y en C todo empieza por 0...
También es posible crear arrays de números, es decir, de int por ejemplo, pero lo dejamos para más adelante ya que tiene alguna complicación añadida.

MATRICES Y ESTRUCTURAS
Únicamente para que os suenen os nombro las matrices y estructuras.
La matrices son, por asi decirlo un conjunto de arrays. Es, generalmente un array bidimensional (tambien puede ser tridimensional) que contiene varios arrays. Para entenderlo mejor, es como una tabla creada en la memoria con sus filas y columnas. En cada celda de dicha tabla se almacena una variable (número o caracter, principalmente) y se puede acceder a ellas a traves de dos cordenadas (la fila y la columna). 
Las estructuras son agrupaciones de varios tipos de datos de los anteriores. Un ejemplo rápido, si queremos almacenar un listado de contactos telefónicos necesitaremos un array de caracteres para el nombre y una variable de tipo entero para el nº de telefono. Para que exista una relación entre el nombre y el telefono se usan estructuras. Esta estructura definiria un "tipo de archivo" que podriamos llamar contacto y que cada uno deberia contener un nombre y un telefono, es decir, dos tipos de datos distintos. También pueden relacionar varios tipos de datos iguales.