fork download
  1. <?php //департаменты и сотрудники
  2.  
  3.  
  4.  
  5.  
  6. $departmentNames = array("закупок","продаж","рекламы","логистики");
  7.  
  8. $listOfWorkersDep["закупок"] = array("ме1"=>9,"ме2"=>3,"ме3"=>2,
  9. "ма1"=>2,"ма2"=>0,"ма3"=>0,
  10. "ин1"=>5,"ин2"=>0,"ин3"=>0,
  11. "аа1"=>0,"ан2"=>1,"ан3"=>0);
  12. $listOfWorkersDep["продаж"] = array("ме1"=>12,"ме2"=>0,"ме3"=>0,
  13. "мар1"=>6,"ма2"=>0,"ма3"=>0,
  14. "ин1"=>5,"ин2"=>0,"ин3"=>0,
  15. "ан1"=>3,"ан2"=>2,"ан3"=>0);
  16. $listOfWorkersDep["рекламы"] = array("ме1"=>8,"ме2"=>0,"ме3"=>0,
  17. "ма1"=>15,"ма2"=>10,"ма3"=>0,
  18. "ин1"=>2,"ин2"=>0,"ин3"=>0,
  19. "ан1"=>0,"ан2"=>1,"ан3"=>0);
  20. $listOfWorkersDep["логистики"] = array("ме1"=>13,"мен2"=>5,"ме3"=>0,
  21. "мар1"=>0,"ма2"=>0,"ма3"=>0,
  22. "ин1"=>5,"ин2"=>0,"ин3"=>0,
  23. "ан1"=>0,"ан2"=>1,"ан3"=>0);
  24.  
  25.  
  26.  
  27. /*----------------------------------------------------------------------------*/
  28.  
  29. class Department
  30. {
  31. protected $name;
  32. protected $listOfWorkers = array();
  33. protected $numberOfWorkers = 0;
  34.  
  35.  
  36. public function __construct( $name )
  37.  
  38.  
  39. {
  40. $this->name = $name;
  41. }
  42.  
  43. public function addWorker( Worker $newWorker ) //добавить рабочего
  44. {
  45. $this->listOfWorkers[] = $newWorker;
  46. $this->numberOfWorkers++;
  47. }
  48.  
  49. public function getWorkesrGroup( $group, $fromRank, $toRank ) //выбрать группу рабочих
  50. {
  51. $workersGroup = array();
  52.  
  53. foreach( $this->listOfWorkers as $i=>$worker )
  54. {
  55. if( ( strtolower(get_class($worker)) == $group ) && ( ( $worker->getRank() >= $fromRank ) && ( $worker->getRank() <= $toRank ) ) )
  56. {
  57. $workersGroup[$i] = $worker;
  58. }
  59. }
  60.  
  61. return $workersGroup;
  62. }
  63.  
  64. public function getDepartmentChief() //выбрать начальника департамента
  65. {
  66. foreach( $this->listOfWorkers as $i=>$worker )
  67. {
  68. if( $worker->getСhief() )
  69. {
  70. $chief = $worker;
  71. }
  72. }
  73. return $chief;
  74. }
  75.  
  76. public function upWorkersGroupLevel( $group, $fromRank, $toRank, $growth, $percent ) //поднять уровень проценту выбранной группы рабочих
  77. {
  78. $workersGroup = $this->getWorkesrGroup( $group, $fromRank, $toRank );
  79. $workersKeys = array_rand($workersGroup,round($percent*count($workersGroup)/100,0,PHP_ROUND_HALF_UP));
  80.  
  81. foreach( $workersKeys as $i=>$key )
  82. {
  83. $workersGroup[$key]->upRank($growth);
  84. }
  85. }
  86.  
  87. public function setWorkersGroupSalary( $group, $fromRank, $toRank, $newSalary ) //изменить зарплату группе рабочих
  88. {
  89. $workersGroup = $this->getWorkesrGroup( $group, $fromRank, $toRank );
  90.  
  91. foreach( $workersGroup as $i=>$worker )
  92. {
  93. $worker->setSalary($newSalary);
  94. }
  95. }
  96.  
  97. public function setWorkersGroupCoffeeConsumptionRate( $group, $fromRank, $toRank, $newCoffeeConsumptionRate ) //изменить потребление кофе группе рабочих
  98. {
  99. $workersGroup = $this->getWorkesrGroup( $group, $fromRank, $toRank );
  100.  
  101. foreach( $workersGroup as $i=>$worker )
  102. {
  103. $worker->setCoffeeConsumptionRate( $newCoffeeConsumptionRate );
  104. }
  105. }
  106.  
  107. public function dismissWorkersGroup( $group, $fromRank, $toRank, $percent ) //удалить процент выбранной группы рабочих, преимущественно низкоуровневых
  108. { //руководителей не увольнять
  109. $workersGroup = $this->getWorkesrGroup( $group, $fromRank, $toRank );
  110. $workerForDismiss = round($percent*count($workersGroup)/100,0,PHP_ROUND_HALF_UP);
  111.  
  112. for( $i = $fromRank; $i <= $toRank; $i++ )
  113. {
  114. $workersGroup = $this->getWorkesrGroup( $group, $i, $i );
  115.  
  116. foreach( $workersGroup as $num=>$worker )
  117. {
  118. if ( !$worker->getСhief() )
  119. {
  120. unset($this->listOfWorkers[$num]);
  121. $workerForDismiss--;
  122. $this->numberOfWorkers--;
  123. }
  124. if ( $workerForDismiss == 0)
  125. {
  126. break;
  127. }
  128. }
  129. if ( $workerForDismiss == 0)
  130. {
  131. break;
  132. }
  133. }
  134. }
  135.  
  136. public function changeChief( $professionOfNewChief ) //заменить руководителя на работника выбранной профессии самого высокого ранга
  137. {
  138. $chief = $this->getDepartmentChief();
  139. if( !(strtolower(get_class($chief)) == $professionOfNewChief) )
  140. {
  141.  
  142. $workersGroup = $this->getWorkesrGroup( $professionOfNewChief, 1, 3 );
  143.  
  144. $maxRank = 0;
  145. foreach( $workersGroup as $i=>$worker)
  146. {
  147. if( $worker->getRank() > $maxRank )
  148. {
  149. $maxRank = $worker->getRank();
  150. $newChief = $worker;
  151. }
  152. }
  153. if( $maxRank != 0 )
  154. {
  155. $chief->removeFromChief();
  156. $newChief->makeChief();
  157. }
  158. }
  159. }
  160.  
  161. public function getName() //название департамента
  162. {
  163. return $this->name;
  164. }
  165.  
  166. public function getWorkersInfos() //получить информацию о рабочих
  167. {
  168. foreach( $this->listOfWorkers as $number=>$worker )
  169. {
  170. $worker->getInfos();
  171. }
  172. }
  173.  
  174. public function getTotalWorkers() //получить число рабочих
  175. {
  176. return $this->numberOfWorkers;
  177. }
  178.  
  179. public function getTotalSalary() //получить общие расходы на зарплату
  180. {
  181. $totalSalary = 0;
  182. foreach( $this->listOfWorkers as $number=>$worker )
  183. {
  184. $totalSalary += $worker->getSalary();
  185. }
  186. return $totalSalary;
  187. }
  188.  
  189. public function getTotalCoffeeConsumption() //получить расход кофе
  190. {
  191. $totalCoffee = 0;
  192. foreach( $this->listOfWorkers as $number=>$worker )
  193. {
  194. $totalCoffee += $worker->getCoffeeConsumption();
  195. }
  196. return $totalCoffee;
  197. }
  198.  
  199. public function getTotalProduction() //получить общую продукцию
  200. {
  201. $totalProduction = 0;
  202.  
  203. foreach( $this->listOfWorkers as $number=>$worker )
  204. {
  205. $totalProduction += $worker->getProduction();
  206. }
  207.  
  208. return $totalProduction;
  209. }
  210.  
  211. public function getDepartmentInfos() //получить информацию о департаменте
  212. {
  213. return array($this->name,
  214. $this->getTotalWorkers(),
  215. $this->getTotalSalary(),
  216. $this->getTotalCoffeeConsumption(),
  217. $this->getTotalProduction(),
  218. round($this->getTotalSalary()/$this->getTotalProduction(),2));
  219. }
  220. }
  221.  
  222. /*----------------------------------------------------------------------------*/
  223.  
  224. abstract class Worker
  225. {
  226. protected $department;
  227. protected $rank;
  228. protected $isChief;
  229. protected $baseSalary;
  230. protected $coffeeConsumptionRate;
  231. protected $productionPerMount;
  232. protected $productionType;
  233.  
  234. public function __construct( Department $department, $rank, $chief )
  235. {
  236. $this->department = $department->getName();
  237. $this->rank = $rank;
  238. $this->isChief = $chief;
  239. $department->addWorker($this);
  240. }
  241.  
  242. public function upRank($growth) //поднять ранг рабочего
  243. {
  244. if ( $this->rank+$growth<=3 )
  245. {
  246. $this->rank += $growth;
  247. }
  248. }
  249.  
  250. public function makeChief()
  251. {
  252. $this->isChief = true;
  253. }
  254.  
  255. public function removeFromChief()
  256. {
  257. $this->isChief = false;
  258. }
  259.  
  260. public function setSalary($newSalary) //изменить зарплату
  261. {
  262. $this->baseSalary = $newSalary;
  263. }
  264.  
  265. public function setCoffeeConsumptionRate($newCoffeeConsumptionRate) //изменить потребление кофе
  266. {
  267. $this->coffeeConsumptionRate = $newCoffeeConsumptionRate;
  268. }
  269.  
  270. public function getRank() //получить ранг рабочего
  271. {
  272. return $this->rank;
  273. }
  274.  
  275. public function getСhief() //узнать начальник ли это рабочий
  276. {
  277. return $this->isChief;
  278. }
  279.  
  280. public function getCoffeeConsumption() //получить потребление кофе
  281. {
  282. if ( $this->isChief )
  283. {
  284. $coffee = $this->coffeeConsumptionRate*2;
  285. }
  286. else
  287. {
  288. $coffee = $this->coffeeConsumptionRate;
  289. }
  290. return $coffee;
  291. }
  292.  
  293. public function getSalary() //получить зарплату рабочего
  294. {
  295. switch( $this->rank )
  296. {
  297. case 1:
  298. $salary = $this->baseSalary;
  299. break;
  300. case 2:
  301. $salary = $this->baseSalary*1.25;
  302. break;
  303. case 3:
  304. $salary = $this->baseSalary*1.5;
  305. break;
  306. }
  307.  
  308. if( $this->isChief )
  309. {
  310. $salary*= 1.5;
  311. }
  312.  
  313. return $salary;
  314. }
  315.  
  316. public function getProduction() //получить проудкцию рабочего
  317. {
  318. return $this->productionPerMount;
  319. }
  320.  
  321. public function getInfos() //получить информацию о рабочем
  322. {
  323. echo $this->rank;
  324. echo "-го уровня ";
  325. if ($this->isChief)
  326. {
  327. echo "и начальник ";
  328. }
  329. echo "департамента ";
  330. echo $this->department;
  331. echo ", зарплата ";
  332. echo $this->getSalary();
  333. echo " тугриков в месяц, выпивает ";
  334. echo $this->getCoffeeConsumption();
  335. echo " литров кофе в месяц\n";
  336. }
  337. }
  338.  
  339. /*----------------------------------------------------------------------------*/
  340.  
  341. class Manager extends Worker
  342. {
  343. protected $coffeeConsumptionRate = 20;
  344. protected $baseSalary = 500;
  345. protected $productionPerMount = 200;
  346. protected $productionType = "страница отчёта";
  347.  
  348. public function getInfos()
  349. {
  350. echo "Менеджер ";
  351. parent::getInfos();
  352. }
  353. }
  354.  
  355. /*----------------------------------------------------------------------------*/
  356.  
  357. class Marketer extends Worker
  358. {
  359. protected $coffeeConsumptionRate = 15;
  360. protected $baseSalary = 400;
  361. protected $productionPerMount = 150;
  362. protected $productionType = "страница отчёта";
  363.  
  364. public function getInfos()
  365. {
  366. echo "Маркетолог ";
  367. parent::getInfos();
  368. }
  369. }
  370.  
  371. /*----------------------------------------------------------------------------*/
  372.  
  373. class Engineer extends Worker
  374. {
  375. protected $coffeeConsumptionRate = 5;
  376. protected $baseSalary = 200;
  377. protected $productionPerMount = 50;
  378. protected $productionType = "страница чертёжа";
  379.  
  380. public function getInfos()
  381. {
  382. echo "Инженер ";
  383. parent::getInfos();
  384. }
  385. }
  386.  
  387. /*----------------------------------------------------------------------------*/
  388.  
  389. class Analyst extends Worker
  390. {
  391. protected $coffeeConsumptionRate = 50;
  392. protected $baseSalary = 800;
  393. protected $productionPerMount = 5;
  394. protected $productionType = "стратегическое исследование";
  395.  
  396. public function getInfos()
  397. {
  398. echo "Аналитик ";
  399. parent::getInfos();
  400. }
  401. }
  402.  
  403. /*----------------------------------------------------------------------------*/
  404.  
  405. function padLeft( $string,$columns )
  406. {
  407. return str_repeat(" ",$columns-mb_strlen($string)).$string;
  408. }
  409.  
  410. function printInfos( $arrayOfSomething,$columns )
  411. {
  412. foreach( $arrayOfSomething as $number=>$data )
  413. {
  414. echo padLeft( $data,$columns );
  415. }
  416. echo "\n";
  417. }
  418.  
  419.  
  420. function printTotalResults( $departmentList )
  421. {
  422. printInfos(array("Департамент","Работников","Зарплата","Расход кофе","Результат(стр)","Расход на стр"),15);
  423.  
  424. foreach( $departmentList as $i=>$department )
  425. {
  426. $arrayOfInfos[$i] = $department->getDepartmentInfos();
  427. printInfos($arrayOfInfos[$i],15);
  428. }
  429.  
  430. $totalInfos = array("итого",0,0,0,0,0);
  431.  
  432. foreach( $arrayOfInfos as $key=>$data )
  433. {
  434. for( $i=1;$i<6;$i++ )
  435. {
  436. $totalInfos[$i] += $data[$i];
  437. }
  438. }
  439.  
  440. $totalInfos[5] = round($totalInfos[2]/$totalInfos[4],2);
  441. printInfos($totalInfos,15);
  442. }
  443.  
  444. /*----------------------------------------------------------------------------*/
  445.  
  446.  
  447. $departmentList = array();
  448. foreach( $departmentNames as $i=>$name )
  449. {
  450. $departmentList[$name] = new Department($name);
  451. }
  452.  
  453. foreach( $departmentNames as $i=>$name ) //вносим работников в департаменты
  454. {
  455. $workers = $listOfWorkersDep[$name];
  456. foreach( $workers as $key=>$num)
  457. {
  458. if ( $num > 0 )
  459. {
  460. switch($key)
  461. {
  462. case "ме1":
  463. for ( $i=0;$i<$num;$i++ )
  464. {
  465. new Manager( $departmentList[$name], 1, false );
  466. }
  467. break;
  468. case "ме2":
  469. for ( $i=0;$i<$num;$i++ )
  470. {
  471. new Manager( $departmentList[$name], 2, false );
  472. }
  473. break;
  474. case "ме3":
  475. for ( $i=0;$i<$num;$i++ )
  476. {
  477. new Manager( $departmentList[$name], 3, false );
  478. }
  479. break;
  480. case "ма1":
  481. for ( $i=0;$i<$num;$i++ )
  482. {
  483. new Marketer( $departmentList[$name], 1, false );
  484. }
  485. break;
  486. case "ма2":
  487. for ( $i=0;$i<$num;$i++ )
  488. {
  489. new Marketer( $departmentList[$name], 2, false );
  490. }
  491. break;
  492. case "ма3":
  493. for ( $i=0;$i<$num;$i++ )
  494. {
  495. new Marketer( $departmentList[$name], 3, false );
  496. }
  497. break;
  498. case "ин1":
  499. for ( $i=0;$i<$num;$i++ )
  500. {
  501. new Engineer( $departmentList[$name], 1, false );
  502. }
  503. break;
  504. case "ин2":
  505. for ( $i=0;$i<$num;$i++ )
  506. {
  507. new Engineer( $departmentList[$name], 2, false );
  508. }
  509. break;
  510. case "ин3":
  511. for ( $i=0;$i<$num;$i++ )
  512. {
  513. new Engineer( $departmentList[$name], 3, false );
  514. }
  515. break;
  516. case "ан1":
  517. for ( $i=0;$i<$num;$i++ )
  518. {
  519. new Analyst( $departmentList[$name], 1, false );
  520. }
  521. break;
  522. case "ан2":
  523. for ( $i=0;$i<$num;$i++ )
  524. {
  525. new Analyst( $departmentList[$name], 2, false );
  526. }
  527. break;
  528. case "ан3":
  529. for ( $i=0;$i<$num;$i++ )
  530. {
  531. new Analyst( $departmentList[$name], 3, false );
  532. }
  533. break;
  534. }
  535. }
  536. }
  537. }
  538.  
  539. //добавляем начальников департаментов
  540. new Manager( $departmentList["закупок"], 2, true );
  541. new Marketer( $departmentList["продаж"], 2, true );
  542. new Marketer( $departmentList["рекламы"], 3, true );
  543. new Manager( $departmentList["логистики"], 1, true );
  544.  
  545.  
  546. echo "Начальные данные:\n\n";
  547. printTotalResults( $departmentList );
  548.  
  549.  
  550. foreach( $departmentList as $i=>$department )
  551. {
  552. $newDepartmentList[$i] = clone $department;
  553. }
  554. foreach( $newDepartmentList as $i=>$department ) //увольняем 40% инженеров начина с самых низкоранговых
  555. {
  556. $department->dismissWorkersGroup( "engineer", 1, 3, 40 );
  557. }
  558. echo "\n\nУволить 40% инженеров\n\n";
  559. printTotalResults( $newDepartmentList );
  560.  
  561.  
  562. foreach( $departmentList as $i=>$department )
  563. {
  564. $newDepartmentList[$i] = clone $department;
  565. }
  566. foreach( $newDepartmentList as $i=>$department ) //поднимаем зарплату и расход кофе всем аналитикам, ставим на должность босса аналитика
  567. {
  568. $department->setWorkersGroupSalary("analyst",1,3,1100);
  569. $department->setWorkersGroupCoffeeConsumptionRate("analyst",1,3,75);
  570. $department->changeChief("analyst");
  571. }
  572. echo"\n\nПоднять зарплату аналитикам, сделать аналитика боссом::\n\n";
  573. printTotalResults( $newDepartmentList );
  574.  
  575.  
  576. foreach( $departmentList as $i=>$department )
  577. {
  578. $newDepartmentList[$i] = clone $department;
  579. }
  580. foreach( $newDepartmentList as $i=>$department ) //поднимаем уровень 50-ти процентам всех менеджеров 1-го и 2-го уровней на 1
  581. {
  582. $department->upWorkersGroupLevel("manager",1,2,1,50);
  583. }
  584. echo"\n\nПоднять уровень менеджерам:\n\n";
  585. printTotalResults( $newDepartmentList );
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
Success #stdin #stdout 0.03s 52432KB
stdin
Standard input is empty
stdout
Начальные данные:

    Департамент     Работников       Зарплата    Расход кофе Результат(стр)  Расход на стр
        закупок             23        11612.5            425           3555           3.27
         продаж             23          12150            545           2825            4.3
        рекламы             37          17300            625           5605           3.09
      логистики             20           9250            375           3055           3.03
          итого            103        50312.5           1970          15040           3.35


Уволить 40% инженеров

    Департамент     Работников       Зарплата    Расход кофе Результат(стр)  Расход на стр
        закупок             21        11212.5            415           3455           3.25
         продаж             21          11750            535           2725           4.31
        рекламы             36          17100            620           5555           3.08
      логистики             18           8850            365           2955           2.99
          итого             96        48912.5           1935          14690           3.33


Поднять зарплату аналитикам, сделать аналитика боссом::

    Департамент     Работников       Зарплата    Расход кофе Результат(стр)  Расход на стр
        закупок             23        12362.5            505           3555           3.48
         продаж             23        14237.5            730           2825           5.04
        рекламы             37        18062.5            710           5605           3.22
      логистики             20        10062.5            455           3055           3.29
          итого            103          54725           2400          15040           3.64


Поднять уровень менеджерам:

    Департамент     Работников       Зарплата    Расход кофе Результат(стр)  Расход на стр
        закупок             23        13237.5            505           3555           3.72
         продаж             23        14987.5            730           2825           5.31
        рекламы             37        18562.5            710           5605           3.31
      логистики             20        10937.5            455           3055           3.58
          итого            103          57725           2400          15040           3.84