Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/php/POO/practica»
De WikiEducator
(→Calculadora Real/Racional) |
|||
| Línea 82: | Línea 82: | ||
</source> | </source> | ||
}} | }} | ||
| − | {{ | + | {{MRM_Ejemplo|Title= Operaciones que se pueden insertar| |
;9/8+4/7 | ;9/8+4/7 | ||
;9.4/2 | ;9.4/2 | ||
Revisión de 09:40 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
- 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
| 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
| 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
| Clase OperacionReal |
|---|
<?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 } |
- OpRacional
| Clase OpRacional |
|---|
<?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; } } |
- A continuación el código del index.php que he usado yo
| Código de index.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> |
