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:



martes, 28 de junio de 2011

Gambas2 y OOP Trabajando con clases (01) Practica 5a

Con el lenguaje Gambas2 (y mucho más Gambas3) podemos hacer tanto programas siguiendo el patrón de programación Estructurada como del tipo Orientados a Objeto.

Este es un ejemplo de como se trabaja (es un ejercicio muy  simple) con clases en gambas2.

Este es el ejercicio que hay que realizar:

Desarrollar una clase llamada Punto que:
Tenga dos atributos private de tipo double.
Tenga un constructor con dos parámetros de tipo double que inicialice los dos atributos.
Tenga un constructor por defecto (sin parámetros) que inicialice los dos atributos al valor que se quiera.
Tenga un getter para cada uno de los atributos.
Tenga un método calcularDistanciaDesde que recibe un parámetro de tipo Punto y que devuelve un double.
 
Desarrollar una clase llamada Circulo que:
Tenga dos atributos private de tipo Punto y double.
Tenga un constructor con dos parámetros de tipo Punto y double que inicialice los dos atributos.
Tenga un constructor por defecto (sin parámetros) que inicialice los dos atributos al valor que se quiera.
Tenga un constructor con tres parámetros de tipo double que inicialice los dos atributos.
Tenga un getter para cada uno de los atributos.
Tenga un método calcularDistanciaDesde que recibe un parámetro de tipo Punto y que devuelve un double.
Tenga un método calcularArea que no recibe ningún parámetro y devuelve un double.
Tenga un método calcularPerimetro que no recibe ningún parámetro y devuelve un double.
 
Desarrollar una clase llamada Triangulo que:
Tenga tres atributos private de tipo Punto.
Tenga un constructor con tres parámetros de tipo Punto que inicialice los dos atributos.
Tenga un constructor por defecto (sin parámetros) que inicialice los tres atributos al valor que se quiera.
Tenga un constructor con seis parámetros de tipo double que inicialice los tres atributos.
Tenga un getter para cada uno de los atributos.
Tenga un método calcularDistanciaDesde que recibe un parámetro de tipo Punto y que devuelve un double.
Tenga un método calcularArea que no recibe ningún parámetro y devuelve un double.
Tenga un método calcularPerimetro que no recibe ningún parámetro y devuelve un double.
 
Desarrollar una clase llamada Practica5a que en su método main: (sustituido por un fmain en gambas)
Cree e inicialice dos objetos de la clase Punto y muestre la distancia entre ambos.
Cree un objeto de la clase Circulo y muestre su área, perímetro y distancia a uno de los dos puntos creados al comienzo.
Cree un objeto de la clase Triangulo y muestre su área, perímetro y distancia a un nuevo punto.
Nota 1: No seremos rigurosos con las matemáticas y supondremos que los triángulos siempre son rectángulos.


Codigo fuente: Clase Punto


' Gambas class file
'atributos
PRIVATE x AS Float = 0
PRIVATE y AS Float = 0

'constructor1
PUBLIC FUNCTION PuntoInicial() AS Punto
x = 2.2
y = 0
END

'constructor2
PUBLIC FUNCTION Punto(param1 AS Float, param2 AS Float) AS punto
x = param1
y = param2
END


'getters
PUBLIC FUNCTION getX() AS Float
RETURN x
END

PUBLIC FUNCTION getY() AS Float
RETURN y
END



PUBLIC FUNCTION calcularDistancia(param AS Punto) AS Float
DIM cateto1 AS Float
DIM cateto2 AS Float
DIM hipotenusa AS Float
cateto1 = x - param.getX()
cateto2 = y - param.getY()
hipotenusa = Sqr(cateto1 ^ 2 + cateto2 ^ 2)
RETURN hipotenusa
END


Clase Circulo

' Gambas class file
' Gambas module file
'atributos
PRIVATE centro AS NEW Punto
PRIVATE radio AS Float = 0



'constructor1
PUBLIC FUNCTION Circulo(param AS Punto, param2 AS Float) AS Circulo
centro = param
radio = param2
END

'conseguir datos
PUBLIC FUNCTION getCentro() AS Punto
RETURN centro
END

PUBLIC FUNCTION getRadio() AS Float
RETURN radio
END


PUBLIC FUNCTION calcularArea() AS Float
RETURN 3.141592 * radio * radio
END


PUBLIC FUNCTION calcularPerimetro() AS Float
RETURN 2 * 3.141592 * radio
END


PUBLIC FUNCTION calcularDistanciaDesde(p AS Punto) AS Float
RETURN centro.calcularDistancia(p)
END


Clase Triangulo

'atributos
PRIVATE p1 AS NEW Punto
PRIVATE p2 AS NEW Punto
PRIVATE p3 AS NEW Punto

'constructor 1
PUBLIC FUNCTION trianguloP(param1 AS Punto, param2 AS Punto, param3 AS Punto) AS Triangulo
p1 = param1
p2 = param2
p3 = param3
END


'constructor2
PUBLIC FUNCTION trianguloXY(x1 AS Float, y1 AS Float, x2 AS Float, y2 AS Float, x3 AS Float, y3 AS Float) AS Triangulo
DIM p AS NEW Punto
p1 = p.Punto(x1, y1)
p2 = p.Punto(x2, y2)
p3 = p.Punto(x3, y3)
END

'getters
PUBLIC FUNCTION getP1() AS Punto
RETURN p1

END

PUBLIC FUNCTION getP2() AS Punto
RETURN p2

END
PUBLIC FUNCTION getP3() AS Punto
RETURN p3

END

PUBLIC FUNCTION calcularArea() AS Float

DIM base AS Float
DIM altura AS Float
base = p1.calcularDistancia(p2)
altura = p1.calcularDistancia(p3)
RETURN base * altura / 2
END

PUBLIC FUNCTION calcularPerimetro() AS Float
DIM lado1 AS Float
DIM lado2 AS Float
DIM lado3 AS Float
lado1 = p1.calcularDistancia(p2)
lado2 = p2.calcularDistancia(p3)
lado3 = p3.calcularDistancia(p1)
RETURN lado1 + lado2 + lado3
END


PUBLIC FUNCTION calcularDistancia(param AS punto) AS Float
RETURN p1.calcularDistancia(param)
END




Clase Main / lo he sustituido por un Fmain para generar la salida grafica

' Gambas class file

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()
DIM a AS NEW Punto
DIM b AS NEW Punto
DIM distancia AS Float
DIM c AS NEW Circulo
DIM t AS NEW triangulo

DIM punto_aux AS NEW Punto

b.Punto(1.1, 42.3)
a.PuntoInicial()



distancia = a.calcularDistancia(b)

TextArea1.text = "Distancia entre punto A al B es:" & Str$(distancia) & "\n"



c.Circulo(a, 5)
TextArea1.text &= "Circulo:\n"
TextArea1.text &= "Area es: " & Str(c.calcularArea()) & "\n"
TextArea1.text &= "El perimetro es: " & Str(c.calcularPerimetro()) & "\n"
TextArea1.text &= "La distancia entre b y el centro del circulo c: " & Str(b.calcularDistancia(c.getCentro())) & "\n"

punto_aux.Punto(7.3, 1.9)
t.trianguloP(a, b, punto_aux)
TextArea1.text &= "Triangulo:\n"
TextArea1.text &= "El area es:" & Str$(t.calcularArea()) & "\n"
TextArea1.text &= "El perimetro es: " & Str(t.calcularPerimetro()) & "\n"

punto_aux.Punto(8, 9)
TextArea1.text &= "La distancia entre un vertice del triangulo al punto 8.0,9.0: " & Str(t.calcularDistancia(punto_aux)) & "\n"
END                                                                                                                                         
Esta es la salida que genera:

Si comparamos el código de gambas con el java, existen varias diferencias. Por ejemplo gambas no admiten diferentes métodos de  constructores con el mismo nombre en una misma clase.  Yo los he definido cambiando el nombre. (por ejemplo: trianguloP y trianguloXY ), para admitir los parámetros de puntos o parámetros de coordenadas.
También a lo hora de crear los objetos varia entre los dos lenguajes:

java
gambas2
Punto b = new Punto(1.1,42.3)
Punto a= new Punto()
dim a as New Punto
dim b as New Punto
 b.Punto(1.1, 42.3)
 a.PuntoInicial()

Bueno espero que os sea de interés. Saludos


Nota:
-Descarga del código fuente:
http://manualjsb.googlecode.com/files/ejercicio5a-0.0.1.tar.gz
-Este ejercicio inicialmente están  hecho en java, tomados de las páginas webs: http://jmordax.com/practicas.html
http://www.ctr.unican.es/asignaturas/pp/#Practicas

- Referencia: Libro en preparación de Fabián Flores Vadell: Cómo programar con Gambas