Title: Fundamentos de Informtica
1Fundamentos de Informática
Rodrigo Álvarez Virgós (rodri.virgos_at_gmail.com)
2Definición (I)
- Una función es un bloque de código al que ponemos
un nombre, y que realiza una determinada tarea. - Las funciones reciben unos datos de entrada
(llamados parámetros), procesa estos datos, y
devuelve un sólo dato de salida.
3Definición (II)
- Aunque no lo parezca, las funciones no son algo
nuevo para nosotros, siempre las hemos usado. - printf, scanf, puts, sqrt, pow son funciones que
nos brinda el lenguaje C. - Ahora veremos cómo hacer nuestras propias
funciones.
5.0
pow
25.0
2.0
4Sintaxis (I)
- lttipogt nombre función (lttipogt nombre parámetro1,
lttipogt nombre parámetro2, ) - Hay que escribir el tipo para cada uno de los
parámetros, aunque sean todos del mismo tipo - int funcion (int a, b, c)
- int funcion (int a, int b, int c)
5Sintaxis (II)
- Una función puede no recibir ningún valor. Si es
el caso, se escribe void como único parámetro
(o nada, omitiendo el void). - Las funciones pueden no devolver ningún valor. En
este caso se escribe también void como tipo de
salida.
6Nombres de funciones
- float dividir (int dividendo, int divisor)
- char a_mayusculas (char caracter)
- int pedir_opcion_menu (void)
- float decimales (float numero)
- void mostrar_cabecera ()
- void f (float a, char b, int c, int d)
7Funcionamiento (I)
- Para usar una función en un programa, hay que
- Declarar el prototipo de la función.
- Declarar el cuerpo de la función e implementar
su comportamiento. - Invocar a la función.
8Funcionamiento (II)
- include ltstdio.hgt
- float doble (float)
- int main ()
- float a, b
- printf(Dame un numero ) scanf(f, a)
- b doble (a)
- printf(2f f, a, b)
-
- float doble (float cantidad)
- return (cantidad 2)
9Definición y cuerpo
- El cuerpo de una función es la función
propiamente dicha. - Contiene el código del algoritmo que usa la
función, y obtiene un resultado.
- int primer_divisor (int n)
-
- int divisor 2
- while (n divisor ! 0)
-
- divisor
-
- return divisor
10Invocación (I)
- La llamada a una función es equivalente a copiar
el código de la función en la línea en la que se
invoca. - Cuando el compilador encuentra la invocación a
una función, salta a la primera línea de la
función, hasta el return, y vuelve a la
sentencia siguiente a la que hace la llamada.
11Invocación (II)
- void main()
- mostrar_mensaje(Hola, Manolo)
- void mostrar_mensaje(char mensaje, char
usuario) - mostrar_nombre (usuario)
- printf(s \n, mensaje)
- return
- void mostrar_nombre(char nombre)
- printf(s dice , nombre)
- return
12Ejemplo funcionamiento (I)
- int main()
- int numero1, numero2, mayor
- puts(Dame dos números )
- scanf(dd, numero1, numero2)
- mayor calcular_mayor (numero1, numero2)
- printf(El mayor es d, mayor)
- return 0
-
- int calcular_mayor (int a, int b)
- if (a gt b) return a
- return b
13Ejemplo funcionamiento (II)
- int main()
- int n1, n2, m
- puts(Dame números )
- scanf(dd, n1, n2)
- m calcular_mayor(n1, n2)
- printf(El mayor de d y d es d, n1, n2, m)
- return 0
-
- int calcular_mayor(int a, int b)
- if (a gt b) return a
- else return b
- int main()
- int n1, n2, m
- puts(Dame 2 números )
- scanf(dd, n1, n2)
- if (n1 gt n2) m n1
- else m n2
- printf(El mayor de d y d es d, n1, n2, m)
- return 0
Mismo código con y sin función
14Prototipos (I)
- El compilador lee las líneas de código una a una
y de arriba abajo. - Cuando encuentra la invocación a una función, el
compilador es incapaz de procesar el nombre de la
función (el cuerpo está debajo del main). - Escribiendo el prototipo, el compilador sabe que
después del main habrá definida una función con
ese nombre.
15Prototipos (II)
- En el prototipo no se escribe ningún
comportamiento, sólo el nombre, el tipo de
entrada y el tipo de los parámetros. - int doble (int valor)
- float raiz_enesima (float, int)
- long int factorial (int)
- char a_mayusculas (char)
- int a_decimal (int numero_binario)
16Prototipos (III)
- include ltstdio.hgt
- float doble (float)
- int main ()
- float a, b
- printf(Dame un numero ) scanf(f, a)
- b doble (a)
- printf(2f f, a, b)
-
- float doble (float cantidad)
- return (cantidad 2)
17Parámetros
- Ante todo, los parámetros son variables como
otras cualquiera. - Son los datos de entrada de la función (la
función los necesita para operar con ellos y
devolver un resultado). - Hay dos tipos de parámetro
- Parámetros por valor.
- Parámetros por referencia.
18Parámetros por valor (I)
- Son una copia de la variable o constante que se
pasa a la función en la invocación. - El parámetro es una variable independiente del
main. Cuando se modifica el valor de un
parámetro, las variables del main permanecen
inalteradas.
19Parámetros por valor (II)
- void main (void)
- float real 5.21478
- printf(Antesf\n, real)
- modificar (real)
- printf(Despuesf\n, real)
-
- void modificar (float numero)
- numero 1.547
-
real 5.21478
numero 5.21478
numero 1.547
20Parámetros por referencia (I)
- Las referencias no son copias, sino que son alias
de los valores pasados a la función. - El parámetro y su argumento son la misma
variable. Si se cambia el valor del parámetro se
cambia tanto dentro como fuera de la función.
21Parámetros por referencia (II)
- Para indicar que un parámetro es una referencia
se indica con el símbolo - Ejemplo
- void ejemplo_funcion(int a, int b)
- a es una copia y b una referencia
- Cuando pasamos un array por parámetro, éste ya es
un alias y no es necesario poner
22Parámetros por referencia(III)
- void main (void)
- float real 5.21478
- printf(Antesf\n, real)
- modificar (real)
- printf(Despuesf\n, real)
-
- void modificar (float numero)
- numero 1.547
-
real 5.21478
real 5.21478 numero
real 1.547 numero
real (y por tanto numero) cambia
23Parámetros por referencia (IV)
- void main (void)
- float r3 5.21, 8.95, 0.847
- printf(Antes f f f\n, r0, r1, r2)
- modificar (reales)
- printf(Despues f f f\n, r0, r1, r2)
-
- void modificar (float n)
- n0 n2 n1 0.021 n2 1478.0
24Resultado de las funciones (I)
- Una función debe devolver un valor siempre.
- Para ello se usa la palabra return.
- return ltvalorgt si la función devuelve int,
float, char, etc. - return si la función devuelve void.
- Es el punto de salida de la función, cuando el
compilador encuentra esta palabra, la función
termina.
25Resultado de las funciones (II)
- char a_mayusculas (char caracter)
-
- if ((caracter gt a) (caracter lt z))
-
- return (caracter 32) printf(Tonto el que
lo lea\n) - return caracter
26La función main (I)
- main (principal) es una función más, que se
invoca automáticamente cuando se ejecuta un
programa, no necesita invocación explícita dentro
del código. - Las funciones también son llamadas subprogramas,
ya que una función es una subordinada de otra
función la función main.
27La función main (II)
La función main solemos declararla como int,
pero podría devolver cualquier tipo de valor.
- include ltstdio.hgt
- void main(void)
-
- printf(Hola, mundo!!)
- return
- include ltstdio.hgt
- int main(void)
-
- printf(Hola, mundo!!)
- return 0
28Ámbito de las variables (I)
- Si se declara una variable dentro de un bloque de
código, ésta es accesible sólo dentro de ese
bloque. - Una función declarada dentro de una función es
accesible sólo dentro de la propia función
(incluyendo el main). - Para que dos funciones compartan una misma
variable, se usan los parámetros.
29Ámbito de las variables (II)
- void main ()
- float num 74, res
- restriplicar (num)
-
- float triplicar (int i)
- return (i3)
-
- void main ()
- float num 74, res
- res triplicar ()
-
- float triplicar ()
- return num3
30Objetivos de las funciones
- Separar la lógica de una operación fuera de la
función main. El main junto con el resto de
funciones forman lo que se llama programación
estructurada. - Ahorrar código. Una función se puede invocar
tantas veces como sean necesarias.
31Ahorro de código
- void main()
- int a, b
- puts(Dame dos numeros)
- scanf(dd, a, b)
- printf(Divisor de ad , primer_divisor (a))
- printf(Divisor de bd , primer_divisor (b))
-
- int primer_divisor (int n)
- divisor 2while (n divisor ! 0)
- divisor
- return divisor
- void main()
- int a, b, divisor
- puts(Dame dos numeros)
- scanf(dd, a, b)
- divisor 2while (a divisor ! 0)
- divisor
- printf(Divisor de ad , divisor)
- divisor 2while (b divisor ! 0)
- divisor
- printf(Divisor de bd , divisor)
Con función
Sin función