Linguaxe de programación C (VII). Estruturas de datos (I)
1991/09/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria
Segundo o analizado no capítulo 2, os datos básicos de C son caracteres, números enteiros e números reais. Ademais, na redacción dos programas C pódense utilizar os seguintes tipos de datos: táboas, demostrativos, estruturas, texturas e enumerados. Doutra banda, mentres que en linguaxes como o PASCAL de alto nivel pódense definir novos tipos de datos, C non o admite, aínda que a expresión typedef permite definir sinónimos de tipos de datos. Por tanto, neste capítulo e no seguinte exporemos a definición e utilización dos tipos de datos e sinónimos mencionados.
Táboas e demostradores
A táboa é a estrutura de datos máis utilizada en calquera linguaxe. As palabras vector, matriz, array, cadea e string utilízanse como sinónimo de táboa, aínda que en ocasións non son subtipos de táboa.
A táboa está formada por un conxunto de variables do mesmo tipo que se gardan e coñécense co mesmo nome. A táboa pode ter una ou varias dimensións, denominadas no primeiro caso vectores. As bidimensionales denomínanse matrices e mentres se utiliza un índice paira identificar os compoñentes dentro do vector, nas matrices utilizaranse dous índices.
Cando os compoñentes da táboa son caracteres, a táboa chámase cadea de caracteres, cadea ou string, con características diferentes.
Definición e utilización de táboas
O tipo de datos dos compoñentes paira a definición das táboas, o nome da táboa e o número de compoñentes deben especificarse no rango. No uso só se menciona o nome da táboa paira referirse ao cadro completo. Paira expresar un compoñente, pola contra, hai que mencionar o nome e o índice entre os mapas. O índice indica a posición dentro da táboa do compoñente, pero mentres que na maioría das linguaxes o rango de valor do índice é desde un até o número de compoñentes (N), en C utilízase desde cero (N-1). Hai que ter en conta que o índice que se determina no rango pode ser calquera expresión completa; constante, variable ou combinación aritmética entre elas.
No programa 1 pódese ver un exemplo no que tras ler as vendas de 12 meses nunha táboa calcúlase e imprime a venda anual e as porcentaxes mensuais. Paira ler a táboa utilizarase una función que definiremos no programa 3.
![](images/A51030.jpg)
Na definición pódese levar a cabo a inicialización das táboas, separando os valores dos compoñentes por comas e definindo ao principio e ao final das mesmas. Por exemplo, a definición da táboa que indica o número de días que ten 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};
Se non hai nada se inicializan as táboas con ceros.
Demostrativos
Como se dixo, cando se utiliza o nome dunha táboa sen índice faise referencia á táboa completa, pero isto non significa o valor de todos os compoñentes, senón a referencia do lugar onde se sitúa a táboa na memoria. Este concepto é o mesmo que o do expositor e por iso dise que cando se utiliza o nome da táboa especificamos o seu índice. Por leste mesmo motivo, a asignación ou asignación entre as dúas táboas tamén se realiza como compoñente. Non se pode realizar cunha simple asignación.
No entanto, aínda que existe una gran tendencia a utilizar táboas, os demostradores pódense utilizar con todo tipo de datos. Os demostrativos son variables, polo que deben definirse e situarse en memoria, ocupando parte da memoria. Os demostrativos pascales, aínda que deben definirse, non inclúen partes de memoria, xa que son dinámicos, pero como C son estáticos, paira a definición utilízase o carácter especial *.
O demostrador (pointer en inglés) indica a dirección da memoria dun dato e sempre se coloca en catro bytes. Na definición débese especificar o tipo de datos que mostra, * e o nome da variable de índice.
![](images/A51030-a.jpg)
Paira o seu uso utilízanse * e axentes. * Mentres que * ten a mesma función que o operador de Pascal (valor da variable mostrada polo demostrador), especifícase fronte a variables non expositoras paira referirse á súa referencia (ou dirección) e non ao valor (ou contido).
No programa 2 defínese una función de intercambio de valores entre ambas as variables. Ambos os parámetros son datos e resultados simultaneamente. Por tanto, non se pode trocar por valor senón por referencia (como en calquera outro linguaxe).
Hai que ter especial coidado cando os expositores participan en operacións aritméticas, xa que a unidade á que se engade ou elimina é a lonxitude da variable mostrada en lugar de ser una.
Por iso na seguinte parte do programa
![](images/A51030-b.jpg)
A variable p1 (lonxitude dun carácter) súmase a p2 dous e p3 catro (lonxitude das variables long). Doutra banda, admítense sumas e restas entre expositores cando os tipos de datos mostrados son os mesmos.
Táboas parámetros de funcións
No primeiro programa non definimos a función 'táboa de lectura'. Como o seu primeiro parámetro é a táboa, existen dúas opcións paira a determinación do parámetro: como array ou como índice, tal e como se pode observar nos programas 3 e 4 (ambos os equivalentes).
![](images/A51030-c.jpg)
![](images/A51030-d.jpg)
Hai que ter en conta as seguintes diferenzas:
- Na primeira solución pódense utilizar índices, polo que a variable de traballo (i) é completa. No segundo, con todo, realizarase sen índices e a variable de traballo (paux) será demostrativa.
- Como a función estándar scanf require o dato de referencia, utilízase na primeira solución (a táboa é do tipo [i] long), pero na segunda non (o punteiro paux e por tanto a referencia é).
- Cando na segunda solución faise paux ++ engádese a paux catro (lonxitude correspondente a long) e ao avaliar a expresión p + vos-as engádese ao índice catro veces o número de VOS.
- No programa principal pódese substituír a táboa de lectura (salmen, 12) pola de lectura ( salmen [0], 12).
Cadeas de caracteres
Una cadea de caracteres ou string, é una táboa co carácter especial ‘\Ø’ formado por caracteres ao final. As diferenzas co resto de táboas son:
- Pódese iniciar cun constante tipo String. Ex. char título [Ø2] = “VENDAS ANUAIS”;
- Non é necesario coñecer a lonxitude (en funcións e macros), xa que paira detectar o final basta con buscar o carácter ‘\Ø’.
- Nas funcións de Scanf e Printf hai un formato especial paira as cadeas e non paira o resto de táboas.
- Na biblioteca estándar hai un conxunto de funcións paira o manexo string (strlen, strcpy, strcmp, ...)
Nos programas 5 e 6 explícase a función de calcular o número de veces que un carácter aparece nunha cadea.
![](images/A51030-e.jpg)
![](images/A51030-f.jpg)
Outros
- Nas táboas multidimensionales, tanto a definición como o uso esixen un número no rango paira cada dimensión.
Por exemplo
,int matriz [1Ø] [10]; /* 1Ø ilad1Ø columna*/
- Pódense definir táboas de demostradores. Por exemplo, mediante a definición char * hil-izen [12]. A táboa de nomes de mes contén 12 expositores, cada un dos cales fai referencia a un string.
- O referenciado por un punteiro pode ser outro.
Exemplo: 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