Master en Artes Digitales (IUA-UPF)
Módulo de Programación

Funciones

Funciones | Return | Parámetros | Ambito y Visibilidad | Ejercicios

Funciones

Son fragmentos de código los cuales reciben un nombre descriptivo y que pueden ser utilizados en cualquier momento haciendo referencia al nombre.

Su utilidad principal es:

function <NombreFunción> () {
<acción(es)>
}
Diagrama de flujo de las llamadas a funciones

 

Return

Las funciones pueden devolver un valor como resultado de sus operaciones o cálculos. Es decir, que a parte de poder dar resultados por pantalla (como en cualquier otra parte del programa), también pueden devolver el resultado al punto del programa en que la función había sido llamada.

Por ejemplo, tenemos una función que multiplica por 2 un número leído por teclado y queremos que este resultado sea accesible en el resto del programa. Definimos la función:

function por_dos(){
   num = readval()
   return num * 2
}

donde la sentencia return define el valor a devolver por la función. Así, el valor puede ser recogido por una variable en el punto de un programa donde se haya llamado a la función:

. . .
. . .
. . .
resultado = por_dos()
. . .
. . .
. . .
write(resultado)
. . .
. . .
. . .

Como se puede observar, a la variable resultado se le asigna el valor que devuelve la función. Este valor, al estar en una variable puede ser utilizado más tarde como por ejemplo en la sentencia que escribe por pantalla el resultado.

 

Ejemplos de funciones a programar en el entorno EP-NAR-6

Modificar los ejemplos anteriores para que devuelvan los valores en vez de dar los resultados por pantalla.

 

Parámetros Formales y Actuales

Un parámetro es un valor que se le pasa a una función para que pueda operar con él.

Por ejemplo, si queremos que una función calcule el área de un cuadrado, en vez de leer el valor del tamaño del costado del cuadrado del teclado, lo podemos pasar por parámetro: area_cuadrado( 5 )

A una función se pueden pasar ninguno, uno o más de un parámetro, pero siempre se pasan en un cierto orden y en la mayoria de lenguajes, así como en JavaScript, se pasan dentro de los paréntesis que siguen al nombre de la función.

Se distingue entre parámetro formal y actual para hacer referencia a:

Parámetro Formal:
El nombre del parámetro que se utiliza dentro de la función y con que se trabaja.
En algunos lenguajes se le define un tipo.
Parámetro Actual:
El valor del parámetro que se pasa a la función en el momento de llamar a la función, ya sea una constante o el valor de una variable.

En el ejemplo del cálculo del área de un cuadrado tendríamos que la definición de la función podría ser:

function area_cuadrado( lado ){
   area = lado * lado
   return area
}

lado es el parámetro formal, es decir, es el nombre que se le da para poder referenciarlo dentro de la función.

Así mismo, cuando llamamos la función para que calcule el área de un cuadrado con los costados de 5 unidades, tenemos:

area_cuadrado( 5 )

Aquí el 5 es el parámetro actual ya que es el valor que le pasamos a la función.

 

Ejemplos de funciones con parámetros a programar en el entorno EP-NAR-6

Modificar los tres primeros ejemplos anteriores para que se les pasen los valores por parámetro, en vez de leerlos de teclado.


Ambito y Visibilidad

Las variables internas a una función (definidas dentro de la función) solo se verán dentro de la función. Es decir, tienen un ámbito local.

Las variables definidas fuera de toda función serán visibles en todo el programa. Es decir, tienen un ámbito global.

Por ejemplo, en la función que calcula el área de un cuadrado:

function area_cuadrado( lado ){
   area = lado * lado
   return area
}

vemos que hemos definido una variable area. Esta variable area no podrá ser referenciada fuera de la función ya que su ámbito es tan solo el de dentro de la función.

También se pueden definir variables globales que permitan ser vistas desde cualquier función. Por ejemplo:

v = 0

function main(){
   v = 5
}

function f(){
   v = 10
}

en el programa anterior, tanto la función principal main, como la función f pueden acceder y trabajar con la variable v.


Ejemplos de funciones a programar en el entorno EP-NAR-6

Ejemplo 1 :

Queremos leer un texto, carácter a carácter, finalizado en punto e irlo escribiendo de forma que entre palabra y palabra, tan solo haya UN espacio. Por lo tanto, el programa deberá saltar los blancos inecesarios. Pista: ayudarse de la función definida en los Ejemplo 4 de arriba.

Ejemplo 2 :

Definir una función que pasándole por parámetro la edad de una persona, su nota media de carrera, la nota de un test de personalidad y la nota de un test psicotécnico, decida si esa persona es APTA para un puesto de trabajo.

En concreto, la función debe devolver un valor booleano (true o false) según los siguientes criterios:

  • La persona deberá ser mayor de edad pero menor de 40 años.
  • La persona deberá tener forzosamente aprobado todo (carrera, y tests) con un mínimo de 5.
  • La persona será apta si tiene una nota de carrera superior a 8.
  • Si la nota no es mayor de 8 también puede ser apta si tiene como mínimo un 8 en cada uno de los test.
  • Si en uno de los test no llega a 8 puede ser apto si la nota media de carrera es superior a 7.

Recomendaciones: escoger unos buenos nombres de parámetros formales.

Ejemplo 3 :

Escribir un programa que lea las fichas de 10 personas y en base a sus datos, de por pantalla el nombre de cada persona, indicando si es apta o no para un puesto de trabajo. Utilizar la función del ejercicio anterior para decidir si cada una es apta.

Notas: Las fichas estarán formadas por el nombre, la nota media de carrera, la nota de un test de personalidad y la nota de un test psicotécnico, dando cada dato en una línea distinta.

Ejemplo 4 :

Definir una función que:

  • vaya leyendo una frase por teclado, carácter a carácter
  • vaya guardando la frase en una variable de tipo string
  • detecte cuando encuentre un símbolo de interrogación "?"
  • a partir del momento e que encuentre el "?", guarde la segunda parte de la frase en otra variable de tipo string

Nota: la frase estará terminada en punto.

Ejemplo 5 :

Escribir un programa que utilice la función anterior y escriba las dos partes de la frase por pantalla, en líneas separadas.

Nota: Utilizar variables globales para poder utilizarlas tanto en la función anterior como en la función principal.

Ejemplo 6 :

Leeremos de teclado (carácter a carácter) una frase del estilo:

Apreciado/a ?, le deseamos una muy Feliz Navidad.

es decir, una frase dirigida a alguien y donde el nombre de ese alguien se ha substituido por "?". Se deberá utilizar la función del Ejemplo 4 para separar la frase en las dos partes en que se separa por la posición del "?".

También por teclado se nos darán 10 nombres y queremos leerlos uno a uno e ir escribiendo, para cada uno, una frase formada por:

  • La primera parte de la frase inicial
  • el nombre de una persona del array
  • la segunda parte de la frase inicial
  • salto de línea.

Nota: tener en cuanta la utilización de variable globales, de parámetros, etc.

 

Soluciones:

Ejemplo 1 :

function main(){
   letra = ""
   letra = readchr()
   while(letra != "."){
      write(letra)
      if(letra == " "){
         letra = saltar_blancos()
      }
      else{
         letra = readchr()
      }
   }
}

function saltar_blancos(){
   do{
     l = readchr()
   }while(l == " ")
   return l
}

Ejemplo 2 :

function persona_apta(edad, carrera, personalidad, psicotecnico){
   if(edad >= 18 && edad < 40){
      if(carrera >= 5 && personalidad >= 5 && psicotecnico >= 5){
         if(carrera > 8){
           return true
         }
         else{
           if(personalidad >= 8 && psicotecnico >= 8){
              return true
           }
           else{
              if(carrera > 7 && personalidad >= 8){
                 return true
              }
              else{
                 if(carrera > 7 && psicotecnico >= 8){
                    return true
                 }
              }
           }
         } 
      }
   }
   return false
}

o bien tambié se podría hacer:

function persona_apta(edad, carrera, personalidad, psicotecnico){
   if((edad >= 18 && edad < 40) && (carrera >= 5 && personalidad >= 5 && psicotecnico >= 5)
      && ((carrera > 8) || (personalidad >= 8 && psicotecnico >= 8)
          || (carrera > 7 && personalidad >= 8)
          || (carrera > 7 && psicotecnico >= 8))){
      return true
   }
   return false
}

o bien tambié se podría hacer:

function persona_apta(edad, carrera, personalidad, psicotecnico){
   if((edad >= 18 && edad < 40) && (carrera >= 5 && personalidad >= 5 && psicotecnico >= 5)
      && ((carrera > 8) || (personalidad >= 8 && psicotecnico >= 8)
          || (carrera > 7 && (personalidad >= 8 || psicotecnico >= 8)))){
      return true
   }
   return false
}

Ejemplo 3 :

function main(){
   for(i=0;i<10;i++){
      nomb = readstr()
      edad = readval()
      carr = readval()
      pers = readval()
      psic = readval()
      if(persona_apta(edad, carr,pers,psic)){
         write(nomb + " es apto/a para el puesto de trabajo\n")
      }
      else{
         write(nomb + " es NO apto/a para el puesto de trabajo\n")
      }
   }
}

Ejemplo 4 :

function separa_frase(){
   frase1 = ""
   frase2 = ""
   letra = ""
   letra = readchr()
   while(letra != "?"){
      frase1 = frase1 + letra
      letra = readchr()
   }
   letra = readchr()
   while(letra != "."){
      frase2 = frase2 + letra
      letra = readchr()
   }
}

Ejemplo 5 :

frase1 = ""
frase2 = ""

function main(){
   separa_frase()
   write(frase1 + "\n")
   write(frase2 + "\n")
}

function separa_frase(){
   letra = ""
   letra = readchr()
   while(letra != "?"){
      frase1 = frase1 + letra
      letra = readchr()
   }
   letra = readchr()
   while(letra != "."){
      frase2 = frase2 + letra
      letra = readchr()
   }
}

Ejemplo 6 :

frase1 = ""
frase2 = ""

function main(){
   separa_frase()
   readstr()  // para garantizar que empezamos en la siguiente línea
   for(i=0;i<10;i++){
      nomb = readstr()
      write(frase1 + nomb + frase2 + "\n")
   }
}

function separa_frase(){
   letra = ""
   letra = readchr()
   while(letra != "?"){
      frase1 = frase1 + letra
      letra = readchr()
   }
   letra = readchr()
   while(letra != "."){
      frase2 = frase2 + letra
      letra = readchr()
   }
}

 

Ejercicios: Escribir programas que hagan lo siguiente
  1. Dados 12 valores por teclado que representan las temperaturas máximas de los 12 meses del año, se deben verificar las siguientes propiedades para cada valor:
    Propiedades:
    * Los números deberán ser entre 0 y 35.
    * Los números deben ser enteros.
    * Los números no podrán variar en más o menos de 8 grados respecto al siguiente (para Diciembre no se ha de verificar).
    Además se darán 12 valores más que representan los litros máximos de lluvia de ese mes y se deben verificar las sigüientes propiedades:
    Propiedades:
    * Los números deberán ser entre 0 y 50.
    * Los números deben ser enteros.
    Escribir un programa que cumpla los siguientes
    Objetivos:
    * Dibujar una gráfica de las temperaturas con el eje vertical siendo el mes y el eje horizontal la temperatura. Por ejemplo:

    TEMPERATURAS
    ene |====== 6
    feb |===== 5
    mar |======== 8
    abr |=========== 11
    may |================ 16
    jun |=================== 19
    jul |========================== 26
    ago |================================== 34
    set |============================= 29
    oct |===================== 21
    nov |============== 14
    dic |======= 7

    * Dbujar una gráfica del la lluvia por cada mes.
    Por ejemplo:

    LLUVIAS
    ene |====================== 22
    feb |================ 16
    mar |================== 18
    abr |===================== 21
    may |============ 12
    jun |======== 8
    jul |===== 5
    ago |========= 9
    set |================== 18
    oct |=================================== 35
    nov |=============================== 31
    dic |======================= 23

    NOTAS:
    * Definir una función que dibuje una gráfica de valores cualesquiera para los doce meses (pasar por parámetro el título de la gráfica).
    * Definir una función que verifique la pertenencia de un valor a un rango.
    * Definir una función que verifique si un valor es entero.

  2. Dar un programa que dadas las especificaciones indicadas cumpla los objetivos de abajo. El programa deberá ayudarse de las funciones que se crean convenientes y útiles para simplificar las tareas y clarificar la lectura del programa.
    Especificaciones:
    * El usuario da un poema por teclado.
    * El poema termina cuando el usuario escribe una "/".
    * Cada verso termina con un punto ".".
    * Todo el poema se introduce letra a letra sin formato y con espacios de más (siempre habrá un espacio entre palabras como mínimo).
    Objetivos:
    * Escribir el poema por pantalla.
    * Cada verso tiene que empezar en una línea nueva.
    * No debe haber más de un espacio entre palabras.
    * Al lado de cada verso debe aparecer la longitud de la palabra más larga de ese verso.
    * Al final del poema debe aparecer la longitud de la palabra más larga de todo el poema.


< Sesión Anterior | Índice | Siguiente Sesión >