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

Департамент              сотр.          тугр.           кофе           стр.    тугр./стр..
------------------------------------------------------------------------------------------
Закупок                     17         9812.5            360           3200           3.07
Продаж                      24        14337.5            650           3625           3.96
Рекламы                     36          19275            710           6700           2.88
Логистики                   24          11375            425           3850           2.95
               
Среднее                  25.25          13700         536.25        4343.75           3.21
Всего                      101          54800           2145          17375

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

Департамент              сотр.          тугр.           кофе           стр.    тугр./стр..
------------------------------------------------------------------------------------------
Закупок                     17         9812.5            360           3200           3.07
Продаж                      24        14337.5            650           3625           3.96
Рекламы                     34          18875            700           6600           2.86
Логистики                   19          10375            400           3600           2.88
               
Среднее                   23.5          13350          527.5        4256.25           3.19
Всего                       94          53400           2110          17025

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

Департамент              сотр.          тугр.           кофе           стр.    тугр./стр..
------------------------------------------------------------------------------------------
Закупок                     17         9812.5            360           3200           3.07
Продаж                      24        16362.5            830           3820           4.28
Рекламы                     36          19275            710           6700           2.88
Логистики                   24          11375            425           3850           2.95
               
Среднее                  25.25       14206.25         581.25         4392.5            3.3
Всего                      101          56825           2325          17570

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

Департамент              сотр.          тугр.           кофе           стр.    тугр./стр..
------------------------------------------------------------------------------------------
Закупок                     17        10687.5            360           3200           3.34
Продаж                      24        15212.5            650           3625            4.2
Рекламы                     36          19900            710           6700           2.97
Логистики                   24          12625            425           3850           3.28
               
Среднее                  25.25       14606.25         536.25        4343.75           3.45
Всего                      101          58425           2145          17375