1
Funciones
●
Forma de una función:
●
Ejemplo:
f
x , y ,
argumentos
valor de la funciónf
x
=
ln
x
3x
2−
4x
sin
x
si x
=
a
f
a
=
ln
a
3a
2−
4a
sin
a
si x
=
f
a
=
ln
3
2−
4
sin
=
18.18717247
2
Funciones (cont.)
●
Las funciones en programación nos
ayudan a:
– Dividir tareas grandes en varias más
pequeñas, p.e. imagine tener que poner el código de como calcular el cos(x) donde lo necesitemos, el resultado sería que el programa original
acabaría muy largo.
– Reusar código escrito por nosotros o
por alguien mas. P.e. Recuerde cuantas veces tuvo que escribir la función en el código del método de bisección.
3
Funciones (Reglas de uso)
●
Un programa puede contener tantas
funciones como sea necesario.
●
Para crear una función se debe
tener claro:
– Lo que la función tiene que hacer.
– Cuales y de que tipo son los
argumentos de entrada.
– La necesidad o no de usar argumentos
de salida.
4
Funciones (sintaxis)
●
Hay dos partes que se tienen que
escribir al hacer una función:
– Declaración de la función, o también
llamada prototipo o encabezado:
tipo_de_dato nombre_funcion(vacio, void, o lista de argumentos con su tipo de dato, con o sin
nombres);
● Por ejemplo:
int hora();
int fecha(void);
double area_circulo(double); int min(int x, int y);
● Aquí solo se indica el tipo de dato de salida,
el nombre de la función y el o los tipos de argumentos usados.
5
Funciones (sintaxis, cont.)
– Definición de la función, o también
llamado implementación:
tipo_de_dato nombre_funcion(vacio, void, o lista de argumentos con su tipo de dato y nombres)
{
cuerpo de la función;
//El valor de regreso debe coincidir en tipo //con el declarado en la función.
return valor_de_regreso; }
● Note que el ; de la primera linea no aparece,
esto es distinto distinto a la declaración.
● En este caso los nombres de los argumentos son
obligatorios
● Los parámetros en la declaración y en la
definición DEBEN coincidir en número y en
tipo. Los nombres no tienen por que ser los mismos.
6
Funciones (sintaxis, cont.)
● Las declaraciones (o prototipos) DEBEN ser
colocadas ANTES de donde son utilizadas en alguna parte del código.
● En C no se pude declarar una función dentro de otra
● Las definiciones (o implementación) pueden ser
colocadas antes o después de donde se invoquen.
– Si las definiciones son colocadas antes de la
función principal se puede evitar escribir la definición.
– Lo importante es que el compilador tenga
declarado el nombre, tipo y numero de argumentos de la función antes de ser invocada.
● El archivo math.h contiene las declaraciones
de las funciones de matemáticas.
● La opción -lm del likeador junta las
definiciones (previamente compiladas) de las funciones de matemáticas.
7
Funciones (llamadas a)
● Para invocar (o llamar) a una función la
sintaxis es la siguiente:
<nombre_de_variable>=nombre_funcion(lista de
variables, constantes, expresiones o funciones);
– Ejemplos:
x=sin(y); x=tan(1.2);
x=cos(fabs(y)); asin(x);
● El número, tipo y orden de argumentos DEBE
coincidir con los indicados en la declaración, si no coinciden el compilador indicará un error.
8
Funciones
(llamadas a (fallas))
● Si en el código solo se declaró la
función pero la definición no está hecha o alguna biblioteca externa no contiene la definición de la función, quien
indicará la falla es el linkeador, de la misma manera que lo hace cuando usamos
una función matemática y no incluimos en el comando de compilación la opción -lm.
● Si ni la declaración ni la definición
están en el código quien indicará la falla es el compilador avisando que la función no existe.
9
Funciones
(ejemplo básico)
● Para ver un ejemplo básico de como
declarar, definir y llamar a una función ver:
http://ifug.ugto.mx/~gonzart/notas/circulo.c http://ifug.ugto.mx/~gonzart/notas/promediofuncion.c
● Se presentan algunas dudas:
– Como se pasan los datos en la llamada
a la función?.
– Como pueden declararse variables con
el mismo nombre? (ver area en el main y area en la función fun_area)
10
Funciones
(paso de valores)
● Lo que hace C es que cuando hace una
llamada a una función se pasan el valor de las variables, en el caso del código circulo.c:
– La variable r pertenece a la función
fun_area. En la llamada de la linea 21, el valor de la variable rad se pasa al valor de la variable r.
● A este tipo de llamada que pasa
valores se le denomina llamada por valores.
11
Funciones
(variables)
● En C las variables tienen una
característica que se llama “alcance”.
– El alcance de una variable es la parte
del programa dentro de la cual se puede utilizar. Reglas:
● Una variable declarada en una
función solo puede usarse dentro de la misma función.
– La variable vive desde su
declaración hasta el lugar donde se encuentre una } que cierre la correspondiente { del bloque.
12
Funciones
(variables (cont.))
– Ejemplo:
int main (void) { //aqui se declara a: int a; ... if (a>0) { float b; ...
//hasta aqui vivie b. }
...
//hasta este punto vive a. }
13
Funciones
(variables (alcance))
●
En el mismo bloque
NO
se pueden
tener dos variables con el mismo
nombre. Como explicar el caso de
área en el código circulo.c?.
– Si dentro de una función o bloque ({})
existe un nombre de variable repetido, el que se usa es la variable definida en la parte más “interna” del bloque {}.
●
Si una variable se define fuera de
14
Funciones
(variables (alcance))
●
Las variables declaradas en el
encabezado de la función se
consideran variables locales a la
función.
●
Repitiendo, cuando en C se hace una
llamada a una función, el paso de
datos es heredando el valor hacia
las variables locales de la
15
Funciones
(variables (alcance))
● Ejemplo:
int a; //variable global, no está dentro de ningun //bloque
void f(void) {
float a; /* diferente de 'a' global */ float b;
a = 0.0; /* da a 'a' declarada en este bloque 0.0 */ /* la variable global 'a', no es tocada*/
{
int a; /* nueva 'a' de este bloque*/
a = 2; /* la variable 'a' del bloque anterior permanece intacta */
}
b = a; /* da a 'b' el valor de 0.0 */ }
Funciones con argumentos
del tipo arreglo.
● Declaración (ejemplo):
float prom(float dat[], int ndat);
– Al poner los [] se indica que ese
argumento es un arreglo del tipo definido.
– En este caso si se modifican los valores
del arreglo dentro de la función también se están modificando los valores del
arreglo que se usa para llamar a la
función. Se dice que la llamada es por
referencia. A diferencia de las llamadas
por valor de las variables convencionales.
17
Funciones
(comentarios)
● Es ampliamente recomendado (y para fines del curso
obligatorio) comentar la utilidad y la forma de uso de una función, el esquema propuesto es el siguiente:
/*---Nombre de la función:
Explicación de lo que hace la función: Argumentos de entrada:
Descripción de cada argumento, explicar el significado.
Argumentos de salida:
Descripción de cada argumento, explicar el significado.
Valor Regresado:
Explicar lo que regresa la función.
18
Función Main
● Existe una función especial que hemos usado
desde el principio, la función main. Ésta, como todas las funciones puede tener
valores de salida y argumentos de entrada.
– Que puede sacar la función main?, para
que serviría que main entregue algún valor?
– Más aún, quen llama a main para invocarla
con argumentos de entrada??!!!.
● Quien llama y recibe argumentos de main es
el sistema operativo desde donde se ejecuta el programa.
19
Función Main (cont.)
● Y que argumentos puede pasar el sistema
operativo?. Veamos el caso de un comando común en unix, acuérdese que la mayoría de los comandos en unix son archivos
ejecutables, cuando se escibe: cat arch1.txt arch2.tx
se está invocando al programa cat con dos argumentos de entrada de tipo cadena de caracteres.
● Lo que regresa el comando es una bandera
que indica si se pudo ejecutar
correctamente (por convención regresa un 0), o un estado de error (regresa algún número negativo).
20
Función Main (cont.)
● Para que la función main acepte los
argumentos con los que fue invocado el
programa se define se la siguiente manera: int main(int argc, char* argv[])
donde argc nos indica el número de
argumentos + 1 que fueron usados al invocar el programa. el segundo argumento es un
arreglo de cadenas de caracteres, el índice 0 contendrá el subdirectorio desde donde se invocó al programa; los demás indices
contendrán la cadena para cada argumento de entrada.