fork download
  1. <?php
  2. header("Content-Type: text/plain");
  3.  
  4. // ООП. Вектор департаменты и сотрудники
  5.  
  6. // Класс сотрудника
  7. class Employee {
  8.  
  9. public $id = ""; // id
  10. private $rank = 1; // ранг
  11. private $chief = 0; // статус руководителя
  12. private $profession; // профессия
  13.  
  14. // Коофициенты зарплаты для ранга
  15. private $xRang = array (1 => '1',
  16. 2 => '1.25',
  17. 3 => '1.5');
  18. // Коофициенты зарплаты для начальников
  19. private $xChiefSalary = array (0 => '1',
  20. 1 => '1.5');
  21. // Коофициенты потребления кофе для начальников
  22. private $xChiefCoffee = array (0 => '1',
  23. 1 => '2');
  24. // Коофициенты продуктивности для начальников
  25. private $xChiefProduct = array (0 => '1',
  26. 1 => '0');
  27.  
  28. public function __construct ($id){
  29. $this->id = $id;
  30. }
  31. // Присвоение профессии сотруднику
  32. public function setProfession ($profession) {
  33. $this->profession = $profession;
  34. }
  35. // Присвоение ранга сотруднику
  36. public function setRank ($rank) {
  37. $this->rank = $rank;
  38. }
  39. // Присвоение статуса начальник
  40. public function setСhief ($chief) {
  41. $this->chief = $chief;
  42. }
  43. // Расчет зарплаты
  44. public function getSalary () {
  45. // Профессия
  46. $profession = $this->profession;
  47. // Ставка по профессии
  48. $salaryRate = $profession->salaryRate;
  49. // Вычисляем коэффициент согласно рангу сотрудника
  50. $tmpxRang = $this->xRang[$this->rank];
  51. // Вычисляем коэффициент для начальника
  52. $tmpxChiefSalary = $this->xChiefSalary[$this->chief];
  53. // Расчет зарплаты
  54. $salary = $salaryRate * $tmpxRang * $tmpxChiefSalary;
  55.  
  56. return $salary;
  57. }
  58. // Расчет потребления кофе
  59. public function getCoffee () {
  60. // Профессия
  61. $profession = $this->profession;
  62. // Потребление кофе по профессии
  63. $coffeeRate = $profession->coffeeRate;
  64. // Вычисляем коэффициент для начальника
  65. $tmpxChiefCoffee = $this->xChiefCoffee[$this->chief];
  66. // Расчет потребления кофе
  67. $coffee = $coffeeRate * $tmpxChiefCoffee;
  68.  
  69. return $coffee;
  70. }
  71. // Расчет продуктивности
  72. public function getProduct () {
  73. // Профессия
  74. $profession = $this->profession;
  75. // Продуктивность по профессии
  76. $productRate = $profession->product;
  77. // Вычисляем коэффициент для начальника
  78. $tmpxChiefProduct = $this->xChiefProduct[$this->chief];
  79. // Расчет продуктивности
  80. $product = $productRate * $tmpxChiefProduct;
  81.  
  82. return $product;
  83. }
  84. }
  85.  
  86. // Абстрактный класс профессии
  87. abstract class Profession {
  88. public $name = ""; // название
  89. public $salaryRate; // ставка
  90. public $coffeeRate; // результат работы
  91. public $product; // производительность
  92. }
  93.  
  94. // Класс менджер
  95. class Manager extends Profession {
  96. public $name = "Manager";
  97. public $salaryRate = 500;
  98. public $coffeeRate = 20;
  99. public $product = 200;
  100. }
  101.  
  102. // Класс маркетолог
  103. class Marketer extends Profession {
  104. public $name = "Marketer";
  105. public $salaryRate = 400;
  106. public $coffeeRate = 15;
  107. public $product = 150;
  108. }
  109.  
  110. // Класс инженер
  111. class Engineer extends Profession {
  112. public $name = "Engineer";
  113. public $salaryRate = 200;
  114. public $coffeeRate = 5;
  115. public $product = 50;
  116. }
  117.  
  118. // Класс аналитик
  119. class Analyst extends Profession {
  120. public $name = "Analyst";
  121. public $salaryRate = 800;
  122. public $coffeeRate = 50;
  123. public $product = 5;
  124. }
  125.  
  126. // Класс департамента
  127. class Departament {
  128.  
  129. public $name = ""; // название
  130. private $employees = array(); // сотрудники
  131.  
  132. public function __construct ($name){
  133. $this->name = $name;
  134. }
  135. // Прием сотрудника на работу
  136. public function setEmployee ($employee){
  137. $this->employees[] = $employee;
  138. }
  139. // Расчет количества сотрудников
  140. public function countEmployees (){
  141. return count($this->employees);
  142. }
  143. // Расходы на зарплату
  144. public function getTotalSalary (){
  145. $totalSalary = 0; // сумарная зарплата
  146. // Для каждого сотрудника
  147. foreach ($this->employees as $employee) {
  148. // Запрашиваем зп у сотрудника и суммируем результат
  149. $totalSalary += $employee->getSalary ();
  150. }
  151. return $totalSalary;
  152. }
  153. // Рассход кофе
  154. public function getTotalCoffee (){
  155. $totalCoffee = 0; // сумарное потребление кофе
  156. // Для каждого сотрудника
  157. foreach ($this->employees as $employee) {
  158. // Запрашиваем потребление кофе у сотрудника и суммируем результат
  159. $totalCoffee += $employee->getCoffee ();
  160. }
  161. return $totalCoffee;
  162. }
  163. // Суммарная производительность
  164. public function getTotalProduct (){
  165. $totalProduct = 0; // сумарная продуктивность
  166. // Для каждого сотрудника
  167. foreach ($this->employees as $employee) {
  168. // Запрашиваем продуктивность у сотрудника и суммируем результат
  169. $totalProduct += $employee->getProduct ();
  170. }
  171. return $totalProduct;
  172. }
  173. // Средний расход тугриков на одну страницу
  174. public function getAvrCostPerProduct (){
  175. // Средняя стоимость 1 страницы = суммарная зарплата / сумарное количество страниц
  176. $avrCostPerProduct = round($this->getTotalSalary () / $this->getTotalProduct () , 2) ;
  177.  
  178. return $avrCostPerProduct;
  179. }
  180. }
  181.  
  182. // Класс компании
  183. class Company {
  184.  
  185. public $name = ""; // название
  186. public $departaments = array(); // департаменты
  187.  
  188. public function __construct($name)
  189. {
  190. $this->name = $name;
  191. }
  192. // Добавление департамента в компанию
  193. public function setNewDepartament ($departament) {
  194. // Имя департамента в массиве для обращения
  195. $depName = $departament->name;
  196. // Добавляем объект департмент в массив $departaments
  197. $this->departaments[$depName] = $departament;
  198. }
  199.  
  200. // Сумарное количество работников
  201. public function getTotalEmployees (){
  202. $totalEmployees = 0;
  203. // Для каждого департамента
  204. foreach ($this->departaments as $departament) {
  205. // Сумируем работников всех департаментов
  206. $totalEmployees += $departament->countEmployees();
  207. }
  208. return $totalEmployees;
  209. }
  210. // Расходы на зарплату в сумме
  211. public function getTotalSalary (){
  212. $salary = 0;
  213. // Для каждого департамента
  214. foreach ($this->departaments as $departament) {
  215. // Сумируем зп всех департаментов
  216. $salary += $departament->getTotalSalary();
  217. }
  218. return $salary;
  219. }
  220.  
  221. // Рассход кофе в сумме
  222. public function getTotalCoffee (){
  223. $coffee = 0;
  224. // Для каждого департамента
  225. foreach ($this->departaments as $departament) {
  226. // Суммируем расход кофе у департаментов
  227. $coffee += $departament->getTotalCoffee();
  228. }
  229. return $coffee;
  230. }
  231.  
  232. // Суммарная производительность
  233. public function getTotalProduct (){
  234. $product = 0;
  235. // Для каждого департамента
  236. foreach ($this->departaments as $departament) {
  237. // Суммируем производительность каждого департамента
  238. $product += $departament->getTotalProduct();;
  239. }
  240. return $product;
  241. }
  242. // Среднее количество работников по департаментам
  243. public function getAvrEmployees (){
  244. // Среднее количество работников = суммарное кол-во работников / кол-во департаментов
  245. $avrEmployees = round($this->getTotalEmployees () / count($this->departaments)) ;
  246.  
  247. return $avrEmployees;
  248. }
  249. // Средняя зарплата по департаментам
  250. public function getAvrSalary (){
  251. // Средняя зарплата = суммарная зарплата / кол-во департаментов
  252. $avrSalary = round($this->getTotalSalary () / count($this->departaments), 2) ;
  253.  
  254. return $avrSalary;
  255. }
  256. // Среднее потребление кофе по департаментам
  257. public function getAvrCoffee (){
  258. // Среднее потребление кофе = суммарная потребление кофе / кол-во департаментов
  259. $avrCoffee = round($this->getTotalCoffee () / count($this->departaments), 2) ;
  260.  
  261. return $avrCoffee;
  262. }
  263. // Средняя производительность по департаментам
  264. public function getAvrProduct (){
  265. // Средняя производительность = суммарная производительность / кол-во департаментов
  266. $avrProduct = round($this->getTotalProduct () / count($this->departaments), 2) ;
  267.  
  268. return $avrProduct;
  269. }
  270. // Средний расход тугриков на одну страницу по департаментам
  271. public function getAvrCostPerProduct (){
  272. $avrCostPerProduct = 0;
  273. // Для каждого департамента
  274. foreach ($this->departaments as $departament) {
  275. // Сумируем средний расход
  276. $avrCostPerProduct += $departament->getAvrCostPerProduct();
  277. }
  278. // Средняя стоимость 1 страницы = cредняя стоимость всех департ / кол-во департаментов
  279. $avrCostPerProduct = round($avrCostPerProduct / count($this->departaments) , 2);
  280.  
  281. return $avrCostPerProduct;
  282. }
  283.  
  284. }
  285.  
  286. // Регистрируем Vector Inc на Сейшельских островах
  287. $vector = new Company('Vector');
  288.  
  289. // Создаем классы департаментов
  290. $purchDep = new Departament('Департамент закупок');
  291. $salesDep = new Departament('Департамент продаж');
  292. $advDep = new Departament('Департамент рекламы');
  293. $logDep = new Departament('Департамент логистики');
  294.  
  295. // Записываем департменты в реестр компании
  296. $vector->setNewDepartament($purchDep);
  297. $vector->setNewDepartament($salesDep);
  298. $vector->setNewDepartament($advDep);
  299. $vector->setNewDepartament($logDep);
  300.  
  301. // Создаем классы профессий
  302. $me = new Manager();
  303. $ma = new Marketer();
  304. $en = new Engineer();
  305. $an = new Analyst();
  306.  
  307. // Добавляем профессии в масив для последующего создания сотрудников пачкой
  308. $professions['me'] = $me;
  309. $professions['ma'] = $ma;
  310. $professions['en'] = $en;
  311. $professions['an'] = $an;
  312.  
  313. // Лист вакансий: департамент => группы вакансий: профессияРанг статус_начальника => кол-во
  314. $vacancies = array(
  315. 'Департамент закупок' => array('me1'=>'9', 'me2'=>'3', 'me3'=>'2', 'ma1'=>'2', 'me2 1'=>'1'),
  316. 'Департамент продаж' => array('me1'=>'12', 'ma1'=>'6', 'an1'=>'3', 'an2'=>'2', 'ma2 1'=>'1'),
  317. 'Департамент рекламы' => array('ma1'=>'15', 'ma2'=>'10', 'me1'=>'8', 'en1'=>'2', 'ma3 1'=>'1'),
  318. 'Департамент логистики' => array('me1'=>'13', 'me2'=>'5', 'en1'=>'5', 'me1 1'=>'1')
  319. );
  320.  
  321. // Создание сотрудников
  322. function creationEmployees ($vacancies, $professions, $vector) {
  323. // Список сотрудников, чтобы не разбежались
  324. $employees = array ();
  325. // Для каждого департамента
  326. foreach ($vacancies as $depName => $vacancyGroup) {
  327.  
  328. // Для каждой группы вакансий
  329. foreach ($vacancyGroup as $vacancyName => $vacancyQuantity) {
  330.  
  331. // Достаем название профессии из вакансии
  332. $profession = mb_substr ($vacancyName, 0, 2);
  333. // Достаем ранг из вакансии
  334. $rank = mb_substr ($vacancyName, 2, 1);
  335. // Достаем статус начальника из вакансии
  336. $chief = mb_substr ($vacancyName, 4, 1);
  337. $chief = ($chief==NULL)? 0 : 1; // если статус не определен явно, считаем что 0
  338.  
  339. // Создаем столько сотрудников, сколько вакансий в группе
  340. for ($id = 1; $id <= $vacancyQuantity; $id++) {
  341. // Создаем сотрудника
  342. $employees[$id] = new Employee($id);
  343.  
  344. // Назначаем профессию согласно текущей вакансии
  345. $employees[$id]->setProfession($professions[$profession]);
  346. // Писваиваем ранг
  347. $employees[$id]->setRank($rank);
  348. // Присваиваем статус начальника
  349. $employees[$id]->setСhief($chief);
  350.  
  351. // Находим нужный департамент в компании
  352. $departament = $vector->departaments[$depName];
  353. // Добавляем сотрудника в этот департамент
  354. $departament->setEmployee($employees[$id]);
  355. }
  356. }
  357. }
  358. }
  359.  
  360. // Запускаем пакетное создание и распределение сотрудников
  361. creationEmployees ($vacancies, $professions, $vector);
  362.  
  363. /* Вывод таблицы результатов */
  364.  
  365. // Класс строки таблицы
  366. class TableTr {
  367. public $str = ""; // строка
  368. //private $caption = 0; // является ли строка заголовком
  369.  
  370. // Ширина колонок
  371. public $length = 15;
  372.  
  373. // Добавление пробелов слева
  374. public function padLeft($string, $length) {
  375. // Разница между переданной строкой и шириной колонки
  376. $lenghtDifference = $length-mb_strlen($string);
  377. // Проверка на отрицательное значение при вычитании
  378. if ($lenghtDifference >= 0) {
  379. // Заполняем разницу пробелами
  380. $string = str_repeat(" ", $lenghtDifference) . $string;
  381. } else {
  382. // Если таки отрицательное, обрезаем край строки до ширины колонки
  383. $string = mb_substr ($string, 0, $length);
  384. }
  385. return $string;
  386. }
  387.  
  388. // Добавление пробелов справа
  389. public function padRight($string, $length) {
  390. // Разница между переданной строкой и шириной колонки
  391. $lenghtDifference = $length-mb_strlen($string);
  392. // Проверка на отрицательное значение при вычитании
  393. if ($lenghtDifference >= 0) {
  394. // Заполняем разницу пробелами
  395. $string .= str_repeat(" ", $lenghtDifference);
  396. } else {
  397. // Если таки отрицательное, обрезаем край строки до ширины колонки
  398. $string = mb_substr ($string, 0, $length);
  399. }
  400. return $string;
  401. }
  402.  
  403. // Делаем горизонтальную черту
  404. public function drawHr($length, $columns) {
  405. $string = str_repeat("-", $length * $columns);
  406. return $string;
  407. }
  408.  
  409. // Конструктор принимает массив строк с статус заголовка
  410. public function __construct ($strs, $caption) {
  411. // Количество колонок
  412. $columns=0; // счетчик колонок
  413. foreach ($strs as $str) {
  414. // Первая колонка
  415. if (mb_strlen( $this->str)==0) {
  416. // Добавляем пробелы справа
  417. $this->str .= "\n" . $this->padRight($str, $this->length);
  418. // Остальные колонки
  419. } else {
  420. // Добавляем пробелы слева
  421. $this->str .= $this->padLeft($str, $this->length);
  422. }
  423. $columns++;
  424. }
  425. // Если строка заголовок
  426. if ($caption==1) {
  427. // Добаляем горизонтальное поддчеркивание снизу, длина колонки * кол-во колонок
  428. $this->str .= "\n" . $this->drawHr($this->length, $columns);
  429. }
  430. }
  431. }
  432. // Класс таблицы
  433. class Table {
  434. public $tableTrs = array (); // массив строк
  435.  
  436. // Добавление строк в таблицу
  437. public function setTableTr ($tableTr) {
  438. $this->tableTrs[] = $tableTr;
  439. }
  440. // Печать таблицы
  441. public function printTable () {
  442. foreach($this->tableTrs as $tableTr) {
  443. echo "{$tableTr->str}";
  444. }
  445. }
  446. }
  447. // Создаем таблицу
  448. $table = new Table();
  449.  
  450. // Заголовок таблицы
  451. $tableCaption = array ("Департамент",
  452. "сотр.",
  453. "тугр.",
  454. "кофе",
  455. "стр.",
  456. "тугр./стр..");
  457. // Создаем строку
  458. $tableTrC = new TableTr ($tableCaption, 1);
  459. // Добавляем строку в таблицу
  460. $table->setTableTr($tableTrC);
  461.  
  462. // Выводим статистику по департаментам
  463. // Каждый департамент строка
  464. foreach ($vector->departaments as $departament) {
  465. unset($strs); // обнуляем массив
  466. // Заполняем массив строк
  467. $strs[] = mb_convert_case(mb_substr($departament->name, 12), MB_CASE_TITLE, "UTF-8");
  468. $strs[] = $departament->countEmployees();
  469. $strs[] = $departament->getTotalSalary();
  470. $strs[] = $departament->getTotalCoffee();
  471. $strs[] = $departament->getTotalProduct();
  472. $strs[] = $departament->getAvrCostPerProduct();
  473.  
  474. // Создаем новую строку
  475. $tableTr = new TableTr ($strs, 0);
  476. // Добавляем строку в таблицу
  477. $table->setTableTr($tableTr);
  478. }
  479.  
  480. // Пустая строка
  481. unset($strs); // обнуляем массив
  482. $strs[] = ' ';
  483. // Создаем новую строку
  484. $tableTrAvr = new TableTr ($strs, 0);
  485. // Добавляем строку в таблицу
  486. $table->setTableTr($tableTrAvr);
  487.  
  488. // Среднее для всей компании
  489. unset($strs); // обнуляем массив
  490. // Заполняем массив строк
  491. $strs[] = 'Среднее';
  492. $strs[] = $vector->getAvrEmployees();
  493. $strs[] = $vector->getAvrSalary();
  494. $strs[] = $vector->getAvrCoffee();
  495. $strs[] = $vector->getAvrProduct();
  496. $strs[] = $vector->getAvrCostPerProduct();
  497.  
  498. // Создаем новую строку
  499. $tableTrAvr = new TableTr ($strs, 0);
  500. // Добавляем строку в таблицу
  501. $table->setTableTr($tableTrAvr);
  502.  
  503.  
  504. // Всего для всей компании
  505. unset($strs); // обнуляем массив
  506. // Заполняем массив строк
  507. $strs[] = 'Всего';
  508. $strs[] = $vector->getTotalEmployees();
  509. $strs[] = $vector->getTotalSalary();
  510. $strs[] = $vector->getTotalCoffee();
  511. $strs[] = $vector->getTotalProduct();
  512.  
  513. // Создаем новую строку
  514. $tableTrAvr = new TableTr ($strs, 0);
  515. // Добавляем строку в таблицу
  516. $table->setTableTr($tableTrAvr);
  517.  
  518. // Выводим таблицу на печать
  519. $table->printTable();
  520.  
  521. ?>
Success #stdin #stdout 0.02s 52472KB
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       12709.38            490        3931.25           3.28
Всего                      101        50837.5           1960          15725