* Изходен код от упражнение 9, 2015
Публикувано на 20 ноември 2015 в раздел ПИК3 Java.
В това упражнение се разглеждат структури от данни. Използват се ArrayList, LinkedList и HashMap.
(решена) Задача 1. Реализирайте enum Diagnosis по следния начин:
enum Diagnosis{ NOTSICK(10.0), LITTLESICK(20.0), SICK(50.0), VERYSICK(200.0); final double cureCost; Diagnosis(double cureCost){ this.cureCost = cureCost; } }
Така след като сте създали например обект “Diagnosis sickness = Diagnosis.SICK;” ще можете да видите колко струва лечението ѝ чрез достъпване на променливата sickness.cureCost;
Задача 2. Реализирайте клас „Пациент” (Patient) със следните характеристики: name (String), egn (String), paycheck (double - колко пари има човека) и sicknesses (ArrayList с елементи от изброим тип Diagnosis – какви заболявания има човека). Направете само конструктор с подадени параметри. Не правете get и set методи – нека всички са с модификатор за достъп default.
Реализирайте метод “private double payBill(double amount)”, който намалява paycheck с amount и:
- Ако paycheck все още е положителен, връща 0 (човека е платил и не сължи нищо);
- Ако paycheck е станал отрицателен, трябва да направи paycheck 0 (човека е платил каквото има), а да върне като резултат колко пари дължи (с колко amount е бил по-голям от paycheck).
Реализирайте метод:
double cureSickness(Diagnosis sickness) throws OutOfMoneyException,NoSuchSicknessException”
в който правите следното:
- Ако човекът вече няма пари (paycheck е станал <=0 след последното лечение или не е имал пари по принцип), хвърля OutOfMoneyException;
- Ако подаденото заболяване не съществува в списъка от болести на човека (той не е болен от него), хвърля NoSuchSicknessException;
- Ако има такава болест и има позитивен баланс, прави return this.payBill(sickness.cureCost);
Решение:
class Patient{ String name; String egn; double paycheck; ArrayList<Diagnosis> sicknesses; Patient(String name, String egn, double paycheck, ArrayList<Diagnosis> sicknesses){ this.name = name; this.egn = egn; this.paycheck = paycheck; this.sicknesses = sicknesses; } private double payBill(double amount){ this.paycheck -= amount; if(this.paycheck >= 0) return 0; else{ double debt = -this.paycheck; return debt; } } double cureSickness(Diagnosis sickness) throws OutOfMoneyException,NoSuchSicknessException{ if(this.paycheck<=0) throw new OutOfMoneyException(sickness.cureCost); Iterator<Diagnosis> it = this.sicknesses.iterator(); while(it.hasNext()){ if(it.next().equals(sickness)){ double result = this.payBill(sickness.cureCost); it.remove(); return result; } } throw new NoSuchSicknessException(sickness); } public int hashCode(){ int result = 17; result = result*37 + this.name==null?0:this.name.hashCode(); result = result*37 + this.egn==null?0:this.egn.hashCode(); // Всеки List, в случая ArrayList, също има hashCode, който е: // int hashCode = 1; // for(E e: list) hashCode = hashCode*31 + (e==null?0:e.hashCode()); // return hashCode; result = result*37 + (this.sicknesses==null?0:this.sicknesses.hashCode()); return result; // Забелязахте ли, че не добавихме payCheck във формулата за result? // Ще считаме ли два записа за пациент с едно и също име, ЕГН и // едни и същи заболявания, но с различни портфейли за различни хора? // Разбира се, че не - това е един и същи човек, който просто се е // прибрал, взел си е портфейла и се е върнал. Това ще отразим и в equals } public boolean equals(Object o){ if(!(o instanceof Patient)) return false; Patient p = (Patient)o; if(this.name == p.name && this.egn == p.egn && this.sicknesses.equals(p.sicknesses) ) return true; else return false; } }
Задача 3. Реализирайте изключенията OutOfMoneyException,NoSuchSicknessException
Решение:
class OutOfMoneyException extends Exception{ OutOfMoneyException(){ super("Пациентът няма достатъчно пари"); } OutOfMoneyException(double cureCost){ super("Пациентът няма достатъчно пари. Трябва да плати: "+cureCost); } } class NoSuchSicknessException extends Exception{ NoSuchSicknessException(){ super("Пациентът нe е болен от тази болест"); } NoSuchSicknessException(Diagnosis sickness){ super("Пациентът нe е болен от тази болест: "+sickness.toString()); } }
Задача 4. Направете клас с main метод, който съдържа:
- Статична член променлива
static HashMap<Patient, Double> debtors = new HashMap<Patient, Double>();
в която в структура от данни тип „речник“ ще записваме длъжниците – хора, които сме лекували, но не са си платили. - Main метод, в който:
- Създавате няколко примерни обекта от тип Patient и ги нареждате в LinkedList;
- За всеки елемент на свързания списък правите по няколко различни лечения;
- Тези хора, които са били лекувани, но не са успяли да платят, записвате в речника debtors
- Накрая извеждате имената и сумите, които дължат, за всички длъжници в речника.
Решение:
import java.util.*; public class Upr9{ static HashMap<Patient, Double> debtors = new HashMap<Patient, Double>(); public static void main(String[] args){ ArrayList<Diagnosis> combination1 = new ArrayList<>(); combination1.add(Diagnosis.LITTLESICK); combination1.add(Diagnosis.SICK); ArrayList<Diagnosis> combination2 = new ArrayList<>(); combination2.add(Diagnosis.VERYSICK); combination2.add(Diagnosis.SICK); ArrayList<Diagnosis> combination3 = new ArrayList<>(); combination3.add(Diagnosis.NOTSICK); Patient p1 = new Patient("Ivan", "1234", 50.0, combination1); Patient p2 = new Patient("Petar", "5678", 150.0, combination2); Patient p3 = new Patient("Maria", "9012", 100.0, combination3); LinkedList<Patient> patients = new LinkedList<Patient>(); patients.add(p1); patients.add(p2); patients.add(p3); for(Diagnosis sickness: Diagnosis.values()){ Iterator<Patient> it = patients.iterator(); while(it.hasNext()){ Patient tmp = it.next(); try{ double debt = tmp.cureSickness(sickness); System.out.println(tmp.name+" was cured from "+sickness.toString()); if(debt>0){ Upr9.debtors.put(tmp, new Double(debt)); System.out.println(tmp.name+" was put in the list of debtors with debt "+debt); } } catch(OutOfMoneyException oe){ System.out.println(tmp.name+" has no money to pay for "+sickness.toString()); } catch(NoSuchSicknessException nse){ //System.out.println(tmp.name+" is not sick from "+sickness.toString()); } } } System.out.println("\nLIST OF OUR DEBTORS:"); for (Map.Entry<Patient, Double> entry : Upr9.debtors.entrySet()){ Patient patient = entry.getKey(); Double debt = entry.getValue(); System.out.println(patient.name+" has debt "+debt.toString()); } } }
Допълнителна задача 1: Подходящо ли сме подбрали структурите от данни? Помислете за потенциални проблеми в съществуващата постановка на задачата, които биха възникнали в практиката.
Допълнителна задача 2: Правилно ли сме дефинирали (от чисто практическа гледна точка) методите equals и hashCode на клас Patient? Отново помислете за потенциални проблеми, които биха възникнали в практиката.
Добави коментар