Administrativ
Laboratoare
Tema
Teste
Resurse utile
Alte resurse
Arhiva Teme
Administrativ
Laboratoare
Tema
Teste
Resurse utile
Alte resurse
Arhiva Teme
În cadrul acestei teme veți simula într-un design orientat pe obiecte un sistem simplificat de Emergency Room.
În cadrul implementării este obligatorie folosirea design pattern-ului Observer. Felul în care îl implementați este la latitudinea voastră. De asemenea puteți folosi și alte pattern-uri.
Simularea se desfășoară în runde.
Entitățile implicate în simulare sunt pacienții și cadrele medicale - asistentele, doctorii și tehnicienii pentru investigații (analize). Ne vom referi acestora pe parcursul acestui enunț și cu denumirile Patient, Nurse, Doctor, respectiv ER Technician.
O dată intrat în spital, un pacient poate trece prin mai multe etape: triaj, consultații la un doctor, operație, investigații, internare. Nu este obligatoriu să treacă prin toate etapele, ci va ajunge în ele pe baza tipului de afecțiune și a severității acesteia.
Caracteristici pacient:
Tipuri de acțiuni legate de pacient, care indică și etapa în care se va afla în următoarea rundă:
Tipuri de afecțiuni (definte și în enum-ul IllnessType
din scheletul temei):
Tipuri de doctori:
Tip | Afecțiuni tratate | C1 | C2 |
---|---|---|---|
Cardiologist | heart attack, heart disease | 0.4 | 0.1 |
ER_Physician | allergic reaction, broken bones, burns, car accident, cuts, high fever, sport injuries | 0.1 | 0.3 |
Gastroenterologist | abdominal pain, allergic reaction, food poisoning | 0.5 | - |
General Surgeon | abdominal pain, burns, car accident, cuts, sport_injuries | 0.2 | 0.2 |
Internist | abdominal pain, allergic reaction, food poisoning, heart disease, high fever, pneumonia | 0.01 | - |
Neurologist | stroke | 0.5 | 0.1 |
C1: factorul de ameliorare a severității în urma consultului doctorului C2: factorul de ameliorare a severității în urma operației T = 22: factorul de ameliorare a severității în urma aplicării tratementului doctorului, are valoarea 22 pentru toți doctorii.
Doctorii de tip Cardiologist, ER_Physician, General Surgeon și Neurologist pot atât consulta cât și opera. Dacă un doctor din unul din aceste patru tipuri este și chirurg, atunci este marcat în fișierul de intrare al simulării ca isSurgeon true.
Pentru fiecare doctor se cunoaște și valoarea unei constante (maxForTreatment). Această constantă reprezintă severitatea maximă pe care o poate avea un pacient atunci când este consultat pentru a putea fi trimis acasă doar cu tratament. Doctorii consideră ca un pacient cu severitatea > maxForTreatment necesită investigații.
Consultația pacienților:
Când un pacient este văzut pentru prima dată de un medic (pacientul are starea not diagnosed), medicul stabilește dacă acesta poate fi trimis acasă cu un tratament (dacă severitatea sa este mai mică decât maxForTreatment), sau dacă este nevoie ca pacientul să fie trimis la investigații.
Dacă pacientul a fost deja la investigații și are o stare stabilită de un ERTehnician, doctorul va putea lua o decizie asupra urmatoarei acțiuni. În acest moment, pacientul fie va fi operat, fie va fi internat, fie i se va prescrie un tratament și va fi trimis acasă.
Tratament: Dacă doctorul decide că pacientului i se va prescrie un tratament, pacientul va fi trimis acasă.
Internarea pacienților:
Atunci când doctorul consultă un pacient care trebuie spitalizat, îi calculează numărul de runde cât timp trebuie aplicat tratamentul după formula max(S*C1, 3)
, unde S este severitatea. Dupa aceea îi actualizează tratamentul pacientului cu numărul de runde și factorul T.
Totodată, doctorul va menține o listă a pacienților care sunt internați de catre el.
În fiecare rundă, asistentele administrează tratamentul pacienților spitalizați. Acestă acțiune reprezintă scăderea valorii severității cu valoarea T stabilită de doctor în urma consultației și a numărului de runde cât timp va fi aplicat tratamentul.
La finalul fiecărei runde, fiecare doctor va trece pe la pacienții săi să verifice dacă aceștia și-au terminat tratamentul (numărul de runde a ajuns la 0), sau dacă severitatea bolii pacienților a ajuns la 0. În cazul în care una din condiții este îndeplinită, pacientul este externat.
Operarea pacienților:
Atunci când doctorul operează un pacient îi aplică o scădere asupra severității conform formulei S = S-S*C2
, unde S este severitatea.
După operație doctorul calculează numărul de runde cât timp trebuie aplicat tratamentul după formula max(S*C1, 3)
și îi actualizează tratamentul pacientului cu numărul de runde și factorul T.
După operație pacientul rămâne spitalizat (internat).
Etapele prin care trece un pacient sunt simulate sub formă de stări (e operat, spitalizat) sau cozi. Vom utiliza termenii în engleză, ei corespund și mesajelor afișate ca rezultat al simulării.
ER Tehnician
Datele de intrare sunt sub forma unor fișiere în format JSON, fiecare fișier corespunzând unei simulări și specificând toate detaliile acesteia, atât entitățile implicate cât și rundele.
Rezultatele unei simulări se scriu în fișiere de output ce vor fi comparate de către checker cu cele de referință. Aceste fișiere conțin mesaje cu acțiunile petrecute în fiecare rundă și starea pacienților.
În cadrul temei va trebui să citiți și să parsați fișierele de intrare. Vă recomandăm biblioteca descrisă în acest tutorial: JSON & Jackson.
Mesajele afișate pentru fiecare rundă:
~~~~ Patients in round [nr_runda] ~~~~ [nume_pacient] is in [nume_coada] queue ~~~~ Nurses treat patients ~~~~ Nurse [id_nurse] treated [nume_pacient] and patient has [nr_runde] more rounds ~~~~ Doctors check their hospitalized patients and give verdicts ~~~~ [tip_doctor] says that [nume_pacient] should remain in hospital [tip_doctor] sent [nume_pacient] home
State
oferit in scheletul temei
Entry-point-ul pentru rularea temei trebuie să fie o clasă Main
, care primește ca parametru numele fișierului de test.
Arhiva pe care o veţi urca pe VMChecker va trebui să conţină în directorul rădăcină:
Main.java
(entry-point-ul aplicatiei voastre care nu se află în vreun pachet)README
Exemple punctare: