1
+ package main
2
+
3
+ import "fmt"
4
+
5
+ type Conjunto struct {
6
+ elementos []string
7
+ }
8
+
9
+ func (c * Conjunto ) añadirElementoFinal (elemento string ) {
10
+ c .elementos = append (c .elementos , elemento )
11
+ }
12
+
13
+ func (c * Conjunto ) añadirElementoInicio (elemento string ) {
14
+ c .elementos = append ([]string {elemento }, c .elementos ... )
15
+ }
16
+
17
+ func (c * Conjunto ) añadirVariosElementosFinal (elementos ... string ) { //...string indica que se pueden pasar un numero variable de "elementos"
18
+ c .elementos = append (c .elementos , elementos ... )
19
+ }
20
+
21
+ func (c * Conjunto ) añadirVariosElementosPosicion (posicion int , elementos ... string ) {
22
+ //c.elementos[:posicion] -> elementos desde el inicio hasta la "posicion", excluyendo la "posicion"
23
+ c .elementos = append (c .elementos [:posicion ], append (elementos , c .elementos [posicion :]... )... )
24
+ //append(elementos, c.elementos[posicion:]...) -> añade los "elementos" al final de "c.elementos" desde la "posicion"
25
+ }
26
+
27
+ func (c * Conjunto ) eliminarElementoPosicion (posicion int ) {
28
+ c .elementos = append (c .elementos [:posicion ], c .elementos [posicion + 1 :]... )
29
+ }
30
+
31
+ func (c * Conjunto ) actualizarElementoPosicion (posicion int , elemento string ) {
32
+ c .elementos [posicion ] = elemento
33
+ }
34
+
35
+ func (c * Conjunto ) comprobarElemento (elemento string ) bool {
36
+ for _ , e := range c .elementos {
37
+ if e == elemento {
38
+ return true
39
+ }
40
+ }
41
+ return false
42
+ }
43
+
44
+ func (c * Conjunto ) eliminarContenido () {
45
+ c .elementos = []string {}
46
+ }
47
+
48
+ func main () {
49
+ conjunto := Conjunto {}
50
+
51
+ conjunto .añadirElementoFinal ("naranja" )
52
+ fmt .Println (conjunto .elementos )
53
+
54
+ conjunto .añadirElementoInicio ("manzana" )
55
+ fmt .Println (conjunto .elementos )
56
+
57
+ conjunto .añadirVariosElementosFinal ("pera" , "kiwi" , "melon" )
58
+ fmt .Println (conjunto .elementos )
59
+
60
+ conjunto .añadirVariosElementosPosicion (2 , "sandia" , "uva" , "mango" )
61
+ fmt .Println (conjunto .elementos )
62
+
63
+ conjunto .eliminarElementoPosicion (3 )
64
+ fmt .Println (conjunto .elementos )
65
+
66
+ conjunto .actualizarElementoPosicion (2 , "fresa" )
67
+ fmt .Println (conjunto .elementos )
68
+
69
+ fmt .Println (conjunto .comprobarElemento ("fresa" ))
70
+ fmt .Println (conjunto .comprobarElemento ("platano" ))
71
+
72
+ conjunto .eliminarContenido ()
73
+ fmt .Println (conjunto .elementos )
74
+
75
+ //Extra:
76
+
77
+ //Unión
78
+ conjunto1 := Conjunto {}
79
+ conjunto1 .añadirVariosElementosFinal ("naranja" , "manzana" )
80
+ conjunto2 := Conjunto {}
81
+ conjunto2 .añadirVariosElementosFinal ("pera" , "uva" )
82
+ conjunto1 .union (conjunto2 )
83
+ fmt .Println ("Union: " , conjunto1 .elementos )
84
+
85
+ //Intersección
86
+ conjunto3 := Conjunto {}
87
+ conjunto3 .añadirVariosElementosFinal ("naranja" , "manzana" , "pera" )
88
+ conjunto4 := Conjunto {}
89
+ conjunto4 .añadirVariosElementosFinal ("pera" , "uva" )
90
+ conjunto3 .interseccion (conjunto4 )
91
+ fmt .Println ("Interseccion: " , conjunto3 .elementos )
92
+
93
+ //Diferencia
94
+ conjunto5 := Conjunto {}
95
+ conjunto5 .añadirVariosElementosFinal ("naranja" , "manzana" , "pera" )
96
+ conjunto6 := Conjunto {}
97
+ conjunto6 .añadirVariosElementosFinal ("pera" , "uva" )
98
+ conjunto5 .diferencia (conjunto6 )
99
+ fmt .Println ("Diferencia: " , conjunto5 .elementos )
100
+
101
+ //Diferencia simétrica
102
+ conjunto7 := Conjunto {}
103
+ conjunto7 .añadirVariosElementosFinal ("naranja" , "manzana" , "pera" )
104
+ conjunto8 := Conjunto {}
105
+ conjunto8 .añadirVariosElementosFinal ("pera" , "uva" )
106
+ conjunto7 .diferenciaSimetrica (conjunto8 )
107
+ fmt .Println ("Diferencia simetrica: " , conjunto7 .elementos )
108
+
109
+ }
110
+
111
+ //Extra:
112
+
113
+ //Unión
114
+ func (c * Conjunto ) union (c2 Conjunto ) {
115
+ for _ , e := range c2 .elementos {
116
+ if ! c .comprobarElemento (e ) {
117
+ c .añadirElementoFinal (e )
118
+ }
119
+ }
120
+ }
121
+
122
+ //Intersección
123
+ func (c * Conjunto ) interseccion (c2 Conjunto ) {
124
+ for i := 0 ; i < len (c .elementos ); i ++ {
125
+ if ! c2 .comprobarElemento (c .elementos [i ]) {
126
+ c .eliminarElementoPosicion (i )
127
+ i --
128
+ }
129
+ }
130
+ }
131
+
132
+ //Diferencia
133
+ func (c * Conjunto ) diferencia (c2 Conjunto ) {
134
+ for i := 0 ; i < len (c .elementos ); i ++ {
135
+ if c2 .comprobarElemento (c .elementos [i ]) {
136
+ c .eliminarElementoPosicion (i )
137
+ i --
138
+ }
139
+ }
140
+ }
141
+
142
+ //Diferencia simétrica
143
+ func (c * Conjunto ) diferenciaSimetrica (c2 Conjunto ) {
144
+ // crear conjuntos temporales/auxiliares
145
+ temp1 := make (map [string ]bool )
146
+ temp2 := make (map [string ]bool )
147
+
148
+ // almacenar los elementos unicos del primer conjunto
149
+ for _ , e := range c .elementos {
150
+ temp1 [e ] = true
151
+ }
152
+
153
+ // almacenar los elementos unicos del segundo conjunto
154
+ for _ , e := range c2 .elementos {
155
+ temp2 [e ] = true
156
+ }
157
+
158
+ // crear un nuevo conjunto para almacenar la diferencia simetrica
159
+ diff := Conjunto {}
160
+
161
+ // agregar elementos que estan en c pero no en c2
162
+ for e := range temp1 {
163
+ if ! temp2 [e ] {
164
+ diff .añadirElementoFinal (e )
165
+ }
166
+ }
167
+
168
+ // agregar elementos que estan en c2 pero no en c
169
+ for e := range temp2 {
170
+ if ! temp1 [e ] {
171
+ diff .añadirElementoFinal (e )
172
+ }
173
+ }
174
+
175
+ // actualizar el conjunto original con la diferencia simetrica
176
+ * c = diff
177
+ }
0 commit comments