Условия на задачите от практическия изпит за ниво 4 и 5
Вариант А: Трудови Навици
Внимание: В решенията се очаква да се спазват всички добри практики от обектно-ориентираното програмиране, включително: капсулация, управление на динамична памет, правилно поведение на обектите в рамките на жизнения им цикъл, преизползване на код, дори да не са споменати изрично в условието на задачата.
В една организация има 3 типа служители:
-
Изпълнители: поставя им се задача за изпълнение. Тези служители успяват да се справят с голяма част от поставените им задачи, но се провалят на всяка k-та поредна задача (т.е. при поставени k на брой задачи първите k–1 ще са приключени успешно, а последната — неуспешно). Цялото число k може да е различно за всеки служител и е негов атрибут.
-
Експерти: изпълнители, които винаги се справят с всяка задача, която им е поставена.
-
Началници (за ниво 5): служители, които разполагат с произволен брой подчинени от произволен тип (изпълнители, експерти, други началници). Когато на един началник му се постави задача, той я поставя на някой от подчинените си. Счита се, че един началник се е справил със задачата си, ако неговият подчинен се справи с нея. Началниците винаги поставят новата задача на някой от тези служители, на които до момента са възлагани най-малко задачи.
“Задачите” се дефинират като произволни символни низове с описание на дейност, например “Carry the stone”, “Dig a trench” и др.
-
Да се дефинира абстрактен клас Employee, описващ служител. Всеки служител има име и може да извършва следните операции:
-
execute: изпълнява задача и връща резултат, показващ дали задачата е изпълнена успешно.
-
successRate: връща текуща успеваемост — дробно число в интервала [0,1], показващо съотношението между броя на всички успешно изпълнени задачи към броя на всички поставени задачи за дадения служител до дадения момент. Ако на служителя не е била поставена нито една задача считаме, че успеваемостта му е 0.
-
Да се реализират класове Worker, Expert и Manager, реализиращи типовете служители, описани по-горе.
-
За клас Manager да се реализират подходящи методи за добавяне и изтриване на подчинени, както и метод printStatus, извеждащ на стандартния изход имената и текущата успеваемост на всички подчинени.
Пример: Нека имаме началника Ангел Ангелов със следните подчинени:
- Изпълнител Боян Боянов, който не успява да изпълни всяка 2-ра задача
- Експерт Василка Василева
- Началник Георги Георгиев с един подчинен:
Изпълнител Димитър Димитров, който не успява да изпълни всяка 4-та задача
Ако на Ангел Ангелов не е била поставена никаква задача, то обръщението към printStatus би довело до сления резултат:
1. Боян Боянов: успеваемост 0
2. Василка Василева: успеваемост 0
3. Георги Георгиев: успеваемост 0
-
Да се реализират методи за изход към поток за всеки от класовете Worker, Expert и Manager. При извеждане на Manager, информацията да се форматира както е показано в примера по-долу. В информацията за клас Worker е записано числото k за този изпълнител, а числото в информацията за клас Manager представя броя на подчинените на дадения началник.
manager: 3 Ангел Ангелов
worker: 2 Боян Боянов
expert: Василка Василева
manager: 1 Георги Георгиев
worker: 4 Димитър Димитров
-
Да се напише програма, която:
-
създава и инициализира началник с посочените в горния пример данни;
-
възлага на създадения началник всички задачи от текстовия файл “tasks.txt” (на всеки ред от текстовия файл има описание на точно една задача);
-
за всяка задача от файла “tasks.txt” извежда на стандартния изход дали е приключила успешно или не;
-
извежда статуса на началника след приключване на всички задачи.
Вариант Б: Сериозна Работа
Внимание: В решенията се очаква да се спазват всички добри практики от обектно-ориентираното програмиране, включително: капсулация, управление на динамична памет, правилно поведение на обектите в рамките на жизнения им цикъл, преизползване на код, дори да не са споменати изрично в условието на задачата.
В една държава има три вида организации:
-
Частни фирми: възлага им се проект за изпълнение. Тези фирми успяват да се справят с голяма част от възложените им проекти, но не успява да приключи успешно всеки k-ти пореден проект (т.е. при възложени k на брой проекти първите k–1 ще са приключени успешно, а последният— неуспешно). Цялото число k може да е различно за всяка фирма и е неин атрибут.
-
Държавни фирми: фирми, които успяват да приключат успешно едва един от всеки 20 проекта.
-
Консорциуми (за ниво 5): тези организации разполагат с произволен брой подизпълнители от произволен тип (частни фирми, държавни фирми, други консорциуми). Когато на един консорциум му се постави проект, той го поставя на някой от подизпълнителите си. Счита се, че един консорциум се е справил с проекта си, ако неговият подизпълнител се справи с проекта. Консорциумите винаги поставят новия проект на някой от тези подизпълнители, на които до момента са възлагани най-малко проекти.
“Проектите” се дефинират като произволни символни низове с описание на дейност, например “Build residential building”, “Run education program” и др.
-
Да се дефинира абстрактен клас Company, описващ организация. Всяка организация има име и следните възможности:
-
perform: изпълнява проект и връща резултат, показващ дали проектът е изпълнен успешно.
-
reliabilityRate: дава текуща надеждност — дробно число в интервала [0,1], показващо съотношението между броя на всички успешно изпълнени проекти към броя на всички възложени проекти за дадената организация до дадения момент. Ако на организацията не е бил поставен нито един проект, считаме, че надеждността ѝ е 0.
-
Да се реализират класове PrivateCompany, StateOwnedCompany и Consortium, реализиращи по-горе описаните типове организации.
-
За клас Consortium да се реализират подходящи методи за добавяне и изтриване на подизпълнители, както и метод printStatus, показващ имената и текущата надежност на всички подизпълнители.
Пример: Нека имаме консорциума Автомагистрални Авантюристи със следните изпълнители:
- Частна фирма Български Багери, която се проваля на всеки 2-ри проект
- Държавна фирма Върховни Влекачи
- Консорциум Грандиозни Грънчари с един подизпълнител:
- Частна Фирма Далновидни Дърводелци, която се проваля на всеки 4-ти проект
Ако на Автомагистрални Авантюристи не е бил възложен никакъв проект, то обръщението към printStatus би довело до сления резултат:
1. Български Багери: надежност 0
2. Върховни Влекачи: надежност 0
3. Грандиозни Грънчари: надежност 0
-
Да се реализират методи за изход към поток за всеки от класовете PrivateCompany, StateOwnedCompany и Consortium. При извеждане на Consortium, информацията да се форматира както е показано в примера по-долу.В информацията за класа PrivateCompany е записано числото k, а числото в информацията за клас Consortium представя броя на подизпълнителите на дадения консорциум.
consortium: 3 Автомагистрални Авантюристи
private: 2 Български Багери
state: Върховни Влекачи
consortium: 1 Грандиозни Грънчари
private: 4 Далновидни Дърводелци
-
Да се напише програма, която:
-
създава и инициализира консорциум с посочените в горния пример данни;
-
възлага на създадения консорциум всички проекти от текстовия файл “projects.txt” (на всеки ред от текстовия файл има описание на точно един проект);
-
за всеки проект от файла “projects.txt” извежда на стандартния изход дали е приключил успешно или не;
-
извежда статуса на консорциума след приключване на всички проекти.