五. 程序功能设计面试题

1.现有如下接口

Interface Ilogger{
Public function __construct($filename);
Public function write($log);
Public function read();
}

现需要日志读写的Logger类,通过构造函数指定了日志文件的路径,通过调用wrtie和read方法完成日志文件的读写。
1)请使用ILogger接口实现Logger类

Interface Ilogger{
    Public function __construct($filename);
    Public function write($log);
    Public function read();
}

class Logger implements Ilogger{
	private $path = '';
	public function __construct($file){
		$this->path = $file;
	}
	//写入方法
	public function write($str){
		$f = fopen($this->path,'w');
		fwrite($f,$str);
		fclose($f);
	}

	// 读日志方法
	public function read(){
		$f = fopen($this->path,'r');
		$str = fread($f);
		fclose($f);
		return $str;
	}
}

2.现有如下Database类的代码,使用上题中的Logger类通过日志记录数据库的操作。

Class Database{	
        private $db;
	private $logger;
	public function __construct(Logger $logger,$dsn = 'mysql:dbname = testdb;host=127.0.0.1',$user = 'dbuser',$password = 'dbpass'){
		$logger = $logger;
		try{
			$db = new PDO($dsn,$user,$password);
		}catch(PDOException $e){
			$logger ->write('Connection failed:{$e ->geMessage()}');
		}
}
	public function execute($sql){
		$result = $db -> exec($sql);
		if($result)
			$logger ->write('$sql is executed,$result line(s) is(are) rows affected by the statement.');
		else
			$loger ->write('Failed to execute : $sql');		
	}
}

3.给定数组a ,调整其中元素的顺序,使得奇数在前偶数在后
样例:a=[1,2,3,4],返回[1,3,2,4]

4.给定两个版本号v1,v2,如v1 > v2 ,返回1,如v1<v2,返回-1,否则返回0。
样例:v1 = “0.1.1”,v2 = “0.1.2”,返回-1;v1=”1.2”,v2=”1.1.13”,返回1。

  $res = 0;
$arr1 = explode(‘.’,$v1);
$arr2 = explode(‘.’,$v2);
$len = min(count($arr1),count($arr2));
for($i=0;$i < $len;$i++){
    if($arr1[$i]>$arr2[$i]){
        $res = -1;
    }else if($arr1[$i]<$arr2[$i]){
        $res = 1;
    }else{
    }
}

if($res == 0){
    if(count($arr1) > count($arr2)){
      res = 1;
    }else if(count($arr1) < count($arr2)){
        $res = -1;
    }
}
Return $res;

5.你所知道的设计模式有哪些?
工厂模式
单例模式
观察者模式

6.编程题:现代化巧克力工厂具备计算机控制的巧克力锅炉。锅炉做的事,就是把巧克力和牛奶融合在一起,然后送到下一个阶段。
请为工厂设计一个巧克力锅炉控制器类。请注意安全问题
(1)锅炉不能满了继续增加原料
(2)锅炉只接受原料巧克力和牛奶
(3)防止锅炉内好没有原料就开始空烧
(4)忽略巧克力,牛奶混合比例。锅炉每次使用后充分冷却进行下次燃烧。

public class ChocolateBoiler {
	private $empty; //是否为空
	private $boiled;//是否已经煮沸
	private static $uniqueInstance;//单例
  
	private ChocolateBoiler() {
		$this->empty = true;
		$this->boiled = false;
	}
  
	public static  getInstance() {
		if (self::$uniqueInstance == null) {
			//创建一个单例
			self::$uniqueInstance = new self();
		}
		
		return self::$uniqueInstance;
	}

	public void fill() {
		if ($this->isEmpty()) {
			$this->empty = false;
			$this->boiled = false;
			// 在锅炉内填满巧克力和牛奶的混合物
		}
	}
 
	public void drain() {
		if (!$this->isEmpty() && $this->isBoiled()) {
			//排出煮沸的巧克力和牛奶
			$this->empty = true;
		}
	}
 
	public void boil() {
		if (!$this->isEmpty() && !$this->isBoiled()) {
			//将炉内物煮沸
			$this->boiled = true;
		}
	}
  
	public boolean isEmpty() {
		return $this->$empty;
	}
 
	public boolean isBoiled() {
		return $this->boiled;
	}
}

7.编程题:请观察数列1,2,3,5,8,13,21 … …编写程序,输出n项的值

8.编程题:一球从100米高度自由落下,每次落地反跳回原高度的一半;在落下。请编写程序,输出第n次落地时,小球落下弹起共经过多少米。

$sum_height = 0;
$height = 100;

$n = 3;
for($i=1;$i<=$n;$i++){
	$sum_height+= ($height+ $height/2);
	$height = $height/2;
}

echo $sum_height;

9.输入参数–一个字符串,返回一个字符串。
输入是一句英文句子,只有英文字(a-z, A-Z)、每个字之间仅以一个空格分格,前后没有空格。
返回的是要把每一个字的字母顺序倒转写,但字的顺序和字母的大小写位置则保持不変
Input: This is an Apple on eBay
Output: Siht si na Elppa no yAbe

$str = "This is an Apple on eBay";

function demo($str){
$res = '';
$arr = explode(' ',$str);
foreach($arr as $k=>$v){
	$len = strlen($v);
	$rev = '';
	for($i=0;$i<$len;$i++){
		if(preg_match('/^[A-Z]+$/', $v[$i])){      
            $rev.=strtoupper($v[$len-$i-1]);
		}else if(preg_match('/^[a-z]+$/', $v[$i])){
			$rev.=strtolower($v[$len-$i-1]);
		}
	}
	$res.= $rev.' ';
}
return trim($res);
	
}

echo demo($str);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我峰兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值