嗨,大家好,我正在尝试制作一个php计算器类,该类需要通过函数进行多个运算,例如当用户尝试通过commpand line claculator.php进行运行时,它会添加2,3,4,5,6,它应该提供输出设为20,它应该允许add方法使用换行符\ n作为数字分隔符示例Calculator.php add 2\n 3,4
它应该允许定义使用什么定界符来分隔数字的示例:
Calculator.php添加\\;\\2;3;4
它也不应该接受负数。如果用户传递的数字超过1000,则应该忽略并给我结果,例如PHP计算器.php加10,20,1010,20,它应该ginore 1010并给出放置为50
我已经尝试过此代码,该代码仅接受2个参数
class Calculator {
private $_val1 , $_val2;
public function __construct($val1, $val2){
$this->_val1 = $val1;
$this->_val2 = $val2;
}
public function add(){
return $this->_val1 + $this->_val2;
}
public function subtract(){
return $this->_val1 - $this->_val2;
}
public function multiply (){
return $this->_val1 * $this->_val2;
}
public function divide () {
return $this->_val1 / $this->_val2;
}
}
$calc = new Calculator(3,4);
echo "<p>3 + 4 = ".$calc->add(). "</p>";
$calc = new Calculator (15,12);
echo "<p>15 - 12 = ".$calc->subtract(). "</p>";
$calc = new Calculator (20,2);
echo "<p> 20 * 2 = ".$calc->multiply(). "</p>";
$calc = new Calculator (20,2);
echo "<p> 20 / 2 = ".$calc ->divide(). "</p>";
谁能帮我解决这些问题
谢谢。
答案 0 :(得分:2)
我认为这是您想要的:
<?php
/**
* Calculator class
*/
class Calculator
{
const min = 0;
const max = 1000;
/**
* Calculate the summation
* @param Array $number
* @return integer
*/
public static function add( $numbers ){
return array_sum( self::_filter_numbers( $numbers ) );
}
/**
* Substract numbers
* @param Array $numbers
* @return integer
*/
public static function subtract( $numbers ){
$filtered_numbers = self::_filter_numbers( $numbers );
$first_number = array_shift( $filtered_numbers );
return ( $first_number - array_sum( $filtered_numbers ) );
}
/**
* Calculate the product of the given numbers
* @param Array $numbers
* @return integer
*/
public static function multiply( $numbers ){
return array_product( self::_filter_numbers( $numbers ) );
}
/**
* Divide the given numbers
* @param Array $numbers
* @return double
*/
public static function divide( $numbers ){
$filtered_numbers = self::_filter_numbers( $numbers );
$first_number = array_shift( $filtered_numbers );
return ($first_number / array_product( $filtered_numbers ));
}
/**
* Filter Invalid numbers
* @param Array $numbers
* @return Array Valid Numbers
*/
private static function _filter_numbers( $numbers ){
return array_filter( $numbers, function( $number ){
return self::_is_valid_number( $number );
} );
}
/**
* Check if the given number is in the interval [0, 1000]
* @param integer $number
* @return boolean
*/
private static function _is_valid_number( $number ){
return ( $number >= self::min && $number <= self::max );
}
}
$test_numbers_1 = [ -2, -1, 0, 1, 2, 1000, 2000 ];
printf( "<h4>Test 1</h4>\n" );
printf( "<p>Numbers: %s</p>\n", implode( ',', $test_numbers_1 ) );
printf( "<p>Add: %d</p>\n", Calculator::add( $test_numbers_1 ) );
printf( "<p>Substract: %d</p>\n", Calculator::subtract( $test_numbers_1 ) );
printf( "<p>Multiply: %d</p>\n", Calculator::multiply( $test_numbers_1 ) );
printf( "<p>Divide: %f</p>\n", Calculator::divide( $test_numbers_1 ) );
$test_numbers_1 = [ -2, -1, 1, 2, 1000, 2000 ];
printf( "<h4>Test 2</h4>\n" );
printf( "<p>Numbers: %s</p>\n", implode( ',', $test_numbers_1 ) );
printf( "<p>Add: %d</p>\n", Calculator::add( $test_numbers_1 ) );
printf( "<p>Substract: %d</p>\n", Calculator::subtract( $test_numbers_1 ) );
printf( "<p>Multiply: %d</p>\n", Calculator::multiply( $test_numbers_1 ) );
printf( "<p>Divide: %f</p>\n", Calculator::divide( $test_numbers_1 ) );
<h4>Test 1</h4>
<p>Numbers: -2,-1,0,1,2,1000,2000</p>
<p>Add: 1003</p>
<p>Substract: -1003</p>
<p>Multiply: 0</p>
<p>Divide: 0.000000</p>
<h4>Test 2</h4>
<p>Numbers: -2,-1,1,2,1000,2000</p>
<p>Add: 1003</p>
<p>Substract: -1001</p>
<p>Multiply: 2000</p>
<p>Divide: 0.000500</p>
答案 1 :(得分:0)
<?php
$opt = getopt('s:n:m:');
try{
if(!array_key_exists('n', $opt)){
throw new InvalidArgumentException('Missing parameter "n"');
}
if(!array_key_exists('m', $opt)){
throw new InvalidArgumentException('Missing parameter "m"');
}
if(array_key_exists('s', $opt)){
$calc = new Calculator($opt['n'], $opt['m'], $opt['s']);
}else{
$calc = new Calculator($opt['n'], $opt['m']);
}
echo $calc;
}catch(Exception $exception){
echo $exception->getMessage();
}
/**
* Class Calculator
*/
class Calculator{
/**
* Min allowed value
*/
const MIN = 0;
/**
* Max allowed value
*/
const MAX = 1000;
/**
* Operators
*/
const OPERATORS = ['add' => '+',
'subtract' => '-',
'multiply' => '*',
'divide' => '/'];
/**
* Separator
* @var string
*/
private $separator = ' ';
/** @var array */
private $numbers = [];
/** @var string */
private $method;
/**
* Calculator constructor.
*
* @param string $numbers
* @param string $method
* @param string $separator
*/
public function __construct(string $numbers, string $method, string $separator = ' '){
$this->separator = $separator;
$this->method = $method;
$this->numbers = $this->parseNumbers($numbers);
}
/**
* @return mixed
*/
public function calculate(){
return $this->{$this->method}();
}
/**
* @return float
*/
public function add(): float{
return (float)array_sum($this->numbers);
}
/**
* @return float
*/
public function subtract(): float{
$numbers = $this->numbers;
$result = array_shift($numbers);
foreach($numbers as $number){
$result -= $number;
}
return (float)$result;
}
/**
* @return float
*/
public function multiply(): float{
return (float)array_product($this->numbers);
}
/**
* @return float
* @throws Exception
*/
public function divide(): float{
$numbers = $this->numbers;
$result = array_shift($numbers);
foreach($numbers as $number){
if($number == 0){
throw new Exception('Div by zero.');
}
$result = $result / $number;
}
return (float)$result;
}
/**
* @param string $numbers
*
* @return array
*/
private function parseNumbers(string $numbers): array{
$numbers = explode($this->separator, $numbers);
$numbers = $this->checkNumbers($numbers);
$numbers = array_map(function($value){
$value = trim($value);
if(is_numeric($value)){
return (float)$value;
}
},
$numbers);
$numbers = array_filter($numbers,
function($value){
return ($value !== null);
});
return (array)$numbers;
}
/**
* @param array $numbers
*
* @return array
*/
private function checkNumbers(array $numbers): array{
return array_filter($numbers,
function($value){
if($value < 0){
throw new Exception('Negative numbers not allowed');
}
return ($value >= self::MIN AND $value <= self::MAX);
});
}
/**
* @return string
*/
public function __toString(): string{
try{
$numbers = $this->numbers;
$output = array_shift($numbers);
foreach($numbers as $number){
$output .= ' '.self::OPERATORS[$this->method].' '.$number;
}
$output .= ' = '.$this->calculate();
return trim($output);
}catch(Exception $exception){
return $exception->getMessage();
}
}
}
php index.php -m add -n "1 2 3 4 5" // print 1 + 2 + 3 + 4 + 5 = 15
php index.php -m subtract -n "1 2 3 4 5" // print 1 - 2 - 3 - 4 - 5 = -13
php index.php -m multiply -n "1 2 3 4 5" // print 1 * 2 * 3 * 4 * 5 = 120
php index.php -m divide -n "1 2 3 4 5" // print 1 / 2 / 3 / 4 / 5 = 0.0083333333333333
php index.php -m add -s ";" -n "1;2;3;4;5" // print 1 + 2 + 3 + 4 + 5 = 15
php index.php -m add -n "1 2 3 4 5 2000" // print 1 + 2 + 3 + 4 + 5 = 15
php index.php -m divide -n "0 1 2 3 4 5" // print 0 / 1 / 2 / 3 / 4 / 5 = 0
php index.php -m add -n "1 2 3 4 5 -20" // print Negative numbers not allowed
php index.php -m divide -n "1 0 2 3 4 5" // print Div by zero.
php index.php -m add -n "1
2 3 4 5" // print 1 + 2 + 3 + 4 + 5 = 15