(c)도경구 version 1.0 (2022/10/13)
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();
}
}
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();
}
}
}