Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



Mostrando entradas con la etiqueta funciones. Mostrar todas las entradas
Mostrando entradas con la etiqueta funciones. Mostrar todas las entradas

viernes, 1 de abril de 2016

Función para saber si un número es potencia de dos: Uso de And Lógico


Función para saber si un número es potencia de dos:
 Uso de And Lógico




Voy a explicaros la siguiente función, que nos devuelve si un número dado es una potencia del número 2 o no.

[JAVASCRIPT]
b2Math.b2IsPowerOfTwo = function(x)
    {
        var result = x > 0 && (x & (x - 1)) == 0;
        return result;
    };

[GAMBAS3]
Private Function function_2(x As Integer) As boolean

  Dim result As boolean = false
  
   If (x > 0) And ((x And (x - 1)) = 0) Then result = 1
    
   Return result

End



Esta función hace lo siguiente:
1) Le pasamos un "x" que es un número integer
2) Hacemos dos comprobaciones: Si...... Y  ... entonces
2.1)(x > 0):  Si x es mayor que 0
2.2) ((x And (x - 1)) = 0): Si x y (x-1) es igual a 0
Esta segunda parte de la expresión que se debe de comprobar es muy interesante, ya que esta trabajando con la tabla lógica de AND y el valor de los número en formato Binario.

Lo explico mejor con un ejemplo:

1) Funcion_2(8)
Vamos a comprobar si el nº 8  es una potencia de 2.

Para ello la 1º condición (2.1) se cumple (es mayor que cero),

Para la segunda condición (2.2) hacemos lo siguiente:

    a) x: El número 8 es en binario: 1000
    b) x-1: El número 8-1 que es 7 en binario es 0111

Hacemos la comprobación AND con los dos número



Como 0 es igual a 0, entonces le cumple.

Por lo tanto, el resultado de la función pasando le el parámetro 8, es verdadero, y el número es una potencia de dos.



1) Funcion_2(6)
Vamos a hacer la comprobación con el número 6
Para ello la 1º condición (2.1) se cumple (es mayor que cero),

Para la segunda condición (2.2) hacemos lo siguiente:

    a) x: El número 6 es en binario: 110
    b) x-1: El número 6-1 que es 5 en binario es 101

Hacemos la comprobación AND con los dos número


Como 4 no es igual a 0, entonces no se cumple.
Por lo tanto la función devuelve FALSE, indicando que ese número (el 6) no es potencia de  2.



Anexo: 
Tabla lógica de AND
Tabla lógica de AND



Nota:
03/04/2016: Gracias a Shell por avisar de un fallo en el artículo. Ya esta corregido



lunes, 14 de septiembre de 2015

Gambas: Funciones que devuelven varios tipos de datos




Gambas: Funciones que devuelven varios tipos de datos




En programación, una función es un grupo de instrucciones con un objetivo en particular y que se ejecuta al ser llamada desde otra función o procedimiento. Una función puede llamarse múltiples veces e incluso llamarse a sí misma (función recurrente).
Las funciones pueden recibir datos desde afuera al ser llamadas a través de los parámetros y deben entregar un resultado.
Se diferencian de los procedimientos porque estos no devuelven un resultado.
Definición de función:

[ FAST ] [ STATIC ] { PUBLIC | PRIVATE } { FUNCTION | PROCEDURE | SUB }
Identifier ( [ [ BYREF ] Parameter AS Datatype [ , ... ] ] [ , ]
[ OPTIONAL [ BYREF ] Optional Parameter AS Datatype [ , ... ] ] [ , ] [ ... ]
) AS Datatype ...
END 

Ejemplo de función típica:

public function dividir(a as integer, b as integer) as single 'esta función divide a/b y devuelve el resultado.
return  a/b
end


Uso de esta función:
...
dim resultado as single
....
resultado=dividir(1345,2)
print "resultado de la división: ",resultado
...

Funciones que devuelven varios tipos de datos a la vez:
Podemos hacer que en vez de devolver un solo tipo de datos devuelva más información,por ejemplo, si la función ha podido realizar su trabajo correctamente que devuelva TRUE (verdadero) y el resultado, y si no ha podido realizar el trabajo (por ejemplo ha dividido entre cero), devuelva esta información FALSE

Para ello lo que tenemos que decir el que el tipo de dato que devuelva, sea tipo Variant[], que es un array de cualquier tipo de dato, el primer dato puede ser True o False, y el segundo seria el resultado de la operacion


public function dividir(a as integer, b as integer) as variant[]
if b=0 then
 return [false,0]'devuelve que no ha podido realizar la operación
else
return [true,a/b] 'operación realizada con exito, devuelve el resultado.
endif
end


Para la lectura de la informacion donde estemos usando esta función se haría del siguiente modo:
....
Dim resultado as variant[]
...
...
resultado=dividir(123,3)
...
if resultado[0]=true then
print "Resultado de la división es...";resultado[1]
end
if resultado[]=false then
print "No he podido dividir, ya que el divisor es 0"
endif
....






Enlaces:
http://gambaswiki.org/wiki/lang/function
http://gambaswiki.org/wiki/lang/methoddecl

domingo, 9 de diciembre de 2012

Clases: Buscar e Interpolar lineal




 Clases: Buscar e Interpolar lineal










Haciendo operaciones con la hoja de calculo, he visto varias funciones interesantes, por ejemplo buscarV ( ejemplo ) y he realizado 2 clases para hacer algo parecido:


- BuscarV
Dado una lista de dos columnas, buscar un valor en la primera columna y devolver el valor de la segunda columna.

Por ejemplo con los datos anteriores, si la calificación es 5, devuelve "Suficiente", si le ponemos 8.5 devuelve "Notable" (porque esta entre el 8 y el 9)


- Interpolar
Dado una lista de valores de X e Y, dado un valor X' obtener el valor interpolado linealmente de Y'
En la gráfica, podemos ver la lista de valores, y el valor de X' (9.5) y el Y' obtenido: 125


Las clases tienen un método que facilita la introducción de la lista de valores:
Definida:
 Public Sub add(valorB As Float, valorC As Float)

Ejemplo de uso:
  lista.add(0, 10)
  lista.add(1, 20)
  lista.add(2, 30)
  ...

Y para calcular..
Ybuscada=lista.InterpolacionLineal(Xvalor)


Enlaces de descarga: buscarV y InterpolacionLineal