Usuario:ManuelRomero/ProgramacionWeb/Inaem2021/Objetos/practica

De WikiEducator
Saltar a: navegación, buscar


Calculadora Real/Racional Versión 1

  • Se pide que realicemos una aplicación web que resuelva cálculos aritméticos con números fraccionarios del tipo a/b.
  • La pantalla de inicio tendrá la siguiente forma:

Calc v1 index.png

  • Como vemos tenemos dos cajas de texto, un desplegable y un botón submit para operar
  • La aplicación implementará los siguientes requisitos
RF1 Diseño de la interfaz gráfica
  • Debes de establecer una interfaz gráfica para poder realizar la aplicación, tal cual se muestra en la image
RF2 Recoger los datos
  • Si aprieto el botón submit (RF2.1), recojo los 3 datos(RF2.2):
RF2.1
  • Podemos seguir con la idea de intentar separar más el controlador y la vista, es decir, todo el código php lo realizaremos en un fichero php que no tenga nada de hmtl
  • Esto nos permite también mejorar la legibilidad, de forma que si hemos presionado submit requerimos ese fichero donde se ejecuta todo el código php.
  • La idea sería hacer algo como esto:
  1. En el fichero index.php escribiríamos
<?php
if (isset($_POST['submit']))
  require "controlador.php";  
 
?>

y en el fichero controlador.php es donde recogeríamos los valores e implementaríamos toda la lógica de la aplicación, generaríamos los valores que luego visualizaremos en el html, pero esto será otro requisito posterior

RF2.2
  • Ahora toca recoger los valores del formulario:
$op1;
$op2;
$operador;
  • Hay que observar que los valores que recojo, en principio son string (siempre el contenido de una caja de texto, cuando lo recojo con $_POST, voy a obtener un valor de tipo string
$op1 = $_POST['op1'];
  • Recordad que para evitar temas de seguridad es mejor recogerlo con filter_input, y si le aplicamos un función de escapar los caracteres especiales como es htmlspecialchar, aún tendremos más seguiridad, por lo que la acción anterior, estará mejor establecida como:
$op1 = htmlspecialchars(filter_input(INPUT_POST, 'op1'));
RF3 Implementar la clase Racional
  • Los valores que he recogido, aunque son de tipo string, los queremos convertir a un tipo especial que vamos a crear, un objeto de la clase racional
  • Se tiene que crear una clase que especifique un objeto que tenga numerador, denominador y que sepa sumar, restar, multiplicar y dividir racionales.
  • Este ejercicio lo hicimos en clase, así que toca recordar y preguntar cualquier duda que tengáis, es muy importante que lo hagáis poco a poco, entendiendo lo que hacéis, no se lo preguntéis al chat openai, mejor con el slack planteemos dudas y resolvamos. En el wiki también hay una clase Racional creada
  • La idea es
class Racional
{
    private $num;
    private $den;
    public function __construct(int|string $num=1, int $den=1){
        //Implementa el código para obtener a partir de los parámetros un valor
        //para $this->num y otro para $this->den
        //Recueda que los parámetros podrían ser:
        //$numero = new Racional() => crearía 1/1
        //$numero = new Racional(6)=> crearía 6/1
        //$numero = new Racional(5,7)=>crearía 5/7
        //$numero = new Racional("6/5")=>crearía 6/5
    }
}
RF4 Leer la entrada como objetos racionales
  • Una vez que esté creada la clase, ya podremos convertir los string leídos en la caja de texto a objetos racionales.
  • Para ello, en el fichero controlador.php:
//Hacemos la autocarga de los ficheros que implementen la especificación de las clases
$carga = fn($clase)=>require "$clase.php";
spl_autoload_register($carga);
 
//Leemos el string de las cajas de texto
$op1 = htmlspecialchars(filter_input(INPUT_POST, 'op1'));
....
 
//Convertimos a Racional
$op1 = new Racional($op1);
  • Esto claramente se puede hacer en una sola instrución, pero mejor separarlo para comprenderlo mejor por pasos.
RF5 Realizar la operación y obtener resultado
  • Para este requisito hay que implementar dos aspectos:
  • 1.- Implementar las operaciones en la clase Racional: que la suma me devuelva otro racional como resultado. por ejemplo el método sumar
    public function sumar(Racional $r1):Racional
    {
        $num = $r1->num * $this->den + $r1->den * $this->num;
        $den = $r1->den * $this->den;
        return new Racional ($num, $den);
    }
  • 2.- Ahora hay que utilizarlo cuando corresponda, en el fichero controlador.php:
   $operador = htmlspecialchars(filter_input(INPUT_POST, 'operador'));
 
   switch($operador){
         case '+':
             $resultado = $op1->sumar($op2);
             break;
   //.......
RF6 implementar el método toString para visualizar los objetos como string
  • Lo que nos queda es que al intentar visualizar un Racional, o sea convertirlo a string, nos visualice el valor, por ejemplo 8/7

Calculadora Real/Racional

  • Se pide que realicemos una aplicación web que resuelva cálculos aritméticos con operadores reales .

(Comment.gif:

  • El término real o racional lo vamos a usar con un significado adaptado a este ejercicio, es decir:
Número Real
un número con o sin decimales
Número Racional
un número expresado en forma de fracción del tipo a/b, donde b, no puede ser cero y ambos han de ser números enteros

)



  • 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

PracticaCalculadoraIndex1.png

  • En el siguiente enlace se puede ver el funcionamiento esperado en esta prácticas


Icon inter.gif
Pŕactica de la calculadora Real - Racional

http://manuel.infenlaces.com/distancia/dwes/practicas/Calculadora/


  • clona el esqueleto (con código implementado)
  git clone https://github.com/MAlejandroR/Calculadora
  • ESte ejemplo es posible que no funcione bien, pero sirve para mostrar cómo debería de funcionar



Icon casestudy.gif
Operaciones que se pueden insertar
9/8+4/7
9.4/2
9/6:6
9/5*5.6 (Éste es un caso de error)


  • 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
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
  • A continuación el código del index.php que he usado yo
  • Para hacer este proyecto facilito un esqueleto con partes ya implementadas para facilitar su desarrollo y comprensión


Icon objectives.jpg
Objetivo
  • El objetivo de esta práctica es familiarizarse con la programación orientada a objetos en php
  • A partir de ahora todos los desarrollos deberán de ser orientados a objetos
  • Cualquier duda planteadla en el foro





</div>