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);