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. //Распечатать информацию о компании (стоит ли вынести это в отдельный класс (например, CompanyReport??))
  38. public function printInfoAboutCompany()
  39. {
  40. $countDepartment = $this->getCountDeparments();
  41. $total = array('сотр' => 0, 'тугр' => 0, 'кофе' => 0, 'стр' => 0);
  42.  
  43. echo "Отчет компании \"{$this->getNameCompany()}\"";
  44. echo padRigth("Департамент", LARGE_COL) . padLeft("сотр.", SMALL_COL) . padLeft("тугр.", MEDIUM_COL) .
  45. padLeft("кофе", SMALL_COL) . padLeft("стр.", SMALL_COL) . padLeft("тугр./стр.", MEDIUM_COL) . "\n";
  46. foreach ($this->listOfDepatments as $departament) {
  47. echo padRigth($departament->getDepartmentName(), LARGE_COL) . padLeft($departament->getCountEmployee(), SMALL_COL) .
  48. padLeft($departament->getTotalSalary(), MEDIUM_COL) . padLeft($departament->getTotalCups(), SMALL_COL) .
  49. padLeft($departament->getTotalPages(), SMALL_COL) . padLeft($departament->getTotalSalary() / $departament->getTotalPages(), MEDIUM_COL) . "\n";
  50. $total['сотр'] += $departament->getCountEmployee();
  51. $total['тугр'] += $departament->getTotalSalary();
  52. $total['кофе'] += $departament->getTotalCups();
  53. $total['стр'] += $departament->getTotalPages();
  54. }
  55.  
  56. //возможно не правильно расчитываю среднее значение
  57. echo padRigth('Среднее', LARGE_COL) . padLeft($total['сотр'] / $countDepartment, SMALL_COL) .
  58. padLeft($total['тугр'] / $countDepartment, MEDIUM_COL) . padLeft($total['кофе'] / $countDepartment, SMALL_COL) .
  59. padLeft($total['стр'] / $countDepartment, SMALL_COL) . padLeft(($total['тугр'] / $total['стр']) / $countDepartment, MEDIUM_COL) . "\n";
  60. echo padRigth('Всего', LARGE_COL) . padLeft($total['сотр'], SMALL_COL) .
  61. padLeft($total['тугр'], MEDIUM_COL) . padLeft($total['кофе'], SMALL_COL) .
  62. padLeft($total['стр'], SMALL_COL) . padLeft($total['тугр'] / $total['стр'], MEDIUM_COL) . "\n";
  63. }
  64. }
  65.  
  66. class Department
  67. {
  68. private $name; //Имя компании
  69. private $listOfEmployee; //Список сотрудников
  70.  
  71. public function __construct($name = 'Noname Department')
  72. {
  73. $this->name = $name;
  74. $this->listOfEmployee = array();
  75. }
  76.  
  77. //Получить имя департамента
  78. public function getDepartmentName()
  79. {
  80. return $this->name;
  81. }
  82.  
  83. //Добавить сотрудника в департамент
  84. public function addEmployeeToDepartment($newEmployee)
  85. {
  86. $this->listOfEmployee[] = $newEmployee;
  87. }
  88.  
  89. //Количество сотрудников
  90. public function getCountEmployee()
  91. {
  92. return count($this->listOfEmployee);
  93. }
  94.  
  95. //Общая сумма
  96. public function getTotalSalary()
  97. {
  98. $totalSalary = 0;
  99. foreach ($this->listOfEmployee as $employee) {
  100. $totalSalary += $employee->getSalary();
  101. }
  102. return $totalSalary;
  103. }
  104.  
  105. //Общий объем страниц
  106. public function getTotalPages()
  107. {
  108. $totalPages = 0;
  109. foreach ($this->listOfEmployee as $employee) {
  110. $totalPages += $employee->getPages();
  111. }
  112. return $totalPages;
  113. }
  114.  
  115. //Обцее число кружек кофе
  116. public function getTotalCups()
  117. {
  118. $totalCups = 0;
  119. foreach ($this->listOfEmployee as $employee) {
  120. $totalCups += $employee->getCupOfCoffee();
  121. }
  122. return $totalCups;
  123. }
  124. }
  125.  
  126. class Employee
  127. {
  128. protected $name; //Имя сотрудника
  129. protected $isDirector; //Является ли он руководителем
  130. protected $rank; //ранг
  131. protected $proffession = ''; //Профессия
  132. protected $salary = 0; //Зарплата
  133. protected $pages = 0; //Страниц отчета
  134. protected $cupOfCoffee = 0; //Кружек кофе
  135.  
  136. public function __construct($name = 'Username', $rank = 0, $isDirector = false)
  137. {
  138. $this->name = $name;
  139. $this->rank = $rank;
  140. $this->isDirector = $isDirector;
  141. }
  142.  
  143. //Получить имя сотрудника
  144. public function getEmployeeName()
  145. {
  146. return $this->name;
  147. }
  148.  
  149. //Получить профессию сотрудника
  150. public function getEmployeeProffession()
  151. {
  152. return $this->proffession;
  153. }
  154.  
  155. //Получить ранг сотрудника
  156. public function getEmployeeRank()
  157. {
  158. return $this->rank;
  159. }
  160.  
  161. //Посчитать зарплату
  162. public function getSalary()
  163. {
  164. $totalSalary = $this->salary;
  165. if ($this->rank == 2) {
  166. $totalSalary *= 1.25;
  167. } elseif ($this->rank == 3) {
  168. $totalSalary *= 1.5;
  169. }
  170.  
  171. if ($this->isDirector) {
  172. $totalSalary *= 1.5;
  173. }
  174. return $totalSalary;
  175. }
  176.  
  177. //Посчитать количество страниц
  178. public function getPages()
  179. {
  180. return ($this->isDirector ? 0 : $this->pages);
  181. }
  182.  
  183. //Посчитать количество кружек кофе
  184. public function getCupOfCoffee()
  185. {
  186. return ($this->isDirector ? ($this->cupOfCoffee * 2) : $this->cupOfCoffee);
  187. }
  188.  
  189. }
  190.  
  191. class Manager extends Employee
  192. {
  193. protected $salary = 500;
  194. protected $pages = 200;
  195. protected $cupOfCoffee = 20;
  196. protected $proffession = 'Менеджер';
  197. }
  198.  
  199. class Marketer extends Employee
  200. {
  201. protected $salary = 400;
  202. protected $pages = 150;
  203. protected $cupOfCoffee = 15;
  204. protected $proffession = 'Маркетолог';
  205. }
  206.  
  207. class Engineer extends Employee
  208. {
  209. protected $salary = 200;
  210. protected $pages = 50;
  211. protected $cupOfCoffee = 5;
  212. protected $proffession = 'Инженер';
  213. }
  214.  
  215. class Analyst extends Employee
  216. {
  217. protected $salary = 800;
  218. protected $pages = 5;
  219. protected $cupOfCoffee = 50;
  220. protected $proffession = 'Аналитик';
  221. }
  222.  
  223. //Для форматированного вывода
  224. function padLeft($text, $length)
  225. {
  226. if (mb_strlen($text) < $length) {
  227. $text = str_repeat(" ", $length - mb_strlen($text)) . $text;
  228. }
  229.  
  230. return $text;
  231. }
  232.  
  233. function padRigth($text, $length) {
  234. if (mb_strlen($text) < $length) {
  235. $text .= str_repeat(" ", $length - mb_strlen($text));
  236. }
  237.  
  238. return $text;
  239. }
  240.  
  241. //функция принимает на вход строку вида: 9xме1;3xмe2;2xмe3;2xмa1;1xмe2 (последний идет руководитель) и возвращает массив созданных объектов
  242. function createEmployee($message)
  243. {
  244. $employee = array();
  245.  
  246. $people = explode(';', $message);
  247. $totalPeople = count($people);
  248.  
  249.  
  250. for ($i = 0; $i < $totalPeople; $i++) {
  251. $rank = (int) mb_substr($people[$i], mb_strlen($people[$i]) - 1, 1);
  252. $proffession = mb_substr($people[$i], mb_strpos($people[$i], 'x') + 1, 2);
  253. $countEmployee = (int) $people[$i];
  254.  
  255. $isDirector = ($i == ($totalPeople - 1)) ? true : false;
  256.  
  257. for ($j = 0; $j < $countEmployee; $j++ ) {
  258. switch ($proffession) {
  259. case "ме": $employee[] = new Manager("Имя{$j}", $rank, $isDirector);
  260. break;
  261. case "ма": $employee[] = new Marketer("Имя{$j}", $rank, $isDirector);
  262. break;
  263. case "ан": $employee[] = new Analyst("Имя{$j}", $rank, $isDirector);
  264. break;
  265. case "ин": $employee[] = new Engineer("Имя{$j}", $rank, $isDirector);
  266. break;
  267. default: echo "Проверьте входные данные! {$proffession}";
  268. exit();
  269. }
  270. }
  271. }
  272.  
  273. return $employee;
  274. }
  275.  
  276. //Добавляем каждого сотрудника в определенный департамент
  277. function addAllEmployeeToDepartment($employee, $departament)
  278. {
  279. $totalEmployee = count($employee);
  280.  
  281. for ($i = 0; $i < $totalEmployee; $i++) {
  282. $departament->addEmployeeToDepartment($employee[$i]);
  283. }
  284. }
  285.  
  286. //Создаем нашу компанию
  287. $vector = new Company('Вектор');
  288.  
  289. //Создаем департаменты и добавляем их в команию
  290. $procurementDepartment = new Department('Департамент закупок');
  291. $vector->addDepartmentToCompany($procurementDepartment);
  292.  
  293. $salesDepartament = new Department('Департамент продаж');
  294. $vector->addDepartmentToCompany($salesDepartament);
  295.  
  296. $advertisingDepartment = new Department('Департамент рекламы');
  297. $vector->addDepartmentToCompany($advertisingDepartment);
  298.  
  299. $logisticsDepartament = new Department('Департамент логистики');
  300. $vector->addDepartmentToCompany($logisticsDepartament);
  301.  
  302. //Создаем сотрудников и добавляем их в департаменты
  303. $procurementEmployee = array();
  304. $procurementEmployee = createEmployee('9xме1;3xме2;2xме3;2xма1;1xме2');
  305. addAllEmployeeToDepartment($procurementEmployee, $procurementDepartment);
  306.  
  307. $salesEmployee = array();
  308. $salesEmployee = createEmployee('12xме1;6xма1;3xан1;2xан2;1xма2');
  309. addAllEmployeeToDepartment($salesEmployee, $salesDepartament);
  310.  
  311. $advertisingEmployee = array();
  312. $advertisingEmployee = createEmployee('15xма1;10xма2;8xме1;2xин1;1xма3');
  313. addAllEmployeeToDepartment($advertisingEmployee, $advertisingDepartment);
  314.  
  315. $logisticsEmployee = array();
  316. $logisticsEmployee = createEmployee('13xме1;5xме2;5xин1;1xме1');
  317. addAllEmployeeToDepartment($logisticsEmployee, $logisticsDepartament);
  318.  
  319. //Выводим отчет о компании
  320. $vector->printInfoAboutCompany();
Success #stdin #stdout 0s 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