Comunidad PHPeros

Lenguajes => PHP => (POO) Programación Orientada a Objetos => Mensaje iniciado por: Marcus en 14 de Abril de 2011, 00:02:24 am

Título: [Clase] Ecuaciones de primer grado
Publicado por: Marcus en 14 de Abril de 2011, 00:02:24 am
Hola chicos!

Viendo éste (http://www.phperos.net/foro/index.php?topic=7435.0) tema me ha entrado interés en hacer algo así, finalmente después de 3 días programando he terminado.

Sin más, el código:

<?php
class Ecuacion{
    private $Terminos = array();
    public $Resultado;
    public $PrimerMiembroA;
    public $SegundoMiembroA;
    public $PrimerMiembroC;
    public $SegundoMiembroC;
    public function __construct($PrimerMiembro, $SegundoMiembro){
        $PrimerMiembro = str_replace(" ", "", $PrimerMiembro);
        $SegundoMiembro = str_replace(" ", "", $SegundoMiembro);
        if($PrimerMiembro{0} != "-" && $PrimerMiembro{0} != "+"){
            $PrimerMiembro = "+".$PrimerMiembro;
        }
        if($SegundoMiembro{0} != "-" && $SegundoMiembro{0} != "+"){
            $SegundoMiembro = "+".$SegundoMiembro;
        }
        $this->PrimerMiembroA = $PrimerMiembro;
        $this->SegundoMiembroA = $SegundoMiembro;
    }
    private function ProcesarTerminos($Miembro, $LadoMiembro, $Signo){
        switch($Signo){
            case "+":
                $SignoContrario = "-";
                $SignoArray = 1;
                break;
            case "-":
                $SignoContrario = "+";
                $SignoArray = 0;
                break;
        }
        $array = explode($Signo, $Miembro);
        foreach($array as $explode){
            if(strstr($explode, $SignoContrario) == true){
                $pos = strpos($explode, $SignoContrario);
                $delete = substr($explode, $pos);
                $explode = str_replace($delete, "", $explode);
            }
            if($explode{0} == "x"){
                $explode = "1x";
            }
            if($explode != ""){
                if(stristr($explode, "x") == true){
                    $this->Terminos[] = array("valor" =>intval(str_ireplace("x", "", $explode)), "variable" => 1,"signo" => $SignoArray, "miembro" => $LadoMiembro);
                } else {
                    $this->Terminos[] = array("valor" => intval($explode),"variable" => 0,"signo" => $SignoArray,"miembro" => $LadoMiembro);
                }
            }
        }               
        // (Valor, Variable, ¿Es positivo?, Miembro)
    }
    public function AlmacenarTerminos(){
        $this->ProcesarTerminos($this->PrimerMiembroA, 1, "+");
        $this->ProcesarTerminos($this->PrimerMiembroA, 1, "-");
        $this->ProcesarTerminos($this->SegundoMiembroA, 2, "+");
        $this->ProcesarTerminos($this->SegundoMiembroA, 2, "-");
        for($i = 0; $i <= count($this->Terminos); $i++){
            if($this->Terminos[$i]['signo'] == 1){
                $SignoContrario = 0;
                $Signo = "+";   
            } else {
                $SignoContrario = 1;
                $Signo = "-";
            }
            if($this->Terminos[$i]['variable'] == 1 && $this->Terminos[$i]['miembro'] == 2){
                $this->Terminos[$i]['miembro'] = 1;
                $this->Terminos[$i]['signo'] = $SignoContrario;
            } elseif($this->Terminos[$i]['variable'] == 0 && $this->Terminos[$i]['miembro'] == 1){
                $this->Terminos[$i]['miembro'] = 2;
                $this->Terminos[$i]['signo'] = $SignoContrario;
            }
        }
    }   
    public function DeterminarResultado(){
        $a = array();
        $aa = array();
        for($i = 0; $i < count($this->Terminos); $i++){
            if($this->Terminos[$i]['variable'] == 1){
                if($this->Terminos[$i]['signo'] == 0){
                    $a[] = intval("-".$this->Terminos[$i]['valor']);
                } else {
                    $a[] = $this->Terminos[$i]['valor'];
                }
            }
        }
        for($i = 0; $i < count($this->Terminos); $i++){
            if($this->Terminos[$i]['variable'] == 0){
                if($this->Terminos[$i]['signo'] == 0){
                    $aa[] = intval("-".$this->Terminos[$i]['valor']);
                } else {
                    $aa[] = $this->Terminos[$i]['valor'];
                }
            }
        }
        $this->PrimerMiembroC = array_sum($a)."x";
        $this->SegundoMiembroC = array_sum($aa);
        $amm = array_sum($a);
        if(is_int($this->SegundoMiembroC/$amm)){
            $this->Resultado = "x = ".$this->SegundoMiembroC/$amm;
        } else {
            $this->Resultado = "x = ".$this->SegundoMiembroC."/".$amm;
        }
    }
}
$ecu = new Ecuacion("4x-4 - 2", "-3x -8x -3"); //(Primer termino, segundo termino
$ecu->AlmacenarTerminos();
$ecu->DeterminarResultado();
echo $ecu->PrimerMiembroA."=".$ecu->SegundoMiembroA."<br />";
echo $ecu->PrimerMiembroC."=".$ecu->SegundoMiembroC."<br />";
echo $ecu->Resultado;
?>


Que tal?, que les parece?
Título: Re:[Clase] Ecuaciones de primer grado
Publicado por: RumbaStereo en 14 de Abril de 2011, 00:57:22 am
Muy Bien (se nota que trabajastes ;)) Pero Intenta explicar un poco mas tu Codigo un saludo :)
Título: Re:[Clase] Ecuaciones de primer grado
Publicado por: Marcus en 14 de Abril de 2011, 01:02:00 am
Muy Bien (se nota que trabajastes ;)) Pero Intenta explicar un poco mas tu Codigo un saludo :)
Muchas gracias!

Vale, ahora lo explico.
Título: Re:[Clase] Ecuaciones de primer grado
Publicado por: javipilo en 15 de Abril de 2011, 10:10:06 am
Muy bien, te llevas un +1 por el código.

Cuando llegue a mi casa lo pruebo y te digo, pero el uso d elas variables y los objetos es perfecto.

Saludos
Título: Re:[Clase] Ecuaciones de primer grado
Publicado por: Physlet en 16 de Abril de 2011, 00:37:00 am
Por lo poco que probé, he visto que funciona y te felicito por ello, pero no me agrada como manejas los atributos de la clase. Hay muchos atributos innecesarios y que a mí parecer y según lo que he estudiado, rompen el esquema de una programación orientada a objetos pura.
Título: Re:[Clase] Ecuaciones de primer grado
Publicado por: Marcus en 16 de Abril de 2011, 01:37:53 am
Por lo poco que probé, he visto que funciona y te felicito por ello, pero no me agrada como manejas los atributos de la clase. Hay muchos atributos innecesarios y que a mí parecer y según lo que he estudiado, rompen el esquema de una programación orientada a objetos pura.
Muchas gracias :)

Me podrías decir cuales atributos son incorrectos/innecesarios? Es que yo estoy empezando con POO y la verdad es que quiero aprender correctamente