Click here to read in english.
Autores: Tomás Badenes y Santiago Fernandez
Este programa fue el resultado de un desafío de un docente de cátedra de matemática. La consigna era:
- Escribir un código que dadas dos matrices analice si pueden sumarse y en caso afirmativo calcule la suma
- Escribir un código que dadas dos matrices analice si el producto está definido y en caso afirmativo lo calcule
- Escribir un código que dada una matriz analice si tiene inversa y en caso afirmativo la calcule
- Implemente un programa que dado un sistema de ecuaciones lineales analice la compatibilidad del sistema
Nosotros hemos decidido llevarlo un paso mas allá y crear una calculadora completa, escrita en Rust, que integre las soluciones a los cuatro problemas propuestos y un poco mas. Sus características se detallan abajo, así como las instrucciones de instalación y uso.
La calculadora funciona mediante comandos. La sintaxis general es: <COMANDO> [parámetros]
Para obtener una lista de los posibles comandos, utilice el comando ayuda
Esta calculadora es capaz de resolver calculos combinados utilizando operaciones entre matrices y escalares. Las operaciones soportadas son:
*
: Multiplicación/
: División+
: Suma-
: Resta (o suma con el producto de -1 por el sustraendo)^
: PotenciaT
: Transpuesta de una matriz (sintaxis:<matriz> T
)DET
: Determinante de una matriz (sintaxis:<matriz> DET
)INV
: Inversa de una matriz (sintaxis:<matriz> INV
)
Utilizando el comando ecu
y como parametro un cadena de operandos y operadores separados por espacios, la calculadora resolverá el cálculo si tiene solución, o mostrará un mensaje de error en caso de expresiones malformadas o operaciones no definidas.
Por ejemplo, para calcular ((((Matriz A + B) * (Matriz A al cuadrado)) <- Transponer) <- Determinante) + PI
:
>>> ecu ( ( A + B ) * ( A ^ 2 ) T ) DET + PI
Resultado: -186.8585
Utilizando el comando mostrar
se pueden ver las variables almacenadas. La calculadora incluye algunas por defecto:
>>> mostrar
PI = 3.1415
B =
3 4.5
8 2
A =
1 2
3 4
C = 0
También se le puede exigir al comando mostrar que filtre por nombre de variable:
>>> mostrar A PI E
A =
1 2
3 4
PI = 3.1415
La variable `E` no está definida
Estos identificadores pueden luego ser utilizados en las expresiones ecu
Mediante el comando ecsis
se puede ingresar un sistema de ecuaciones en la forma de la matriz expandida en el vector resultado (A|b) para determinar si este tiene solución o no.
- Clonar el repositorio:
git clone https://github.com/b-Tomas/calculadora.git
O utilizar el botón verde para descargar un comprimido .zip
-
Descargar e instalar la versión de rust para tu sistema operativo desde la página oficial
-
Compile el proyecto
cargo build
- Compruebe que los tests de unidad:
$ cargo test
running 21 tests
test exp_interpreter::tests::test_postfix_to_tree ... ok
test exp_interpreter::tests::test_infix_to_postfix ... ok
test math::tests::compatible_determinado ... ok
test math::tests::identity_matrix ... ok
test math::tests::determinant ... ok
test math::tests::incompatible_equation ... ok
test math::tests::mat_pow ... ok
test math::tests::matrix_multiplication ... ok
test math::tests::inverse_test ... ok
test math::tests::matrix_sub ... ok
test math::tests::matrix_sum ... ok
test math::tests::multiplication_by_scalar ... ok
test math::tests::transposed ... ok
test exp_interpreter::tests::test_solve ... ok
test math::tests::test_adj ... ok
test math::tests::undetermined ... ok
test math::tests::very_incompatible ... ok
test structs::tests::create_empty_matrix ... ok
test structs::tests::create_matrix_from_data ... ok
test structs::tests::equals ... ok
test structs::tests::is_squared ... ok
test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
- Inicie el programa:
cargo run
Visite la página de releases para descargar el programa compilado para su plataforma, aunque se recomienda instalar de código fuente para tener disponible la última versión del programa.
La lógica responsable de la solución de los problemas matemáticos se encuentra en el archivo src/math.rs
. Dado que se trataba de trabajo práctico de matemáticas, decidimos mantenernos alejados de librerías externas que nos faciliten los cálculos para programar las soluciones desde cero.
Además, fue nuestro primer contacto con el lenguaje Rust. Si bien el código no es perfecto o el más prolijo, creemos que es bastante aceptable habiendo tenido sólo una semana para completarlo.