home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 August / PCWorld_2001-08_cd.bin / Komunikace / phptriad / phptriadsetup2-11.exe / php / pear / Math / Fraction.php next >
PHP Script  |  2001-01-10  |  8KB  |  290 lines

  1. <?php
  2. //
  3. // +----------------------------------------------------------------------+
  4. // | PHP version 4.0                                                      |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2001 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.02 of the PHP license,      |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Sebastian Bergmann <sb@sebastian-bergmann.de>               |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id: Fraction.php,v 1.2 2001/01/10 01:01:56 ssb Exp $
  20. //
  21.  
  22.   /**
  23.   * Math::Math_Fraction
  24.   * 
  25.   * Purpose:
  26.   * 
  27.   *   Class for handling fractions.
  28.   * 
  29.   * Example:
  30.   * 
  31.   *   $a = new Math_Fraction( 1, 2 );
  32.   *   $b = new Math_Fraction( 3, 4 );
  33.   * 
  34.   *   $a->add( $b );
  35.   * 
  36.   * @author   Sebastian Bergmann <sb@sebastian-bergmann.de>
  37.   * @version  $Revision: 1.2 $
  38.   * @access   public
  39.   */
  40.  
  41.   require_once "Math/Util.php";
  42.  
  43.   class Math_Fraction
  44.   {
  45.     // {{{ properties
  46.  
  47.     /**
  48.     * zaehler of the fraction
  49.     *
  50.     * @var    int zaehler
  51.     * @access public
  52.     */
  53.  
  54.     var $zaehler;
  55.  
  56.     /**
  57.     * nenner of the fraction
  58.     *
  59.     * @var    int nenner
  60.     * @access public
  61.     */
  62.  
  63.     var $nenner;
  64.  
  65.     // }}}
  66.     // {{{ Math_Fraction( $zaehler, $nenner )
  67.  
  68.     /**
  69.     * Constructor.
  70.     *
  71.     * @param  int zaehler
  72.     * @param  int nenner
  73.     * @access public
  74.     */
  75.  
  76.     function Math_Fraction( $zaehler, $nenner = 1 )
  77.     {
  78.       $this->zaehler  = $zaehler;
  79.       $this->nenner   = $nenner;
  80.     }
  81.  
  82.     // }}}
  83.     // {{{ add( $fraction, $overwrite_with_result )
  84.  
  85.     /**
  86.     * Add another fraction to this one.
  87.     *
  88.     * @param  Math_Fraction fraction              
  89.     * @param  boolean       overwrite_with_result 
  90.     * @return Math_Fraction result (if overwrite_with_result == false)
  91.     * @access public
  92.     * @see    sub, mul, div
  93.     */
  94.  
  95.     function add( $fraction, $overwrite_with_result = true )
  96.     {
  97.       // check, if argument is a fraction
  98.       $fraction = $this->_check_fraction( $fraction );
  99.  
  100.       // add
  101.       $result = new Math_Fraction( ( $this->zaehler + $fraction->zaehler ), 
  102.                                    ( $this->nenner  * $fraction->nenner  )
  103.                                  );
  104.  
  105.       // handle result
  106.       return $this->_return( $result, $overwrite_with_result );
  107.     }
  108.  
  109.     // }}}
  110.     // {{{ sub( $fraction, $overwrite_with_result )
  111.  
  112.     /**
  113.     * Subtract another fraction from this one.
  114.     *
  115.     * @param  Math_Fraction fraction              
  116.     * @param  boolean       overwrite_with_result 
  117.     * @return Math_Fraction result (if overwrite_with_result == false)
  118.     * @access public
  119.     * @see    add, mul, div
  120.     */
  121.  
  122.     function sub( $fraction, $overwrite_with_result = true )
  123.     {
  124.       // check, if argument is a fraction
  125.       $fraction = $this->_check_fraction( $fraction );
  126.  
  127.       // subtract
  128.       $result = new Math_Fraction( ( $this->zaehler - $fraction->zaehler ), 
  129.                                    ( $this->nenner  * $fraction->nenner  )
  130.                                  );
  131.  
  132.       // handle result
  133.       return $this->_return( $result, $overwrite_with_result );
  134.     }
  135.  
  136.     // }}}
  137.     // {{{ mul( $fraction, $overwrite_with_result )
  138.  
  139.     /**
  140.     * Multiply another fraction with this one.
  141.     *
  142.     * @param  Math_Fraction fraction              
  143.     * @param  boolean       overwrite_with_result 
  144.     * @return Math_Fraction result (if overwrite_with_result == false)
  145.     * @access public
  146.     * @see    add, sub, div
  147.     */
  148.  
  149.     function mul( $fraction, $overwrite_with_result = true )
  150.     {
  151.       // check, if argument is a fraction
  152.       $fraction = $this->_check_fraction( $fraction );
  153.  
  154.       // multiply
  155.       $result = new Math_Fraction( ( $this->zaehler * $fraction->zaehler ), 
  156.                                    ( $this->nenner  * $fraction->nenner  )
  157.                                  );
  158.  
  159.       // handle result
  160.       return $this->_return( $result, $overwrite_with_result );
  161.     }
  162.  
  163.     // }}}
  164.     // {{{ div( $fraction, $overwrite_with_result )
  165.  
  166.     /**
  167.     * Divide this fraction by another one.
  168.     *
  169.     * @param  Math_Fraction fraction              
  170.     * @param  boolean       overwrite_with_result 
  171.     * @return Math_Fraction result (if overwrite_with_result == false)
  172.     * @access public
  173.     * @see    add, sub, mul
  174.     */
  175.  
  176.     function div( $fraction, $overwrite_with_result = true )
  177.     {
  178.       // check, if argument is a fraction
  179.       $fraction = $this->_check_fraction( $fraction );
  180.  
  181.       // divide
  182.       $result = new Math_Fraction( ( $this->zaehler * $fraction->nenner  ), 
  183.                                    ( $this->nenner  * $fraction->zaehler )
  184.                                  );
  185.  
  186.       // handle result
  187.       return $this->_return( $result, $overwrite_with_result );
  188.     }
  189.  
  190.     // }}}
  191.     // {{{ normalize()
  192.  
  193.     /**
  194.     * Normalize this fraction.
  195.     *
  196.     * @access public
  197.     */
  198.  
  199.     function normalize()
  200.     {
  201.       // get greatest common divisor
  202.       $gcd = gcd( $this->zaehler, $this->nenner );
  203.  
  204.       // divide zaehler / nenner by gcd
  205.       $this->zaehler = $this->zaehler / $gcd;
  206.       $this->nenner  = $this->nenner  / $gcd;
  207.     }
  208.  
  209.     // }}}
  210.     // {{{ dump()
  211.  
  212.     /**
  213.     * Dump this fraction.
  214.     *
  215.     * @access public
  216.     */
  217.  
  218.     function dump()
  219.     {
  220.       print $this->get();
  221.     }
  222.  
  223.     // }}}
  224.     // {{{ get()
  225.  
  226.     /**
  227.     * Get string representation of this fraction.
  228.     *
  229.     * @return string  representation of fraction
  230.     * @access public
  231.     */
  232.  
  233.     function get()
  234.     {
  235.       return $this->zaehler . " / " . $this->nenner;
  236.     }
  237.  
  238.     // }}}
  239.     // {{{ _check_fraction( $fraction )
  240.  
  241.     /**
  242.     * Check, if a varaible holds a Math_Fraction object.
  243.     *
  244.     * @param  Math_Fraction fraction to be checked
  245.     * @return Math_Fraction checked fraction
  246.     * @access public
  247.     */
  248.  
  249.     function _check_fraction( $fraction )
  250.     {
  251.       if( get_class( $fraction ) != "math_fraction" )
  252.       {
  253.         $fraction = new Math_Fraction( $fraction );
  254.       }
  255.  
  256.       return $fraction;
  257.     }
  258.  
  259.     // }}}
  260.     // {{{ _return( $result, $overwrite_with_result )
  261.  
  262.     /**
  263.     * Handle the return or storage of a result from add, sub, mul or div.
  264.     *
  265.     * @param Math_Fraction  result
  266.     * @param boolean        overwrite_with_result
  267.     * @return Math_Fraction result (if overwrite_with_result == false)
  268.     * @access public
  269.     */
  270.  
  271.     function _return( $result, $overwrite_with_result )
  272.     {
  273.       $result->normalize();
  274.  
  275.       if( $overwrite_with_result )
  276.       {
  277.         $this->zaehler  = $result->zaehler;
  278.         $this->nenner   = $result->nenner;
  279.       }
  280.  
  281.       else
  282.       {
  283.         return $result;
  284.       }
  285.     }
  286.  
  287.     // }}}
  288.   }
  289. ?>
  290.