lunes, 17 de agosto de 2015

Una clase con funciones estaticas

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.

El valor absoluto de un número.

  • Nombre de la función: absoluto
  • Parámetros: un entero
  • Devuelve: un número entero positivo.
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

  • Nombre de la función: potencia
  • Parámetros: la base y el exponente, ambos enteros
  • Devuelve: el resultado, un número del tipo long.
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ónvalor 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

  • Nombre de la función: factorial
  • Parámetros: un entero int
  • Devuelve: el resultado, un número positivo del tipo long.
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

  • Nombre de la función: esPrimo
  • Parámetros: un entero int
  • Devuelve: true o false, un dato del tipo boolean
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
  • un número par no es primo, excepto el 2
  • un número impar es primo si no es divisible por los números impares comprendidos entre 1 y numero/2
            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(...);
  • Hallar el número combinatorio m sobre n
    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);
  • Encontrar los números primos comprendidos entre 100 y 200
        for(int num=100; num<200; num++){
            if(Matematicas.esPrimo(num)){
                System.out.print(num+" - ");
            }
        }
  • Hallar la potencia de un número entero
        System.out.print("La potencia 5 elevado a 4 ");
        System.out.print("vale "+Matematicas.potencia(5, 4));
  • Hallar el valor absoluto de un número
        double y=-2.5;
        System.out.print("El valor absoluto de "+y);
        System.out.println(" vale "+Matematicas.absoluto(y));

No hay comentarios:

Publicar un comentario