Miércoles 17 de Marzo

Funciones y ejecución condicional

Objetivos: Introducir las funciones predefinidas y la instrucción if.

Temas:


Suma de horas con minutos

(ver enunciado en clase anterior.)

Obtener datos:

    print("Hora ? ");
    int horas1= readInt();
    print("Minutos ? ");
    int minutos1= readInt();
    print("Hora ? ");
    int horas2= readInt();
    print("Minutos ? ");
    int minutos2= readInt();
Sumar los tiempos: Alternativa 1

    // Sumar hora y minutos por separado
    int horas= horas1+horas2;
    int minutos= minutos1+minutos2;
    // Si minutos >= 60, pasarlos a las horas.
    print("Suma= "); print(horas+minutos/60);
    print(" hrs. "); print(minutos%60); print(" min.");
Sumar los tiempos: Alternativa 2

    // Sumar en minutos
    int minutos= horas1*60+minutos1 + horas2*60+minutos2;
    print("Suma= "); print(minutos/60); print(" hrs. ");
    print(minutos%60); print(" min. ");
Propuesto: Modificar el programa para que sea capaz de sumar horas, minutos y segundos.


Funciones predefinidas

En el lenguaje Java se pueden calcular las funciones matemáticas típicas que vienen en una calculadora. Por ejemplo para calcular el lado de un cuadrado a partir de su área se puede usar la función que calcula la raíz cuadrada:

    double lado= sqrt(area);
En esta instrucción, sqrt(area) es una llamada a una función. Una llamada a función es una forma de expresión aritmética. Su sintaxis general es:

``función''( ``argumentos'')

En donde ``argumentos'' son una o más expresiones separadas por coma. Una llamada a una función se puede colocar en cualquier parte en donde sea válido colocar una expresión.

Una función puede ser por ejemplo:

(Obs. a los profesores: vean sólo algunas de estas funciones. La idea es mostrar la sintaxis.)

Función Significado Ejemplo Valor
sqrt(x) raíz cuadrada sqrt(4.0) 2.0
abs(x) valor absoluto abs(-3.0) 3.0
pow(x,y) x elevado a y pow(2.0, 3.0) 8.0
exp(x) e a la x exp(1.0) 2.71...
log(x) logaritmo natural log(E) 1.0

O puede ser una función trigonométrica:

Función Significado Ejemplo Valor
sin(x) seno sin(PI/2) 1.0
cos(x) coseno sin(PI) -1.0
tan(x) tangente tan(PI/4) 1.0
asin(x) arco seno asin(1.0) PI/2
acos(x) arco coseno asin(-1.0) PI
atan(x) arco tangente atan(1.0) PI/4

O puede ser una función de conversión:

Función Significado Ejemplo Valor
round(x) redondea round(1.5) 2.0
round(1.4) 1.0
floor(x) piso floor(3.9) 3.0
floor(-5.2) -6.0
ceil(x) techo ceil(3.9) 4.0
ceil(-5.2) -5.0

O puede ser una función para calcular el máximo o mínimo:

Función Significado Ejemplo Valor
max(x) máximo max(3.5, 5.2) 5.2
min(x) mínimo min(3.5, 5.2) 3.5

Todas las funciones anteriores operan con números reales (double). La siguiente función toma un número real y devuelve un entero:

Función Significado Ejemplo Valor
trunc(x) convierte trunc(3.9) 3
a entero trunc(-5.2) -5

Ejercicio: Calcular el máximo de 3 números.

    Primer número ? 2.1
    Segundo número ? 8.6
    Tercer número ? -2.0
    El máximo es : 8.6
Solución 1:

    // Leer datos
    print("Primer número ? ");
    double a= readDouble();
    print("Segundo número ? ");
    double b= readDouble();
    print("Tercer número ? ");
    double c= readDouble();
    // Calcular el máximo
    print("El máximo es : ");
    print(max(max(a,b),c);
Los argumentos de una llamada a una función pueden ser el resultado de otra llamada a función.


Ejecución condicional de instrucciones

Motivación: Indicar si una ecuación de segundo grado tiene raíces reales o complejas.

    Coeficiente a ? 1.
    Coeficiente b ? 4.
    Coeficiente c ? 7.
    La ecuación tiene raíces complejas
La idea es que si b*b >= 4*a*c, la ecuación tiene raíces reales, si no, son complejas. Por lo tanto, hay que desplegar mensajes distintos. Hay que ejecutar instrucciones distintas.

    if (b*b >= 4*a*c)
      print("La ecuación tiene raíces reales");
    else
      print("La ecuación tiene raíces complejas");
Sintaxis de if:

    if (``condición'')
      ``instrucción 1''
    else
      ``instrucción 2''
Semántica de if:

La condición sigue la siguiente sintaxis:

``expresión 1'' ``operador relacional'' ``expresión 2''

En donde el operador relacional compara expresiones numéricas y puede ser: >, <, >= (mayor o igual), <= (menor o igual), == (igual) o != (distinto).

Ejercicio: desplegar el máximo entre a y b sin usar max.

Solución incorrecta:

    if (a>b)
      print("El máximo es ");
      print(a);
    else
      print("El máximo es ");
      print(b);
¡Entre if (a>b) y el else solo puede haber una instrucción!


Agrupación de instrucciones

Se puede agrupar instrucciones usando { }:

    { print("El máximo es "); print(a); }
Encerradas entre { }, las dos instrucciones son ahora una sola instrucción compuesta, que se puede colocar en cualquier lugar en donde sea válido colocar una instrucción. La forma general es:

{ ``instrucción 1'' ``instrucción 2'' ... ``instrucción n'' }

Por lo tanto, el máximo se puede escribir como:

    if (a>b) {
      print("El máximo es ");
      print(a);
    }
    else {
      print("El máximo es ");
      print(b);
    }
La cantidad de líneas que ocupe una instrucción es irrelevante.


Tarea:

Complete el programa que calcula las raíces de la ecuación de segundo grado. Cuando la ecuación tiene raíces reales, el diálogo debe ser el siguiente:

Por ejemplo:

    Coef. a ? 1.
    Coef. b ? -3.
    Coef. c ? 2.
    Las raíces son 1.0 y 2.0