物件導向的例項應用:圖形計算器

1111發表於2019-02-16

1.使用動態頁面實現圖形計算器,可以計算給定圖形的周長和麵積
2.可以使用介面或抽象類作為規範,再寫各子類的多型
3.動態頁面如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            #cal{
                text-align: center;
            }
        </style>
    </head>
    <body>
        <div id="cal">
            <h1>圖形計算器</h1>
            <a href="save.php?action=rect">矩形</a>||
            <a href="save.php?action=triangle">三角形</a>||
            <a href="save.php?action=cycle">圓形</a>
            <hr>
        </div>
        <?php
            include "get.php";
            if(!empty($_GET[`action`])){
                $p=ucfirst($_GET[`action`]);
                $s=new $p($_POST);
                $s->input();
                
                if(!empty($_POST)){
                    if($s->identify($_POST)){
                        echo $s->name."的周長為:".$s->getPerimeter()."<br>";
                        echo $s->name."的面積為:".$s->getArea()."<br>";
                    }                        
                }
            
            }else{
                echo "請選擇圖形!<br>";
            }
            
        ?>
    </body>
</html>

4.介面與各子類如下:

<?php    
    interface Calculate {
        function input();
        function getPerimeter();
        function getArea();
        function identify($arr);
    };
    class Triangle implements Calculate {
        private $line1;
        private $line2;
        private $line3;
        public $name;
        function __construct($arr){
            if(!empty($arr)){
                $this->line1=$arr[`line1`];
                $this->line2=$arr[`line2`];
                $this->line3=$arr[`line3`];
                $this->name="三角形";
            }    
        }        
        function input(){
            if(!empty($_POST)){
                $line1=$_POST[`line1`];
                $line2=$_POST[`line2`];
                $line3=$_POST[`line3`];
            }else{
                $line1=null;
                $line2=null;
                $line3=null;
            }
            $form="<form action=`save.php?action=triangle` method=`post`>";
            $form.="<label for=`line1`>三角形第一條邊為:</label><input type=`text` id=`line1` name=`line1` value=`".$line1."`/><br>";
            $form.="<label for=`line2`>三角形第二條邊為:</label><input type=`text` id=`line2` name=`line2` value=`".$line2."`/><br>";
            $form.="<label for=`line3`>三角形第三條邊為:</label><input type=`text` id=`line3` name=`line3` value=`".$line3."`/><br>";
            $form.="<button type=`submit` name=`doSubmit`>計算</button><br>";
            $form.="</form>";
            echo $form;
        }
        function getPerimeter(){
            return $this->line1+$this->line2+$this->line3;
        }
        function getArea(){
            $p=$this->getPerimeter()/2;
            return sqrt($p*($p-$this->line1)*($p-$this->line2)*($p-$this->line3));
        }
        function identify($arr){
            $line1=$arr[`line1`];
            $line2=$arr[`line2`];
            $line3=$arr[`line3`];
            $identifier=true;
            if($line1<0){
                echo "第一條邊小於0<br>";
                $identifier=false;
            }
            if($line2<0){
                echo "第二條邊小於0<br>";
                $identifier=false;
            }
            if($line3<0){
                echo "第三條邊小於0<br>";
                $identifier=false;
            }
            if(($line1+$line2<$line3)||($line1+$line3<$line2)||($line2+$line3<$line1)){
                $identifier=false;
                echo "兩邊之和小於第三邊<br>";
            }
            return $identifier;
        }
    }
    class Cycle implements Calculate {
        private $radius;
        public $name;
        function __construct($arr){
            if(!empty($arr)){
                $this->radius=$arr[`radius`];
                $this->name="圓形";
            }    
        }        
        function input(){
            $form="<form action=`save.php?action=cycle` method=`post`>";
            $form.="<label for=`radius`>圓形的半徑為:</label><input type=`text` id=`radius` name=`radius`/><br>";
            $form.="<button type=`submit` name=`doSubmit`>計算</button><br>";
            $form.="</form>";
            echo $form;
        }
        function getPerimeter(){
            return 2*pi()*$this->radius;
        }
        function getArea(){
            return pi()*$this->radius*$this->radius;
        }
        function identify($arr){
            $identifier=true;
            if($arr[`radius`]<0){
                echo "半徑不能小於0!<br>";
                $identifier=false;
            }
            return $identifier;
        }
    }
    class Rect implements Calculate {
        private $height;
        private $width;
        public $name;
        function __construct($arr){
            if(!empty($arr)){
                $this->width=$arr[`width`];
                $this->height=$arr[`height`];
                $this->name="矩形";
            }    
        }
        function input(){
            $form="<form action=`save.php?action=rect` method=`post`>";
            $form.="<label for=`width`>矩形的長度:</label><input type=`text` id=`width` name=`width`/><br>";
            $form.="<label for=`height`>矩形的寬度:</label><input type=`text` id=`height` name=`height`/><br>";
            $form.="<button type=`submit` name=`doSubmit`>計算</button><br>";
            $form.="</form>";
            echo $form;
        }
        function getPerimeter(){
            return 2*($this->width+$this->height);
        }
        function getArea(){
            return $this->width*$this->height;
        }
        function identify($arr){
            $identifier=true;
            if($arr[`width`]<0){
                echo "寬度不能小於0!<br>";
                $identifier=false;
            }
            if($arr[`height`]<0){
                echo "高度不能小於0!<br>";
                $identifier=false;
            }
            return $identifier;
        }
    }
    
?>

相關文章