Subpunt anterior Subpunt posterior Punt precedent Titol Contingut


2.3. Funcions.


- En C, totes les funcions són globals. És a dir, es defineixen totes a fora del main, i cap funció pot estar inclosa dins d'una altra funció.

- Per definir una funció, primer cal escriure el tipus del valor que retorna aquella funció, el nom de la funció, i la llista dels paràmetres entre parèntesi, especificant el tipus i el nom de cada paràmetre. Si la funció no retorna res (procediment), llavors cal indicar que retorna un void. Si no té paràmetres, cal posar void dins del parèntesi de paràmetres.

- Després de l'especificació del nom i el tipus dels paràmetres i del resultat, s'especifica entre claus les variables locals i les instruccions associades a aquella funció. Les instruccions, a més de les sentències C, poden ser crides a altres funcions (no hi ha límit de número de crides imbricades) o fins i tot a ella mateixa (recursivitat). Al final de la funció cal posar la sentència return per indicar entre parèntesi el resultat que ha de retornar, excepte en el cas que no retorni res.

ex 2.4: 1ª versió del programa que calcula el Màxim Comú Divisor de dos números. La funció Mcd() rep 2 enters per paràmetre i retorna un altre enter amb el MCD (aplicant l'algorisme d'Euler):

- Alguns informàtics prefereixen escriure els programes començant per les funcions més importants i acabant per les més simples (mètode Top-Down). En C, però, abans de fer servir una funció s'ha de declarar (el mateix que amb els tipus, les estructures, les variables, etc.), amb la qual cosa no es pot escriure primer les funcions més importants perquè aquestes criden a les més simples. Per solventar això, es poden declarar només els prototipus de les funcions abans d'escriure el seu codi. Els prototipus són simplement el nom i els tipus dels paràmetres i el resultat, però seguits per un punt i coma. ex 2.5: Segona versió del MCD. Aquesta vegada especificant el prototipus abans de main() (és molt important posar el punt i coma darrera els prototipus, però no quan es defineix el cos de la funció):

- A les funcions que només tinguin una línia de codi també s'han de posar les claus. Per exemple:

A la funció Mcd es cridarien de la següent forma:

- En els casos en que el codi de la funció sigui molt petit, es pot recórrer a la definició de macros, a través de la directiva define. Cal tenir en compte, però, que només es tracta d'una substitució literal en temps de compilació. És a dir, no es realitza cap mena de crida, i el codi es replica cada cop que s'invoca a la macro. Per exemple, es pot definir els símbols max i min de la següent forma:

els paràmetres a i b es substituiran quan es trobi un invocació al define, pel símbol que hi hagi en el seu lloc. Això s'indica posant els "pseudoparàmetres" entre parèntesi quan s'escriu el text de substitució: (a) i (b). Per invocar a la macro es fa com si fos una funció:

- Dins dels Headers estàndard es troben els prototipus de les funcions de les llibreries estàndard, o bé un conjunt de macros predefinides. Per exemple, dins de STDIO.H es te el prototipus de la funció printf(), i dins de STDLIB.H hi ha les macros de max i min (en els llibres de C es troba la descripció de totes les funcions i macros estàndard disponibles):

Paràmetres array

- Els vectors i les matrius, en C, sempre es passen com a paràmetres per referència (de fet, és recomanable que sigui així, per no copiar molts valors a la pila). Quan es defineix un paràmetre en una funció, només s'indica el tipus dels elements, el nom del paràmetre array, i dos claudàtors sense número d'elements, ja que aquest número serà el de l'array que es passi per paràmetre quan es crida la funció (només es posa el nom de l'array a referenciar). ex 2.6: El programa MAXCAR calcula quin és el caràcter que apareix més vegades dins d'una cadena (un array). Cal observar com la funció inicialitzar() accedeix als components del vector que es passi com a paràmetre, perquè es passa per referència:

Paràmetres estructurats

- Els paràmetres estructurats (tuples) es poden passar per valor, és a dir, es copiarà tot el contingut d'una variable estructurada sobre el paràmetre associat (incloent-hi tots els elements dels vectors que contingui). Això pot sobrecarregar l'ús de la pila. Per tant, si les estructures són massa complexes cal passar paràmetres per referència (s'explicarà a la secció 3).

ex 2.7: En el programa PUNTS2D es defineix un tipus nou que consta de 2 reals simples (aquest tipus es pot fer servir per definir paràmetres i resultats de funcions). Es tracta d'introduir 2 punts 2D i calcular el punt mig, també en 2D:

Exercici

Modificar el fitxer PUNTS2D.C per obtenir el fitxer CERCLE2D.C corresponent a un programa en C que, a partir de 2 punts 2D, imprimeixi per pantalla les coordenades del centre i el radi del cercle que té com a diàmetre la recta que uneix els dos punts. És a dir, que imprimeixi el punt mig i la distància d'aquest punt mig a qualsevol dels 2 punts d'entrada.

Per fer la funció distancia() es necessitarà la funció arrel quadrada, que està definida a MATH.H. La funció té el següent prototipus: double sqrt(double x). la funció distancia() aplicarà el teorema de Pitàgores, segons el qual la distància entre 2 punts es pot calcular com a l'arrel quadrada de la suma de les diferències de coordenades al quadrat. Aquesta funció tindrà un prototipus com aquest:

Paràmetres de main

- La funció main també pot rebre paràmetres i retornar resultat. Això s'entén si pensem que el Sistema Operatiu pot reconèixer les paraules (opcions) que s'escriuen darrera de la comanda a executar, i passar aquesta llista de paraules a l'aplicació que invoca la comanda. Per exemple;

invoca la comanda DIR i li passa com a paràmetre les paraules "DIR", "TC" i "/w", per a que el DIR operi en conseqüència (el nom de la comanda o programa també el considera com un paràmetre). El retorn de resultat es refereix a un enter que accepta el S.O. com a codi d'error de l'aplicació (0 : execució correcta; no 0 : número d'error).

- Els dos tipus de paràmetre que rep el main són el número de paraules (enter) i una taula de strings. El què retorna és només enter. Els noms dels paràmetres poden ser qualsevol, encara que en molts llibres apareixen com argc i argv.

ex 2.8: A PARAM.C, el programa imprimeix el número i la llista de paràmetres. Per verificar l'efecte del pas de paràmetres cap a main compilar el PARAM.C, i executar-lo escrivint algunes paraules darrera el nom del programa. Per verificar l'efecte del retorn de resultat, es pot estudiar i executar el fitxer NOPAR.BAT, que crida a PARAM una vegada amb paràmetres i l'altra sense, i canvia l'execució en funció del codi d'error retornat.


Subpunt anterior Subpunt posterior Punt precedent Titol Contingut