์ด๋ฒ์ ๋ง๋ ํ๋ก๊ทธ๋จ์ ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ
๊ฐ๋จํ? ์
,ํด์ ๋ฐ ๋ณ์ค ๋ฐ ๋ณ๋ ์
์ํํฉ์ ์์ ์๋๋ก ๋ง๋๋ ๊ฒ์ด๋ค.
ํ์ผ๋ก๋ถํฐ ์
๋ ฅ๋ฐ์ ํ์์ ๋ณ์ค ๋ชฉ๋ก์ ์ด์ฉํด์
๋ณ์ค ์ ๋ณด ์์ ๋งํฌ๋๋ฆฌ์คํธ๋ก ์
์์ค์ธ ํ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ
๊ธฐ๋ณธ์ ์ธ ์์ด๋์ด๋ค.
ํด์์ ๋ฐ๋๋ก ๋งํฌ๋๋ฆฌ์คํธ์์ ์ ์ธํ๋๊ฒ.
ํ์ ๋ชฉ๋ก์ ํ์ฌ ์
์์ค์ธ ํ์์ ํด์ํ ํ์ 2๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋์ด
์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋ชฉ๋ก์ ๊ฐ๊ฐ ๋ฐ๋ก ๋ง๋ค์ด์ฃผ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์
์ ๋ฐ ํด์์ ๊ฐ๊ฐ ๋ชฉ๋ก์ผ๋ก ์ฎ๊ฒจ์ฃผ์ด์ผ ๋๋ ๋จ์ ์ด ์์ง๋ง
๋ฐ๋ก ๊ด๋ฆฌ ํ๊ธฐ ๋๋ฌธ์ ๋ ํธ๋ฆฌํ ๋ถ๋ถ์ด ์๋ค.
[spoiler "์์ค ๋ด์ฉ"]
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string>
#include <time.h>
using namespace std;
#pragma warning(disable:4996) // warning ์ ๊ฐ์ถฐ์ฃผ๋ ๋งคํฌ๋ก
#define MAX_PATIENTS 100 // ์ต๋ ํ์์
#define MAX_ROOMS 100 // ์ต๋ ๋ฐฉ์
#define MAX_CLINICAL_PARTS 10 // ์ต๋ ์ง๋ฃ๋ถ์์
#define MAX_LENGTH 20 // ์ต๋๊ธธ์ด
#define MAX_DATE_LEN 9 // “yyyymmdd”
#define EMPTY “”
#define EMPTY_DATE “0″ // empty data of in_date or out_date
#define EMPTY_ROOM -1
#define EMPTY_PATIENT -1
#define DUMMY_P_ID -999 // ๋ณ์ค ์
์ ํ์ ๋ชฉ๋ก ๋๋ฏธ๋
ธ๋์ Patient ID ๊ฐ
#define SUCCESS 1
#define NOT_FOUND -1
#define CHECKED_IN -2 // ์
์์ค์ธ ํ์
#define CHECKED_OUT -3 // ํด์ํ ํ์
#define WANT_TO_QUIT -999
#define TRUE 1
#define FALSE 0
// menu constants
#define CHECK_IN 1
#define CHECK_OUT 2
#define INQUIRY 3
#define EXIT 4
void get_date(char date[]);
int get_menu();
//ํ์ ๊ด๋ จ ํด๋์ค
class Patient {
int patient_id; // ๊ณ ์ ๋ฒํธ
char patient_name[MAX_LENGTH];
char sex; // F:female, M:male
int age;
char insurance; // Y:๊ฐ์
, N:๋ฏธ๊ฐ์
char clinic_part;
char in_date[MAX_DATE_LEN]; // yyyymmdd
int room_no; // ํ์ฌ ์
์์ค์ธ ํ์: ๋ณ์ค๋ฒํธ, ํด์ํ์:NULL
char out_date[MAX_DATE_LEN]; // ํ์ฌ ์
์์ค์ธ ํ์: EMPTY, ํด์ํ์:ํด์์ผ
public:
Patient() { // ์์ฑ์
patient_id=EMPTY_PATIENT; strcpy(patient_name, “”);
sex=0; age=0; insurance=’N';
clinic_part=0;
strcpy(in_date, “”);
room_no = EMPTY_ROOM, strcpy(out_date, “”);
}
Patient(int p_id, char *p_name, char p_sex, int p_age, char p_insurance, char p_clinic_part, char *p_in_date, int r_no, char *p_out_date) { // ์์ฑ์ ์ค๋ฒ๋ผ์ด๋ฉ
patient_id=p_id;
strncpy(patient_name, p_name, MAX_LENGTH);
sex=p_sex;
age=p_age;
insurance=p_insurance;
clinic_part=p_clinic_part;
strncpy(in_date, p_in_date, MAX_DATE_LEN);
room_no = r_no;
strncpy(out_date, p_out_date, MAX_DATE_LEN);
}
~Patient() { } // ํ๊ดด์
void setPatientId(int p_id) { patient_id = p_id; } //ํ์ ID ์ ์ฅ
int getPatientId() { return patient_id; } //ํ์ ID ๋ฐํ
char* getPatientName() { return patient_name; } //ํ์ ์ด๋ฆ๋ฐํ
char getSex() { return sex; } //ํ์ ์ฑ๋ณ ๋ฐํ
int getAge() { return age; } // ํ์ ๋์ด ๋ฐํ
char getInsurance() { return insurance; } // ํ์ ๋ณดํ์ฌ๋ถ ๋ฐํ
char getClinicPartId() { return clinic_part; } // ์ง๋ฃ๋ถ์ ๋ฐํ
char* getInDate() { return in_date; } // ์
์์ผ์ ๋ฐํ
int getRoomNo() { return room_no; } // ์
์๋ณ์ค ๋ฐํ
char* getOutDate() { return out_date;} // ํด์์ผ์ ๋ฐํ
void setRoomNo(int room) { room_no = room; }
void SetOutDate(char date[]) { strcpy(out_date, date); }
};
// ํ์ ๋ชฉ๋ก ํด๋์ค
class PatientList {
int max_number;
int patient_count;
Patient *patient_list; // ํ์ ๋ชฉ๋ก์ ๋ฐฐ์ด
public:
PatientList() {max_number=MAX_PATIENTS; patient_count=0; patient_list = new Patient[MAX_PATIENTS];}
PatientList(int n) {max_number=n; patient_count=0; patient_list = new Patient[n];}
~PatientList() { delete[] patient_list;}
int getMaxNumber() { return max_number; }
int getPatientCount() { return patient_count; }
Patient *getPatientList() { return patient_list;}
Patient getPatient(int index) {return patient_list[index];}
void InsertPatient(Patient p);
void deletePatient(int p_index);
int findPatientByIndex(int p_id); // ID๋ฅผ ์ด์ฉํด ํ์ ๋ชฉ๋ก ๊ฒ์ํ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํ
void SortPatientList();
};
// ํ์ ์ ๋ณด ํจ๋ค๋ง ํด๋์ค
class PatientDataHandler {
ifstream in;
ofstream out; // ํ์ผ ์ถ๋ ฅ์ฉ out์ ์ ์ธ
void OpenPatientFile(char *fname) {in.open(fname);}
void SavePatientFile(char *fname) {out.open(fname);}
void ClosePatientFile() {in.close();}
void CloseSavePatientFile() {out.close();}
Patient getPatientFromFile(); // ํ์ ์ ๋ณด๋ฅผ ํ์ผ๋ก๋ถํฐ ๋ถ๋ฌ์จ๋ค.
public:
PatientDataHandler() {}
~PatientDataHandler() {}
int getPatientIdFromKeyboard(); // ํค๋ณด๋๋ก๋ถํฐ ํ์ID๋ฅผ ์
๋ ฅ๋ฐ์ ๋ฐํํด์ค
Patient getPatientDataFromKeyboard(int p_id); // ํค๋ณด๋๋ก๋ถํฐ ํ์์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ์
void getPatientsFromFile(char *fname, PatientList *in_p_list, PatientList *out_p_list); //ํ์ผ๋ก๋ถํฐ ํ์๋ชฉ๋ก์ ์
๋ ฅ๋ฐ์
void savePatientToFile(char *fname, PatientList *in_p_list, PatientList *out_p_list); // ํ์ ๋ชฉ๋ก์ ํ์ผ๋ก ์ ์ฅํจ
};
// ๋ณ์ค ์ ๋ณด์ ์ฐ๊ฒฐ๋ ํ์ NODE ํด๋์ค
class PatientNode
{
int patient_id;
PatientNode * pNext; // ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ํ ํฌ์ธํฐ
public:
PatientNode() {}
PatientNode(int p_id) {patient_id = p_id; pNext = NULL; }
~PatientNode() {};
int getPatientId() { return patient_id; }
PatientNode* getPatientNodepNext() { return pNext;}
void SetPatientNodepNext(PatientNode *p_pNext) { pNext = p_pNext;}
};
// ์ง๋ฃ๋ถ์ ํด๋์ค
class ClinicPart
{
char part_id; // ์ง๋ฃ๋ถ์ ์ฝ๋
char part_name[MAX_LENGTH]; // ์ง๋ฃ๋ถ์ ์ด๋ฆ
int ward_no; // ๋ณ๋ ์ธ๋ฑ์ค
public:
ClinicPart() {part_id = 0; strcpy(part_name, “”); ward_no=0;}
ClinicPart(int p_id, char *p_name, int w_no) {part_id = p_id; strcpy(part_name, p_name); ward_no = w_no; }
~ClinicPart(){}
char getPartId() {return part_id;}
char* getPartName() {return part_name;}
int getWardNo() {return ward_no;}
};
// ์ง๋ฃ๋ถ์ ๋ชฉ๋ก ํด๋์ค
class ClinicPartTable
{
int count; // ํ์ฌ ์ง๋ฃ๋ถ์์ ์
ClinicPart * clinicPartTable; // ์ง๋ฃ๋ถ์ ๋ฐฐ์ด
public:
ClinicPartTable();
~ClinicPartTable() { delete[] clinicPartTable; }
ClinicPart getClinicPartId(char pId); // ์ง๋ฃ๋ถ์ ์ฝ๋์ ํด๋นํ๋ ์ง๋ฃ๋ถ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
ClinicPart getClinicPartId(int roomNo); // ๋ณ์ค ๋ฒํธ์ ํด๋นํ๋ ์ง๋ฃ๋ถ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฉ์
};
// ๋ณ์ค ์ ๋ณด ํด๋์ค
class Room
{
int room_no; // ๋ณ์ค๋ฒํธ
int capacity; // ์์ฉ์ธ์
char sex; // B:both, F:female, M:male
int count; // ํ์ฌ ์
์ ํ์ ์
public:
PatientNode *p_list; // ํด๋น ๋ณ์ค ์
์ํ์ ๋ชฉ๋ก์ ๋ํ ํฌ์ธํฐ, ๋๋ฏธ ๋
ธ๋ ์ฌ์ฉ
public:
Room() { room_no=EMPTY_ROOM; capacity=0; sex=’ ‘; count=0; p_list=new PatientNode(DUMMY_P_ID); }
Room(int r_no, int r_capa, char r_sex) { room_no=r_no; capacity=r_c
apa; sex=r_sex, count=0; p_list=new PatientNode(DUMMY_P_ID); }
~Room(){}
int getRoomNo() { return room_no; }
int getCapacity() { return capacity; }
char getSex() { return sex;}
int getCount() { return count; }
PatientNode * getPatinetList() { return p_list; }
void insertPatient(PatientNode* p); // ํ์ ๋
ธ๋๋ฅผ ๋ณ์ค ์ ๋ณด์ ์ฝ์
int deletePatient(int p_id); // ๋๊ฒจ๋ฐ์ ID๋ก ํ์ ์ ๋ณด ์ญ์
};
// ๋ณ์ค ๋ชฉ๋ก ํด๋์ค
class RoomList
{
int max_number; // ์ต๋ ๋ณ์ค ๊ฐฏ์
int count; // ํ์ฌ ๋ณ์ค์ ๊ฐฏ์
Room *room_list; // ๋ณ์ค ๋ชฉ๋ก์ ๋ฐฐ์ด
public:
RoomList() {max_number = MAX_ROOMS; count = 0; room_list = new Room[MAX_ROOMS]; };
RoomList(int n) {max_number = n; count = 0; room_list = new Room[n]; };
~RoomList(){}
int getCount() { return count;}
int getRoomIndex(int room_no);
Room * getRoom(int index) { return &room_list[index];}
void loadPatientsIntoRoom(PatientList &in_p_list); // ์ฝ์ด์จ ํ์ ์ ๋ณด๋ฅผ ๋ณ์ค์ ์ฝ์
int findRoomIndexForCheckIn(char clinicPart_id, char sex); // ์ฑ๋ณ๊ณผ ์ง๋ฃ๋ถ์์ ๋ง๋ ๋ณ์ค์ ์ฐพ์ ๋ณ๋๋ฒํธ๋ฅผ ๋ฐํ
void insertRoom(Room r); // ๋ณ์ค ์ ๋ณด๋ฅผ ์ฝ์
};
// ๋ณ์ค ์ ๋ณด ํธ๋ค๋ฌ ํด๋์ค
class RoomDataHandler
{
ifstream in;
void openRoomFile(char *fname) { in.open(fname); }
void closeRoomFile() { in.close(); }
Room getRoomFromFile(); // ํ์ผ๋ก๋ถํฐ ๋ณ์ค ์ ๋ณด๋ฅผ ์ฝ์ด์จํ ๋ฐํํ๋ค
public:
RoomDataHandler(){}
~RoomDataHandler(){}
int getClinicPartIdIdFromKeyboard(); // ์ง๋ฃ๋ถ์๋ฅผ ํค๋ณด๋๋ก๋ถํฐ ์
๋ ฅ๋ฐ๋๋ค.
void getRoomListFromFile(char *fname, RoomList *r_list); // ํ์ผ๋ก๋ถํฐ ๋ณ์ค ์ ๋ณด๋ฅผ ์ฝ์ด์ ๋ณ์ค ๋ชฉ๋ก์ ๋ง๋ ๋ค
};
// ์ฌ์ฉ์๋ก ๋ถํฐ ์
๋ ฅ๋ฐ์ ๋ฉ๋ด๋ฅผ ์งํ
class RoomListProcessor {
public :
RoomListProcessor() {};
~RoomListProcessor() {};
void checkInHandler(PatientList &in_p_list, PatientList &out_p_list, RoomList &room_list);
void checkOutHandler(PatientList &in_p_list, PatientList &out_p_list, RoomList &room_list);
void inquiryHandler(PatientList &in_p_list, PatientList &out_p_list, RoomList &room_list);
};
// ===== Class ์ ์ ์์======
void PatientList::InsertPatient(Patient p)
{
if(patient_count >= max_number) {
cout << “ํ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ด ๋ถ์กฑํฉ๋๋ค.\n” << endl;
exit(1);
}
patient_list[patient_count] = p;
patient_count++;
}
void PatientList::deletePatient(int p_index)
{
int i;
if (patient_count == 0) {
cout << “Patient List Empty!!” << endl;
return;
}
for (i = p_index; i < patient_count; i++) {
patient_list[i] = patient_list[i+1];
}
patient_count–;
}
// ID๋ฅผ ์ด์ฉํด ํ์ ๋ชฉ๋ก ๊ฒ์ํ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํ
int PatientList::findPatientByIndex(int p_id)
{
for(int i=0; i<patient_count; i++ )
if(p_id == patient_list[i].getPatientId()) return i;
return NOT_FOUND;
}
// ๋ฒ๋ธ sort ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ์ ๋ ฌ
void PatientList::SortPatientList()
{
Patient temp; // ์ค์์ ์ํ temp
for(int i=0; i<patient_count; i++) {
int min = i;
for(int j=i+1; j<patient_count; j++)
if(patient_list[j].getPatientId() < patient_list[min].getPatientId())
min = j;
if(min != i) {
temp = patient_list[i];
patient_list[i] = patient_list[min];
patient_list[min]= temp;
}
}
}
int PatientDataHandler::getPatientIdFromKeyboard()
{
int p_id;
cout << “\nType patient id, (quit to ” << WANT_TO_QUIT << ” )==> “;
cin >> p_id;
return p_id;
}
// ํ์ ์ ๋ณด๋ฅผ ํค๋ณด๋๋ก๋ถํฐ ์
๋ ฅ๋ฐ๋๋ค
Patient PatientDataHandler::getPatientDataFromKeyboard(int p_id)
{
char name[MAX_LENGTH];
char sex; // F:female, M:male
int age;
char insurance; // Y:๊ฐ์
, N:๋ฏธ๊ฐ์
char clinic_part;
char in_date[MAX_DATE_LEN];
char out_date[MAX_DATE_LEN];
// ID๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ ๋ณด๋ฅผ ํค๋ณด๋๋ก ๋ถํฐ ์
๋ ฅ๋ฐ๋๋ค.
cout << “\nType a patient name ==> “;
cin >> name;
cout << “\nType sex of patient. (F:female, M:male) ==> “;
cin >> sex;
cout << “\nType age of patient ==> “;
cin >> age;
cout << “\nType insurance. (0:๋ฏธ๊ฐ์
, 1:๊ฐ์
) ==> “;
cin >> insurance;
cout << “\nType a clinical part id. ==> “;
cin >> clinic_part;
get_date(in_date); // ์
์์ผ์๋ฅผ ํ์ฌ๋ ์ง๋ก ์
๋ ฅ๋ฐ๋๋ค.
strcpy(out_date, “”); // ํด์์ผ์์ “”๋ฅผ ๋ฃ์ด์ค๋ค.
Patient p(p_id, name, sex, age, insurance, clinic_part, in_date, EMPTY_ROOM, out_date); // ์
๋ ฅ๋ฐ์ ๊ฐ์ผ๋ก Patient ํด๋์ค๋ฅผ ์์ฑ
return p; // Patient ํด๋์ค๋ฅผ ๋ฐํํด์ค๋ค.
}
// ํ์ ์ ๋ณด๋ฅผ ํ์ผ๋ก๋ถํฐ ์ ์ฅ๋ฐ๊ณ ์ ์ฅ๋ฐ์ ๊ฐ์ ๋ฐํํ๋ค.
Patient PatientDataHandler::getPatientFromFile()
{
int id;
char name[MAX_LENGTH];
char sex; // F:female, M:male
int age;
char insurance; // Y:๊ฐ์
, N:๋ฏธ๊ฐ์
char clinic_part;
char in_date[MAX_LENGTH];
int room_no;
char out_date[MAX_LENGTH];
if( in.eof() ) {
Patient p(EMPTY_PATIENT,”", 0, 0, 0, 0, “”, 0, “”);
return p;
}
in >> id >> name >> sex >> age >> insurance >> clinic_part >> in_date >> room_no >> out_date;
Patient p(id, name, sex, age, insurance, clinic_part, in_date, room_no, out_date);
return p;
}
// ํ์ผ๋ก๋ถํฐ ์ฝ์ด๋ค์ธ ํ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ํ์ ๋ชฉ๋ก์ ๋ง๋ ๋ค
void PatientDataHandler::getPatientsFromFile(char *fname, PatientList *in_p_list, PatientList *out_p_list)
{
Patient p;
OpenPatientFile(fname);
while(1) { // ํ์ผ๋ก ๋ถํฐ ์ฝ์ด์จ ํ์ ์ ๋ณด๊ฐ NULL ๊ฐ์ ๊ฐ์ง๋๊น์ง ๋ฐ๋ณต
p = getPatientFromFile();
if (p.getPatientId() == EMPTY_PATIENT) break;
if ( strcmp(p.getOutDate(), EMPTY_DATE) == 0) in_p_list->InsertPatient(p); // ์
์ํ์ ๋ชฉ๋ก์ ๋ง๋ ๋ค
else out_p_list->InsertPatient(p); // ํด์ํ์ ๋ชฉ๋ก์ ๋ง๋ ๋ค
}
ClosePatientFile();
}
void PatientDataHandler::savePatientToFile(char *fname, PatientList *in_p_list, PatientList *out_p_list)
{
Patient p;
SavePatientFile(fname);
int i;
for (i = 0; i < in_p_list->getPatientCount(); i++) {
p = in_p_list->getPatient(i);
out << p.getPatientId() <<” “<< p.getPatientName() << ” ” << p.getSex() << ” ” << p.getAge() << ” ” << p.getInsurance() << ” ” << p.getClinicPartId() << ” ” << p.getInDate() << ” ” << p.getRoomNo() << ” ” << “0″ << endl;
}
for (i = 0; i < out_p_list->getPatientCount(); i++) {
p = out_p_list->getPatient(i);
out << p.getPatientId() <<” “<< p.getPatientName() << ” ” << p.getSex() << ” ” << p.getAge() << ” ” << p.getInsurance() << ” ” << p.getClinicPartId() << ” ” << p.getInDate() << ” ” << p.getRoomNo() << ” ” << p.getOutDate() << endl;
}
CloseSavePatientFile();
}
// ์ง๋ฃ๋ถ์ ํ
์ด๋ธ์ ๋ง๋ ๋ค
ClinicPartTable::ClinicPartTable()
{
cli
nicPartTable = new ClinicPart[5];
clinicPartTable[0] = ClinicPart(’A', “๋ด๊ณผ”, 61);
clinicPartTable[1] = ClinicPart(’B', “์ธ๊ณผ”, 62);
clinicPartTable[2] = ClinicPart(’C', “์ ๊ฒฝ๊ณผ”, 63);
clinicPartTable[3] = ClinicPart(’D', “์์๊ณผ”, 64);
clinicPartTable[4] = ClinicPart(’E', “์ฐ๋ถ์ธ๊ณผ”, 65);
count = 5;
}
ClinicPart ClinicPartTable::getClinicPartId(char pId)
{
for(int i=0; i<count; i++)
if(clinicPartTable[i].getPartId() == pId) return clinicPartTable[i];
return ClinicPart(NOT_FOUND, NULL, 0); // NOT_FOUND
}
ClinicPart ClinicPartTable::getClinicPartId(int roomNo)
{
for(int i=0; i<count; i++)
if( clinicPartTable[i].getWardNo() == (roomNo/10) ) return clinicPartTable[i];
return ClinicPart(NOT_FOUND, NULL, 0); // NOT_FOUND
}
// ํ์ ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํด์ค๋ค.(๋งํฌ๋ ๋ฆฌ์คํธ)
void Room::insertPatient(PatientNode* p)
{
PatientNode *ptr = p_list;
// ๋๋ฏธ ๋ค์ Node๋ก ์ฐ๊ฒฐ
p->SetPatientNodepNext(ptr->getPatientNodepNext());
ptr->SetPatientNodepNext(p);
count++;
}
// ํ์ ๋
ธ๋๋ฅผ ์ญ์ ํ๋ค.
int Room::deletePatient(int p_id)
{
PatientNode *ptr = p_list;
PatientNode *trail;
while(ptr != NULL) {
if(ptr->getPatientId()== p_id) {
trail->SetPatientNodepNext(ptr->getPatientNodepNext());
delete ptr; // ptr ์ ๋ฉ๋ชจ๋ฆฌ ํด์ ํด์ค
count–; // ํ์ฌ ํ์์๋ฅผ -1 ํด์ค
return SUCCESS;
}
trail = ptr;
ptr = ptr->getPatientNodepNext();
}
return NOT_FOUND;
}
void RoomList::loadPatientsIntoRoom(PatientList &in_p_list)
{
int p_list_count = in_p_list.getPatientCount();
for(int i=0; i<p_list_count; i++) {
// ํ์ ๋ฐ์ดํฐ ํ๋ ์ ํ
Patient p = in_p_list.getPatient(i);
// ๊ธฐ์กด ์
์ ๋ณ์ค์ ์ ํ
int roomNo = p.getRoomNo();
int r_index = getRoomIndex(roomNo);
if( r_index == NOT_FOUND) {
cout << “์กด์ฌํ์ง ์๋ ๋ณ์ค ๋ฒํธ์
๋๋ค.” << endl;
continue;
}
Room *room = getRoom(r_index);
if( room->getCount() >= room->getCapacity() ) {
cout << “์
์ ๊ฐ๋ฅ ํ์์๋ฅผ ์ด๊ณผํ์ฌ ” << p.getPatientId() << “ํ์๋ ์ฒ๋ฆฌ ํ ์ ์์ต๋๋ค.” << endl;
continue;
}
// ํ์ ๋
ธ๋ ๋ง๋ค์ด์ ๋ณ์ค์ ํ์ ์ฝ์
PatientNode *pNode = new PatientNode(p.getPatientId());
room->insertPatient(pNode);
}
}
int RoomList::findRoomIndexForCheckIn(char clinicPart_id, char sex)
{
ClinicPartTable clinicPartTable;
ClinicPart clinicPart;
Room room;
char r_sex;
clinicPart = clinicPartTable.getClinicPartId(clinicPart_id);
// ์
์ ๊ฐ๋ฅํ ๋ณ์ค์ ์ฐพ๋ ์กฐ๊ฑด ๊ฒ์ฌ
for(int i=0; i<count; i++) {
room = room_list[i];
if( room.getRoomNo()/10 != clinicPart.getWardNo() ) continue;
r_sex = room.getSex();
if( r_sex != ‘B’ && r_sex != sex ) continue;
if( room.getCount() >= room.getCapacity()) continue;
return i;
}
return NOT_FOUND;
}
int RoomList::getRoomIndex(int room_no)
{
for(int i=0; i<count; i++)
if(room_list[i].getRoomNo() == room_no) return i;
return NOT_FOUND;
}
void RoomList::insertRoom(Room r)
{
if( count >= max_number) {
cout << “๋ณ์ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ด ๋ถ์กฑํฉ๋๋ค.\n” << endl;
exit(1);
}
room_list[count] = r;
count++;
}
Room RoomDataHandler::getRoomFromFile()
{
int room_no; // ๋ณ์ค๋ฒํธ
int capacity; // ์์ฉ์ธ์
char sex; // B:both, F:female, M:male
Room nullRoom;
if( in.eof()) return nullRoom;
in >> room_no >> capacity >> sex;
Room r(room_no, capacity, sex);
return r;
}
void RoomDataHandler::getRoomListFromFile(char *fname, RoomList *r_list)
{
Room r;
openRoomFile(fname);
while(1) { // ๋ณ์ค ์ ๋ณด๊ฐ NULL ์ผ๋๊น์ง ๋ฐ๋ณต
r = getRoomFromFile();
if( r.getRoomNo() == EMPTY_ROOM ) break;
r_list->insertRoom(r);
}
closeRoomFile();
}
int RoomDataHandler::getClinicPartIdIdFromKeyboard()
{
int r_no;
cout << “\nType Room Number, (quit to ” << WANT_TO_QUIT << ” )==> “;
cin >> r_no;
return r_no;
}
void RoomListProcessor::checkInHandler(PatientList &in_p_list, PatientList &out_p_list, RoomList &room_list)
{
Patient p;
int p_id;
int p_index; // index for patient list
int r_index; // index for room list
PatientDataHandler pdh;
while(1) {
// ํ์ ์ฝ๋๋ฅผ ๋ฐ๋๋ค.
p_id = pdh.getPatientIdFromKeyboard();
// ์ข
๋ฃ๋ฅผ ์ํ๋ฉด ์ข
๋ฃ
if( p_id == WANT_TO_QUIT) return ;
// ์
์ ํ์ ๋ชฉ๋ก์์ p_id ์ ํด๋นํ๋ index ์ป์ด ์
์ ํ์ ์ธ์ง ํ์ธ
p_index = in_p_list.findPatientByIndex(p_id);
if( p_index != NOT_FOUND ) {
cout << “์
์์ค์ธ ํ์์
๋๋ค. ” << endl;
continue ;
}
// ํด์ ํ์ ๋ชฉ๋ก์์ p_id ์ ํด๋นํ๋ index ์ป์ด ๊ธฐ์กด ํ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธ
p_index = out_p_list.findPatientByIndex(p_id);
if( p_index == NOT_FOUND )
p = pdh.getPatientDataFromKeyboard(p_id); // ์ ํ์ ์
๋ ฅ
else
p = out_p_list.getPatient(p_index); // existing patient
// ์ง๋ฃ๊ณผ ์ฝ๋์ ํด๋นํ๋ ๋ณ์ค ๋ชฉ๋ก์์ ์
์ ํ ์ ์๋ ๋ณ์ค์ index ์ฐพ๊ธฐ
r_index = room_list.findRoomIndexForCheckIn(p.getClinicPartId(), p.getSex());
if( r_index == NOT_FOUND) {
cout << “ํด๋น ์ง๋ฃ ๋ถ์์๋ ์
์ ๊ฐ๋ฅํ ๋ณ์ค์ด ์์ต๋๋ค.”;
continue;
}
// ํด๋น ๋ณ์ค์ ํ์ ๋
ธ๋ ์ฝ์
Room *room = room_list.getRoom(r_index);
p.setRoomNo(room->getRoomNo());
cout << room->getRoomNo() << ” ๋ณ์ค์ ์
์” << endl;
// ์
์ ํ์ ๋ชฉ๋ก์ ํ์ ๋ฐ์ดํฐ ์ฝ์
in_p_list.InsertPatient(p);
PatientNode *pNode = new PatientNode(p.getPatientId());
room->insertPatient(pNode);
}
}
// ํด์ ํ๋ก์ธ์ ๋ฏธ๊ตฌํ
void RoomListProcessor::checkOutHandler(PatientList &in_p_list, PatientList &out_p_list, RoomList &room_list)
{
PatientDataHandler pdh;
Patient p;
int p_id;
int p_index;
int r_index;
char out_date[MAX_DATE_LEN];
while (1) {
// ํ์ ๋ฒํธ ์
๋ ฅ
p_id = pdh.getPatientIdFromKeyboard();
// ์ข
๋ฃ๋ฅผ ์
๋ ฅํ์ ๊ฒฝ์ฐ
if (p_id == WANT_TO_QUIT) return ;
// ์
์ ํ์ ๋ชฉ๋ก์์ p_id์ ํด๋นํ๋ index๋ฅผ ์ป์ด ์
์ ํ์์ธ์ง ํ์ธ
p_index = in_p_list.findPatientByIndex(p_id);
if (p_index == NOT_FOUND) {
cout << “์
์์ค์ธ ํ์๊ฐ ์๋๋๋ค.” << endl;
continue;
}
// ๋ฐํ๋ฐ์ ํ์๋ชฉ๋ก index๋ฅผ ๊ฐ์ง๊ณ ํ์ ์ ๋ณด๋ฅผ ๋ฐํ๋ฐ์
p = in_p_list.getPatient(p_index);
// ํด์์ผ์๋ฅผ ํ์ฌ ๋ ์ง๋ก
get_date(out_date);
p.SetOutDate(out_date);
r_index = room_list.getRoomIndex(p.getRoomNo());
out_p_list.InsertPatient(p);
in_p_list.deletePatient(p_index);
Room *room = room_list.getRoom(r_index);
room->deletePatient(p_id);
}
//
}
// ์
์ํ์ ํํฉ ํ๋ก์ธ์
void RoomListProcessor::inquiryHandler(PatientList &in_p_list, PatientList &out_p_list, RoomList &room_list)
{
Patient p;
Room *r_node;
PatientNode *p_node;
<
p>ClinicPartTable *c_temp = new ClinicPartTable();
ClinicPart c;
int r_no; // ๋ณ์ค๋ฒํธ ์
๋ ฅ์ ์ํ ๋ณ์
int r_index; // ๋ณ์ค ๋ชฉ๋ก ๋ฐฐ์ด์ ๋ฐํ๋ฐ์ ๋ณ์
RoomDataHandler rdh;
while (1) {
// ๋ณ์ค ๋ฒํธ ์
๋ ฅ
r_no = rdh.getClinicPartIdIdFromKeyboard();
// ์ฌ์ฉ์๊ฐ ์ข
๋ฃ๋ฅผ ์ ํํ์ ์
if (r_no == WANT_TO_QUIT) return ;
// ์
๋ ฅ๋ฐ์ ๋ณ์ค๋ฒํธ๋ก ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฅผ ๋ฐํ๋ฐ๋๋ค
r_index = room_list.getRoomIndex(r_no);
// ๋ฐํ๋ฐ์ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ก ์
๋ ฅ๋ฐ์ ๋ณ์ค์ r_node์ ์ ์ฅํ๋ค.
r_node = room_list.getRoom(r_index);
c = c_temp->getClinicPartId(r_no);
cout << “๋ณ๋ : ” << c.getWardNo() << endl;
cout << “๋ณ์ค๋ฒํธ ํ์์ฝ๋ ํ์์ฑ๋ช
์ฑ๋ณ ๋์ด” << endl;
// p_node์ PatientNode->pNext ๊ฐ์ ๋ฃ๊ณ NULL ์ผ๋๊น์ง ๋ฐ๋ณต
for (p_node = r_node->p_list->getPatientNodepNext(); p_node; p_node = p_node->getPatientNodepNext()) {
// ํ์ ์ ๋ณด๋ฅผ Patient p์ ๋์
p = in_p_list.getPatient(in_p_list.findPatientByIndex(p_node->getPatientId()));
// ํ์ ์ ๋ณด ์ถ๋ ฅ
cout << r_node->getRoomNo() << ” ” << p.getPatientId() << ” ” <<p.getPatientName() << ” ” << p.getSex() << ” ” << p.getAge() << endl;
}
}
}
// === ํด๋์ค ์ ์ ๋ถ๋ถ ๋ ===
// ์ค๋์ ๋ ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์
void get_date(char date[])
{
time_t timer;
struct tm *t;
timer = time(NULL); // ํ์ฌ ์๊ฐ์ ์ด ๋จ์๋ก ์ป๊ธฐ
t = localtime(&timer); // ์ด ๋จ์์ ์๊ฐ์ ๋ถ๋ฆฌํ์ฌ ๊ตฌ์กฐ์ฒด์ ์ ์ฅ
// date์ “YYYYMMDD” ํ์์ผ๋ก ์ ์ฅ
sprintf(date, “%0.4d%0.2d%0.2d”, t->tm_year+1900, t->tm_mon+1, t->tm_mday);
}
// get a menu for user
int get_menu()
{
int menu;
while(1) {
// ๋ฉ๋ด ์ถ๋ ฅ
printf(” ***menu***\n”);
printf(”1) Check In\n”);
printf(”2) Check Out\n”);
printf(”3) Inquiry\n”);
printf(”4) Exit\n”);
// ๋ฉ๋ด ์ ํ
printf(”\nMENU ==> “);
scanf(”%d”,&menu);
if(menu >= CHECK_IN && menu <= EXIT)
return menu;
// ์๋ชป๋ ์
๋ ฅ์ผ ๊ฒฝ์ฐ
printf(”\nInvalid menu!! Retry!!”);
}
}
int main()
{
PatientList in_p_list;
PatientList out_p_list;
RoomList room_list;
PatientDataHandler patient_data_handler;
RoomDataHandler room_data_handler;
RoomListProcessor roomListProcessor;
int menu;
patient_data_handler.getPatientsFromFile(”patient.dat”, &in_p_list, &out_p_list);
in_p_list.SortPatientList();
out_p_list.SortPatientList();
room_data_handler.getRoomListFromFile(”room.dat”, &room_list);
// ๋ณ์ค๋ชฉ๋ก์ ๊ธฐ์กด ์
์ ํ์๋ชฉ๋ก ๋ก๋
room_list.loadPatientsIntoRoom(in_p_list);
// ์ฌ์ฉ์๋ก๋ถํฐ ๋ฉ๋ด ์
๋ ฅ์ ๋ฐ๋๋ค.
while(1)
{
menu = get_menu();
if(menu == EXIT) {
patient_data_handler.savePatientToFile(”patient.dat”, &in_p_list, &out_p_list);
break;
}
switch(menu) {
case CHECK_IN:
roomListProcessor.checkInHandler(in_p_list, out_p_list, room_list);
break;
case CHECK_OUT:
roomListProcessor.checkOutHandler(in_p_list, out_p_list, room_list);
break;
case INQUIRY:
roomListProcessor.inquiryHandler(in_p_list, out_p_list, room_list);
break;
}
}
}
[/spoiler]