fork download
  1. <?php
  2.  
  3.  
  4. define("SMALL_COL", 10);
  5. define("MEDIUM_COL", 20);
  6. define("LARGE_COL", 25);
  7.  
  8. class Company
  9. {
  10. private $name; //Имя компанию
  11. private $listOfDepatments; //Список департаментов
  12.  
  13. public function __construct($name = 'Без имени')
  14. {
  15. $this->name = $name;
  16. $this->listOfDepatments = array();
  17. }
  18.  
  19. //Получить имя компании
  20. public function getNameCompany()
  21. {
  22. return $this->name;
  23. }
  24.  
  25. //Количество департаментов
  26. public function getCountDeparments()
  27. {
  28. return count($this->listOfDepatments);
  29. }
  30.  
  31. //Добавить новый департамент
  32. public function addDepartmentToCompany($newDepartment)
  33. {
  34. $this->listOfDepatments[] = $newDepartment;
  35. }
  36.  
  37. //Дать приказ на увольнение инженеров в каждом департаменте
  38. public function reduceEngineer()
  39. {
  40. foreach ($this->listOfDepatments as $departament) {
  41. $departament->reduceEngineerInDep(40);
  42. }
  43. }
  44.  
  45. //Дать приказ на повышение менеджеров
  46. public function raiseManager()
  47. {
  48. foreach($this->listOfDepatments as $departament) {
  49. $departament->raiseManagerInDep(50);
  50. }
  51. }
  52.  
  53. //повышение аналитиков (вторая мера)
  54. public function raiseAnalytics()
  55. {
  56. foreach($this->listOfDepatments as $departament) {
  57. $departament->changeDirector("Аналитик");
  58. }
  59. }
  60.  
  61. //Распечатать информацию о компании (стоит ли вынести это в отдельный класс (например, CompanyReport??))
  62. public function printInfoAboutCompany($message)
  63. {
  64. $countDepartment = $this->getCountDeparments();
  65. $total = array('сотр' => 0, 'тугр' => 0, 'кофе' => 0, 'стр' => 0);
  66.  
  67. echo "Отчет компании " . $this->getNameCompany() . $message . "\n";
  68. echo padRigth("Департамент", LARGE_COL) . padLeft("сотр.", SMALL_COL) . padLeft("тугр.", MEDIUM_COL) .
  69. padLeft("кофе", SMALL_COL) . padLeft("стр.", SMALL_COL) . padLeft("тугр./стр.", MEDIUM_COL) . "\n";
  70. foreach ($this->listOfDepatments as $departament) {
  71. echo padRigth($departament->getDepartmentName(), LARGE_COL) . padLeft($departament->getCountEmployee(), SMALL_COL) .
  72. padLeft($departament->getTotalSalary(), MEDIUM_COL) . padLeft($departament->getTotalCups(), SMALL_COL) .
  73. padLeft($departament->getTotalPages(), SMALL_COL) . padLeft($departament->getTotalSalary() / $departament->getTotalPages(), MEDIUM_COL) . "\n";
  74. $total['сотр'] += $departament->getCountEmployee();
  75. $total['тугр'] += $departament->getTotalSalary();
  76. $total['кофе'] += $departament->getTotalCups();
  77. $total['стр'] += $departament->getTotalPages();
  78. }
  79.  
  80. //возможно не правильно расчитываю среднее значение
  81. echo padRigth('Среднее', LARGE_COL) . padLeft($total['сотр'] / $countDepartment, SMALL_COL) .
  82. padLeft($total['тугр'] / $countDepartment, MEDIUM_COL) . padLeft($total['кофе'] / $countDepartment, SMALL_COL) .
  83. padLeft($total['стр'] / $countDepartment, SMALL_COL) . padLeft(($total['тугр'] / $total['стр']) / $countDepartment, MEDIUM_COL) . "\n";
  84. echo padRigth('Всего', LARGE_COL) . padLeft($total['сотр'], SMALL_COL) .
  85. padLeft($total['тугр'], MEDIUM_COL) . padLeft($total['кофе'], SMALL_COL) .
  86. padLeft($total['стр'], SMALL_COL) . padLeft($total['тугр'] / $total['стр'], MEDIUM_COL) . "\n";
  87. }
  88. }
  89.  
  90. class Department
  91. {
  92. private $name; //Имя компании
  93. private $listOfEmployee; //Список сотрудников
  94.  
  95. public function __construct($name = 'Noname Department')
  96. {
  97. $this->name = $name;
  98. $this->listOfEmployee = array();
  99. }
  100.  
  101. //Получить имя департамента
  102. public function getDepartmentName()
  103. {
  104. return $this->name;
  105. }
  106.  
  107. //Добавить сотрудника в департамент
  108. public function addEmployeeToDepartment($newEmployee)
  109. {
  110. $this->listOfEmployee[] = $newEmployee;
  111. }
  112.  
  113. //Количество сотрудников
  114. public function getCountEmployee()
  115. {
  116. return count($this->listOfEmployee);
  117. }
  118.  
  119. //Общая сумма
  120. public function getTotalSalary()
  121. {
  122. $totalSalary = 0;
  123. foreach ($this->listOfEmployee as $employee) {
  124. $totalSalary += $employee->getSalary();
  125. }
  126. return $totalSalary;
  127. }
  128.  
  129. //Общий объем страниц
  130. public function getTotalPages()
  131. {
  132. $totalPages = 0;
  133. foreach ($this->listOfEmployee as $employee) {
  134. $totalPages += $employee->getPages();
  135. }
  136. return $totalPages;
  137. }
  138.  
  139. //Обцее число кружек кофе
  140. public function getTotalCups()
  141. {
  142. $totalCups = 0;
  143. foreach ($this->listOfEmployee as $employee) {
  144. $totalCups += $employee->getCupOfCoffee();
  145. }
  146. return $totalCups;
  147. }
  148.  
  149. //Сколько всего инженеров
  150. public function totalEngineer()
  151. {
  152. $result = 0;
  153. foreach ($this->listOfEmployee as $employee) {
  154. if ($employee->checkProffession("Инженер")) {
  155. $result++;
  156. }
  157. }
  158. return $result;
  159. }
  160.  
  161. //Сколько всего менеддеров
  162. public function totalManager()
  163. {
  164. $result = 0;
  165. foreach ($this->listOfEmployee as $employee) {
  166. if ($employee->checkProffession("Менеджер")) {
  167. $result++;
  168. }
  169. }
  170. return $result;
  171. }
  172.  
  173. //Сортировка по рангу
  174. public function sortByRank()
  175. {
  176. usort($this->listOfEmployee, "compareRank");
  177. }
  178.  
  179. //Увольняем инженеров
  180. public function reduceEngineerInDep($percent)
  181. {
  182. $countEmployee = $this->getCountEmployee();
  183. $countEngineer = $this->totalEngineer();
  184. $engineerDelete = ceil(0.4 * $countEngineer);
  185.  
  186. for ($i = 0; $i < $countEmployee; $i++) {
  187. if ($engineerDelete == 0) {
  188. break;
  189. }
  190. if ($this->listOfEmployee[$i]->checkProffession("Инженер") && !($this->listOfEmployee[$i]->isDirector)) {
  191. echo "Удалён: " . $this->listOfEmployee[$i]->getEmployeeName() . " [" . $this->listOfEmployee[$i]->getEmployeeRank() . " ранг] из " . $this->getDepartmentName() . "\n";
  192. unset($this->listOfEmployee[$i]);
  193. $engineerDelete--;
  194. }
  195. }
  196. }
  197.  
  198. //Повышение менеджеров
  199. public function raiseManagerInDep($percent)
  200. {
  201. $countEmployee = $this->getCountEmployee();
  202. $countManager = $this->totalManager();
  203. $managerRaise = ceil(0.5 * $countManager);
  204. for ($i = 0; $i < $countEmployee; $i++) {
  205. if ($managerRaise == 0) {
  206. break;
  207. }
  208. if ($this->listOfEmployee[$i]->checkProffession("Менеджер") && ($this->listOfEmployee[$i]->getEmployeeRank() != 3)) {
  209. echo "Повышен: " . $this->listOfEmployee[$i]->getEmployeeName() . " [" . $this->listOfEmployee[$i]->getEmployeeRank() . " ранг] из " . $this->getDepartmentName() . "\n";
  210. $oldRank = $this->listOfEmployee[$i]->getEmployeeRank();
  211. $this->listOfEmployee[$i]->setRank($oldRank + 1);
  212. $managerRaise--;
  213. }
  214. }
  215. }
  216.  
  217. //кто директор
  218. public function findDirector()
  219. {
  220. foreach ($this->listOfEmployee as $employee) {
  221. if ($employee->isDirector) {
  222. $director = $employee;
  223. break;
  224. }
  225. }
  226. return $director;
  227. }
  228.  
  229. //найти аналитика с высшим рангом
  230. public function findHighestRankInProffession($proffession)
  231. {
  232. $rank = 0;
  233. foreach ($this->listOfEmployee as $employee) {
  234. if (($employee->getEmployeeRank() > $rank) && ($employee->getEmployeeProffession() == $proffession)) {
  235. $analytics = $employee;
  236. $rank = $employee->getEmployeeRank();
  237. }
  238. }
  239.  
  240. return ($rank) ? $analytics : false;
  241. }
  242.  
  243. //Сменяем директора на аналитика с высшим рангом
  244. public function changeDirector($proffession)
  245. {
  246. $director = $this->findDirector();
  247. if ($director->getEmployeeProffession() != $proffession) {
  248. $highestAnalytics = $this->findHighestRankInProffession($proffession);
  249.  
  250. if ($highestAnalytics) {
  251. $highestAnalytics->isDirector = true;
  252. $director->isDirector = false;
  253. echo "Новый директор \"{$this->getDepartmentName()}\" - {$highestAnalytics->getEmployeeName()} [ранг - {$highestAnalytics->getEmployeeRank()}]\n";
  254. }
  255. }
  256. }
  257. }
  258.  
  259. class Employee
  260. {
  261. protected $name; //Имя сотрудника
  262. public $isDirector; //Является ли он руководителем
  263. protected $rank; //ранг
  264. protected $proffession = ''; //Профессия
  265. protected $salary = 0; //Зарплата
  266. protected $pages = 0; //Страниц отчета
  267. protected $cupOfCoffee = 0; //Кружек кофе
  268.  
  269. public function __construct($name = 'Username', $rank = 0, $isDirector = false)
  270. {
  271. $this->name = $name;
  272. $this->rank = $rank;
  273. $this->isDirector = $isDirector;
  274. }
  275.  
  276. //Получить имя сотрудника
  277. public function getEmployeeName()
  278. {
  279. return $this->name;
  280. }
  281.  
  282. //Получить профессию сотрудника
  283. public function getEmployeeProffession()
  284. {
  285. return $this->proffession;
  286. }
  287.  
  288. //Получить ранг сотрудника
  289. public function getEmployeeRank()
  290. {
  291. return $this->rank;
  292. }
  293.  
  294. //Посчитать зарплату
  295. public function getSalary()
  296. {
  297. $totalSalary = $this->salary;
  298. if ($this->rank == 2) {
  299. $totalSalary *= 1.25;
  300. } elseif ($this->rank == 3) {
  301. $totalSalary *= 1.5;
  302. }
  303.  
  304. if ($this->isDirector) {
  305. $totalSalary *= 1.5;
  306. }
  307. return $totalSalary;
  308. }
  309.  
  310. //Посчитать количество страниц
  311. public function getPages()
  312. {
  313. return ($this->isDirector ? 0 : $this->pages);
  314. }
  315.  
  316. //Посчитать количество кружек кофе
  317. public function getCupOfCoffee()
  318. {
  319. return ($this->isDirector ? ($this->cupOfCoffee * 2) : $this->cupOfCoffee);
  320. }
  321.  
  322. public function getRank()
  323. {
  324. return $this->rank;
  325. }
  326.  
  327. public function setRank($rank)
  328. {
  329. $this->rank = $rank;
  330. }
  331.  
  332. public function checkProffession($proffession) {
  333. return ($this->proffession == $proffession) ? true : false;
  334. }
  335. }
  336.  
  337. class Manager extends Employee
  338. {
  339. protected $salary = 500;
  340. protected $pages = 200;
  341. protected $cupOfCoffee = 20;
  342. protected $proffession = 'Менеджер';
  343. }
  344.  
  345. class Marketer extends Employee
  346. {
  347. protected $salary = 400;
  348. protected $pages = 150;
  349. protected $cupOfCoffee = 15;
  350. protected $proffession = 'Маркетолог';
  351. }
  352.  
  353. class Engineer extends Employee
  354. {
  355. protected $salary = 200;
  356. protected $pages = 50;
  357. protected $cupOfCoffee = 5;
  358. protected $proffession = 'Инженер';
  359. }
  360.  
  361. class Analyst extends Employee
  362. {
  363. protected $salary = 800;
  364. protected $pages = 5;
  365. protected $cupOfCoffee = 50;
  366. protected $proffession = 'Аналитик';
  367. }
  368.  
  369. class AnalystImproved extends Analyst
  370. {
  371. protected $salary = 1100;
  372. protected $cupOfCoffee = 75;
  373. }
  374.  
  375. //Для форматированного вывода
  376. function padLeft($text, $length)
  377. {
  378. if (mb_strlen($text) < $length) {
  379. $text = str_repeat(" ", $length - mb_strlen($text)) . $text;
  380. }
  381.  
  382. return $text;
  383. }
  384.  
  385. function padRigth($text, $length) {
  386. if (mb_strlen($text) < $length) {
  387. $text .= str_repeat(" ", $length - mb_strlen($text));
  388. }
  389.  
  390. return $text;
  391. }
  392.  
  393. //функция принимает на вход строку вида: 9xме1;3xмe2;2xмe3;2xмa1;1xмe2 (последний идет руководитель) и возвращает массив созданных объектов
  394. function createEmployee($message)
  395. {
  396. $employee = array();
  397.  
  398. $people = explode(';', $message);
  399. $totalPeople = count($people);
  400.  
  401.  
  402. for ($i = 0; $i < $totalPeople; $i++) {
  403. $rank = (int) mb_substr($people[$i], mb_strlen($people[$i]) - 1, 1);
  404. $proffession = mb_substr($people[$i], mb_strpos($people[$i], 'x') + 1, 2);
  405. $countEmployee = (int) $people[$i];
  406.  
  407. $isDirector = ($i == ($totalPeople - 1)) ? true : false;
  408.  
  409. for ($j = 0; $j < $countEmployee; $j++ ) {
  410. switch ($proffession) {
  411. case "ме": $employee[] = new Manager("Имя{$j}", $rank, $isDirector);
  412. break;
  413. case "ма": $employee[] = new Marketer("Имя{$j}", $rank, $isDirector);
  414. break;
  415. case "ан": $employee[] = new Analyst("Имя{$j}", $rank, $isDirector);
  416. break;
  417. case "ин": $employee[] = new Engineer("Имя{$j}", $rank, $isDirector);
  418. break;
  419. case "па": $employee[] = new AnalystImproved("Имя{$j}", $rank, $isDirector);
  420. break;
  421. default: echo "Проверьте входные данные! {$proffession}";
  422. exit();
  423. }
  424. }
  425. }
  426.  
  427. return $employee;
  428. }
  429.  
  430. //Добавляем каждого сотрудника в определенный департамент
  431. function addAllEmployeeToDepartment($employee, $departament)
  432. {
  433. $totalEmployee = count($employee);
  434.  
  435. for ($i = 0; $i < $totalEmployee; $i++) {
  436. $departament->addEmployeeToDepartment($employee[$i]);
  437. }
  438. }
  439.  
  440. //Функция для сортировки
  441. function compareRank($a, $b)
  442. {
  443. return ($a->getRank() < $b->getRank()) ? -1 : 1;
  444. }
  445.  
  446. function createCompany($procurementPeople, $salesPeople, $advertisingPeople, $logisticsPeople)
  447. {
  448. //Создаем нашу компанию
  449. $vector = new Company('Вектор');
  450.  
  451. //Создаем департаменты и добавляем их в команию
  452. $procurementDepartment = new Department('Департамент закупок');
  453. $vector->addDepartmentToCompany($procurementDepartment);
  454.  
  455. $salesDepartament = new Department('Департамент продаж');
  456. $vector->addDepartmentToCompany($salesDepartament);
  457.  
  458. $advertisingDepartment = new Department('Департамент рекламы');
  459. $vector->addDepartmentToCompany($advertisingDepartment);
  460.  
  461. $logisticsDepartament = new Department('Департамент логистики');
  462. $vector->addDepartmentToCompany($logisticsDepartament);
  463.  
  464. //Создаем сотрудников и добавляем их в департаменты
  465. $procurementEmployee = array();
  466. $procurementEmployee = createEmployee($procurementPeople);
  467. addAllEmployeeToDepartment($procurementEmployee, $procurementDepartment);
  468.  
  469. $salesEmployee = array();
  470. $salesEmployee = createEmployee($salesPeople);
  471. addAllEmployeeToDepartment($salesEmployee, $salesDepartament);
  472.  
  473. $advertisingEmployee = array();
  474. $advertisingEmployee = createEmployee($advertisingPeople);
  475. addAllEmployeeToDepartment($advertisingEmployee, $advertisingDepartment);
  476.  
  477. $logisticsEmployee = array();
  478. $logisticsEmployee = createEmployee($logisticsPeople);
  479. addAllEmployeeToDepartment($logisticsEmployee, $logisticsDepartament);
  480.  
  481. return $vector;
  482. }
  483.  
  484.  
  485. //Выводим отчет без антикризисных мер
  486. $vector = createCompany(
  487. '9xме1;3xме2;2xме3;2xма1;1xме2',
  488. '12xме1;6xма1;3xан1;2xан2;1xма2',
  489. '15xма1;10xма2;8xме1;2xин1;1xма3',
  490. '13xме1;5xме2;5xин1;1xме1');
  491. $vector->printInfoAboutCompany("");
  492. echo str_repeat('-', 80) . "\n";
  493.  
  494. //первая антикризисная мера
  495. $vectorWithoutEngineer = createCompany(
  496. '9xме1;3xме2;2xме3;2xма1;1xме2',
  497. '12xме1;6xма1;3xан1;2xан2;1xма2',
  498. '15xма1;10xма2;8xме1;2xин1;1xма3',
  499. '13xме1;5xме2;5xин1;1xме1');
  500. $vectorWithoutEngineer->reduceEngineer();
  501. $vectorWithoutEngineer->printInfoAboutCompany("[Увольнение 40% инженеров из каждого департамента]");
  502. echo str_repeat('-', 80) . "\n";
  503.  
  504. //вторая антикризисная мера
  505. $vectorRaiseAnalytics = createCompany(
  506. '9xме1;3xме2;2xме3;2xма1;1xме2',
  507. '12xме1;6xма1;3xпа1;2xпа2;1xма2',
  508. '15xма1;10xма2;8xме1;2xин1;1xма3',
  509. '13xме1;5xме2;5xин1;1xме1');
  510. $vectorRaiseAnalytics->raiseAnalytics();
  511. $vectorRaiseAnalytics->printInfoAboutCompany("[Повышение ставки аналитикам]");
  512. echo str_repeat('-', 80) . "\n";
  513.  
  514. //третья антикризисная мера
  515. $vectorRaiseManager = createCompany(
  516. '9xме1;3xме2;2xме3;2xма1;1xме2',
  517. '12xме1;6xма1;3xан1;2xан2;1xма2',
  518. '15xма1;10xма2;8xме1;2xин1;1xма3',
  519. '13xме1;5xме2;5xин1;1xме1');
  520. $vectorRaiseManager->raiseManager();
  521. $vectorRaiseManager->printInfoAboutCompany("[Повышение ранга менеджеров]");
Success #stdin #stdout 0.01s 52488KB
stdin
Standard input is empty
stdout
Отчет компании Вектор
Департамент                   сотр.               тугр.      кофе      стр.          тугр./стр.
Департамент закупок              17              9612.5       350      3100     3.1008064516129
Департамент продаж               24               13550       610      3325     4.0751879699248
Департамент рекламы              36               16300       575      5450     2.9908256880734
Департамент логистики            24               11375       425      3850     2.9545454545455
Среднее                       25.25           12709.375       490   3931.25    0.80822734499205
Всего                           101             50837.5      1960     15725     3.2329093799682
--------------------------------------------------------------------------------
Удалён: Имя0 [1 ранг] из Департамент рекламы
Удалён: Имя0 [1 ранг] из Департамент логистики
Удалён: Имя1 [1 ранг] из Департамент логистики
Отчет компании Вектор[Увольнение 40% инженеров из каждого департамента]
Департамент                   сотр.               тугр.      кофе      стр.          тугр./стр.
Департамент закупок              17              9612.5       350      3100     3.1008064516129
Департамент продаж               24               13550       610      3325     4.0751879699248
Департамент рекламы              35               16100       570      5400     2.9814814814815
Департамент логистики            22               10975       415      3750     2.9266666666667
Среднее                        24.5           12559.375    486.25   3893.75    0.80638041733547
Всего                            98             50237.5      1945     15575     3.2255216693419
--------------------------------------------------------------------------------
Новый директор "Департамент продаж" - Имя0 [ранг - 2]
Отчет компании Вектор[Повышение ставки аналитикам]
Департамент                   сотр.               тугр.      кофе      стр.          тугр./стр.
Департамент закупок              17              9612.5       350      3100     3.1008064516129
Департамент продаж               24             15637.5       795      3470     4.5064841498559
Департамент рекламы              36               16300       575      5450     2.9908256880734
Департамент логистики            24               11375       425      3850     2.9545454545455
Среднее                       25.25            13231.25    536.25    3967.5    0.83372715816005
Всего                           101               52925      2145     15870     3.3349086326402
--------------------------------------------------------------------------------
Повышен: Имя0 [1 ранг] из Департамент закупок
Повышен: Имя1 [1 ранг] из Департамент закупок
Повышен: Имя2 [1 ранг] из Департамент закупок
Повышен: Имя3 [1 ранг] из Департамент закупок
Повышен: Имя4 [1 ранг] из Департамент закупок
Повышен: Имя5 [1 ранг] из Департамент закупок
Повышен: Имя6 [1 ранг] из Департамент закупок
Повышен: Имя7 [1 ранг] из Департамент закупок
Повышен: Имя0 [1 ранг] из Департамент продаж
Повышен: Имя1 [1 ранг] из Департамент продаж
Повышен: Имя2 [1 ранг] из Департамент продаж
Повышен: Имя3 [1 ранг] из Департамент продаж
Повышен: Имя4 [1 ранг] из Департамент продаж
Повышен: Имя5 [1 ранг] из Департамент продаж
Повышен: Имя0 [1 ранг] из Департамент рекламы
Повышен: Имя1 [1 ранг] из Департамент рекламы
Повышен: Имя2 [1 ранг] из Департамент рекламы
Повышен: Имя3 [1 ранг] из Департамент рекламы
Повышен: Имя0 [1 ранг] из Департамент логистики
Повышен: Имя1 [1 ранг] из Департамент логистики
Повышен: Имя2 [1 ранг] из Департамент логистики
Повышен: Имя3 [1 ранг] из Департамент логистики
Повышен: Имя4 [1 ранг] из Департамент логистики
Повышен: Имя5 [1 ранг] из Департамент логистики
Повышен: Имя6 [1 ранг] из Департамент логистики
Повышен: Имя7 [1 ранг] из Департамент логистики
Повышен: Имя8 [1 ранг] из Департамент логистики
Повышен: Имя9 [1 ранг] из Департамент логистики
Отчет компании Вектор[Повышение ранга менеджеров]
Департамент                   сотр.               тугр.      кофе      стр.          тугр./стр.
Департамент закупок              17             10612.5       350      3100     3.4233870967742
Департамент продаж               24               14300       610      3325     4.3007518796992
Департамент рекламы              36               16800       575      5450     3.0825688073394
Департамент логистики            24               12625       425      3850     3.2792207792208
Среднее                       25.25           13584.375       490   3931.25    0.86387122416534
Всего                           101             54337.5      1960     15725     3.4554848966614