Skip to content

Commit e34fa81

Browse files
authored
Merge pull request mouredev#4834 from hectorio23/hectorio23
#27 - C++
2 parents 5fb8c9f + 0f96733 commit e34fa81

File tree

3 files changed

+272
-0
lines changed

3 files changed

+272
-0
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// Autor: Héctor Adán
2+
// GitHub: https://github.com/hectorio23
3+
4+
#include <iostream>
5+
#include <unordered_map>
6+
#include <memory>
7+
#include <cmath>
8+
9+
/*
10+
* EJERCICIO:
11+
* Explora el "Principio SOLID Abierto-Cerrado (Open-Close Principle, OCP)"
12+
* y crea un ejemplo simple donde se muestre su funcionamiento
13+
* de forma correcta e incorrecta.
14+
*
15+
* DIFICULTAD EXTRA:
16+
* Desarrolla una calculadora que necesita realizar diversas operaciones matemáticas.
17+
* Requisitos:
18+
* - Debes diseñar un sistema que permita agregar nuevas operaciones utilizando el OCP.
19+
* Instrucciones:
20+
* 1. Implementa las operaciones de suma, resta, multiplicación y división.
21+
* 2. Comprueba que el sistema funciona.
22+
* 3. Agrega una quinta operación para calcular potencias.
23+
* 4. Comprueba que se cumple el OCP.
24+
*/
25+
26+
class Operacion {
27+
public:
28+
virtual double calcular(double a, double b) const = 0;
29+
virtual ~Operacion() = default;
30+
};
31+
32+
class Suma : public Operacion {
33+
public:
34+
double calcular(double a, double b) const override {
35+
return a + b;
36+
}
37+
};
38+
39+
class Resta : public Operacion {
40+
public:
41+
double calcular(double a, double b) const override {
42+
return a - b;
43+
}
44+
};
45+
46+
class Multiplicacion : public Operacion {
47+
public:
48+
double calcular(double a, double b) const override {
49+
return a * b;
50+
}
51+
};
52+
53+
class Division : public Operacion {
54+
public:
55+
double calcular(double a, double b) const override {
56+
if (b == 0) {
57+
throw std::invalid_argument("División por cero");
58+
}
59+
return a / b;
60+
}
61+
};
62+
63+
class Potencia : public Operacion {
64+
public:
65+
double calcular(double a, double b) const override {
66+
return std::pow(a, b);
67+
}
68+
};
69+
70+
class Calculadora {
71+
private:
72+
std::unordered_map<char, std::unique_ptr<Operacion>> operaciones;
73+
74+
public:
75+
void agregarOperacion(char simbolo, std::unique_ptr<Operacion> operacion) {
76+
operaciones[simbolo] = std::move(operacion);
77+
}
78+
79+
double calcular(char operacion, double a, double b) const {
80+
auto it = operaciones.find(operacion);
81+
if (it != operaciones.end()) {
82+
return it->second->calcular(a, b);
83+
} else {
84+
throw std::invalid_argument("Operación no soportada");
85+
}
86+
}
87+
};
88+
89+
int main() {
90+
Calculadora calc;
91+
calc.agregarOperacion('+', std::make_unique<Suma>());
92+
calc.agregarOperacion('-', std::make_unique<Resta>());
93+
calc.agregarOperacion('*', std::make_unique<Multiplicacion>());
94+
calc.agregarOperacion('/', std::make_unique<Division>());
95+
calc.agregarOperacion('^', std::make_unique<Potencia>());
96+
97+
std::cout << "[+] - Suma: " << calc.calcular('+', 5, 3) << std::endl;
98+
std::cout << "[+] - Resta: " << calc.calcular('-', 5, 3) << std::endl;
99+
std::cout << "[+] - Multiplicación: " << calc.calcular('*', 5, 3) << std::endl;
100+
std::cout << "[+] - División: " << calc.calcular('/', 5, 3) << std::endl;
101+
std::cout << "[+] - Potencia: " << calc.calcular('^', 5, 3) << std::endl;
102+
103+
return 0;
104+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// Autor: Héctor Adán
2+
// GitHub: https://github.com/hectorio23
3+
4+
"use strict";
5+
6+
/*
7+
* EJERCICIO:
8+
* Explora el "Principio SOLID Abierto-Cerrado (Open-Close Principle, OCP)"
9+
* y crea un ejemplo simple donde se muestre su funcionamiento
10+
* de forma correcta e incorrecta.
11+
*
12+
* DIFICULTAD EXTRA:
13+
* Desarrolla una calculadora que necesita realizar diversas operaciones matemáticas.
14+
* Requisitos:
15+
* - Debes diseñar un sistema que permita agregar nuevas operaciones utilizando el OCP.
16+
* Instrucciones:
17+
* 1. Implementa las operaciones de suma, resta, multiplicación y división.
18+
* 2. Comprueba que el sistema funciona.
19+
* 3. Agrega una quinta operación para calcular potencias.
20+
* 4. Comprueba que se cumple el OCP.
21+
*/
22+
23+
class Operacion {
24+
calcular(a, b) {
25+
throw new Error('Método calcular debe ser implementado');
26+
}
27+
}
28+
29+
class Suma extends Operacion {
30+
calcular(a, b) {
31+
return a + b;
32+
}
33+
}
34+
35+
class Resta extends Operacion {
36+
calcular(a, b) {
37+
return a - b;
38+
}
39+
}
40+
41+
class Multiplicacion extends Operacion {
42+
calcular(a, b) {
43+
return a * b;
44+
}
45+
}
46+
47+
class Division extends Operacion {
48+
calcular(a, b) {
49+
if (b === 0) {
50+
throw new Error('División por cero');
51+
}
52+
return a / b;
53+
}
54+
}
55+
56+
class Potencia extends Operacion {
57+
calcular(a, b) {
58+
return Math.pow(a, b);
59+
}
60+
}
61+
62+
class Calculadora {
63+
constructor() {
64+
this.operaciones = {};
65+
}
66+
67+
agregarOperacion(nombre, operacion) {
68+
this.operaciones[nombre] = operacion;
69+
}
70+
71+
calcular(nombre, a, b) {
72+
const operacion = this.operaciones[nombre];
73+
if (!operacion) {
74+
throw new Error('Operación no soportada');
75+
}
76+
return operacion.calcular(a, b);
77+
}
78+
}
79+
80+
const calc = new Calculadora();
81+
calc.agregarOperacion('+', new Suma());
82+
calc.agregarOperacion('-', new Resta());
83+
calc.agregarOperacion('*', new Multiplicacion());
84+
calc.agregarOperacion('/', new Division());
85+
calc.agregarOperacion('^', new Potencia());
86+
87+
console.log("[+] - Suma:", calc.calcular('+', 5, 3));
88+
console.log("[+] - Resta:", calc.calcular('-', 5, 3));
89+
console.log("[+] - Multiplicación:", calc.calcular('*', 5, 3));
90+
console.log("[+] - División:", calc.calcular('/', 5, 3));
91+
console.log("[+] - Potencia:", calc.calcular('^', 5, 3));
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Autor: Héctor Adán
2+
# GitHub: https://github.com/hectorio23
3+
4+
from abc import ABC, abstractmethod
5+
import math
6+
7+
"""
8+
EJERCICIO:
9+
Explora el "Principio SOLID Abierto-Cerrado (Open-Close Principle, OCP)"
10+
y crea un ejemplo simple donde se muestre su funcionamiento
11+
de forma correcta e incorrecta.
12+
13+
DIFICULTAD EXTRA:
14+
Desarrolla una calculadora que necesita realizar diversas operaciones matemáticas.
15+
Requisitos:
16+
- Debes diseñar un sistema que permita agregar nuevas operaciones utilizando el OCP.
17+
Instrucciones:
18+
1. Implementa las operaciones de suma, resta, multiplicación y división.
19+
2. Comprueba que el sistema funciona.
20+
3. Agrega una quinta operación para calcular potencias.
21+
4. Comprueba que se cumple el OCP.
22+
"""
23+
24+
class Operacion(ABC):
25+
@abstractmethod
26+
def calcular(self, a, b):
27+
pass
28+
29+
class Suma(Operacion):
30+
def calcular(self, a, b):
31+
return a + b
32+
33+
class Resta(Operacion):
34+
def calcular(self, a, b):
35+
return a - b
36+
37+
class Multiplicacion(Operacion):
38+
def calcular(self, a, b):
39+
return a * b
40+
41+
class Division(Operacion):
42+
def calcular(self, a, b):
43+
if b == 0:
44+
raise ValueError("División por cero")
45+
return a / b
46+
47+
class Potencia(Operacion):
48+
def calcular(self, a, b):
49+
return math.pow(a, b)
50+
51+
class Calculadora:
52+
def __init__(self):
53+
self.operaciones = {}
54+
55+
def agregar_operacion(self, nombre, operacion):
56+
self.operaciones[nombre] = operacion
57+
58+
def calcular(self, nombre, a, b):
59+
if nombre in self.operaciones:
60+
return self.operaciones[nombre].calcular(a, b)
61+
else:
62+
raise ValueError("Operación no soportada")
63+
64+
65+
if __name__ == "__main__":
66+
calc = Calculadora()
67+
calc.agregar_operacion('+', Suma())
68+
calc.agregar_operacion('-', Resta())
69+
calc.agregar_operacion('*', Multiplicacion())
70+
calc.agregar_operacion('/', Division())
71+
calc.agregar_operacion('^', Potencia())
72+
73+
print("[+] - Suma:", calc.calcular('+', 5, 3))
74+
print("[+] - Resta:", calc.calcular('-', 5, 3))
75+
print("[+] - Multiplicación:", calc.calcular('*', 5, 3))
76+
print("[+] - División:", calc.calcular('/', 5, 3))
77+
print("[+] - Potencia:", calc.calcular('^', 5, 3))

0 commit comments

Comments
 (0)