-
Notifications
You must be signed in to change notification settings - Fork 2
/
ejemplo-objeto.g
85 lines (69 loc) · 2.54 KB
/
ejemplo-objeto.g
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
DeclareRepresentation("EsFraccionRep", IsAttributeStoringRep, []);
DeclareCategory( "EsFraccion", EsFraccionRep and IsAdditiveElement);
TipoFraccion:=NewType(NewFamily("FamiliaFracciones"), EsFraccion);
DeclareAttribute("Numerador", EsFraccion);
DeclareAttribute("Denominador", EsFraccion);
DeclareOperation("Simplifica", [EsFraccion]);
DeclareProperty("EsPositivo", EsFraccion);
DeclareProperty("EsNoNegativo", EsFraccion);
Fraccion:=function(a,b)
local r;
if not(IsInt(a)) then
Error("El primer argumento debe ser un entero");
fi;
if not(IsInt(b)) or (b=0) then
Error("El segundo argumento debe ser un entero no nulo");
fi;
r:=Objectify(TipoFraccion, rec());
SetNumerador(r,a);
SetDenominador(r,b);
return r;
end;
InstallMethod(EsPositivo, "es positivo para fracciones", [EsFraccion],
function(x)
return Numerador(x)*Denominador(x)>0;
end);
InstallMethod(EsNoNegativo, "es positivo para fracciones", [EsFraccion],
function(x)
return Numerador(x)*Denominador(x)>=0;
end);
InstallTrueMethod(EsNoNegativo, EsPositivo);
InstallMethod(Simplifica, "simplificación para fracciones", [EsFraccion],
function(x)
local s, d;
d:=Gcd(Numerador(x),Denominador(x));
return Fraccion(Numerador(x)/d,Denominador(x)/d);
end);
InstallMethod(\=, "igualdad para fracciones", [EsFraccion, EsFraccion],
function(x,y)
return Numerador(x)*Denominador(y)=Numerador(y)*Denominador(x);
end);
InstallMethod(\+, "suma de fracciones", [EsFraccion, EsFraccion],
function(x,y)
return Simplifica(Fraccion(Numerador(x)*Denominador(y)+ Numerador(y)*Denominador(x),Denominador(x)*Denominador(y)));
end);
InstallMethod(Display, "mostrar racionales", [EsFraccion],
function(x)
local l,s,i;
l:=Maximum(Length(String(Numerador(x))),Length(String(Denominador(x))));
s:="";
for i in [1..l] do
Append(s,"-");
od;
Print(Numerador(x),"\n");
Print(s,"\n");
Print(Denominador(x),"\n");
return;
end);
InstallMethod(ViewString, "mostrar fracciones", [EsFraccion],
function(x)
return Concatenation(String(Numerador(x))," / ",String(Denominador(x)));
end);
InstallMethod(String, "fracciones a cadenas", [EsFraccion],
function(x)
return Concatenation(String(Numerador(x)),"/",String(Denominador(x)));
end);
#InstallMethod(PrintString, "mostrar fracciones", [EsFraccion],
# function(x)
# return Concatenation("El racional ",String(Numerador(x))," / ",String(Denominador(x)));
#end);