(c)도경구 version 1.0 (2022/10/13)

2021년 시험1 미완성 코드

import javax.swing.JOptionPane;

public class Reader {
    
    /**
     * 입력 대화창을 띄워 +와 - 둘 중 하나만 받아 리턴한다. 
     * @param message 인풋 대화창에 보여줄 메시지 
     * @return "+" 또는 "-"
     */
    public String readMenu(String message) {
        String input = JOptionPane.showInputDialog(message);
        while (! (input.equals("+") || input.equals("-")))
            input = JOptionPane.showInputDialog(message);
        return input;
    }
    
    /**
     * 입력 대화창을 띄워 받은 입력을 정수로 변환하여 리턴한다. 
     * @param message 인풋 대화창에 보여줄 메시지
     * @return 정수
     */
    public int readInteger(String message) { // 입력 오류 처리 생략  
        String input = JOptionPane.showInputDialog(message);
        int n = Integer.parseInt(input);
        return n;
    }
    
    /**
     * 입력 대화창을 띄워 받은 입력을 실수로 변환하여 리턴한다. 
     * @param message 인풋 대화창에 보여줄 메시지
     * @return 실수 
     */
    public double readDouble(String message) { // 입력 오류 처리 생략  
        String input = JOptionPane.showInputDialog(message);
        double r = Double.parseDouble(input);
        return r;
    }

}
import java.awt.*;
import javax.swing.*;

public class Displayer extends JPanel {
    
    private Hospital hospital;
    
    public Displayer(Hospital h) {
        hospital = h;
        JFrame f = new JFrame();
        f.getContentPane().add(this);
        f.setLocation(200,200);
        f.setTitle("ERICA 병원");
        f.setSize(400, 400);
        f.setVisible(true);
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    
    public void paintComponent(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0, 0, 400, 400);
        g.setColor(Color.black);
        int y = 100;
        paintHeader(g, 100, y);
        Patient[] rooms = hospital.getRoomsInfo();
        for (int i = 0; i < rooms.length; i++) {
            Patient p = rooms[i];
            if (p != null) {
                y += 30;
                paintRow(g, p, i, 100, y);
            }
        }
    }
    
    private void paintHeader(Graphics g, int x, int y) {
        g.drawString("병실", x, y);
        x += 50;
        g.drawString("환자", x, y);
        x += 50;
        g.drawString("체온", x, y);
        x += 50;
        g.drawString("혈압", x, y);
    }
    
    private void paintRow(Graphics g, Patient p, int r, int x, int y) {
        g.drawString(Integer.toString(r), x, y);
        x += 50;
        g.drawString(Integer.toString(p.getID()), x, y);
        x += 50;
        g.drawString(Double.toString(p.getTemp()), x, y);
        x += 50;
        String high = Integer.toString(p.getBPHigh());
        String low = Integer.toString(p.getBPLow());
        g.drawString(high+"/"+low, x, y);
    }
    
    /**
     * 병원 입원실의 입실 상황을 보여준다.
     */
    public void display() {
        this.repaint();
    }
    
    /**
     * 메시지 대화창에 전달할 메시지를 띄운다.
     * @param message - 전달할 메시지 
     */
    public void showMessage(String message) {
        JOptionPane.showMessageDialog(null, message);
    }
}
public class Patient {
    
    private int patient_id; // 환자 등록번호 
    private double temperature; // 환자 체온 
    private int blood_pressure_high; // 환자 혈압 (위)
    private int blood_pressure_low; // 환자 혈압 (아래) 
    
    // 환자 객체 생성 초기화 메소드
    public Patient(int id, double t, int high, int low) {
        patient_id = id;
        temperature = t;
        blood_pressure_high = high;
        blood_pressure_low = low;
    }
    
    public int getID() {
        return patient_id;
    }
    
    public double getTemp() {
        return temperature;
    }
    
    public int getBPHigh() {
        return blood_pressure_high;
    }

    public int getBPLow() {
        return blood_pressure_low;
    }
}
public class Hospital {
    
    private Patient[] rooms; // 입원실 배열 
    private int occupied; // 환자가 입실중인 입원실의 개수 
    
    public Hospital(int n) { // 병원 객체 생성 초기화 메소드, n = 병원이 보유한 입원실의 개수
        rooms = new Patient[n]; 
        occupied = 0;
    }
    
    /**
     * 입원실 배열을 리턴한다.
     * @return
     */
    public Patient[] getRoomsInfo() {
        return rooms;
    }
    
    /** [1번 - 배점 2점]
     * 비어있는 입원실이 있는지 여부를 리턴한다.
     * @return
     */
    public boolean roomAvailable() {
        
        return true;
    }
    
    /** [2번 - 배점 5점]
     * 환자 등록번호 id로 입원 중인 환자를 찾는다. 
     * @param id
     * @return 환자 
     */
    public Patient findPatient(int id) {
        
        return true;
    }
    
    /** [3번 - 배점 5점]
     * 환자 p를 입실시킨다.
     * @param p 
     * @return 빈 입원실이 있어서 입실 성공하면 true, 없어서 실패하면 false
     */
    public boolean admit(Patient p) {
    
        return true;
    }
    
    /** [4번 - 배점 5점]
     * 환자 p를 퇴실시킨다.
     * @param p
     * @return 환자를 찾아서 퇴실 성공하면 true, 실패하면 false
     */
    public boolean discharge(Patient p) {
         
        return true;
    }
    
}
import javax.swing.*;

public class HospitalController {
    
    private Hospital hospital; // 병원 객체
    private Displayer displayer; // 출력 객체
    private Reader reader; // 입력 객체
    private int new_id = 1001; // 신규 환자 등록번호, 1001 = 첫 환자의 등록번호
    
    public HospitalController(Hospital h, Displayer d, Reader r) {
        hospital = h;
        displayer = d;
        reader = r;
    }
    
    // 입원실 관리 서비스 (무한 루프)
    // [5번 - 배점 10점]
    public void manageRooms() {
        while (true) {
            double temperature;
            int bp_high, bp_low, id;
            Patient p;
            // 1. + 또는 -를 입력 대화창에서 입력 받는다.
            // 2. + 이면 입실 관리
            //    빈 입원실이 있으면
            //        체온, 혈압(상), 혈압(하)를 차례로 입력 대화창에서 입력받아
            //        환자 객체를 만들고 입실시킨다.
            //    빈 입원실이 없으면,
            //        출력 메시지 창을 띄워 "병실이 없습니다."를 보여준다.
            // 3. - 이면 퇴실 관리
            //    퇴실할 환자의 등록번호 id로 환자의 입원실을 찾는다.
            //    해당 환자가 입원실에 없으면, 
            //        출력 메시지 창을 띄워 "id 환자를 찾을 수 없습니다."를 보여준다.
            //    해당 환자가 입원실에 있으면,
            //        환자를 퇴원시키고, 
            //        출력 메시지 창을 띄워 "id 환자 퇴실 합니다."를 보여준다.
        }
    }
    
}
public class HospitalRoomManager {

    public static void main(String[] args) {
        Hospital h = new Hospital(4);
        new HospitalController(h, new Displayer(h), new Reader()).manageRooms();
    }

}

2021년 시험1 완성 코드

public class Hospital {
    
    private Patient[] rooms; // 입원실 배열 
    private int occupied; // 환자가 입실중인 입원실의 개수 
    
    public Hospital(int n) { // 병원 객체 생성 초기화 메소드, n = 병원이 보유한 입원실의 개수
        rooms = new Patient[n]; 
        occupied = 0;
    }
    
    /**
     * 입원실 배열을 리턴한다.
     * @return
     */
    public Patient[] getRoomsInfo() {
        return rooms;
    }
    
    /**
     * 비어있는 입원실이 있는지 여부를 리턴한다.
     * @return
     */
    public boolean roomAvailable() {
        return occupied < rooms.length;
    }
    
    /**
     * 환자 등록번호 id로 입원 중인 환자를 찾는다. 
     * @param id
     * @return 환자 
     */
    public Patient findPatient(int id) {
        for (int i = 0; i < rooms.length; i++) {
            Patient p = rooms[i];
            if (p != null && p.getID() == id) {
                return p;
            }
        }
        return null;
    }
    
    /** 
     * 환자 p를 입실시킨다.
     * @param p 
     * @return 빈 입원실이 있어서 입실 성공하면 true, 없어서 실패하면 false
     */
    public boolean admit(Patient p) {
        for (int i = 0; i < rooms.length; i++)
            if (rooms[i] == null) {
                rooms[i] = p;
                occupied += 1;
                return true;
            }
        return false;
    }
    
    /** 
     * 환자 p를 퇴실시킨다.
     * @param p
     * @return 환자를 찾아서 퇴실 성공하면 true, 실패하면 false
     */
    public boolean discharge(Patient p) {
        for (int i = 0; i < rooms.length; i++)
            if (rooms[i] != null && rooms[i].getID() == p.getID()) {
                rooms[i] = null;
                occupied -= 1;
                return true;
            }
        return false;
    }
    
}
import javax.swing.*;

public class HospitalController {
    
    private Hospital hospital; // 병원 객체
    private Displayer displayer; // 출력 객체
    private Reader reader; // 입력 객체
    private int new_id = 1001; // 신규 환자 등록번호, 1001 = 첫 환자의 등록번호
    
    public HospitalController(Hospital h, Displayer d, Reader r) {
        hospital = h;
        displayer = d;
        reader = r;
    }
    
    // 입원실 관리 서비스 (무한 루프)
    public void manageRooms() {
        while (true) {
            double temperature;
            int bp_high, bp_low, id;
            Patient p;
            String menu_selected = reader.readMenu("+: 입실, -: 퇴실");
            if (menu_selected.equals("+")) {
                if (hospital.roomAvailable()) {
                    temperature = reader.readDouble("체온?");
                    bp_high = reader.readInteger("혈압(상)?");
                    bp_low = reader.readInteger("혈압(하)?");
                    if (hospital.admit(new Patient(new_id, temperature, bp_high, bp_low)))
                        new_id += 1;
                }
                else
                    displayer.showMessage("병실이 없습니다.");
            }
            else { // 분명히 "-"일 수밖에 없음 
                id = reader.readInteger("환자 등록번호?");
                p = hospital.findPatient(id);
                if (p == null) 
                    displayer.showMessage(id + " 환자를 찾을 수 없습니다.");
                else {
                    hospital.discharge(p);
                    displayer.showMessage(id + " 환자 퇴실 합니다.");
                }
                    
            }
            displayer.display();
        }
    }
    
}