Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/php/POO/practica»
De WikiEducator
(→Calculadora Real/Racional) |
|||
Línea 535: | Línea 535: | ||
}} | }} | ||
--> | --> | ||
+ | {{Plegable|hide|Title=Clase Abstracta Operaciona| | ||
+ | <source lang=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 string $operacion es una cadena con la operacion | ||
+ | * @return int indica el tipo de operaciion (ver constantes anteriores) | ||
+ | */ | ||
+ | public static function tipoOperacion($operacion) { | ||
+ | //Implementa | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | /** | ||
+ | * | ||
+ | * @param string $operacion La operación a realizar leída de una caja de texto | ||
+ | * inicializa los atributos | ||
+ | */ | ||
+ | public function __construct($operacion) { | ||
+ | |||
+ | } | ||
+ | |||
+ | private function obtenerOperador1($operacion) { | ||
+ | |||
+ | } | ||
+ | |||
+ | private function obtenerOperador2($operacion) { | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | /** Cuidado con el carácter /, puede ser parte del operadorando en el caso racional | ||
+ | en el caso real es un posible opearador | ||
+ | */ | ||
+ | private function obtenerOperador($operacion) { | ||
+ | |||
+ | } | ||
+ | |||
+ | 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 "<br />$this->op1$this->operador$this->op2 = "; | ||
+ | } | ||
+ | |||
+ | 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; | ||
+ | } | ||
+ | |||
+ | |||
+ | //Este método convierte a la clase en abstracta | ||
+ | //Se DEBE implementar en las clases que hereden de ella | ||
+ | abstract public function opera(); | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | }} | ||
+ | {{Plegable|hide|Title= Clase OperacionRacional| | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | |||
+ | /** | ||
+ | * Description of OperacionRacional | ||
+ | * | ||
+ | * @author manuel | ||
+ | */ | ||
+ | class OperacionRacional extends Operacion { | ||
+ | |||
+ | /** | ||
+ | inicializa los operandos, ahora ya sabemos que es un Racional .... | ||
+ | */ | ||
+ | public function __construct($operacion) { | ||
+ | //Implementa | ||
+ | } | ||
+ | |||
+ | //Realiza la operacion indicada | ||
+ | public function opera() { | ||
+ | //Implementa | ||
+ | } | ||
+ | |||
+ | public function __toString() { | ||
+ | //Implementa | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | 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>"; | ||
+ | $rtdo = $this->opera(); | ||
+ | $r.= "<tr><th>Resultado simplificado</th><th>" . $rtdo->simplificar() . "</th></tr>"; | ||
+ | $r.= "</table>"; | ||
+ | return $r; | ||
+ | } | ||
+ | }} | ||
+ | {{Plegable|hide|Title= Clase OperacionReal| | ||
+ | |||
+ | <source ang=php> | ||
+ | <?php | ||
+ | |||
+ | /* | ||
+ | * To change this license header, choose License Headers in Project Properties. | ||
+ | * To change this template file, choose Tools | Templates | ||
+ | * and open the template in the editor. | ||
+ | */ | ||
+ | |||
+ | /** | ||
+ | * Description of OperacionReal | ||
+ | * | ||
+ | * @author manuel | ||
+ | */ | ||
+ | class OperacionReal extends Operacion { | ||
+ | |||
+ | public function __construct($operacion) { | ||
+ | parent::__construct($operacion); | ||
+ | } | ||
+ | |||
+ | public function opera() { | ||
+ | |||
+ | switch ($this->operador) { | ||
+ | case '+': | ||
+ | $resultado = $this->op1 + $this->op2; | ||
+ | break; | ||
+ | case '-': | ||
+ | $resultado = $this->op1 - $this->op2; | ||
+ | break; | ||
+ | case '*': | ||
+ | $resultado = $this->op1 * $this->op2; | ||
+ | break; | ||
+ | case '/': | ||
+ | $resultado = $this->op1 / $this->op2; | ||
+ | break; | ||
+ | default : | ||
+ | $resultado = FALSE; | ||
+ | } | ||
+ | return $resultado; | ||
+ | } | ||
+ | |||
+ | public function __toString() { | ||
+ | $r = parent::__toString(); | ||
+ | $r.= $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> | ||
+ | |||
+ | }} | ||
</div> | </div> |
Revisión de 21:32 12 mar 2018
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
- OP1 es un operador real o racional
- operador es una operación que puede ser +,-,*,/,:.
- 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
- En el siguiente enlace se puede ver el funcionamiento esperado en esta prácticas
- Vamos a aplicar una pequeña css para la pantalla
CSS para práctica de la calculadora |
---|
fieldset{ border: 0.25em solid; align : center; position: absolute; left: 55%; top: 20%; margin-left: -115px; margin-top: -80px; padding:10px; background-color: #eee; } fieldset#rtdo{ border: 0.25em solid; position: absolute; left: 55%; top: 55%; padding:10px; background-color: #eee; } fieldset#ayuda{ border: 0.25em solid; position: absolute; left: 10%; top: 20%; padding:10px; background-color: #eee; } legend{ font-size: 2em; color: green; font-weight: bold; } input[type=submit] { padding:5px 15px 10px 10px; background:#ccc; border:2; cursor:pointer; -webkit-border-radius: 5px; border-radius: 5px; margin: 1em; font-size: 1em; } label{ font-weight: bold; font-size : 1.5em; margin: 0.65em; } input[type=text]{ font-weight: bold; font-size : 1.5em; padding: 1em 1em 1em 1em; margin: 1em 1em 1em 1em; } #texhelp{ font-size : 1.2em; } |
- Al presionar intro aparecerá un texto (en el primer caso 9/8+4/7)
- En el segundo caso ( 9.4 / 2)
- En el tercer caso ( 9/6:6)
- En el cuarto caso es erróneo ( 9/5*5.6 )
- Para realizar este ejercicio, tendremos que implementar las siguientes clases según aparece en el dibujo
- Es obligatorio usar esta jerarquía de clase.
- 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
- Num (p.e 10)
- Den (p.e 6)
- Métodos
- 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
- simplifica() Simplifica si se puede numerador y denominador (Utilizar el método de Euclides (mcd))
- suma
- resta
- multiplica
- 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
//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
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 string $operacion es una cadena con la operacion * @return int indica el tipo de operaciion (ver constantes anteriores) */ public static function tipoOperacion($operacion) { //Implementa } /** * * @param string $operacion La operación a realizar leída de una caja de texto * inicializa los atributos */ public function __construct($operacion) { } private function obtenerOperador1($operacion) { } private function obtenerOperador2($operacion) { } /** Cuidado con el carácter /, puede ser parte del operadorando en el caso racional en el caso real es un posible opearador */ private function obtenerOperador($operacion) { } 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 "<br />$this->op1$this->operador$this->op2 = "; } 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; } //Este método convierte a la clase en abstracta //Se DEBE implementar en las clases que hereden de ella abstract public function opera(); } |
---|
{{{3}}} |
<?php /** * Description of OperacionRacional * * @author manuel */ class OperacionRacional extends Operacion { /** inicializa los operandos, ahora ya sabemos que es un Racional .... */ public function __construct($operacion) { //Implementa } //Realiza la operacion indicada public function opera() { //Implementa } public function __toString() { //Implementa } 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>"; $rtdo = $this->opera(); $r.= "<tr><th>Resultado simplificado</th><th>" . $rtdo->simplificar() . "</th></tr>"; $r.= "</table>"; return $r; } }} {{Plegable|hide|Title= Clase OperacionReal| <source ang=php> <?php /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ /** * Description of OperacionReal * * @author manuel */ class OperacionReal extends Operacion { public function __construct($operacion) { parent::__construct($operacion); } public function opera() { switch ($this->operador) { case '+': $resultado = $this->op1 + $this->op2; break; case '-': $resultado = $this->op1 - $this->op2; break; case '*': $resultado = $this->op1 * $this->op2; break; case '/': $resultado = $this->op1 / $this->op2; break; default : $resultado = FALSE; } return $resultado; } public function __toString() { $r = parent::__toString(); $r.= $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 } |
---|
{{{3}}} |