Una clase con funciones estáticas

prev.gif (997 bytes)chapter.gif (1105 bytes)home.gif (1054 bytes)next.gif (998 bytes)

Clases y objetos

El valor absoluto de un número

La potencia de exponente entero de un número entero

El factorial de un número

Determinar si un número es o no primo

La clase Matematicas

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.

disco.gif (1035 bytes)mates: Matematicas.java, MatesApp.java

 

El valor absoluto de un número.

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;
    }


La potencia de exponente entero de un número entero

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)*3
(1*3)*3
(1*3*3)*3
(1*3*3*3)*3
(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;
}


El factorial de un número

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);


Determinar si un número es o no primo

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;
    }


La clase Matematicas

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){
	//...
    }
}

 

Llamada a las funciones miembro

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));