Tema 4. Funciones

También podría gustarte

Está en la página 1de 17

TEM

A
Tema 4. Funciones

Autoría: Cristian Catalán


Informática. Programación I
Tema 4. Funciones

Tema 4: Funciones

¿Qué aprenderás?

• Desarrollar programas con un diseño modular.


• Crear funciones con parámetros y valores de retorno.
• Utilizar funciones para encapsular el código.

¿Sabías que…?

• Existen cinco paradigmas de programación principales: orientados a


objetos, procedimentales, funcionales, lógicos y matemáticos.
• Un 37% de los programadores aprendió a programar en un periodo de
entre uno y cuatro años andes de trabajar como programador
• Un 87% de los programadores ha aprendido algún lenguaje de
programación por su cuenta.
Informática. Programación I
Tema 4. Funciones

1. Introducción

La programación estructurada se basa en programar utilizando estructuras de control.


Al programar nos encontramos con trozos de códigos que se repiten en múltiples veces en
distintos puntos de nuestro programa. El código repetido es una fuente de errores, mal
funcionamiento y dificultades en su mantenimiento. Por ello como programadores siempre
deberemos intentar disminuir al máximo el código repetido en un programa.
Pensemos en un programa que tiene que realizar una operación de actualización de stock
cada vez que se realiza una operación de compra, venta o alquiler. Si programamos la
actualización del stock 3 veces, vamos a tener el tripe de trabajo en la depuración de
errores que si solo la programamos una vez. A demás solo deberemos modificar el código
una única vez cuando se tenga que hacer algún cambio en el sistema de actualización del
stock.
Las funciones nos permiten encapsular un trozo de código con un identificador para que
cada vez que llamemos a ese identificador se ejecute todo el código que contiene.

2. El uso de funciones

Una función identifica un bloque de código que podemos ejecutar tantas veces como
queramos en distintos puntos de nuestro programa. Podemos definir múltiples funciones
dentro de nuestro programa y utilizarlas tantas veces como necesitemos.
Las funciones se identifican por su nombre y sus posibles parámetros (valores que
podremos pasar a la función cuando la queramos ejecutar). No pueden existir dos
funciones con el mismo nombre y mismo número de parámetros.
Las funciones se definen siempre dentro del bloque correspondiente a nuestro programa,
pero fuera de cualquier otra función.
La función principal de nuestro programa es la función main. Al ejecutar nuestro programa
siempre se ejecutará el código encapsulado por la función main.

2
Informática. Programación I
Tema 4. Funciones

public class MainEsLaFuncionPrincipal {

public static void main(String[] args) {


System.out.println("al ejecutar un programa se ejecuta siempre el código en main");
}

3. Crear una función

Sintaxis en la creación de una función simple:


public static void nombreDeLaFuncion ( ) { …. }
El nombreDeLaFuncion va a ser el nombre que identifique mi función. Entre las llaves { }
escribiremos el código que queramos ejecutar cada vez que ejecutemos ésta función.
Veremos más a delante el uso de las palabras clave public, static y void así como los
paréntesis.
Desde una función podemos llamar a otras funciones escribiendo el nombre de la función
seguido de dos paréntesis con sus posibles parámetros dentro, pero hemos de tener
presente que las variables creadas en una función no serán accesibles desde fuera de la
función.
Así el siguiente código mostrará por consola:
Mensaje: 0
Mensaje: 0

3
Informática. Programación I
Tema 4. Funciones

public class EjemploFuncionSimple {

public static void main(String[] args) {


int contador =0; //ésta variable no es utilizada
miFuncion();
miFuncion();
}
public static void miFuncion(){
int contador =0;
System.out.println("Mensaje:"+contador);
//esta operación de suma es innecesaria, la variable se destruye al finalizar la función
contador++;
}
}

El siguiente código mostrará un error debido a que la variable contador no se ha definido


dentro de miFuncion() . Al estar definida en main solo es accesible desde el bloque de
código de la función main:

public class EjemploFuncionSimple {

public static void main(String[] args) {


int contador =0;
miFuncion();
miFuncion();
}
public static void miFuncion(){
System.out.println("Mensaje:"+contador);
contador++;
}
}

¿Cómo podemos entonces enviar valores desde una función a otra? Veamos el paso de
parámetros en el siguiente capítulo.

4
Informática. Programación I
Tema 4. Funciones

4. Paso de parámetros a funciones

Cuando queramos llamar a una función enviándole valores para que ésta los pueda usar
tendremos que definir qué cantidad y qué tipo de valores va a poder recibir.
Hablaremos de parámetros para referirnos a los valores que puede recibir una función. Y
siempre que creemos una función vamos a tener que indicar el número y tipo de
parámetros que tiene. Una función va a poder tener tantos parámetros como sea
necesario.

4.1 . Declarar parámetros a una función

Al declarar una función tendremos que declarar los parámetros dentro de los paréntesis de
la función.
Por ejemplo, la siguiente función es definida con un parámetro entero llamado numero:
public static void miFuncion(int numero){ …. }

Una función puede tener más de un parámetro. Los declararemos siempre dentro de los
paréntesis separándolos por comas.
Por ejemplo, la siguiente función es definida declarando un parámetro de tipo entero y
otro de tipo texto:
public static void miFuncion(int edad, String nombre){ … }

Cada función se identifica por su nombre y por el número y tipo de parámetros que tiene.
Así que dos funciones pueden tener el mismo nombre si tienen distinto tipo y/o número de
parámetros.
Cuando queramos ejecutar una función escribiremos el nombre de la función y entre
paréntesis sus atributos.

Por ejemplo, el siguiente código mostrará por consola:


Mensaje: 0
Otro mensaje: 1

5
Informática. Programación I
Tema 4. Funciones

Fin del ejemplo

public class EjemploPasoParametro {

public static void main(String[] args) {


int contador = 0;
miFuncion(contador); //ejecutamos la función “miFuncion(int cont)”
contador++;
miFuncion(contador,"Otro mensaje"); //ejecutamos "miFuncion(int cont,String texto)”
miFuncion("Fin del ejemplo"); //ejecutamos “miFuncion(String mensaje)”
}

public static void miFuncion(int cont) {


int contador = cont;
System.out.println("Mensaje:" + contador);
}

public static void miFuncion(int cont,String texto) {


int contador = cont;
System.out.println(texto + contador);
}

public static void miFuncion(String mensaje) {


System.out.println(mensaje);
}
}

Es muy común el preguntarse: ¿Cuándo pasamos un parámetro estamos pasando la


variable o el valor?

4.2 . Paso de parámetros por valor o referencia

El paso de parámetros en Java siempre se realiza por valor, nunca por referencia. Con eso
nos referimos a que nunca estaremos pasando como parámetro la variable en sí, sino que
pasaremos solamente el valor que contiene (incluso aunque tengan el mismo nombre!).

Como la variable contador definida en main es distinta a la definida en miFuncion, el


siguiente código mostrará por consola:
Mensaje: 0
Mensaje: 0

6
Informática. Programación I
Tema 4. Funciones

public class EjemploPasoParametroValor{

public static void main(String[] args) {


int contador = 0;
miFuncion(contador);
miFuncion(contador);
}
public static void miFuncion(int contador) {
System.out.println("Mensaje:" + contador);
contador++;
}

¿No podremos entonces conseguir que miFuncion aumente el valor de la variable contador
definida dentro de main?
La respuesta es que: no podremos directamente desde miFuncion, pero podremos asignar
a contador de main el valor que miFuncion retorne.

5. Retorno de valores en funciones

En ocasiones al ejecutar una función ésta va a generar un valor que querremos recuperar.
Para poder retornar un valor, cuando definamos una función vamos a tener que indicar
qué tipo de valor va a retornar.
Es importante remarcar que una función solo va a poder retornar un mismo tipo de valor
(int, String , …) , y que una función está obligada a retornar un valor del tipo definido.
Si queremos indicar que una función no va a retornar ningún valor, utilizaremos la palabra
clave void. En este caso no estamos obligados a hacer ningún return.
Por ejemplo, la siguiente función no puede retornar ningún valor:
public static void miFuncion(int contador) { }

Un return no tiene por qué retornar un valor. La siguiente función tampoco retorna ningún
valor, aunque tenga más de un return:
public static void miFuncion(int contador) {
if(contador>4){ return; }
else{ return; }
}

7
Informática. Programación I
Tema 4. Funciones

El tipo de retorno se indica justo delante del nombre de la función, y podemos retornar un
valor en cualquier momento con la palabra clave return seguido del valor a retornar.
En el siguiente ejemplo definimos una función que retorna un valor entero cada vez que es
llamada:
public int void miFuncion(){
return 33;
}

Cuando se ejecuta un return, siempre se detiene la ejecución de la función actual y se


prosigue con la ejecución del resto del programa.
En el siguiente ejemplo definimos y llamamos a una función que retorna dos posibles
mensajes según el parámetro que reciba:

public class EjemploFuncionConRetorno {

public static void main(String[] args) {


comparaCon5(10);
comparaCon5(4);
}

public static String comparaCon5(int numero) {


if (numero > 5) {
return "es mayor que 5";
} else {
return "es menor que 5";
}
}

¿Qué ocurre cuando una función se llama a sí misma? Vamos a por el siguiente tema, la
recursividad:

8
Informática. Programación I
Tema 4. Funciones

6. Recursividad

La recursividad es una técnica de programación que consiste en que una función se llame a
ella misma. Esto provoca un efecto bucle que se repite hasta el infinito si no lo detenemos
en algún momento. Por eso siempre que ejecutemos una función recursiva tendremos que
estar seguros que no se va a llamar a ella misma siempre.

Por ejemplo, la siguiente función recursiva se va a llamar a ella eternamente en un bucle


infinito:

public static void recursivaInfinita(int numero){


numero ++;
System.out.println(numero);
recursivaInfinita(numero);
}

En cambio, la siguiente función recursiva se va a llamar a ella solo mientras número < 10:

public static void recursivaFinita(int numero){


numero ++;
System.out.println(numero);
if(numero< 10){
recursivaInfinita(numero);
}
}

La recursividad es una técnica poco eficiente, pero en ocasiones resulta más sencilla de
programar y entender. La alternativa a la recursividad es la iteratividad, la técnica con la
que hemos estado trabajando hasta ahora.
Si las funciones recursivas tienen valores de retorno, no van a ser obtenidos hasta que no
detengamos la recursividad.

9
Informática. Programación I
Tema 4. Funciones

Por ejemplo, el siguiente código mostrará por consola primero los mensajes que se
imprimen antes de llamarse a ella misma, y luego los mensajes una vez se ha detenido la
recursividad:
número++:1
número++:2
número++:3
return número:3
return número:3
return número:3

public class LINKIA_M06_18_19 {


public static void main(String[] args) {
recursivaRetornaValor(0);
}
public static int recursivaRetornaValor(int numero){
numero ++;
System.out.println("número++:"+numero);
if(numero< 3){
numero = recursivaRetornaValor(numero);
}
System.out.println("return número:"+ (numero));
return numero;
}
}

10
Informática. Programación I
Tema 4. Funciones

Recursos y enlaces
• Documentación oficial de Java: https://docs.oracle.com/en/java/javase/11/

• Documentación oficial de la clase String:


https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html

• Documentación oficial de la clase Math:


https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Math.html

Conceptos clave
• Función: bloque de código al que le asignamos un nombre que utilizaremos para
ejecutar el código que contenga siempre que queramos.
• Parámetro: valores que recibe una función cuando se llama.
• Recursividad: una función es recursiva cuando se llama a ella misma.

11
Informática. Programación I
Tema 4. Funciones

Test de autoevaluación

¿El paso de parámetros en Java se produce por valor o por referencia?


a) Siempre por valor.
b) Por referencia cuando las variables son simples, si son complejas el paso se hace por
valor.
c) Por valor cuando las variables son simples, si son complejas el paso se hace por
referencia.
d) Siempre por referencia.

¿En Java pueden existir dos funciones con el mismo nombre?


a) No, nunca. Las funciones se identifican por sus nombres y por ello no pueden existir
dos con el mismo nombre.
b) Si, si tienen distinto tipo de parámetros.
c) Solo si contienen distinto código.
d) Solo en la versión 11 de Java.

¿En la definición de una función, qué código indicará una función va a recibir un parámetro
del tipo String y uno de tipo entero?
a) ( String param1, int param2)
b) {String param1, int param2}
c) (string, int)
d) [string, int]

¿Qué función se ejecuta por defecto al ejecutar un programa?


a) La primera función definida.
b) La última función definida.
c) Aquella que sea static.
d) La función main.

12
Informática. Programación I
Tema 4. Funciones

Ponlo en práctica

Actividad 1
Escribe un programa de nombre Recursividad que imprima valores del 0 al 20 utilizando
una función recursiva

Actividad 2
Escribe un programa de nombre PidiendoValores que llame a una función encargada de
pedir un número entero superior a 0. Si el usuario escribe un número incorrecto, vuelve a
pedir. Cuando el usuario haya escrito un número correcto la función ha de retornar ése
número y desde la función main se ha de mostrar el número introducido.

13
Informática. Programación I
Tema 4. Funciones

SOLUCIONARIOS

Test de autoevaluación

¿El paso de parámetros en Java se produce por valor o por referencia?


e) Siempre por valor.
f) Por referencia cuando las variables son simples, si son complejas el paso se hace por
valor.
g) Por valor cuando las variables son simples, si son complejas el paso se hace por
referencia.
h) Siempre por referencia.

¿En Java pueden existir dos funciones con el mismo nombre?


i) No, nunca. Las funciones se identifican por sus nombres y por ello no pueden existir
dos con el mismo nombre.
j) Si, si tienen distinto tipo de parámetros.
k) Solo si contienen distinto código.
l) Solo en la versión 11 de Java.

¿En la definición de una función, qué código indicará una función va a recibir un parámetro
del tipo String y uno de tipo entero?
m) ( String param1, int param2)
n) {String param1, int param2}
o) (string, int)
p) [string, int]

¿Qué función se ejecuta por defecto al ejecutar un programa?


q) La primera función definida.
r) La última función definida.
s) Aquella que sea static.
t) La función main.

14
Informática. Programación I
Tema 4. Funciones

Ponlo en práctica

Actividad 1
Escribe un programa de nombre Recursividad que imprima valores del 0 al 20 utilizando
una función recursiva

Solución:
public class Recursividad {

public static void main(String[] args) {


imprimeHastaEl20(0);
}
public static void imprimeHastaEl20(int num){
System.out.println(num);
if(num<20){
num++;
imprimeHastaEl20(num);

}
}
}

Actividad 2
Escribe un programa de nombre PidiendoValores que llame a una función encargada de
pedir un número entero superior a 0. Si el usuario escribe un número incorrecto, vuelve a
pedir. Cuando el usuario haya escrito un número correcto la función ha de retornar ése
número y desde la función main se ha de mostrar el número introducido.

15
Informática. Programación I
Tema 4. Funciones

Solución:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PidiendoValores {

public static void main(String[] args) {


int num=getEnteroSuperior0();
System.out.println("Numero>0: "+num);
}

public static int getEnteroSuperior0() {


String numeroEscrito;
int numero = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
do {
System.out.println("Introduce un numero > 0");
try {
numeroEscrito = br.readLine();
numero = Integer.parseInt(numeroEscrito);
} catch (IOException e) {
System.out.println("Error al intentar acceder al teclado");
}catch( NumberFormatException e2){
System.out.println("Debes introducir un valor numérico");
}

} while (numero <1);


return numero;
}
}

16

También podría gustarte