Prog. orientada a objetos

Práctica 1: Clase Rational

Objetivos

Durante esta práctica, los alumnos serán capaces de:

Esta actividad promueve las siguientes habilidades, valores y actitudes: análisis y síntesis, capacidad de resolver problemas, creatividad, y uso eficiente de la informática y las telecomunicaciones.


Descripción de la actividad

IMPORTANTE

Para esta actividad de programación, se prohíbe el uso de sistemas de inteligencia artificial (IA) como ChatGPT o Copilot. El propósito es evaluar tu habilidad de programar de manera auténtica y sin ayuda de herramientas externas.

El incumplimiento de esta regla será considerado una violación académica y puede resultar en sanciones. Revisa la documentación oficial y otros recursos educativos, y no dudes en preguntar a tu profesor si tienes dudas.

¡Confía en tus habilidades y demuestra tu potencial!

Esta práctica debe ser elaborada en los equipos de dos personas ya constituidos.

A partir del código de C++ elaborado en clase, agrega las declaraciones y definiciones necesarias a la clase Rational para incorporar las funciones miembro (métodos) que se describen a continuación. Debes modificar los archivos rational.h y rational.cpp según corresponda.

Función miembro Descripción

Rational operator * (
    const Rational& other
) const

Multiplicación (operador binario): regresa un nuevo objeto Rational que resulta de multiplicar el objeto receptor por other.

Fórmula:

$$ \frac{a}{b} \times \frac{c}{d} = \frac{a \cdot c}{b \cdot d} $$

Rational operator ~ () const

Recíproco (operador unario): regresa un nuevo objeto Rational que resulta de obtener el recíproco del objeto receptor.

El recíproco de un número racional es un número que, al multiplicarse por el original, da como resultado uno, obteniéndose al intercambiar el numerador y el denominador del número original.

Fórmula:

$$ \left ( \frac{a}{b} \right )^{-1} = \frac{b}{a} $$

Rational operator / (
    const Rational& other
) const

División (operador binario): regresa un nuevo objeto Rational que resulta de dividir el objeto receptor entre other.

Fórmula:

$$ \frac{a}{b} \div \frac{c}{d} = \frac{a}{b} \times \left ( \frac{c}{d} \right )^{-1} = \frac{a \times d}{b \times c} $$

bool operator < (
    const Rational& other
) const

Menor que (operador binario): regresa true si el objeto receptor es menor que other, o false en caso contrario.

Fórmula:

$$ \left ( \frac{a}{b} < \frac{c}{d} \right ) = ( a \times d < b \times c) $$

bool operator <= (
    const Rational& other
) const

Menor o igual (operador binario): regresa true si el objeto receptor es menor o igual a other, o false en caso contrario.

Fórmula:

$$ \left ( \frac{a}{b} \le \frac{c}{d} \right ) = ( a \times d \le b \times c) $$

bool operator > (
    const Rational& other
) const

Mayor que (operador binario): regresa true si el objeto receptor es mayor que other, o false en caso contrario.

Fórmula:

$$ \left ( \frac{a}{b} > \frac{c}{d} \right ) = ( a \times d > b \times c) $$

bool operator >= (
    const Rational& other
) const

Mayor o igual (operador binario): regresa true si el objeto receptor es mayor o igual a other, o false en caso contrario.

Fórmula:

$$ \left ( \frac{a}{b} \ge \frac{c}{d} \right ) = ( a \times d \ge b \times c) $$

Prueba tu código utilizando el siguiente archivo main.cpp:

// Archivo: main.cpp

// Para compilar y correr:
//               
//     g++ *.cpp -o main && ./main

#include <iostream>
#include <iomanip>
#include <stdexcept>
#include "rational.h"

int main()
{
    Rational a(1, 2);
    Rational b(6, 4);
    Rational c(4, 8);
    Rational d;
    Rational e(-3);

    // Para imprimir los booleanos como true o false
    // en lugar de 1 o 0.
    std::cout << std::boolalpha;

    std::cout << "a: " << a << "\n";
    std::cout << "b: " << b << "\n";
    std::cout << "c: " << c << "\n";
    std::cout << "d: " << d << "\n";
    std::cout << "e: " << e << "\n";
    std::cout << "a + b: " << a + b << "\n";
    std::cout << "c + d: " << c + d << "\n";
    std::cout << "a == c: " << (a == c) << "\n";
    std::cout << "a == b: " << (a == b) << "\n";
    std::cout << "a != b: " << (a != b) << "\n";
    std::cout << "a != c: " << (a != c) << "\n";
    std::cout << "-a: " << -a << "\n";
    std::cout << "-e: " << -e << "\n";
    std::cout << "a - b: " << a - b << "\n";
    std::cout << "c - e: " << c - e << "\n";
    std::cout << "static_cast<double>(a): "
        << static_cast<double>(a) << "\n";
    std::cout << "static_cast<double>(b): "
        << static_cast<double>(b) << "\n";
    std::cout << "a * b: " << a * b << "\n";
    std::cout << "c * e: " << c * e << "\n";
    std::cout << "~b: " << ~b << "\n";
    std::cout << "~e: " << ~e << "\n";
    std::cout << "b * ~b: " << b * ~b << "\n";
    std::cout << "e * ~e: " << e * ~e << "\n";
    std::cout << "a / b: " << a / b << "\n";
    std::cout << "c / e: " << c / e << "\n";
    try {
        Rational t = a / d;
        std::cout << "a / d: " << t << "\n";
    } catch (const std::invalid_argument& e) {
        std::cout << "a / d: " << e.what() << "\n";
    }
    std::cout << "a < b: " << (a < b) << "\n";
    std::cout << "a < c: " << (a < c) << "\n";
    std::cout << "a <= c: " << (a <= c) << "\n";
    std::cout << "a <= d: " << (a <= d) << "\n";
    std::cout << "b > c: " << (b > c) << "\n";
    std::cout << "a > c: " << (a > c) << "\n";
    std::cout << "a >= c: " << (a >= c) << "\n";
    std::cout << "e >= d: " << (e >= d) << "\n";
    return 0;
}

Asegúrate que la salida sea idéntica a lo siguiente:

a: 1/2
b: 3/2
c: 1/2
d: 0
e: -3
a + b: 2
c + d: 1/2
a == c: true
a == b: false
a != b: true
a != c: false
-a: -1/2
-e: 3
a - b: -1
c - e: 7/2
static_cast<double>(a): 0.5
static_cast<double>(b): 1.5
a * b: 3/4
c * e: -3/2
~b: 2/3
~e: -1/3
b * ~b: 1
e * ~e: 1
a / b: 1/3
c / e: -1/6
a / d: Denominator cannot be zero!
a < b: true
a < c: false
a <= c: true
a <= d: false
b > c: true
a > c: false
a >= c: true
e >= d: false

Consideraciones adicionales

¿Qué se debe entregar?

Crea un archivo comprimido TAR GZ o ZIP con el contenido completo del directorio rational. El archivo resultante se debe llamar rational.tar.gz o rational.zip.

Instrucciones para subir archivo

Para entregar el archivo rational.tar.gz/rational.zip, ingresa los siguientes datos:

Solicitar NIP

Solo es necesario que lo entregue un miembro del equipo.

La fecha límite es el viernes 7 de junio.