Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/php/POO/practica»

De WikiEducator
Saltar a: navegación, buscar
(Calculadora Real/Racional)
(Calculadora Real/Racional)
Línea 78: Línea 78:
 
</source>
 
</source>
 
}}
 
}}
 
+
{{MRM_Ejemplos|Title= Operaciones que se pueden insertar|
Si en esa caja de texto el usuario insertará algo del tipo
+
;9/8+4/7
9/8+4/7
+
;9.4/2
o
+
;9/6:6
9.4 / 2
+
;9/5*5.6 (Éste es un caso de error)
o
+
}}
9/6:6
+
o (Este es un caso de error)
+
9/5*5.6
+
 
*Al presionar intro aparecerá un texto (en el primer caso  9/8+4/7)
 
*Al presionar intro aparecerá un texto (en el primer caso  9/8+4/7)
 
[[Archivo:PracticaCalculadoraUso1.png|500px]]
 
[[Archivo:PracticaCalculadoraUso1.png|500px]]
Línea 96: Línea 93:
 
[[Archivo:PracticaCalculadoraUso4.png|300px]]
 
[[Archivo:PracticaCalculadoraUso4.png|300px]]
  
<h3>  9.4/2=3.7</h3>
 
<h4>Operando 1  =      9.4</h4>
 
<h4>Operando 2    =    2</h4>
 
<h4>Tipo de operación  /</h4>
 
  
 
*Para realizar este ejercicio, tendremos que implementar las siguientes clases según aparece en el dibujo
 
*Para realizar este ejercicio, tendremos que implementar las siguientes clases según aparece en el dibujo
Línea 107: Línea 100:
 
*Los métodos según correspondan serán '''''private protected o public'''''
 
*Los métodos según correspondan serán '''''private protected o public'''''
 
*A continuación una descripción de las clases.
 
*A continuación una descripción de las clases.
{{MRM_Actividad|Title=Descripción de la idea de la práctica|
 
;Es una aplicación donde hay operaciones
 
*Una operación está formada por dos operandos y un operador.
 
*La operación puede ser '''''racional''''' o '''''real'''''
 
*Una operación racional operará con números racionales (del tipo a/b).
 
** Lógicamente en este caso no habrá decimales.
 
*Una operación real operará con números reales.
 
}}
 
 
;Racional (p.e 10/6)
 
;Racional (p.e 10/6)
 
:Propiedades
 
:Propiedades
Línea 121: Línea 106:
  
 
:Métodos
 
:Métodos
#'''''constructor'''''. Hay que sobrecargarlo según se indica
+
#'''''constructor'''''. Hay que sobrecargarlo según se indica, aunque en este caso, solo usemos el constructor con cadena de caracteres
 
<source lang=php>
 
<source lang=php>
 
$a = new Racional();      //Crea el racional 1/1
 
$a = new Racional();      //Crea el racional 1/1
Línea 130: Línea 115:
 
No hace falta recoger otras situaciones no deseadas, no obstante si se hace se debería de crear el Racional 1/1
 
No hace falta recoger otras situaciones no deseadas, no obstante si se hace se debería de crear el Racional 1/1
 
</source>
 
</source>
#''''asigna'''''. También se pide que está sobrecargado
+
 
<source lang=php>
+
$a = new Racional();      //Crea el racional 1/1
+
$a->asigna(10);  //Asigna al raciona a el valor  10/1
+
$a->asigna(10,6);  //Asigna al raciona a el valor 10/6
+
$a->asigna("10/6");//Asigna al raciona a el valor 10/6
+
$a->asigna();  //Asigna al raciona a el valor 1/1
+
$a->asigna("11");//Asigna al raciona a el valor 11/1
+
</source>
+
 
#'''''simplifica()''''' Simplifica si se puede numerador y denominador (Utilizar el método de Euclides (mcd))
 
#'''''simplifica()''''' Simplifica si se puede numerador y denominador (Utilizar el método de Euclides (mcd))
  
Línea 146: Línea 123:
 
#multiplica
 
#multiplica
 
#divide
 
#divide
 +
#__toString
 +
 
:Todos estos métodos operan con un argumento racional  y retorna un Racional resultado de operarse él mismo con el racional que pasamos como argumento
 
:Todos estos métodos operan con un argumento racional  y retorna un Racional resultado de operarse él mismo con el racional que pasamos como argumento
 
<source lang=php>
 
<source lang=php>
Línea 164: Línea 143:
 
</source>
 
</source>
 
*Por defecto todas las operaciones se deben de facilitar con el racional simplificado, salvo que se pase en la operación un segundo parámetro a valor false, en cuyo caso no se simplifica y se da el valor sin simplificar
 
*Por defecto todas las operaciones se deben de facilitar con el racional simplificado, salvo que se pase en la operación un segundo parámetro a valor false, en cuyo caso no se simplifica y se da el valor sin simplificar
 +
{{Plegable|hide|Clase Racional|
 +
<source lang=php>
 +
<?php
 +
 +
class Racional {
 +
 +
    private $num;
 +
    private $den;
 +
 +
    /**
 +
    *
 +
    * @param type $num
 +
    * @param type $den
 +
    * @description Construimos un objeto de la clase recional en las siguientes situaciones
 +
    *  //opciones new Racional () =>1/1
 +
        //opciones new Racional (5) =>5/1
 +
        //opciones new Racional (5,2) =>5/2
 +
        //opciones new Racional ("5/2") =>5/2
 +
        //opciones new Racional ("5") =>5/1
 +
       
 +
        //Otra sitiación no se instancia
 +
 +
    */
 +
    public function __construct($num, $den) {
 +
        if (is_null($den)) {
 +
            switch (is_numeric($num)) {
 +
                case true:
 +
                    $this->num = $num;
 +
                    $this->den = 1;
 +
                    break;
 +
                case false:
 +
                    if (is_null($num)) {
 +
                        $this->num = 1;
 +
                        $this->den = 1;
 +
                    } else {
 +
                        $this->num = (int) $num;
 +
                        //if (strpos($num, "/") == FALSE) {
 +
                        $this->den = (int) substr($num, strpos($num, "/") + 1);
 +
                        //} else
 +
                        //    $this->den = 1;
 +
                    }
 +
                    break;
 +
            }
 +
        } else {
 +
            $this->num = $num;
 +
            $this->den = $den;
 +
        }
 +
    }
 +
 +
    /**
 +
    * @param Racional $op1 segundo operando
 +
    * @return \Racional Resultado de sumar al objeto racional actual, el objeto raciona que recibimos como parámetro
 +
    */
 +
    public function sumar(Racional $op1) {
 +
        $num = $this->num * $op1->den + $this->den * $op1->num;
 +
        $den = $this->den * $op1->den;
 +
        return new Racional($num, $den);
 +
    }
 +
 +
    /**
 +
    * @param Racional $op1 segundo operando
 +
    * @return \Racional Resultado de restar al objeto racional actual, el objeto raciona que recibimos como parámetro
 +
    */
 +
    public function restar(Racional $op1) {
 +
        $num = $this->num * $op1->den - $this->den * $op1->num;
 +
        $den = $this->den * $op1->den;
 +
        return new Racional($num, $den);
 +
    }
 +
 +
    /**
 +
    * @param Racional $op1 segundo operando
 +
    * @return \Racional Resultado de multiplicar al objeto racional actual, el objeto raciona que recibimos como parámetro
 +
    */
 +
    public function multiplicar(Racional $op1) {
 +
        $num = $this->num * $op1->num;
 +
        $den = $this->den * $op1->den;
 +
        return new Racional($num, $den);
 +
    }
 +
    /**
 +
    * @param Racional $op1 segundo operando
 +
    * @return \Racional Resultado de dividir al objeto racional actual, el objeto raciona que recibimos como parámetro
 +
    */
 +
    public function dividir(Racional $op1) {
 +
        $num = $this->num * $op1->den;
 +
        $den = $this->den * $op1->num;
 +
        return new Racional($num, $den);
 +
    }
 +
 +
    /**
 +
    *
 +
    * @return type un string del tipo a/b
 +
    */
 +
    public function __toString() {
 +
        return ($this->num . "/" . $this->den);
 +
    }
 +
}
 +
</source>
 
;Operación
 
;Operación
 
*Como vemos en el diagrama va a tener algún método abstracto, por lo que la vamos a considerar abstracta
 
*Como vemos en el diagrama va a tener algún método abstracto, por lo que la vamos a considerar abstracta
Línea 170: Línea 246:
 
*'''''Operando2''''' igual
 
*'''''Operando2''''' igual
 
*'''''Operación''''' será la cadena de caracteres que el usuario inserte en la caja de texto.
 
*'''''Operación''''' será la cadena de caracteres que el usuario inserte en la caja de texto.
*'''''Operador''''' es el carácter que indica el tipo de operación que se quiere realizar.
+
*'''''Operador''''' es el carácter que indica el tipo de operación que se quiere realizar.
 
*'''''Resultado''''' es el resultado de la operación, puede ser real o racional
 
*'''''Resultado''''' es el resultado de la operación, puede ser real o racional
 
*Esta clase  descompondrá la operación y generará un resultado  
 
*Esta clase  descompondrá la operación y generará un resultado  
:Métodos
+
{{Plegable|hide|Clase Operacion|
*Los que consideres.
+
<source lang=php>
 +
<?php
 +
 
 +
abstract class Operacion {
 +
 
 +
    //put your code here
 +
    protected $op1;
 +
    protected $op2;
 +
    protected $operador;
 +
    protected $operacion;
 +
    static protected $tipo;
 +
 
 +
    const RACIONAL = 1;
 +
    const REAL = 2;
 +
    const ERROR = -1;
 +
 
 +
    /**
 +
    * @param $operacion string que especifica la operación que se desar analizar
 +
    * @description Establece de qué tipo es una operación en función de sus argumentos
 +
    *      * Operacion real numero_real operando  numero_real
 +
    *      * Operacion racional  numero_racional operandoRacional numero_racional
 +
    *      * Operacion racional  numero_entero operandoRacional numero_racional
 +
    *      * Operacion racional  numero_racional operandoRacional numero_entero
 +
    *      * Otro caso se especificará un error
 +
    *
 +
    *  Usamos expresiones regulares para especificarlo
 +
    * **/
 +
   
 +
    public static function tipoOperacion($operacion) {
 +
        self::$tipo = Operacion::ERROR;
 +
 
 +
        $numReal = '[0-9]+(\.[0-9]*)?';
 +
        $numEntero = '[0-9]+';
 +
        $op = '[\+|\-|\*|\/]';
 +
        $numRacional = '[0-9]+\/[0-9]+';
 +
        $opRacional = '[\+|\-|\*|\:]';
 +
 
 +
 
 +
        $exp = "/^$numReal$op$numReal$/";
 +
        if (preg_match($exp, $operacion)) {
 +
            self::$tipo = Operacion::REAL;
 +
        } else {
 +
            /*Escribe el código que consideres*/
 +
 
 +
 
 +
         
 +
        }
 +
        return self::$tipo;
 +
 
 +
    }
 +
 
 +
    public function __construct($operacion) {
 +
        $this->operacion = $operacion;
 +
        $this->operador = $this->obtenerOperador($operacion);
 +
        $this->op1 = $this->obtenerOperador1($operacion);
 +
        $this->op2 = $this->obtenerOperador2($operacion);
 +
    }
 +
 
 +
    private function obtenerOperador1($operacion) {
 +
 
 +
/*Escribe el código que consideres*/
 +
    }
 +
 
 +
    private function obtenerOperador2($operacion) {
 +
/*Escribe el código que consideres*/
 +
    }
 +
 
 +
    private function obtenerOperador($operacion) {
 +
/*Escribe el código que consideres*/
 +
 
 +
    }
 +
   
 +
 
 +
    /**
 +
    *  Métodos get and set
 +
    */
 +
   
 +
   
 +
    public function getOp1() {
 +
        return $this->op1;
 +
    }
 +
 
 +
    public function getOp2() {
 +
        return $this->op2;
 +
    }
 +
 
 +
    public function getOperador() {
 +
        return $this->operador;
 +
    }
 +
 
 +
    public function getTipo() {
 +
        return $this->tipo;
 +
    }
 +
 
 +
    public function __toString() {
 +
        return "$this->op1$this->operador$this->op2";
 +
    }
 +
 
 +
    /**
 +
    *
 +
    * @return string  que describe las  propiedades de una operacion
 +
    * Lo devuelve como contenido de una tabla sin especificar la tabla
 +
    */
 +
    public function describe() {
 +
        $operacion = "<tr><th>Operando 1 </th> <th> $this->op1</th></tr>";
 +
        $operacion.="<tr><th>Operando 2 </th> <th> $this->op2</th></tr>";
 +
        $operacion.="<tr><th>Operación </th> <th> $this->operador</th></tr>";
 +
        if (self::$tipo == Operacion::RACIONAL)
 +
            $tipo = "Racional";
 +
        else
 +
            $tipo = "Real";
 +
        $operacion.="<tr><th>Tipo de operacion  </th> <th> $tipo</th></tr>";
 +
        return $operacion;
 +
    }
 +
 
 +
    /**
 +
    * método abstracto que se implementará cuando se sepa si una operación es real o racional
 +
    */
 +
    abstract public function opera();
 +
}
 +
 
 +
</source>
 +
 
 
;OpReal
 
;OpReal
*Realiza una operación real
+
{{Plegable|hide|Clase OperacionReal|
 +
<source lang=php>
 +
<?php
 +
 
 +
 
 +
/**
 +
* Description of OperacionReal
 +
*
 +
* @author manuel
 +
*/
 +
class OperacionReal extends Operacion {
 +
 
 +
    public function __construct($operacion) {
 +
        parent::__construct($operacion);
 +
    }
 +
 
 +
    public function opera() {
 +
 
 +
    /*Escribe el código que consideres*/
 +
 
 +
    }
 +
 
 +
    public function __toString() {
 +
        $r = parent::__toString();
 +
        $r.= "Resultado =" . $this->opera() . "<br />";
 +
        return $r;
 +
    }
 +
 
 +
    public function describe() {
 +
        $r = "<table border=1><tr><th>Cocepto</th> <th>Valores</th></tr>";
 +
        $r .= parent::describe();
 +
        $r.= "<tr><th>Resultado </th><th>" . $this->opera() . "</th></tr>";
 +
        $r.= "</table>";
 +
        return $r;
 +
    }
 +
 
 +
    //put your code here
 +
}
 +
 
 +
</source>
 +
}}
 +
 
 
;OpRacional
 
;OpRacional
*Realiza una operación racional
+
{{Plegable|hide|Clase OpRacional|
 +
<source lang=php>
 +
<?php
 +
 
 +
/**
 +
* Description of OperacionRacional
 +
*
 +
* @author manuel
 +
*/
 +
class OperacionRacional extends Operacion {
 +
 
 +
    public function __construct($operacion) {
 +
        parent::__construct($operacion);
 +
        $this->op1 = new Racional($this->op1);
 +
        $this->op2 = new Racional($this->op2);
 +
    }
 +
 
 +
    public function opera() {
 +
    /*Escribe el código que consideres*/
 +
    }
 +
 
 +
    public function __toString() {
 +
        $r = parent::__toString();
 +
        $r.= "=" . $this->opera();
 +
        return $r;
 +
    }
 +
 
 +
    public function describe() {
 +
        $r = "<table border=1><tr><th>Cocepto</th> <th>Valores</th></tr>";
 +
        $r .= parent::describe();
 +
        $r.= "<tr><th>Resultado </th><th>" . $this->opera() . "</th></tr>";
 +
        $r.= "</table>";
 +
        return $r;
 +
    }
 +
 
 +
}
 +
 
 +
 
 +
</source>
 +
}}
 +
 
 +
*A continuación el código del index.php que he usado yo
 +
{{Plegable|hide|Código de index.php|
 +
<source lang=php>
 +
<!DOCTYPE html>
 +
<html>
 +
    <head>
 +
        <meta charset="UTF-8">
 +
        <title></title>
 +
        <link rel="stylesheet" type="text/css" href="estilo.css" media="screen" />
 +
    </head>
 +
    <body>
 +
        <fieldset id="ayuda">
 +
            <legend>Reglas de uso de la calculadora</legend>
 +
            <div id=texhelp> La calculadora se usa escribiendo la operación.</div>
 +
            <div id=texhelp> La  operación será <strong>Operando_1 operación Operando_2</strong>.</div>
 +
            <div id=texhelp> Cada operando puede ser número <strong>real  o racional.</strong></div>
 +
            <div id=texhelp> Real p.e. <strong>5</strong> o <strong>5.12 </strong> Racional p.e <strong> 6/3 </strong>o<strong> 7/1</strong></div>
 +
            <div id=texhelp> Los operadores reales permitidos son <strong><font size='5' color='red'> +  -  *  /</font></strong></div>
 +
            <div id=texhelp> Los operadores racionales permitidos son <strong><font size='5' color='red'> +  -  *  :</font> </strong></div>
 +
            <div id=texhelp> No se deben de dejar espacios en blanco entre operandos y operación</div>
 +
            <div id=texhelp> Si un operando es real y el otro racional se considerará operación racional</label></div>
 +
            <div id=texhelp> Ejemplo (Real)<strong>5.1+4</strong>  (Racional)<strong>5/1:2</strong>  (Error)<strong>5.2+5/1</strong> (Error)<strong>52214+</strong> </label></div>
 +
           
 +
 
 +
        </fieldset>
 +
        <?php
 +
        spl_autoload_register(function($clase) {
 +
            require"$clase.php";
 +
        });
 +
        if ($_POST['enviar']) {
 +
            //Leemos la operacion
 +
            $operacionCadena = $_POST['operacion'];
 +
            switch (Operacion::tipoOperacion($operacionCadena)) {
 +
                case Operacion::RACIONAL:
 +
                    $operacionNum = new OperacionRacional($operacionCadena);
 +
                    $descripcion = $operacionNum->describe();
 +
                    break;
 +
                case Operacion::REAL:
 +
                    $operacionNum = new OperacionReal($operacionCadena);
 +
                    $descripcion = $operacionNum->describe();
 +
                    break;
 +
                case Operacion::ERROR:
 +
                    $descripcion = " La operación <br /><strong>$operacionCadena</strong><br /> No es una operación válida";
 +
                    break;
 +
            }
 +
            echo "<fieldset id=rtdo><legend>Resultado</legend>";
 +
            echo ("<label>$descripcion</label>");
 +
            echo "</fieldset>";
 +
        }
 +
        ?>
 +
        <fieldset>
 +
            <legend>Establece la operación</legend>
 +
            <form action="." method="post">
 +
                <label for="operacion">Operacion</label>
 +
                <input type="text" name="operacion" id="">
 +
                <input type="submit" name="enviar" value="Calcular">
 +
                <?php
 +
                if (isset($_POST['enviar'])) {
 +
                    echo "<label>$operacionNum</label>";
 +
                }
 +
                ?>
 +
 
 +
            </form>
 +
        </fieldset>
 +
    </body>
 +
</html>
 +
 
 +
</source>
 +
 
 +
}}

Revisión de 22:31 16 ene 2017



Calculadora Real/Racional

  • Se pide que realicemos una aplicación web que resuelva cálculos aritméticos con operadores reales o racionales
  • La operación se insertará en una caja de texto
  • La operación tendrá el siguiente formato
OP1 operador OP2
  • Donde
  1. OP1 es un operador real o racional
  2. operador es una operación que puede ser +,-,*,/,:.
    1. según los operandos sean reales o racionales el operador división será / o : respectivamente
  • El tipo de operación, la deberemos obtener según nos indique un método stático de la clase operación según se indica más abajo.
  • En la pantalla mostraremos un pequeño texto explicativo y una caja de texto donde el usuario podrá interactuar

PracticaCalculadoraIndex.png


  • Vamos a aplicar una pequeña css para la pantalla

Plantilla:MRM Ejemplos

  • Al presionar intro aparecerá un texto (en el primer caso 9/8+4/7)

PracticaCalculadoraUso1.png

  • En el segundo caso ( 9.4 / 2)

PracticaCalculadoraUso2.png

  • En el tercer caso ( 9/6:6)

PracticaCalculadoraUso3.png

  • En el cuarto caso es erróneo ( 9/5*5.6 )

PracticaCalculadoraUso4.png


  • Para realizar este ejercicio, tendremos que implementar las siguientes clases según aparece en el dibujo
  • Es obligatorio usar esta jerarquía de clase.

Racional.png

  • Todos los atributos private o protected (no debe de haber atributos public)
  • Los métodos según correspondan serán private protected o public
  • A continuación una descripción de las clases.
Racional (p.e 10/6)
Propiedades
  1. Num (p.e 10)
  2. Den (p.e 6)
Métodos
  1. constructor. Hay que sobrecargarlo según se indica, aunque en este caso, solo usemos el constructor con cadena de caracteres
$a = new Racional();      //Crea el racional 1/1
$a=  new Racional (10);   //Crea el racional 10/1
$a = new Racional(10,6);  //Crea el racional 10/6 
$a = new Racional("10/6");//Crea el racional 10/6
$a = new Racional("10");//Crea el racional 10/6
No hace falta recoger otras situaciones no deseadas, no obstante si se hace se debería de crear el Racional 1/1
  1. simplifica() Simplifica si se puede numerador y denominador (Utilizar el método de Euclides (mcd))


  1. suma
  2. resta
  3. multiplica
  4. divide
  5. __toString
Todos estos métodos operan con un argumento racional y retorna un Racional resultado de operarse él mismo con el racional que pasamos como argumento
//En la clase
public function suma (Racional $b) {
 $numResultado = ....;
 $denResultado = ....
 $resultado = new Racional......
 return $resultado;
}
.....
//En el programa que use la clase
 
$a = new Racional("5/6");
$b = new Racional (6,4);
$c= $a->sumar($b);
echo "$a+$b=$c"//Me visualizará 5/6+6/4=56/24, o bien simplificado 7/3
  • Por defecto todas las operaciones se deben de facilitar con el racional simplificado, salvo que se pase en la operación un segundo parámetro a valor false, en cuyo caso no se simplifica y se da el valor sin simplificar

{{Plegable|hide|Clase Racional|

<?php
 
class Racional {
 
    private $num;
    private $den;
 
    /**
     * 
     * @param type $num
     * @param type $den
     * @description Construimos un objeto de la clase recional en las siguientes situaciones
     *  //opciones new Racional () =>1/1
        //opciones new Racional (5) =>5/1
        //opciones new Racional (5,2) =>5/2
        //opciones new Racional ("5/2") =>5/2
        //opciones new Racional ("5") =>5/1
 
        //Otra sitiación no se instancia
 
     */
    public function __construct($num, $den) {
        if (is_null($den)) {
            switch (is_numeric($num)) {
                case true:
                    $this->num = $num;
                    $this->den = 1;
                    break;
                case false:
                    if (is_null($num)) {
                        $this->num = 1;
                        $this->den = 1;
                    } else {
                        $this->num = (int) $num;
                        //if (strpos($num, "/") == FALSE) {
                        $this->den = (int) substr($num, strpos($num, "/") + 1);
                        //} else
                        //    $this->den = 1;
                    }
                    break;
            }
        } else {
            $this->num = $num;
            $this->den = $den;
        }
    }
 
    /**
     * @param Racional $op1 segundo operando
     * @return \Racional Resultado de sumar al objeto racional actual, el objeto raciona que recibimos como parámetro
     */
    public function sumar(Racional $op1) {
        $num = $this->num * $op1->den + $this->den * $op1->num;
        $den = $this->den * $op1->den;
        return new Racional($num, $den);
    }
 
    /**
     * @param Racional $op1 segundo operando
     * @return \Racional Resultado de restar al objeto racional actual, el objeto raciona que recibimos como parámetro
     */
    public function restar(Racional $op1) {
        $num = $this->num * $op1->den - $this->den * $op1->num;
        $den = $this->den * $op1->den;
        return new Racional($num, $den);
    }
 
    /**
     * @param Racional $op1 segundo operando
     * @return \Racional Resultado de multiplicar al objeto racional actual, el objeto raciona que recibimos como parámetro
     */
    public function multiplicar(Racional $op1) {
        $num = $this->num * $op1->num;
        $den = $this->den * $op1->den;
        return new Racional($num, $den);
    }
    /**
     * @param Racional $op1 segundo operando
     * @return \Racional Resultado de dividir al objeto racional actual, el objeto raciona que recibimos como parámetro
     */
    public function dividir(Racional $op1) {
        $num = $this->num * $op1->den;
        $den = $this->den * $op1->num;
        return new Racional($num, $den);
    }
 
    /**
     * 
     * @return type un string del tipo a/b
     */
    public function __toString() {
        return ($this->num . "/" . $this->den);
    }
}
Operación
  • Como vemos en el diagrama va a tener algún método abstracto, por lo que la vamos a considerar abstracta
Propiedades
  • Operando1 es un atributo que podrá ser real o racional, pero como en php no hay que declarar tipos, nos va bien
  • Operando2 igual
  • Operación será la cadena de caracteres que el usuario inserte en la caja de texto.
  • Operador es el carácter que indica el tipo de operación que se quiere realizar.
  • Resultado es el resultado de la operación, puede ser real o racional
  • Esta clase descompondrá la operación y generará un resultado

{{Plegable|hide|Clase Operacion|

<?php
 
abstract class Operacion {
 
    //put your code here
    protected $op1;
    protected $op2;
    protected $operador;
    protected $operacion;
    static protected $tipo;
 
    const RACIONAL = 1;
    const REAL = 2;
    const ERROR = -1;
 
    /**
     * @param $operacion string que especifica la operación que se desar analizar
     * @description Establece de qué tipo es una operación en función de sus argumentos
     *      * Operacion real numero_real operando  numero_real
     *      * Operacion racional  numero_racional operandoRacional numero_racional
     *      * Operacion racional  numero_entero operandoRacional numero_racional
     *      * Operacion racional  numero_racional operandoRacional numero_entero
     *      * Otro caso se especificará un error
     * 
     *  Usamos expresiones regulares para especificarlo
     * **/
 
    public static function tipoOperacion($operacion) {
        self::$tipo = Operacion::ERROR;
 
        $numReal = '[0-9]+(\.[0-9]*)?';
        $numEntero = '[0-9]+';
        $op = '[\+|\-|\*|\/]';
        $numRacional = '[0-9]+\/[0-9]+';
        $opRacional = '[\+|\-|\*|\:]';
 
 
        $exp = "/^$numReal$op$numReal$/";
        if (preg_match($exp, $operacion)) {
            self::$tipo = Operacion::REAL;
        } else {
            /*Escribe el código que consideres*/ 
 
 
 
        }
        return self::$tipo;
 
    }
 
    public function __construct($operacion) {
        $this->operacion = $operacion;
        $this->operador = $this->obtenerOperador($operacion);
        $this->op1 = $this->obtenerOperador1($operacion);
        $this->op2 = $this->obtenerOperador2($operacion);
    }
 
    private function obtenerOperador1($operacion) {
 
 /*Escribe el código que consideres*/ 
    }
 
    private function obtenerOperador2($operacion) {
 /*Escribe el código que consideres*/ 
    }
 
    private function obtenerOperador($operacion) {
 /*Escribe el código que consideres*/ 
 
    }
 
 
    /**
     *  Métodos get and set 
     */
 
 
    public function getOp1() {
        return $this->op1;
    }
 
    public function getOp2() {
        return $this->op2;
    }
 
    public function getOperador() {
        return $this->operador;
    }
 
    public function getTipo() {
        return $this->tipo;
    }
 
    public function __toString() {
        return "$this->op1$this->operador$this->op2";
    }
 
    /**
     * 
     * @return string  que describe las  propiedades de una operacion
     * Lo devuelve como contenido de una tabla sin especificar la tabla
     */
    public function describe() {
        $operacion = "<tr><th>Operando 1 </th> <th> $this->op1</th></tr>";
        $operacion.="<tr><th>Operando 2 </th> <th> $this->op2</th></tr>";
        $operacion.="<tr><th>Operación </th> <th> $this->operador</th></tr>";
        if (self::$tipo == Operacion::RACIONAL)
            $tipo = "Racional";
        else
            $tipo = "Real";
        $operacion.="<tr><th>Tipo de operacion  </th> <th> $tipo</th></tr>";
        return $operacion;
    }
 
    /**
     * método abstracto que se implementará cuando se sepa si una operación es real o racional
     */
    abstract public function opera();
}
OpReal
OpRacional
  • A continuación el código del index.php que he usado yo