Llenguatge de programació C (VII). Estructures de dades (I)
1991/09/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria
Segons l'analitzat en el capítol 2, les dades bàsiques de C són caràcters, nombres enters i nombres reals. A més, en la redacció dels programes C es poden utilitzar els següents tipus de dades: taules, demostratius, estructures, textures i enumerats. D'altra banda, mentre que en llenguatges com el PASCAL d'alt nivell es poden definir nous tipus de dades, C no ho admet, encara que l'expressió typedef permet definir sinònims de tipus de dades. Per tant, en aquest capítol i en el següent exposarem la definició i utilització dels tipus de dades i sinònims esmentats.
Taules i demostradors
La taula és l'estructura de dades més utilitzada en qualsevol llenguatge. Les paraules vector, matriu, array, cadena i string s'utilitzen com a sinònim de taula, encara que a vegades no són subtipus de taula.
La taula està formada per un conjunt de variables del mateix tipus que es guarden i es coneixen amb el mateix nom. La taula pot tenir una o diverses dimensions, denominades en el primer caso vectors. Les bidimensionals es denominen matrius i mentre s'utilitza un índex per a identificar els components dins del vector, en les matrius s'utilitzaran dos índexs.
Quan els components de la taula són caràcters, la taula es diu cadena de caràcters, cadena o string, amb característiques diferents.
Definició i utilització de taules
El tipus de dades dels components per a la definició de les taules, el nom de la taula i el nombre de components han d'especificar-se en el rang. En l'ús només s'esmenta el nom de la taula per a referir-se al quadre complet. Per a expressar un component, per contra, cal esmentar el nom i l'índex entre els mapes. L'índex indica la posició dins de la taula del component, però mentre que en la majoria dels llenguatges el rang de valor de l'índex és des d'un fins al nombre de components (N), en C s'utilitza des de zero (N-1). Cal tenir en compte que l'índex que es determina en el rang pot ser qualsevol expressió completa; constant, variable o combinació aritmètica entre elles.
En el programa 1 es pot veure un exemple en el qual després de llegir les vendes de 12 mesos en una taula es calcula i imprimeix la venda anual i els percentatges mensuals. Per a llegir la taula s'utilitzarà una funció que definirem en el programa 3.
En la definició es pot dur a terme la inicialització de les taules, separant els valors dels components per comes i definint al principi i al final d'aquestes. Per exemple, la definició de la taula que indica el nombre de dies que té cada mes seria:
int hil-egun [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 31, 31, 30, 30, 31, 31, 31};
Si no hi ha res s'inicialitzen les taules amb zeros.
Demostratius
Com s'ha dit, quan s'utilitza el nom d'una taula sense índex es fa referència a la taula completa, però això no significa el valor de tots els components, sinó la referència del lloc on se situa la taula en la memòria. Aquest concepte és el mateix que el de l'expositor i per això es diu que quan s'utilitza el nom de la taula especifiquem el seu índex. Per aquest mateix motiu, l'assignació o assignació entre les dues taules també es realitza com a component. No es pot realitzar amb una simple assignació.
No obstant això, encara que existeix una gran tendència a utilitzar taules, els demostradors es poden utilitzar amb tota mena de dades. Els demostratius són variables, per la qual cosa han de definir-se i situar-se en memòria, ocupant part de la memòria. Els demostratius pascals, encara que han de definir-se, no inclouen parts de memòria, ja que són dinàmics, però com a C són estàtics, per a la definició s'utilitza el caràcter especial *.
El demostrador (pointer en anglès) indica la direcció de la memòria d'una dada i sempre es col·loca en quatre bytes. En la definició s'ha d'especificar el tipus de dades que mostra, * i el nom de la variable d'índex.
Per al seu ús s'utilitzen * i agents. * Mentre que * té la mateixa funció que l'operador de Pascal (valor de la variable mostrada pel demostrador), s'especifica enfront de variables no expositores per a referir-se a la seva referència (o direcció) i no al valor (o contingut).
En el programa 2 es defineix una funció d'intercanvi de valors entre totes dues variables. Tots dos paràmetres són dades i resultats simultàniament. Per tant, no es pot canviar per valor sinó per referència (com en qualsevol altre llenguatge).
Cal tenir especial cura quan els expositors participen en operacions aritmètiques, ja que la unitat a la qual s'afegeix o elimina és la longitud de la variable mostrada en lloc de ser una.
Per això en la següent part del programa
La variable p1 (longitud d'un caràcter) se suma a p2 dos i p3 quatre (longitud de les variables long). D'altra banda, s'admeten sumes i restes entre expositors quan els tipus de dades mostrades són els mateixos.
Taules paràmetres de funcions
En el primer programa no hem definit la funció 'taula de lectura'. Com el seu primer paràmetre és la taula, existeixen dues opcions per a la determinació del paràmetre: com array o com a índex, tal com es pot observar en els programes 3 i 4 (tots dos equivalents).
Cal tenir en compte les següents diferències:
- En la primera solució es poden utilitzar índexs, per la qual cosa la variable de treball (i) és completa. En el segon, no obstant això, es realitzarà sense índexs i la variable de treball (paux) serà demostrativa.
- Com la funció estàndard scanf requereix la dada de referència, s'utilitza en la primera solució (la taula és del tipus [i] long), però en la segona no (el punter paux i per tant la referència és).
- Quan en la segona solució es fa paux ++ s'afegeix a paux quatre (longitud corresponent a long) i en avaluar l'expressió p + us-as s'afegeix a l'índex quatre vegades el número d'US.
- En el programa principal es pot substituir la taula de lectura (salmen, 12) per la de lectura ( salmen [0], 12).
Cadenes de caràcters
Una cadena de caràcters o string, és una taula amb el caràcter especial ‘\Ø’ format per caràcters al final. Les diferències amb la resta de taules són:
- Es pot iniciar amb una constant tipus String. Ex. char títol [Ø2] = “VENDES ANUALS”;
- No és necessari conèixer la longitud (en funcions i macros), ja que per a detectar el final n'hi ha prou amb buscar el caràcter ‘\Ø’.
- En les funcions de Scanf i Printf hi ha un format especial per a les cadenes i no per a la resta de taules.
- A la biblioteca estàndard hi ha un conjunt de funcions per al maneig string (strlen, strcpy, strcmp, ...)
En els programes 5 i 6 s'explica la funció de calcular el nombre de vegades que un caràcter apareix en una cadena.
Uns altres
- En les taules multidimensionals, tant la definició com l'ús exigeixen un número en el rang per a cada dimensió.
Per exemple
,int matriu [1Ø] [10]; /* 1Ø ilad1Ø columna*/
- Es poden definir taules de demostradors. Per exemple , mitjançant la definició char * hil-izen [12]. La taula de noms de mes conté 12 expositors, cadascun dels quals fa referència a un string.
- El referenciat per un punter pot ser un altre.
Exemple:
int r, *p, **q;
r = 1Ø
p = r; /* *p = 1Ø */
q = p /* **q = 1Ø */
Gai honi buruzko eduki gehiago
Elhuyarrek garatutako teknologia