fork(3) download
  1. <?php
  2.  
  3. //mb_internal_encoding("utf-8");
  4.  
  5. //include("class.php");
  6. ///////////////////////////////////////////////
  7. class Company{
  8. private $name; //название компании
  9. public $departments=array(); //департаменты класса Department
  10.  
  11. public function __construct($name){
  12. $this->name = $name;
  13. }
  14.  
  15. //Добавляет новый департамент
  16. public function newDepartment(Department $department){
  17. if(!in_array($department,$this->departments)){
  18. $this->departments[]=$department;
  19. }
  20. else{
  21. throw new Exception("Нельзя добавить дважды один департамент");
  22. }
  23.  
  24. }
  25.  
  26. //Всего сотрудников
  27. public function countEmployees(){
  28. $empls=0;
  29. foreach($this->departments as $k=>$v){
  30. $empls+=$v->countEmployees();
  31. }
  32. return $empls;
  33. }
  34. //Расходы на зарплату
  35. public function countSalary(){
  36. $salary=0;
  37. foreach($this->departments as $k=>$v){
  38. $salary+=$v->countSalary();
  39. }
  40. return $salary;
  41. }
  42. //Расходы на кофе
  43. public function countCoffee(){
  44. $coffee=0;
  45. foreach($this->departments as $k=>$v){
  46. $coffee+=$v->countCoffee();
  47. }
  48. return $coffee;
  49. }
  50. //Расходы на страницы
  51. public function countPages(){
  52. $pages=0;
  53. foreach($this->departments as $k=>$v){
  54. $pages+=$v->countPages();
  55. }
  56. return $pages;
  57. }
  58. //Средний расход рублей на страницу
  59. public function PagesBySalary(){
  60. $pbs=0;
  61. foreach($this->departments as $k=>$v){
  62. $pbs+=round($this->countSalary()/$this->countPages());
  63. }
  64. return $pbs;
  65. }
  66. }
  67.  
  68. class Department{
  69. public $name; //название департамента
  70. public $employees=array(); //сотрудники класса Employee
  71.  
  72. public function __construct($name){
  73. $this->name = $name;
  74. }
  75.  
  76. //Добавляет нового сотрудника
  77. public function newEmployee(Employee $employee){
  78. $this->employees[]=$employee;
  79. }
  80.  
  81. //Удаляет сотрудника
  82. public function delEmployee(int $i){
  83. if(array_key_exists($i,$this->employees))
  84. unset($this->employees[$i]);
  85. else
  86. throw new Exception("delEmployee: нет такого сотрудника");
  87. }
  88.  
  89. //Считает кол-во сотрудников в департаменте
  90. public function countEmployees(){
  91. return count($this->employees);
  92. }
  93.  
  94. //Расходы на зарплату
  95. public function countSalary(){
  96. $salary=0;
  97. foreach($this->employees as $k=>$v){
  98. $salary+=$v->getSalary();
  99. }
  100. return $salary;
  101. }
  102. //Расходы на кофе
  103. public function countCoffee(){
  104. $coffee=0;
  105. foreach($this->employees as $k=>$v){
  106. $coffee+=$v->getCoffee();
  107. }
  108. return $coffee;
  109. }
  110. //Расходы на страницы
  111. public function countPages(){
  112. $pages=0;
  113. foreach($this->employees as $k=>$v){
  114. $pages+=$v->getPages();
  115. }
  116. return $pages;
  117. }
  118. //Средний расход рублей на страницу
  119. public function PagesBySalary(){
  120. return $pbs=round($this->countSalary()/$this->countPages());
  121. }
  122. }
  123.  
  124. abstract class Employee{
  125. public $range; //[1;3]
  126. public $isBoss; //bool
  127. public static $rate; //int
  128. public static $coffee; //int
  129. public static $pages; //int
  130.  
  131. public function __construct($range,$isBoss)
  132. {
  133. if(($range>=1)&&($range<=3))
  134. $this->range = $range;
  135. else
  136. throw new Exception("Ранг: [1;3]");
  137.  
  138. if (is_bool($isBoss))
  139. $this->isBoss = $isBoss;
  140. else
  141. throw new Exception("Босс: boolean");
  142. }
  143.  
  144. public function getSalary(){
  145. $salary=static::$rate;
  146. if ($this->range==2)
  147. $salary*=1.25;
  148. elseif ($this->range==3)
  149. $salary*=1.5;
  150.  
  151. if (($this->isBoss)){
  152. $salary*=1.5;
  153. }
  154. return $salary;
  155. }
  156.  
  157. public function getCoffee(){
  158. $coffee=static::$coffee;
  159. if (($this->isBoss)){
  160. $coffee*=2;
  161. }
  162. return $coffee;
  163. }
  164.  
  165. public function getPages(){
  166. $pages=static::$pages;
  167. if (($this->isBoss)){
  168. $pages=0;
  169. }
  170. return $pages;
  171. }
  172. }
  173.  
  174. class Manager extends Employee{
  175. public static $rate=500;
  176. public static $coffee=20;
  177. public static $pages=200;
  178. }
  179.  
  180.  
  181. class Marketer extends Employee{
  182. public static $rate=400;
  183. public static $coffee=15;
  184. public static $pages=150;
  185. }
  186. class Engineer extends Employee{
  187. public static $rate=200;
  188. public static $coffee=5;
  189. public static $pages=50;
  190. }
  191. class Analyst extends Employee{
  192. public static $rate=800;
  193. public static $coffee=50;
  194. public static $pages=5;
  195. }
  196.  
  197. //////////////////Ф-ии//////////////////////
  198. function showCompanyTable($company){
  199.  
  200. foreach($company->departments as $depNum=>$depClass){
  201. $department[$depNum]=$depClass;
  202. }
  203.  
  204. $col1 = 11;
  205. $col2 = 10;
  206. // Заголовок таблицы
  207. echo padRight("Департамент", $col1) .
  208. padLeft("сотр.", $col2) .
  209. padLeft("руб.", $col2) .
  210. padLeft("кофе", $col2) .
  211. padLeft("стр", $col2) .
  212. padLeft("руб/стр", $col2) . "\n";
  213. echo "-----------------------------------------------------------------\n";
  214. foreach ($department as $d){
  215. echo padRight($d->name,$col1).
  216. padLeft($d->countEmployees(), $col2) .
  217. padLeft($d->countSalary(), $col2) .
  218. padLeft($d->countCoffee(), $col2) .
  219. padLeft($d->countPages(), $col2) .
  220. padLeft($d->PagesBySalary(), $col2) . "\n";
  221.  
  222. }
  223. echo "-----------------------------------------------------------------\n";
  224. $depNum=count($department);
  225. echo padRight("Среднее",$col1).
  226. padLeft(round($company->countEmployees()/$depNum), $col2) .
  227. padLeft(round($company->countSalary()/$depNum), $col2) .
  228. padLeft(round($company->countCoffee()/$depNum), $col2) .
  229. padLeft(round($company->countPages()/$depNum), $col2) .
  230. padLeft(round($company->PagesBySalary()/$depNum), $col2) . "\n";
  231.  
  232. echo padRight("Всего",$col1).
  233. padLeft($company->countEmployees(), $col2) .
  234. padLeft($company->countSalary(), $col2) .
  235. padLeft($company->countCoffee(), $col2) .
  236. padLeft($company->countPages(), $col2) .
  237. padLeft($company->PagesBySalary(), $col2) . "\n";
  238.  
  239.  
  240. }
  241. //Красивый вывод
  242.  
  243. function padRight($string,$charNumber){
  244. return $string.=str_repeat(' ',$charNumber-mb_strlen($string));
  245. }
  246.  
  247. function padLeft($string,$charNumber){
  248. return $string=str_repeat(' ',$charNumber-mb_strlen($string)).$string;
  249. }
  250. ///////////////////////////////////////////
  251. //Заполнение базы
  252. $vector= new Company("Вектор");
  253. $department[0]=new Department("Закупок");
  254. $department[1]=new Department("Продаж");
  255. $department[2]=new Department("Рекламы");
  256. $department[3]=new Department("Логистики");
  257.  
  258. foreach ($department as $dep){
  259. $vector->newDepartment($dep);
  260. }
  261. //Закупок
  262. for($i=0;$i<9;$i++){
  263. $employee[0][]=new Manager(1,false);
  264. }
  265. for($i=0;$i<3;$i++){
  266. $employee[0][]=new Manager(2,false);
  267. }
  268. for($i=0;$i<2;$i++){
  269. $employee[0][]=new Manager(3,false);
  270. }
  271. for($i=0;$i<2;$i++){
  272. $employee[0][]=new Marketer(1,false);
  273. }
  274. $employee[0][]=new Manager(2,true);
  275. //Продаж
  276. for($i=0;$i<12;$i++){
  277. $employee[1][]=new Manager(1,false);
  278. }
  279. for($i=0;$i<6;$i++){
  280. $employee[1][]=new Marketer(1,false);
  281. }
  282. for($i=0;$i<3;$i++){
  283. $employee[1][]=new Analyst(1,false);
  284. }
  285. for($i=0;$i<2;$i++){
  286. $employee[1][]=new Analyst(2,false);
  287. }
  288. $employee[1][]=new Marketer(2,true);
  289. //Рекламы
  290. for($i=0;$i<15;$i++){
  291. $employee[2][]=new Marketer(1,false);
  292. }
  293. for($i=0;$i<10;$i++){
  294. $employee[2][]=new Marketer(2,false);
  295. }
  296. for($i=0;$i<8;$i++){
  297. $employee[2][]=new Manager(1,false);
  298. }
  299. $employee[2][]=new Engineer(2,false);
  300. $employee[2][]=new Engineer(1,false);
  301. /*for($i=0;$i<2;$i++){
  302. $employee[2][]=new Engineer(1,false);
  303. }*/
  304. $employee[2][]=new Marketer(3,true);
  305. //Логистики
  306. for($i=0;$i<13;$i++){
  307. $employee[3][]=new Manager(1,false);
  308. }
  309. for($i=0;$i<5;$i++){
  310. $employee[3][]=new Manager(2,false);
  311. }
  312. $employee[3][]=new Engineer(1,true); /////
  313. $employee[3][]=new Engineer(3,false);
  314. $employee[3][]=new Engineer(1,false);
  315. $employee[3][]=new Engineer(2,false);
  316. /*for($i=0;$i<5;$i++){
  317. $employee[3][]=new Engineer(1,false);
  318. }*/
  319. $employee[3][]=new Manager(1,true);
  320. //Записываем сотрудников в департаменты
  321. foreach($employee as $k=>$v){
  322. foreach ($employee[$k] as $empl){
  323. $department[$k]->newEmployee($empl);
  324. }
  325. }
  326. /////////////////////////////////////////
  327. //Вывод информации
  328. showCompanyTable($vector);
  329.  
  330.  
  331.  
  332. /*ООО Вектор и антикризисные меры*/
  333. /////////////////////////////////////////////////////////
  334. //Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
  335. $vector_orig=clone $vector; //делаем клон $vector_orig, редактируем $vector, выводим результат, потом опять возращаем $vector изначальные данные из $vector_orig и редактируем дальше
  336.  
  337.  
  338. $engineers=[]; //массив всех инженеров в компании
  339. foreach ($department as $depNum=>$depClass){
  340. foreach($depClass->employees as $empNum=>$empClass){
  341. if(get_class($empClass)=="Engineer"){
  342. $engArr["id"]=$empNum;
  343. $engArr["range"]=$empClass->range;
  344. $engineers[$depNum][]=$engArr;
  345. }
  346. }
  347. }
  348.  
  349. // Сортировка инженеров по рангу
  350. foreach($engineers as $depNum=>$depEmpls){
  351. foreach ($engineers[$depNum] as $key => $row) {
  352. $range[$key] = $row['range'];
  353. }
  354. array_multisort($range, SORT_ASC,$engineers[$depNum]);
  355. }
  356.  
  357.  
  358. //удаление
  359. foreach($engineers as $depNum=>$depEmpls){
  360. $d=ceil(count($depEmpls) * 0.4); //сколько нужно удалить в департаменте
  361. $i=0; //сколько уже удалено
  362. foreach($depEmpls as $empNum=>$empId){
  363. if($i<$d){
  364. $empId=$empId['id']; //костыль
  365. if(($department[$depNum]->employees[$empId]->isBoss)==false){ //если не босс
  366. $department[$depNum]->delEmployee($empId);
  367. $i++;
  368. }
  369. }
  370. else{
  371. break;
  372. }
  373. }
  374. }
  375. echo "\n\n\n После антикризисных мер 1\n\n";
  376. showCompanyTable($vector);
  377. $vector=clone $vector_orig; //возвратили исходные данные
  378. /////////////////////////////////////////////////////////
  379. //Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров.
  380. Analyst::$rate = 1100;
  381. Analyst::$coffee = 75;
  382. //В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
  383.  
  384. //Ищем в департаментах босса-не-аналитика и аналитиков-не-боссов
  385. $analysts=[];
  386. foreach ($department as $depNum=>$depClass){ //в каждом департаменте
  387. foreach($depClass->employees as $empNum=>$empClass){ //каждый сотрудник департамента
  388. if($empClass->isBoss){ //если босс
  389. if(get_class($empClass)!="Analyst"){ //и не аналитик
  390. $boss[$depNum]=$empNum; //пишем id босса
  391. }
  392. }
  393. else{ //если не босс
  394. if(get_class($empClass)=="Analyst"){ //но аналитик
  395. //записываем в массив аналитиков
  396. $engArr["id"]=$empNum;
  397. $engArr["range"]=$empClass->range;
  398. $analysts[$depNum][]=$engArr;
  399. }
  400. }
  401. }
  402. }
  403. //если босс не аналитик и есть в отделе аналитики
  404. foreach ($analysts as $depNum=>$empl){
  405. if (isset($boss[$depNum])){ //Если перем есть, то это точно не аналитик
  406. ////сортируем аналитиков по рангу
  407. foreach ($empl as $key => $row) {
  408. $range[$key] = $row['range'];
  409. }
  410. array_multisort($range, SORT_ASC,$empl);
  411. ////
  412. $last=count($empl)-1; //последний - самый старший
  413. $doHimBoss=$empl[$last]['id']; //получим его id
  414.  
  415. $department[$depNum]->employees[$doHimBoss]->isBoss=true; //сделали боссом старшего аналитика
  416. $department[$depNum]->employees[$boss[$depNum]]->isBoss=false; //текущий босс - не босс
  417. }
  418. }
  419. echo "\n\n\n После антикризисных мер 2\n\n";
  420. showCompanyTable($vector);
  421. $vector=clone $vector_orig; //возвратили исходные данные
  422. /////////////////////////////////////////////////////////////////
  423. //В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
  424. foreach ($department as $depNum=>$depClass){ //в каждом департаменте
  425.  
  426. $managerNum=0;
  427. foreach($depClass->employees as $empNum=>$empClass){ //каждый сотрудник департамента
  428. if((get_class($empClass)=="Manager") && ($empClass->range<3)){
  429. $managerNum++;
  430. }
  431. }
  432.  
  433. for($i=0;$i<$managerNum;$i++){
  434. if(get_class($depClass->employees[$i])=="Manager"){
  435. if($depClass->employees[$i]->range<3){
  436. $depClass->employees[$i]->range++;
  437. }
  438. }
  439. }
  440. }
  441.  
  442. //
  443. echo "\n\n\n После антикризисных мер 3\n\n";
  444. showCompanyTable($vector);
  445.  
  446.  
  447. //print_r($vector);
Runtime error #stdin #stdout #stderr 0.04s 52480KB
stdin
Standard input is empty
stdout
Департамент     сотр.      руб.      кофе       стр   руб/стр
-----------------------------------------------------------------
Закупок            17    9612.5       350      3100         3
Продаж             24     13550       610      3325         4
Рекламы            36     16350       575      5450         3
Логистики          23     11425       425      3750         3
-----------------------------------------------------------------
Среднее            25     12734       490      3906         3
Всего             100   50937.5      1960     15625        12
stderr
PHP Catchable fatal error:  Argument 1 passed to Department::delEmployee() must be an instance of int, integer given, called in /home/FU9ksd/prog.php on line 367 and defined in /home/FU9ksd/prog.php on line 83