> For the complete documentation index, see [llms.txt](https://programmingfundamental.gitbook.io/programmingwithjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://programmingfundamental.gitbook.io/programmingwithjava/obektno-orientirano-programirane-1-chast/laboratorno-uprazhnenie-13/uprazhneniya-za-izvnauditorna-zaetost-1.md).

# Упражнения за извънаудиторна заетост

В една организация има 3 типа служители:  изпълнители, експерти, началници.

1\. Да се дефинира интерфейс ExecuteWork, който има:

* методи:&#x20;
  * execute
    * Параметри:
      * &#x20;името на задачата която трябва да се изпълни
    * Резултат&#x20;
      * Дали е изпълнена или не

&#x20;2\. Да се дефинира абстрактен клас Employee, описващ служител. Всеки служител има :

* Интерфейси:
  * ExecuteWor
* Атрибути:
  * Име,  модификатор : видим само за класа (get метод)
  * общ брой поставени задачи, модификатор : видим само за класа (get, set методи )
  * успешно завършени задачи , модификатор : видим само за класа (get, set методи )

И може да извършва следните операции:

\-          публичен конструктор;

\-           successRate: връща текуща успеваемост — дробно число в интервала \[0,1], показващо съотношението между броя на всички успешно изпълнени задачи към броя на всички поставени задачи за дадения служител до дадения момент.  Ако на служителя не е била поставена нито една задача считаме, че успеваемостта му е 0.

3\. Клас Изпълнители (Worker): поставя им се задача за изпълнение. Тези служители успяват да се справят с голяма част от поставените им задачи, но се провалят на всяка k-та поредна задача (т.е. при поставени k на брой задачи първите k–1 ще са приключени успешно, а последната — неуспешно). Цялото число k може да е различно за всеки служител и е негов атрибут.

\-          наследява класа Employee

Атрибути:

\-          k  - номер на провалена задача, модификатор : видим само за класа

Методи:

\-          публичен конструктор

\-          Имплементация на абстрактния метод „execute“ от родителския клас - изпълнява поставената задача и връща резултат, показващ дали задачата е изпълнена, извежда на стандартния изход дали е приключила успешно или не; Инкрементираме стойността на общия брой изпълнени задачи и на успешно завършените ако е изпълнена правилно задачата.

\-          “successOrFailed” - метод видим само за класа, който проверява дали задачата за изпълнение ще се изпълни този път или няма. Ако текущата задача е кратна на „к“ номера на провалена задача, то тя няма да се изпълни.

&#x20;

&#x20;

4\.       Експерти: изпълнители, които винаги се справят с всяка задача, която им е поставена.

\-          наследява класа Employee

Методи:

\-          публичен конструктор.

\-          Имплементация на абстрактния метод „execute“ от родителския клас - изпълнява поставената задача и връща резултат, показващ дали задачата е изпълнена, извежда на стандартния изход дали е приключила успешно ; Инкрементираме стойността на общия брой изпълнени задачи и на успешно завършените.

5\.       Началници: служители, които разполагат с произволен брой подчинени от произволен тип (изпълнители, експерти, други началници). Когато на един началник му се постави задача, той я поставя на някой от подчинените си. Счита се, че един началник се е справил със задачата си, ако неговият подчинен се справи с нея. Началниците винаги поставят новата задача на някой от тези служители, на които до момента са възлагани най-малко задачи.

\-          Наследява класа Employee

Атрибути:

\-          Масив от работници(Employee) – модификатор видим само за класа

Методи:

\-          Публичен конструктор

\-          Имплементация на абстрактния метод „execute“ от родителския клас – Намира , кой работник има най-малко поставени задачи и делегира изпълнението на задачата на този работник.

\-          Метод printStatus() – метод printStatus, извежда на стандартния изход имената и текущата успеваемост на всички подчинени.

&#x20;

&#x20;

“Задачите” се дефинират като произволни символни низове с описание на дейност, например “Carry the stone”, “Dig a trench” и др.

Да се реализират класове Worker, Expert и Manager, реализиращи типовете служители, описани по-горе.

&#x20;

Пример:

Нека имаме двама работника:

·         Никола Младенов, греши на всяка 2-ра задача. Възложете 4 задачи на Никола. Изведете успеваемостта.

·         Павлина Григорова, греши на всяка 5-та задача. Възложете 3 задача на Павлина. Изведете успеваемостта.

Експерт:

·         Иван Ангелов. Възложете 1 задачи на Иван. Изведете успеваемостта.

Началник1:

·         Иван Иванов – негови работници са всички вече създадени. Възложете 3 задачи на началника и проследете дали се изпъняват от правилните работници, тези които имам най-малко възожени задачи.

·         Изведете статуса.

·         Изведете успедаемостта, на началника.

Началник 2:

·         Създайте нов работник, без да му възлагате задачи;

·         Създате масив от работници включващ новия работник и началник1;

·         Изведете статуса.

·         Изведете успедаемостта, на началника.
