![]() ![]() ![]() ![]() |
Clases y objetos |
El valor absoluto de un número
La potencia de exponente entero de un número entero
Determinar si un número es o no primo
Llamada a las funciones miembro
El propósito de este capítulo es definir un conjunto de funciones estáticas dentro de una clase denominada Matematicas. Al definir el concepto de clase estudiamos las funciones miembro o métodos. En esta página, vamos a ver cómo se define una función para realizar una determinada tarea.
Se deberá tener en cuenta que no se puede usar una variable de instancia por una función estática. Por ejemplo
class UnaClase{ int i=0; static void funcion(){ System.out.println(i); } //otras funciones miembro }
Al compilar se produce un error ya que la variable i es de instancia y no se puede usar en un contexto estático. El lector puede probar esto con cualquier clase que describe una aplicación. Declara una variable de instancia en la clase y la trata de usar en la función estática main.
mates:
Matematicas.java, MatesApp.java
El valor absoluto de un número x es x si el número es positivo y -x si el número es negativo. Una función absoluto que calcula el valor absoluto de un número recibirá el dato del número, y devolverá el valor absoluto del mismo. Supongamos que dicho dato es entero, la definición de la función será:
int absoluto(int x){ int abs; if(x>0) abs=x; else abs=-x; return abs; }
Podemos simplificar el código sin necesidad de declarar una variable temporal abs.
int absoluto(int x){ if(x>0) return x; else return -x; }
O bien,
int absoluto(int x){ if(x>0) return x; return -x; }
Una función similar nos hallará el valor absoluto de un dato de tipo double.
double absoluto(double x){ if(x<0) return -x; return x; }
Para hallar la potencia de un número se multiplica tantas veces la base como indica el exponente. Por ejemplo, para hallar la quinta potencia de 3, se escribirá
35=3*3*3*3*3
Podemos realizar este producto en un bucle for, de manera que en la variable resultado se vaya acumulando el resultado de los sucesivos productos, tal como se recoge en la Tabla, entre paréntesis figura el valor de resultado en la iteración previa, el valor inicial es 1.
iteración | valor de resultado |
1ª | (1)*3 |
2ª | (1*3)*3 |
3ª | (1*3*3)*3 |
4ª | (1*3*3*3)*3 |
5ª | (1*3*3*3*3)*3 |
long resultado=1; for(int i=0; i<5; i++) resultado*=3;
El siguiente paso es la generalización del proceso a un exponente positivo cualquiera y a una base entera cualesquiera. La variable resultado es de tipo long, porque al hallar la potencia de un número entero se puede sobrepasar el rango de dichos números.
long resultado=1; for(int i=0; i<exponente; i++) resultado*=base;
Por último, le pondremos una etiqueta a esta tarea, asociaremos esta rutina al nombre de una función.
long potencia(int base, int exponente){ long resultado=1; for(int i=0; i<exponente; i++){ resultado*=base; } return resultado; }
Como ejemplos de los sentencias iterativas for y while ya tuvimos la ocasión de calcular el factorial de un número. Ahora se trata de poner las líneas de código dentro de una función para que pueda ser reutilizada.
long resultado=1; while(numero>0){ resultado*=numero; numero--; }
Es mucho más lógico definir una función que calcule el factorial del número num,
long factorial(int num){ long resultado=1; while(num>0){ resultado*=num; num--; } return resultado; }
que repetir tres veces el código del cálculo del factorial para hallar el número combinatorio m sobre n, de acuerdo a la siguiente fórmula.
El numerador y el denominador del número combinatorio m sobre n se obtiene del siguiente modo:
long num=factorial(m); long den=factorial(n)*factorial(m-n);
Como ejemplos de los sentencias iterativas for y break ya tuvimos la ocasión de calcular los números primos comprendidos entre 3 y 100. Recuérdese que
boolean bPrimo=true; for(int i=3; i<numero/2; i+=2){ if(numero%i==0){ bPrimo=false; break; } }
Ahora, se trata de poner las líneas de código dentro de una función que determine si un número es primo (devuelve true) o no es primo (devuelve false), para que pueda ser reutilizada. El código de la función esPrimo es la siguiente
boolean esPrimo(int numero){ if(numero==2) return true; if(numero%2==0) return false; boolean bPrimo=true; for(int i=3; i<numero/2; i+=2){ if(numero%i==0){ bPrimo=false; break; } } return bPrimo; }
Podemos ahorrarnos la variable bPrimo, escribiendo la función esPrimo de la siguiente forma equivalente
boolean esPrimo(int numero){ if((numero!=2)&&(numero%2==0)) return false; for(int i=3; i<numero/2; i+=2){ if(numero%i==0){ return false; } } return true; }
Ahora solamente nos queda poner todas las funciones en el interior de una clase que le llamaremos Matematicas, anteponiéndole a cada una de las funciones la palabra reservada static.
public class Matematicas { static long factorial(int num){ //... } static long potencia(int base, int exponente){ //... } static boolean esPrimo(int numero){ //... } static double absoluto(double x){ //... } static int absoluto(int x){ //... } } |
Para llamar a las funciones miembro se escribe
Nombre_de_la_clase.función_miembro(...);
int m=8, n=3; System.out.print("El número combinatorio "+m +" sobre "+ n); long numerador=Matematicas.factorial(m); long denominador=Matematicas.factorial(m-n)*Matematicas.factorial(n); System.out.println(" vale "+numerador +" / "+ denominador);
for(int num=100; num<200; num++){ if(Matematicas.esPrimo(num)){ System.out.print(num+" - "); } }
System.out.print("La potencia 5 elevado a 4 "); System.out.print("vale "+Matematicas.potencia(5, 4));
double y=-2.5; System.out.print("El valor absoluto de "+y); System.out.println(" vale "+Matematicas.absoluto(y));