fork download
  1. <?php
  2. header("Content-Type: text/plain");
  3.  
  4. // ООП. Вектор и антикризичные меры
  5.  
  6. // Класс сотрудника
  7. class Employee
  8. {
  9. private $rank = 1; // ранг
  10. private $chief = 0; // статус руководителя
  11. private $profession; // профессия
  12. private $salaryRate = 0;// индивидуальная ставка работника
  13. private $coffeeRate = 0;// индивидуальное потребление кофе
  14.  
  15. // Коофициенты зарплаты для ранга
  16. private $rankSalary = array(1 => 1,
  17. 2 => 1.25,
  18. 3 => 1.5);
  19. // Коофициенты зарплаты для начальников
  20. private $chiefSalary = array(0 => 1,
  21. 1 => 1.5);
  22. // Коофициенты потребления кофе для начальников
  23. private $chiefCoffee = array(0 => 1,
  24. 1 => 2);
  25. // Коофициенты продуктивности для начальников
  26. private $chiefProduct = array(0 => 1,
  27. 1 => 0);
  28.  
  29. public function __construct(Profession $profession, $rank, $chief)
  30. {
  31. // Присвоение профессии сотруднику
  32. $this->profession = $profession;
  33. // Присвоение ранга сотруднику
  34. $this->rank = $rank;
  35. // Присвоение статуса начальник
  36. $this->chief = $chief;
  37. }
  38.  
  39. // Присвоение профессии сотруднику
  40. public function addProfession(Profession $profession)
  41. {
  42. $this->profession = $profession;
  43. // Сбрасываем ставку при смене профессии
  44. $this->salaryRate = 0;
  45. // Сбрасываем потребление кофе
  46. $this->coffeeRate = 0;
  47. }
  48.  
  49. // Возвращает ранг сотрудника
  50. public function getRank()
  51. {
  52. return $this->rank;
  53. }
  54.  
  55. // Присвоение ранга
  56. public function setRank($rank)
  57. {
  58. $this->rank = $rank;
  59. }
  60.  
  61. // Изменение статуса начальника
  62. public function setСhief($chief)
  63. {
  64. $this->chief = $chief;
  65. }
  66.  
  67. // Изменение ставки
  68. public function setSalaryRate($salary)
  69. {
  70. $this->salaryRate = $salary;
  71. }
  72.  
  73. // Изменение кол-во выпиваемого кофе
  74. public function setCoffeeRate($coffee)
  75. {
  76. $this->coffeeRate = $coffee;
  77. }
  78.  
  79. // Возвращаем название профессии сотрудника
  80. public function getProfession()
  81. {
  82. return $this->profession;
  83. }
  84.  
  85. // Возвращаем статус шафа сотрудника
  86. public function getChief()
  87. {
  88. return $this->chief;
  89. }
  90.  
  91. // Расчет зарплаты
  92. public function getSalary()
  93. {
  94. // Профессия
  95. $profession = $this->profession;
  96. // Ставка, берем из данного класса если поле переопределено, иначе берем из профессии
  97. if ($this->salaryRate != 0) {
  98. $salaryRate = $this->salaryRate;
  99. } else {
  100. $salaryRate = $profession->getSalaryRate();
  101. }
  102. // Узнаем коэффициент согласно рангу сотрудника
  103. $salaryMultiplier = $this->rankSalary[$this->rank];
  104. // Узнаем коэффициент для начальника
  105. $chiefSalaryMultiplier = $this->chiefSalary[$this->chief];
  106. // Расчет зарплаты
  107. $salary = $salaryRate * $salaryMultiplier * $chiefSalaryMultiplier;
  108.  
  109. return $salary;
  110. }
  111.  
  112. // Расчет потребления кофе
  113. public function getCoffee()
  114. {
  115. // Профессия
  116. $profession = $this->profession;
  117. // Потребление кофе
  118. // Берем из данного класса если поле переопределено, иначе берем из профессии
  119. if ($this->coffeeRate != 0) {
  120. $coffeeRate = $this->coffeeRate;
  121. } else {
  122. $coffeeRate = $profession->getCoffeeRate();
  123. }
  124. // Вычисляем коэффициент для начальника
  125. $tmpchiefCoffee = $this->chiefCoffee[$this->chief];
  126. // Расчет потребления кофе
  127. $coffee = $coffeeRate * $tmpchiefCoffee;
  128.  
  129. return $coffee;
  130. }
  131.  
  132. // Расчет продуктивности
  133. public function getProduct()
  134. {
  135. // Профессия
  136. $profession = $this->profession;
  137. // Продуктивность по профессии
  138. $productRate = $profession->getProduct();
  139. // Вычисляем коэффициент для начальника
  140. $tmpchiefProduct = $this->chiefProduct[$this->chief];
  141. // Расчет продуктивности
  142. $product = $productRate * $tmpchiefProduct;
  143.  
  144. return $product;
  145. }
  146.  
  147.  
  148. }
  149.  
  150. // Абстрактный класс профессии
  151. abstract class Profession
  152. {
  153. // Возвращает имя
  154. public function getName()
  155. {
  156. return get_class($this);
  157. }
  158.  
  159. abstract public function getSalaryRate();
  160.  
  161. abstract public function getCoffeeRate();
  162.  
  163. abstract public function getProduct();
  164. }
  165.  
  166. // Класс менджер
  167. class Manager extends Profession
  168. {
  169. public function getSalaryRate()
  170. {
  171. return 500;
  172. }
  173.  
  174. public function getCoffeeRate()
  175. {
  176. return 20;
  177. }
  178.  
  179. public function getProduct()
  180. {
  181. return 200;
  182. }
  183. }
  184.  
  185. // Класс маркетолог
  186. class Marketer extends Profession
  187. {
  188. public function getSalaryRate()
  189. {
  190. return 400;
  191. }
  192.  
  193. public function getCoffeeRate()
  194. {
  195. return 15;
  196. }
  197. public function getProduct()
  198. {
  199. return 150;
  200. }
  201. }
  202.  
  203. // Класс инженер
  204. class Engineer extends Profession
  205. {
  206. public function getSalaryRate()
  207. {
  208. return 200;
  209. }
  210.  
  211. public function getCoffeeRate()
  212. {
  213. return 5;
  214. }
  215. public function getProduct()
  216. {
  217. return 50;
  218. }
  219. }
  220.  
  221. // Класс аналитик
  222. class Analyst extends Profession
  223. {
  224. public function getSalaryRate()
  225. {
  226. return 800;
  227. }
  228.  
  229. public function getCoffeeRate()
  230. {
  231. return 50;
  232. }
  233.  
  234. public function getProduct()
  235. {
  236. return 5;
  237. }
  238. }
  239.  
  240. // Класс департамента
  241. class Departament
  242. {
  243. public $name = ""; // название
  244. private $employees = array(); // сотрудники
  245.  
  246. public function __construct($name)
  247. {
  248. $this->name = $name;
  249. }
  250.  
  251. // Клонирование департамента
  252. public function __clone()
  253. {
  254. $employeesClones = array(); // клоны работников
  255.  
  256. foreach ($this->employees as $employee) {
  257. $employee = clone $employee;
  258. $departamentsClones[] = $employee;
  259. }
  260. // Заменяем массив работников массивом клонов
  261. $this->employees = $departamentsClones;
  262. }
  263.  
  264. // Прием сотрудника на работу
  265. public function addEmployee(Employee $employee)
  266. {
  267. $this->employees[] = $employee;
  268. }
  269.  
  270. // Расчет количества сотрудников по профессии, не указанный параметр возвращает общее кол-во
  271. public function countEmployees($profession = null)
  272. {
  273. $employeesNumber = 0; // число сотрудников
  274.  
  275. // Если профессия не задана
  276. if (!$profession) {
  277. return count($this->employees);
  278. }
  279.  
  280. // Если считаем сотрудников определенной профессии
  281. foreach ($this->employees as $employee) {
  282.  
  283. // Если сотрудник не соответствует профессии
  284. if ($employee->getProfession()->getName() != $profession) {
  285. continue;
  286. }
  287. // Счетчик
  288. $employeesNumber++;
  289. }
  290. return $employeesNumber;
  291. }
  292.  
  293. // Возвращаем сотрудников массивом
  294. public function getEmployees()
  295. {
  296. return $this->employees;
  297. }
  298.  
  299. // Возвращает сотрудников заданной профессии массивом
  300. public function findEmployees($profession)
  301. {
  302. $employees = array(); // массив Сотрудников
  303.  
  304. // Перебираем всех сотрудников
  305. foreach ($this->employees as $employee) {
  306. // Если название класса профессии сотрудника соответствует профессии
  307. if (get_class ($employee->getProfession()) == $profession) {
  308. $employees[] = $employee;
  309. }
  310. }
  311. // Возвращаем Сотрудников
  312. return $employees;
  313.  
  314. }
  315.  
  316. // Возвращает шефа департамента
  317. public function getChief()
  318. {
  319. // Фильтруем работников по признаку шефства
  320. $chief = array_filter ($this->employees, function ($e) { return ($e->getChief()==1) ;});
  321. // Сбрасываем индексы массива
  322. $chief = array_values($chief);
  323. return $chief[0];
  324. }
  325.  
  326. // Увольнение сотрудника
  327. public function dismissEmployee($employee)
  328. {
  329. $employeeKey = array_search($employee, $this->employees, TRUE);
  330. unset ($this->employees[$employeeKey]);
  331. }
  332.  
  333. // Замена шефа департамента
  334. public function replaceChief(Employee $employee)
  335. {
  336. // Ищем переданного работника в данном департаменте
  337. $employeeKey = array_search($employee, $this->employees, TRUE);
  338. // Если в департаменте не существует переданного работника
  339. if ($employeeKey == null) {
  340. // Выкидываем исключение
  341. throw new Exception ("Переданный работник не найден");
  342. }
  343.  
  344. // Возвращаем текущего шефа к обычной работе
  345. $chief = $this->getChief(); // метод поиска шефа
  346. $chief->setСhief(0);
  347.  
  348. // Назначаем работника шефом
  349. $this->employees[$employeeKey]->setСhief(1);
  350. }
  351.  
  352. // Расходы на зарплату
  353. public function getTotalCoffee()
  354. {
  355. $totalCoffee = 0; // сумарное потребление кофе
  356. // Для каждого сотрудника
  357. foreach ($this->employees as $employee) {
  358. // Запрашиваем потребление кофе у сотрудника и суммируем результат
  359. $totalCoffee += $employee->getCoffee();
  360. }
  361. return $totalCoffee;
  362. }
  363.  
  364. // Рассход кофе
  365.  
  366. public function getAverageCostPerProduct()
  367. {
  368. // Средняя стоимость 1 страницы = суммарная зарплата / сумарное количество страниц
  369. $avrCostPerProduct = $this->getTotalSalary() / $this->getTotalProduct();
  370.  
  371. return $avrCostPerProduct;
  372. }
  373.  
  374. // Суммарная производительность
  375.  
  376. public function getTotalSalary()
  377. {
  378. $totalSalary = 0; // сумарная зарплата
  379. // Для каждого сотрудника
  380. foreach ($this->employees as $employee) {
  381. // Запрашиваем зп у сотрудника и суммируем результат
  382. $totalSalary += $employee->getSalary();
  383. }
  384. return $totalSalary;
  385. }
  386.  
  387. // Средний расход тугриков на одну страницу
  388.  
  389. public function getTotalProduct()
  390. {
  391. $totalProduct = 0; // сумарная продуктивность
  392. // Для каждого сотрудника
  393. foreach ($this->employees as $employee) {
  394. // Запрашиваем продуктивность у сотрудника и суммируем результат
  395. $totalProduct += $employee->getProduct();
  396. }
  397. return $totalProduct;
  398. }
  399. }
  400.  
  401. // Класс компании
  402. class Company
  403. {
  404. public $name = ""; // название
  405. private $departaments = array(); // департаменты
  406.  
  407. public function __construct($name)
  408. {
  409. $this->name = $name;
  410. }
  411.  
  412. // Клонирование компании
  413. public function __clone()
  414. {
  415. $departamentsClones = array(); // клоны департаментов
  416.  
  417. foreach ($this->departaments as $departament) {
  418. $departament = clone $departament;
  419. $departamentsClones[] = $departament;
  420. }
  421. // Заменяем массив департаментов массивом клонов
  422. $this->departaments = $departamentsClones;
  423. }
  424.  
  425. // Создание департамента
  426. public function createDepartament($name)
  427. {
  428. $this->departaments[$name] = new Departament ($name);
  429. }
  430.  
  431. // Возвращает все департаменты массивом
  432. public function getAllDepartments ()
  433. {
  434. return $this->departaments;
  435. }
  436.  
  437. // Поиск департамента по названию,
  438. // если название не определено, возращает все департааменты
  439. public function findDepartamentByName($name = null)
  440. {
  441. $result = null; // ссылка на департамент или массив департаментов
  442. // Ищем департамент в массиве по названию
  443. if ($name) {
  444. $result = $this->departaments[$name];
  445. } else {
  446. // Возвращаем все департаменты массивом
  447. foreach ($this->departaments as $name => $departament) {
  448. $result[$name] = $departament;
  449. }
  450. }
  451. // Если ничего не нашли
  452. if ($result == null) {
  453. // Ничего не возвращам, выкидываем исключение
  454. throw new Exception ( "Департамент не найден" ) ;
  455. }
  456. return $result;
  457. }
  458.  
  459. // Сумарное количество работников
  460.  
  461. public function getAverageEmployees()
  462. {
  463. // Среднее количество работников = суммарное кол-во работников / кол-во департаментов
  464. $avrEmployees = $this->getTotalEmployees() / count($this->departaments);
  465.  
  466. return $avrEmployees;
  467. }
  468.  
  469. // Расходы на зарплату в сумме
  470.  
  471. public function getTotalEmployees()
  472. {
  473. $totalEmployees = 0;
  474. // Для каждого департамента
  475. foreach ($this->departaments as $departament) {
  476. // Сумируем работников всех департаментов
  477. $totalEmployees += $departament->countEmployees();
  478. }
  479. return $totalEmployees;
  480. }
  481.  
  482. // Рассход кофе в сумме
  483.  
  484. public function getAverageSalary()
  485. {
  486. // Средняя зарплата = суммарная зарплата / кол-во департаментов
  487. $avrSalary = $this->getTotalSalary() / count($this->departaments);
  488.  
  489. return $avrSalary;
  490. }
  491.  
  492. // Суммарная производительность
  493.  
  494. public function getTotalSalary()
  495. {
  496. $salary = 0;
  497. // Для каждого департамента
  498. foreach ($this->departaments as $departament) {
  499. // Сумируем зп всех департаментов
  500. $salary += $departament->getTotalSalary();
  501. }
  502. return $salary;
  503. }
  504.  
  505. // Среднее количество работников по департаментам
  506.  
  507. public function getAverageCoffee()
  508. {
  509. // Среднее потребление кофе = суммарная потребление кофе / кол-во департаментов
  510. $avrCoffee = $this->getTotalCoffee() / count($this->departaments);
  511.  
  512. return $avrCoffee;
  513. }
  514.  
  515. // Средняя зарплата по департаментам
  516.  
  517. public function getTotalCoffee()
  518. {
  519. $coffee = 0;
  520. // Для каждого департамента
  521. foreach ($this->departaments as $departament) {
  522. // Суммируем расход кофе у департаментов
  523. $coffee += $departament->getTotalCoffee();
  524. }
  525. return $coffee;
  526. }
  527.  
  528. // Среднее потребление кофе по департаментам
  529.  
  530. public function getAverageProduct()
  531. {
  532. // Средняя производительность = суммарная производительность / кол-во департаментов
  533. $avrProduct = $this->getTotalProduct() / count($this->departaments);
  534.  
  535. return $avrProduct;
  536. }
  537.  
  538. // Средняя производительность по департаментам
  539.  
  540. public function getTotalProduct()
  541. {
  542. $product = 0;
  543. // Для каждого департамента
  544. foreach ($this->departaments as $departament) {
  545. // Суммируем производительность каждого департамента
  546. $product += $departament->getTotalProduct();;
  547. }
  548. return $product;
  549. }
  550.  
  551. // Средний расход тугриков на одну страницу по департаментам
  552.  
  553. public function getAverageCostPerProduct()
  554. {
  555. $avrCostPerProduct = 0;
  556. // Для каждого департамента
  557. foreach ($this->departaments as $departament) {
  558. // Сумируем средний расход
  559. $avrCostPerProduct += $departament->getAverageCostPerProduct();
  560. }
  561. // Средняя стоимость 1 страницы = cредняя стоимость всех департ / кол-во департаментов
  562. $avrCostPerProduct = $avrCostPerProduct / count($this->departaments);
  563.  
  564. return $avrCostPerProduct;
  565. }
  566. }
  567.  
  568. // Антикризисный коммитет
  569. class AnticrisisCommittee
  570. {
  571. /*
  572.   * Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров,
  573.   * преимущественно самого низкого ранга. Если инженер является боссом,
  574.   * вместо него надо уволить другого инженера, не босса.
  575.   * */
  576. public function dismissEngineers($company)
  577. {
  578. // Запрашивавем все департаменты в компании
  579. $departaments = $company->getAllDepartments();
  580.  
  581. // Перебираем все департаменты в компании
  582. foreach ($departaments as $departamentName => $departament) {
  583.  
  584. // Берем всех работников определенной профессии
  585. $engineers = $departament->findEmployees(get_class (new Engineer));
  586. // Если таковых нет, переходим к следующему департаменту
  587. if (!$engineers) continue;
  588.  
  589. // Исключаем из списка босса
  590. $engineers = array_filter($engineers, function ($engineer) {
  591. return ($engineer->getChief() == 0);
  592. });
  593. /*
  594.   foreach ($engineers as $key => $engineer) {
  595.   if ($engineer->getChief() == 1) {
  596.   unset($engineers[$key]);
  597.   }
  598.   }*/
  599. //sort($engineers);
  600.  
  601. // Сортируем массив работников по рангу по возрастанию
  602. usort ($engineers, function ($engineer1, $engineer2) {
  603. $rank1 = $engineer1->getRank();
  604. $rank2 = $engineer2->getRank();
  605. if ($rank1 == $rank2) return 0;
  606. return ($rank1 > $rank2) ? -1 : 1;
  607. });
  608.  
  609. // Берем первые 40% через array_slice
  610. $dismissingEngineers = floor(count($engineers) * 0.6);
  611. $engineers = array_slice($engineers, $dismissingEngineers);
  612.  
  613. // Увольняем сотрудников
  614. foreach ($engineers as $engineer) {
  615. $departament->dismissEmployee($engineer);
  616. }
  617. }
  618. }
  619.  
  620. /*
  621.   * Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков,
  622.   * а количество выпиваемого им кофе с 50 до 75 литров.
  623.   * */
  624. public function increaseSalaryRate($company)
  625. {
  626. // Запрашивавем все департаменты в компании
  627. $departaments = $company->getAllDepartments();
  628.  
  629. // Перебираем все департаменты в компании
  630. foreach ($departaments as $departamentName => $departament) {
  631.  
  632. // Запрашиваем работников
  633. $analysts = $departament->findEmployees(get_class (new Analyst));
  634. //var_dump($analysts);
  635. // Если таковых нет, переходим к следующему департаменту
  636. if (!$analysts) continue;
  637.  
  638. // Перебираем $analysts
  639. foreach ($analysts as $analyst) {
  640.  
  641. // Повышаем ставку
  642. $analyst->setSalaryRate(1100);
  643. // Повышаем количество выпиваемого им кофе
  644. $analyst->setCoffeeRate(75);
  645. }
  646. }
  647. }
  648.  
  649. /*
  650.   * В тех департаментах, где руководитель не является аналитиком,
  651.   * заменить его на аналитика самого высшего ранга из этого департамента
  652.   * (а бывшего руководителя вернуть к обычной работе)
  653.   * */
  654. public function setAnalystAsChief($company)
  655. {
  656. // Запрашивавем все департаменты в компании
  657. $departaments = $company->getAllDepartments();
  658.  
  659. // Перебираем все департаменты в компании
  660. foreach ($departaments as $departamentName => $departament) {
  661.  
  662. // Находим шефа в компании
  663. $chiefEmployee = $departament->getChief(); //findEmployee("all", "all", 1);
  664. // Узнаем профессию
  665. $professionName = $chiefEmployee->getProfession()->getName();
  666. // Если профессия не Аналитик, начинаем переназначение
  667. if ($professionName != "Analyst") {
  668.  
  669. // Берем всех аналитиков
  670. $analysts = $departament->findEmployees(get_class (new Analyst));
  671.  
  672. // Если в Департаменте нет аналитиков, переходим к след. департаменту
  673. if (!isset($analysts[0])) continue;
  674.  
  675. // Сортируем по рангу, по убыванию
  676. usort ($analysts, function($a, $b)
  677. {
  678. $a = $a->getRank();
  679. $b = $b->getRank();
  680. if ($a==$b) return 0;
  681. return ($a > $b) ? 1 : -1;
  682. });
  683. //var_dump($analysts);
  684. // Заменяем шефа аналитиком
  685. $departament->replaceChief($analysts[0]);
  686. }
  687. }
  688. }
  689.  
  690. /*
  691.   * В каждом департаменте повысить 50% (округляя в большую сторону)
  692.   * менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
  693.   * */
  694. public function liftManager($company)
  695. {
  696. // Запрашивавем все департаменты в компании
  697. $departaments = $company->getAllDepartments();
  698.  
  699. // Перебираем все департаменты в компании
  700. foreach ($departaments as $departamentName => $departament) {
  701.  
  702. // Берем всех работников определенной профессии
  703. $employees = $departament->findEmployees(get_class (new Manager));
  704. // Если таковых нет, переходим к следующему департаменту
  705. if (!$employees) continue;
  706.  
  707. // Исключаем из списка менеджеров вышые 2ого ранга
  708. foreach ($employees as $key => $employee) {
  709. if ($employee->getRank() > 2) {
  710. unset($employees[$key]);
  711. }
  712. }
  713. sort($employees);
  714.  
  715. // Берем 50% через array_slice
  716. $enhancingEmployees = ceil(count($employees) * 0.5);
  717. $employees = array_slice($employees, $enhancingEmployees);
  718.  
  719. // Повышаем сотрудников
  720. foreach ($employees as $employee) {
  721. $currentRank = $employee->getRank();
  722. $employee->setRank($currentRank + 1);
  723. }
  724. }
  725. }
  726. }
  727.  
  728. // Функция создания компании
  729. function createCompany($name)
  730. {
  731. // Создаем новый класс компании
  732. $vector = new Company('$name');
  733.  
  734. // Создаем классы департаментов
  735. $vector->createDepartament('Департамент закупок');
  736. $vector->createDepartament('Департамент продаж');
  737. $vector->createDepartament('Департамент рекламы');
  738. $vector->createDepartament('Департамент логистики');
  739.  
  740. // Создаем классы профессий
  741. $me = new Manager();
  742. $ma = new Marketer();
  743. $en = new Engineer();
  744. $an = new Analyst();
  745.  
  746. // Добавляем профессии в масив для последующего создания сотрудников пачкой
  747. $professions['me'] = $me;
  748. $professions['ma'] = $ma;
  749. $professions['en'] = $en;
  750. $professions['an'] = $an;
  751.  
  752. // Лист вакансий: департамент => группы вакансий: кол-во|профессия|ранг|статус_начальника
  753. $vacancies = array(
  754. 'Департамент закупок' => array('9me1', '3me2', '2me3', '2ma1', '1me2boss'),
  755. 'Департамент продаж' => array('12me1', '6ma1', '3an1', '2an2', '1ma2boss'),
  756. 'Департамент рекламы' => array('15ma1', '10ma2', '8me1', '2en1', '1ma3boss'),
  757. 'Департамент логистики' => array('13me1', '5me2', '5en1', '1me1boss')
  758. );
  759.  
  760. // Для каждого департамента
  761. foreach ($vacancies as $depName => $vacancyGroup) {
  762.  
  763. // Для каждой группы вакансий
  764. foreach ($vacancyGroup as $vacancy) { //($vacancyGroup as $vacancyName => $vacancyQuantity)
  765.  
  766. // Достаем кол-во, профессию, ранг и статус боса из вакансии
  767. preg_match ('/(\d+)?(\D+)?(\d)?(\w+)?/', $vacancy, $matches);
  768. $vacancyQuantity = (int)$matches[1];
  769. $professionIndex = $matches[2];
  770. $rank = (int)$matches[3];
  771. if (isset($matches[4]) and $matches[4]=='boss') {
  772. $chief = 1;
  773. } else {
  774. $chief = 0;
  775. }
  776.  
  777. // Назначаем профессию
  778. $profession = $professions[$professionIndex];
  779.  
  780. // Создаем столько сотрудников, сколько вакансий в группе
  781. for ($id = 1; $id <= $vacancyQuantity; $id++) {
  782. // Создаем сотрудника
  783. $employee = new Employee($profession, $rank, $chief);
  784.  
  785. // Запрашиваем в Компании нужный департамент
  786. $departament = $vector->findDepartamentByName($depName);
  787. // Добавляем сотрудника в этот Департамент
  788. $departament->addEmployee($employee);
  789. }
  790. }
  791. }
  792. // Возвращаем объект Компания
  793. return $vector;
  794. }
  795.  
  796. // Класс строки таблицы, хранит не фарматированную строку
  797. class TableRow
  798. {
  799. private $columns = array(); // строка это массив из колонок
  800.  
  801. // Конструктор принимает массив колонок
  802. public function __construct($columns)
  803. {
  804. $this->columns = $columns;
  805. }
  806.  
  807. // Метод возвращает содержимое строки (все ее колоночки)
  808. public function getColumns()
  809. {
  810. return $this->columns;
  811. }
  812. }
  813.  
  814. // Класс таблицы
  815. class Table
  816. {
  817. private $tableRows = array(); // массив объектов Строк
  818. private $length = 15; // ширина колонок
  819.  
  820. // Добавление строки в таблицу, принимает массив
  821. public function addRow($row)
  822. {
  823. // Создаем новую строку
  824. $this->tableRows[] = new TableRow($row);
  825. }
  826.  
  827. // Печать таблицы
  828. public function printTable()
  829. {
  830. $caption = 1; // первая строка - заголовок таблицы
  831.  
  832. // Перебираем массив объектов Строк
  833. foreach ($this->tableRows as $row) {
  834.  
  835. $stringRow = ""; // строка для печати
  836. $columnNumber = 0; // счетчик колонок
  837.  
  838. // Извлекаем колонки из строки
  839. $columns = $row->getColumns();
  840.  
  841. // Форматируем каждую колонку в строке
  842. foreach ($columns as $column) {
  843.  
  844. // Округляем числа до 2х знаков после запятой
  845. if (is_float($column)) {
  846. $column = round($column, 2);
  847. }
  848. // Добавляем отступы справа для первой колонки
  849. if ($columnNumber == 0) {
  850. $stringRow .= "\n" . $this->padRight($column, $this->length);
  851. // Добавляем оступы слева для остальных колонок
  852. } else {
  853. $stringRow .= $this->padLeft($column, $this->length);
  854. }
  855. $columnNumber++;
  856. }
  857. // Добавляем черту после заголовка
  858. if ($caption == 1) {
  859. $stringRow .= "\n" . $this->formatCaption($columnNumber, $this->length);
  860. }
  861. // Выводим строку на печать
  862. echo "{$stringRow}";
  863.  
  864. $caption--; // останется только один заголовок
  865. }
  866. }
  867.  
  868. // Добавление пробелов слева
  869. private function padRight($string, $length)
  870. {
  871. // Разница между переданной строкой и шириной колонки
  872. $lenghtDifference = $length - mb_strlen($string);
  873. // Проверка на отрицательное значение при вычитании
  874. if ($lenghtDifference >= 0) {
  875. // Заполняем разницу пробелами
  876. $string .= str_repeat(" ", $lenghtDifference);
  877. } else {
  878. // Если таки отрицательное, обрезаем край строки до ширины колонки
  879. $string = mb_substr($string, 0, $length);
  880. }
  881. return $string;
  882. }
  883.  
  884. // Добавление пробелов справа
  885. private function padLeft($string, $length)
  886. {
  887. // Разница между переданной строкой и шириной колонки
  888. $lenghtDifference = $length - mb_strlen($string);
  889. // Проверка на отрицательное значение при вычитании
  890. if ($lenghtDifference >= 0) {
  891. // Заполняем разницу пробелами
  892. $string = str_repeat(" ", $lenghtDifference) . $string;
  893. } else {
  894. // Если таки отрицательное, обрезаем край строки до ширины колонки
  895. $string = mb_substr($string, 0, $length);
  896. }
  897. return $string;
  898. }
  899.  
  900. // Делаем горизонтальную черту
  901. private function formatCaption($columnNumber, $length)
  902. {
  903. $string = str_repeat("-", $length * $columnNumber);
  904. return $string;
  905. }
  906. }
  907.  
  908. /* Вывод таблицы результатов */
  909.  
  910. // Функция вывода статистики по компании
  911. function printStatistics($company, $caption)
  912. {
  913.  
  914. // Создаем таблицу
  915. $table = new Table();
  916.  
  917. // Заголовок таблицы
  918. $table->addRow(array("Департамент",
  919. "сотр.",
  920. "тугр.",
  921. "кофе",
  922. "стр.",
  923. "тугр./стр.."));
  924.  
  925. // Статистика по департаентам
  926. $departaments = $company->getAllDepartments();
  927. // Каждый департамент строка
  928. foreach ($departaments as $departament) {
  929. unset($columns); // обнуляем массив
  930. // Заполняем массив строк
  931. $columns[] = mb_convert_case(mb_substr($departament->name, 12), MB_CASE_TITLE, "UTF-8");
  932. $columns[] = $departament->countEmployees();
  933. $columns[] = $departament->getTotalSalary();
  934. $columns[] = $departament->getTotalCoffee();
  935. $columns[] = $departament->getTotalProduct();
  936. $columns[] = $departament->getAverageCostPerProduct();
  937. // Добавляем строку в таблицу
  938. $table->addRow($columns);
  939. }
  940.  
  941. // Пустая строка
  942. unset($columns); // обнуляем массив
  943. $columns[] = ' ';
  944. // Добавляем строку в таблицу
  945. $table->addRow($columns);
  946.  
  947. // Среднее для всей компании
  948. unset($columns); // обнуляем массив
  949. // Заполняем массив строк
  950. $columns[] = 'Среднее';
  951. $columns[] = $company->getAverageEmployees();
  952. $columns[] = $company->getAverageSalary();
  953. $columns[] = $company->getAverageCoffee();
  954. $columns[] = $company->getAverageProduct();
  955. $columns[] = $company->getAverageCostPerProduct();
  956. // Добавляем строку в таблицу
  957. $table->addRow($columns);
  958.  
  959. // Всего для всей компании
  960. unset($columns); // обнуляем массив
  961. // Заполняем массив строк
  962. $columns[] = 'Всего';
  963. $columns[] = $company->getTotalEmployees();
  964. $columns[] = $company->getTotalSalary();
  965. $columns[] = $company->getTotalCoffee();
  966. $columns[] = $company->getTotalProduct();
  967. // Добавляdем строку в таблицу
  968. $table->addRow($columns);
  969.  
  970. // Выводим на печать заголовок
  971. echo "{$caption}\n";
  972.  
  973. // Выводим таблицу на печать
  974. $table->printTable();
  975. echo "\n\n";
  976. }
  977. // Клонирует компанию
  978. function cloneCompany($company)
  979. {
  980. return clone $company;
  981. }
  982.  
  983. // Регистрируем Vector Inc на Сейшельских островах
  984. $vector = createCompany('Vector');
  985. printStatistics($vector, "Докризисная статистика");
  986. // Создаем антикризисный коммитет
  987. $anticrisisCommittee = new AnticrisisCommittee();
  988. // Первый набор Антикризисных мер
  989. $vector1 = cloneCompany($vector);
  990. $anticrisisCommittee->dismissEngineers($vector1);
  991. printStatistics($vector1, "Антикризисные меры 1");
  992. // Второй набор Антикризисных мер
  993. $vector2 = cloneCompany($vector);
  994. $anticrisisCommittee->increaseSalaryRate($vector2);
  995. $anticrisisCommittee->setAnalystAsChief($vector2);
  996. printStatistics($vector2, "Антикризисные меры 2");
  997. // Третий набор Антикризисных мер
  998. $vector3 = cloneCompany($vector);
  999. $anticrisisCommittee->liftManager($vector3);
  1000. printStatistics($vector3, "Антикризисные меры 3");
  1001. //var_dump ($vector);
  1002. ?>
Success #stdin #stdout 0.04s 52480KB
stdin
Standard input is empty
stdout
Докризисная статистика

Департамент              сотр.          тугр.           кофе           стр.    тугр./стр..
------------------------------------------------------------------------------------------
Закупок                     17         9612.5            350           3100            3.1
Продаж                      24          13550            610           3325           4.08
Рекламы                     36          16300            575           5450           2.99
Логистики                   24          11375            425           3850           2.95
               
Среднее                  25.25       12709.38            490        3931.25           3.28
Всего                      101        50837.5           1960          15725

Антикризисные меры 1

Департамент              сотр.          тугр.           кофе           стр.    тугр./стр..
------------------------------------------------------------------------------------------
Закупок                     17         9612.5            350           3100            3.1
Продаж                      24          13550            610           3325           4.08
Рекламы                     35          16100            570           5400           2.98
Логистики                   22          10975            415           3750           2.93
               
Среднее                   24.5       12559.38         486.25        3893.75           3.27
Всего                       98        50237.5           1945          15575

Антикризисные меры 2

Департамент              сотр.          тугр.           кофе           стр.    тугр./стр..
------------------------------------------------------------------------------------------
Закупок                     17         9612.5            350           3100            3.1
Продаж                      24          15500            795           3470           4.47
Рекламы                     36          16300            575           5450           2.99
Логистики                   24          11375            425           3850           2.95
               
Среднее                  25.25       13196.88         536.25         3967.5           3.38
Всего                      101        52787.5           2145          15870

Антикризисные меры 3

Департамент              сотр.          тугр.           кофе           стр.    тугр./стр..
------------------------------------------------------------------------------------------
Закупок                     17          10425            350           3100           3.36
Продаж                      24          14300            610           3325            4.3
Рекламы                     36          16800            575           5450           3.08
Логистики                   24        12562.5            425           3850           3.26
               
Среднее                  25.25       13521.88            490        3931.25            3.5
Всего                      101        54087.5           1960          15725