Clase 3: Funciones Valeria Herskovic – vherskov@dcc.uchile.cl CC1001 Computación I
Problema Escribir las instrucciones principales de un programa que establezca el diálogo indicado en el siguiente ejemplo: Invertir número entero de 2 dígitos Número a invertir: 56 Número invertido: 65
Solución 1: aritmética enteros public static void main(String args[]) throws IOException{ U.println(“Invertir numero entero de dos digitos”); U.print(“Numero a invertir: “); int aInvertir = U.readInt(); int primerDigito = aInvertir/10; int segundoDigito = aInvertir – primerDigito*10; U.print(“Numero invertido ”+segundoDigito+””+primerDigito);
Solución 2: aritmética reales … U.print(“Numero a invertir: ”); int aInvertir = U.readInt(); int primerDigito = aInvertir/10; int segundoDigito = (int)((aInvertir/10.0 – primerDigito)*10); U.print(“Numero invertido : ”); U.print(segundoDigito+””+primerDigito);
Solución 3: con % … U.print(“Numero a invertir: ”); int aInvertir = U.readInt(); int primerDigito = aInvertir/10; int segundoDigito = aInvertir%10; U.print(“Numero invertido : ”); U.print(segundoDigito+””+primerDigito);
Propuesto Obtener una fecha (por ej: 20070308) y escribirla de la forma 08/03/2007.
Problema Escribir las instrucciones principales de un programa que establezca el siguiente diálogo: Perímetro y área de triángulo de lados a, b, c a ? ___ b ? ___ c ? ___ Perimetro = N° Area = N° Nota. El área se calcula como s(s-a)(s-b)(s-c) con s=a+b+c (semi-perímetro) 2
Solución U.println(“Perimetro y área de triángulo de lados a, b, c"); //obtener lados double a = U.readDouble(“a?”); double b = U.readDouble(“b?”); double c = U.readDouble(“c?”); //calcular y mostrar perimetro y area U.println(“Perimetro = ”+(a+b+c)); double s= (a+b+c)/2; U.println("Area = "+Math.sqrt(s*(s-a)*(s-b)*(s-c))); o U.println("Area = "+Math.pow(s*(s-a)*(s-b)*(s-c),0.5));
Uso (invocación) de métodos (funciones) predefinidas Ejemplos Math.sqrt(s*(s-a)*(s-b)*(s-c)) Math.pow (s*(s-a)*(s-b)*(s-c), 0.5) Sintaxis Math.nombre(argumentos) ¿argumentos? cero o más expresiones aritméticas (separadas por comas) Semántica 1° evaluar argumentos. Ejemplo: s*(s-a)*(s-b)*(s-c) 2° evaluar función (método) con/en valores de argumentos 3° recibir resultado de la función (en el lugar o punto de invocación)
Funciones predefinidas en el lenguaje Java (métodos de clase predefinida Math) función significado ejemplo resultado sqrt(x) x, x 0 sqrt(4.0) 2.0 pow(x,y) xy pow(2.0,3.0) 8.0 exp(x) ex exp(1.0) 2.71... log(x) logex log(Math.E) 1.0 sin(x) seno de angulo x sin(Math.PI) 0.0 cos(x) coseno de x cos(Math.PI) -1.0 tan(x) tangente de x tan(Math.PI) asin(x) arco-seno de x asin(1.0) Π/2 acos(x) arco-coseno x acos(1.0) atan(x) arco-tangente x atan(0.0) todas las funciones reciben y entregan un double un argumento double admite un int (int es asignable a double)
Funciones predefinidas en el lenguaje Java (métodos de clase Math) función significado arg result ejemplo abs(x) |x| int double abs(-3) abs(-3.0) 3 3.0 max(x,y) mayor entre x e y max(4, 6) max(4.1, 6.5) 6 6.5 min(x,y) menor entre min(4, 6) min(4.1, 6.5) 4 4.1 random() Nº al azar en [0,1[ random( ) 0.x....
Problema Ordenar dos reales entre 0 y 9 generados al azar Ej: Números = 7 3 Ordenados = 3 7
Problema Ordenar dos reales entre 0 y 9 generados al azar Ej: Números = 7 3 Ordenados = 3 7 //generar nº reales en rango [0,1[: 0.dd… double a=Math.random(), b=Math.random(); //generar enteros en rango [0,9] (de un dígito) int i=(int)(10*a), j=(int)(10*b); U.println(“Numeros= “ + i + “ “ + j); //ordenar dos enteros U.println(“Ordenados= “+ Math.min(i,j) + “ “ + Math.max(i,j));
Problema (10 min) Escribir las instrucciones principales de un programa que establezca el diálogo indicado en el siguiente ejemplo: Ordenar 3 enteros entre 1 y 100 generados al azar Numeros = 73 8 46 Ordenados = 8 46 73 Indicación. Si multiplica por 100 el Nº real 0.x1x2x3... (ej: 0.734...) que entrega la función random() obtendrá un número de la forma x1x2.x3.... (ej:73.4...). De la parte entera del resultado, usando coerción (int)(expresión), se puede obtener un Nº entero de 2 dígitos (valor entre 00 y 99). Sumando uno se obtiene un número entre 1 y 100.
Solución 1 //generar al azar 3 enteros entre 1 y 100 int a = (int)(Math.random()*100) + 1, b = (int)(Math.random()*100) + 1, c = (int)(Math.random()*100) + 1; U.println("Numeros="+a+" "+b+" "+c); //obtener 2º restando el menor y el mayor a suma de los 3 int mayor = Math.max(Math.max(a,b),c), menor = Math.min(Math.min(a,b),c), medio = a + b + c - menor - mayor; U.println("Ordenados="+ menor+" "+medio+" "+mayor);
Soluciones 2 y 3 Sol. 2: obtener 2º como el menor de los ganadores (de los 3 “partidos” entre dos números) int medio = Math.min(Math.max(a,b), Math.min(Math.max(a,c),Math.max(b,c))); Sol. 3: obtener 2º como el mayor de los perdedores int medio = Math.max(Math.min(a,b),Math.max(Math.min(a,c),Math.min(b,c)));
Solución 4: ordenar dos primeros, y después considerar 3º int minab = Math.min(a,b), maxab = Math.max(a,b); int menor = Math.min(minab,c), aux = Math.max(minab,c); int medio = Math.min(aux,maxab), mayor = Math.max(aux,maxab);
Solución 5 Con funciones (métodos) definidos por el programador class Ordenar3{ static public void main(String[]args) { U.println(“Ordenar 3 numeros “ + “entre 1 y 100 generados al azar”); int a=azar(1,100),b=azar(1,100),c=azar(1,100); U.println("Numeros="+a+" "+b+" "+c); U.println("Ordenados = " + minimo(a,b,c) + " “ + medio(a,b,c) + " " + maximo(a,b,c)); }
Solución 5 (continúa) static public int azar(int x,int y){ return x + (int)(Math.random()*(y-x+1)); } static public int minimo(int x,int y,int z){ return Math.min(Math.min(x,y),z); static public int maximo(int x,int y,int z){ return Math.max(Math.max(x,y),z); static public int medio(int x,int y,int z){ return x+y+z - minimo(x,y,z) -maximo(x,y,z); }//fin de la clase Ordenar3
Funciones definidas por el programador sintaxis static public tipo-resultado nombre(parámetros) { instrucciones return expresión; } ¿parámetros? tipo nombre, ... semántica 1º copiar (asignar) argumentos de llamada en parámetros 2º ejecutar las instrucciones 3º devolver valor de la expresión (del tipo-resultado) en el punto de invocación (uso)
Propuestos 1. Ordenar 4 números generados al azar. Indicación. Ordene los 3 primeros y en seguida determine el lugar del 4º. 2. Escribir la función : static public int mayor(int x,int y) sin usar la función Math.max ni Math.min