Lenguaje de programación C (VII). Estructuras de datos (I)
1991/09/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria
Según lo analizado en el capítulo 2, los datos básicos de C son caracteres, números enteros y números reales. Además, en la redacción de los programas C se pueden utilizar los siguientes tipos de datos: tablas, demostrativos, estructuras, texturas y enumerados. Por otro lado, mientras que en lenguajes como el PASCAL de alto nivel se pueden definir nuevos tipos de datos, C no lo admite, aunque la expresión typedef permite definir sinónimos de tipos de datos. Por tanto, en este capítulo y en el siguiente expondremos la definición y utilización de los tipos de datos y sinónimos mencionados.
Tablas y demostradores
La tabla es la estructura de datos más utilizada en cualquier lenguaje. Las palabras vector, matriz, array, cadena y string se utilizan como sinónimo de tabla, aunque en ocasiones no son subtipos de tabla.
La tabla está formada por un conjunto de variables del mismo tipo que se guardan y se conocen con el mismo nombre. La tabla puede tener una o varias dimensiones, denominadas en el primer caso vectores. Las bidimensionales se denominan matrices y mientras se utiliza un índice para identificar los componentes dentro del vector, en las matrices se utilizarán dos índices.
Cuando los componentes de la tabla son caracteres, la tabla se llama cadena de caracteres, cadena o string, con características diferentes.
Definición y utilización de tablas
El tipo de datos de los componentes para la definición de las tablas, el nombre de la tabla y el número de componentes deben especificarse en el rango. En el uso sólo se menciona el nombre de la tabla para referirse al cuadro completo. Para expresar un componente, por el contrario, hay que mencionar el nombre y el índice entre los mapas. El índice indica la posición dentro de la tabla del componente, pero mientras que en la mayoría de los lenguajes el rango de valor del índice es desde uno hasta el número de componentes (N), en C se utiliza desde cero (N-1). Hay que tener en cuenta que el índice que se determina en el rango puede ser cualquier expresión completa; constante, variable o combinación aritmética entre ellas.
En el programa 1 se puede ver un ejemplo en el que tras leer las ventas de 12 meses en una tabla se calcula e imprime la venta anual y los porcentajes mensuales. Para leer la tabla se utilizará una función que definiremos en el programa 3.
![](images/A51030.jpg)
En la definición se puede llevar a cabo la inicialización de las tablas, separando los valores de los componentes por comas y definiendo al principio y al final de las mismas. Por ejemplo, la definición de la tabla que indica el número de días que tiene cada mes sería:
int hil-egun [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 31, 31, 30, 30, 31, 31, 31};
Si no hay nada se inicializan las tablas con ceros.
Demostrativos
Como se ha dicho, cuando se utiliza el nombre de una tabla sin índice se hace referencia a la tabla completa, pero esto no significa el valor de todos los componentes, sino la referencia del lugar donde se sitúa la tabla en la memoria. Este concepto es el mismo que el del expositor y por eso se dice que cuando se utiliza el nombre de la tabla especificamos su índice. Por este mismo motivo, la asignación o asignación entre las dos tablas también se realiza como componente. No se puede realizar con una simple asignación.
No obstante, aunque existe una gran tendencia a utilizar tablas, los demostradores se pueden utilizar con todo tipo de datos. Los demostrativos son variables, por lo que deben definirse y ubicarse en memoria, ocupando parte de la memoria. Los demostrativos pascales, aunque deben definirse, no incluyen partes de memoria, ya que son dinámicos, pero como C son estáticos, para la definición se utiliza el carácter especial *.
El demostrador (pointer en inglés) indica la dirección de la memoria de un dato y siempre se coloca en cuatro bytes. En la definición se debe especificar el tipo de datos que muestra, * y el nombre de la variable de índice.
![](images/A51030-a.jpg)
Para su uso se utilizan * y agentes. * Mientras que * tiene la misma función que el operador de Pascal (valor de la variable mostrada por el demostrador), se especifica frente a variables no expositoras para referirse a su referencia (o dirección) y no al valor (o contenido).
En el programa 2 se define una función de intercambio de valores entre ambas variables. Ambos parámetros son datos y resultados simultáneamente. Por tanto, no se puede canjear por valor sino por referencia (como en cualquier otro lenguaje).
Hay que tener especial cuidado cuando los expositores participan en operaciones aritméticas, ya que la unidad a la que se añade o elimina es la longitud de la variable mostrada en lugar de ser una.
Por ello en la siguiente parte del programa
![](images/A51030-b.jpg)
La variable p1 (longitud de un carácter) se suma a p2 dos y p3 cuatro (longitud de las variables long). Por otro lado, se admiten sumas y restas entre expositores cuando los tipos de datos mostrados son los mismos.
Tablas parámetros de funciones
En el primer programa no hemos definido la función 'tabla de lectura'. Como su primer parámetro es la tabla, existen dos opciones para la determinación del parámetro: como array o como índice, tal y como se puede observar en los programas 3 y 4 (ambos equivalentes).
![](images/A51030-c.jpg)
![](images/A51030-d.jpg)
Hay que tener en cuenta las siguientes diferencias:
- En la primera solución se pueden utilizar índices, por lo que la variable de trabajo (i) es completa. En el segundo, sin embargo, se realizará sin índices y la variable de trabajo (paux) será demostrativa.
- Como la función estándar scanf requiere el dato de referencia, se utiliza en la primera solución (la tabla es del tipo [i] long), pero en la segunda no (el puntero paux y por tanto la referencia es).
- Cuando en la segunda solución se hace paux ++ se añade a paux cuatro (longitud correspondiente a long) y al evaluar la expresión p + os-as se añade al índice cuatro veces el número de OS.
- En el programa principal se puede sustituir la tabla de lectura (salmen, 12) por la de lectura ( salmen [0], 12).
Cadenas de caracteres
Una cadena de caracteres o string, es una tabla con el carácter especial ‘\Ø’ formado por caracteres al final. Las diferencias con el resto de tablas son:
- Se puede iniciar con una constante tipo String. Ej. char título [Ø2] = “VENTAS ANUALES”;
- No es necesario conocer la longitud (en funciones y macros), ya que para detectar el final basta con buscar el carácter ‘\Ø’.
- En las funciones de Scanf y Printf hay un formato especial para las cadenas y no para el resto de tablas.
- En la biblioteca estándar hay un conjunto de funciones para el manejo string (strlen, strcpy, strcmp, ...)
En los programas 5 y 6 se explica la función de calcular el número de veces que un carácter aparece en una cadena.
![](images/A51030-e.jpg)
![](images/A51030-f.jpg)
Otros
- En las tablas multidimensionales, tanto la definición como el uso exigen un número en el rango para cada dimensión.
Por ejemplo
,int matriz [1Ø] [10]; /* 1Ø ilad1Ø columna*/
- Se pueden definir tablas de demostradores. Por ejemplo, mediante la definición char * hil-izen [12]. La tabla de nombres de mes contiene 12 expositores, cada uno de los cuales hace referencia a un string.
- El referenciado por un puntero puede ser otro.
Ejemplo: int r, *p, **q; r = 1Ø p = r; /* *p = 1Ø */ q = p /* **q = 1Ø */
![](https://elia.eus/static/elhuyar/img/elia_RGB.png)
Gai honi buruzko eduki gehiago
Elhuyarrek garatutako teknologia