/******************************************************************
程序名:医院设备利用
作者:许文发
时间:2009-11-27
描述:县中心医院试图在经济疲软和人口增长过快的情况下改进其服务。为
支持医院的计划,你被要求设计一个模拟程序一供医院评估可选择的手术室、
恢复室的配置方案。你的程序将监视手术室和恢复室在一天中的使用情况。
县中心医院有一些手术室和恢复室。每个手术病人被分配到一个可用的手术室,
术后病人被分配到恢复室的一个床位。将一个病人从一间手术室移到恢复室
所需的时间是固定的,与病人无关。相似的,为下一个病人准备一间手术室
所需要的时间和为下一个新病人准备一个恢复室的时间是固定的。
医院将在同一时间为所有病人正式排编手术,但他们实际进入手术室的顺序取
决于他们的登记编号。一个进入手术的病人进入编号最小的可用的手术室。手术后
,病人被送到编号最小的可用的恢复室床位。
输入:
手术室的数目、恢复室的数目、一天第一次手术开始时间、将病人从手术室
送到恢复室所需的分钟数、为下一个病人准备手术所需的分钟数、为下一个病人
准备恢复床位所需的分钟数、病人的信息(病人的姓名、手术所需分钟数、
恢复所需分钟数)
输出:
时间表、及各手术室、恢复室利用率,总可用时间为第一次手术开始时间到
最后一个病人离开恢复室所用的时间。
******************************************************************/
#include<iostream.h>
#include<stdio.h>
//自定义时间类,及重载部分运算符
class Time
{
public:
int hour;
int minute;
public:
Time(){}
Time(int h,int m)
{
hour=h;
minute=m;
}
Time operator+(const int m)
{
Time sum;
sum.minute=minute+m;
sum.hour=hour+sum.minute/60;
sum.minute=sum.minute%60;
return sum;
}
Time operator+(const Time & t)
{
Time sum;
sum.minute=minute+t.minute;
sum.hour=hour+sum.minute/60;
sum.minute=sum.minute%60;
return sum;
}
bool operator>(const Time & t)
{
if(hour>t.hour)
return true;
else if(hour<t.hour)
return false;
else
{
if(minute>t.minute)
return true;
else
return false;
}
}
bool operator>=(const Time &t)
{
if(hour>t.hour)
return true;
else if(hour<t.hour)
return false;
else
{
if(minute>=t.minute)
return true;
else
return false;
}
}
void operator=(const Time & t)
{
hour=t.hour;
minute=t.minute;
}
void display()
{
cout<<hour<<":"<<minute<<endl;
}
};
//病人信息及手术时间和恢复时间
typedef struct patient
{
int code;
char name[9];
int room;
int bed;
Time op_Begin;
Time op_End;
Time re_Begin;
Time re_End;
int op_time;
int re_time;
}PAT;
//在时间数组中找出最小的时间所对应的索引
int small(Time useTime[],int Num)
{
Time min;
int index=0;
min=useTime[0];
for(int i=1;i<Num;i++)
{
if(min>useTime[i])
{
min=useTime[i];
index=i;
}
}
return index;
}
//手术时间安排
void arrangeOp(int room_en[],Time room_useTime[],int roomNum,PAT &p,Time start,int op_wait)
{
int i;
int m=0;
for(i=0;i<roomNum;i++)
{
if(room_en[i]==1)
m++;
}
if(m<roomNum)
{
for(i=0;i<roomNum;i++)
{
if(room_en[i]==0)
{
room_en[i]=1;
room_useTime[i]=start+p.op_time;
p.op_Begin=start;
p.op_End=room_useTime[i];
p.room=i+1;
break;
}
}
}
else
{
i=small(room_useTime,roomNum);
p.op_Begin=room_useTime[i]+op_wait;
room_useTime[i]=room_useTime[i]+p.op_time+op_wait;
p.op_End=room_useTime[i];
p.room=i+1;
}
}
//恢复时间安排
void arrangeRe(Time bed_useTime[],int bedNum,PAT p[],int re_wait,int patientNum,int opToRe)
{
int i,j;
PAT temp;
Time t1,t2;
for(i=0;i<patientNum-1;i++)
{
for(j=i+1;j<patientNum;j++)
{
if(p[i].op_End>p[j].op_End)
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
for(i=0;i<patientNum;i++)
{
for(j=0;j<bedNum;j++)
{
t1=p[i].op_End+opToRe;
t2=bed_useTime[j]+re_wait;
if(t1>=t2)
{
p[i].re_Begin=p[i].op_End+opToRe;
bed_useTime[j]=p[i].re_Begin+p[i].re_time;
p[i].re_End=bed_useTime[j];
p[i].bed=j+1;
break;
}
}
}
for(i=0;i<patientNum-1;i++)
{
for(j=i+1;j<patientNum;j++)
{
if(p[i].code>p[j].code)
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
}
//获取手术室总时间数
int minuteRoom(PAT p[],int n,int room)
{
int sum=0;
for(int i=0;i<n;i++)
{
if(room==p[i].room)
sum+=p[i].op_time;
}
return sum;
}
//获取床位使用时间数
int minuteBed(PAT p[],int n,int bed)
{
int sum=0;
for(int i=0;i<n;i++)
{
if(bed==p[i].bed)
sum+=p[i].re_time;
}
return sum;
}
//获取两时间差
int getMinute(Time t1,Time t2)
{
int result;
result=t1.hour*60+t1.minute-t2.hour*60-t2.minute;
return result;
}
//获取最大时间
Time getLargh(PAT p[],int n)
{
Time t;
t=p[0].re_End;
for(int i=1;i<n;i++)
{
if(p[i].re_End>t)
{
t=p[i].re_End;
}
}
return t;
}
//输出
void mywrite(PAT p[],int n,int roomNum,int bedNum)
{
FILE *pt;
pt=fopen("output.txt","w");
float w;
fprintf(pt,"Patient/t/tOperating Room/t/t/tRecovery Room/n");
fprintf(pt,"#/tName/tRoom#/tBegin/t End/tBed#/tBegin/tEnd/n");
for(int i=0;i<n;i++)
{
fprintf(pt,"%2d/t",p[i].code);
fprintf(pt,"%s/t/t",p[i].name);
fprintf(pt,"%d/t",p[i].room);
fprintf(pt,"%2d:%02d/t",p[i].op_Begin.hour,p[i].op_Begin.minute);
fprintf(pt,"%2d:%02d/t",p[i].op_End.hour,p[i].op_End.minute);
fprintf(pt,"%2d/t/t",p[i].bed);
fprintf(pt,"%2d:%02d/t",p[i].re_Begin.hour,p[i].re_Begin.minute);
fprintf(pt,"%2d:%02d",p[i].re_End.hour,p[i].re_End.minute);
fprintf(pt,"/n");
}
fprintf(pt,"Facility Utilization/n");
fprintf(pt,"Type/t# Minutes/t%%Used/n");
for(i=0;i<roomNum;i++)
{
w=(float)minuteRoom(p,n,i+1)*100/getMinute(getLargh(p,n),p[0].op_Begin);
fprintf(pt,"Room/t%d/t%d/t/t%4.2f/n",i+1,minuteRoom(p,n,i+1),w);
}
for(i=0;i<bedNum;i++)
{
w=(float)minuteBed(p,n,i+1)*100/getMinute(getLargh(p,n),p[0].op_Begin);
fprintf(pt,"Bed/t/t%d/t%3d/t/t%4.2f",i+1,minuteBed(p,n,i+1),w);
if(i!=bedNum-1)
fprintf(pt,"/n");
}
fclose(pt);
}
//时间设为0
void setzero(Time useTime[],int num)
{
Time t(0,0);
for(int i=0;i<num;i++)
useTime[i]=t;
}
void main()
{
int roomNum,bedNum,patientNum,time,opToRe,op_waitNext,re_waitNext;
Time *room_useTime,*bed_useTime;
Time start;
int i;
int *room_en;
FILE *pt;
PAT *patient;
if(NULL==(pt=fopen("input.txt","r")))
{
}
else
{
fscanf(pt,"%d",&roomNum);
fscanf(pt,"%d",&bedNum);
fscanf(pt,"%d",&time);
fscanf(pt,"%d",&opToRe);
fscanf(pt,"%d",&op_waitNext);
fscanf(pt,"%d",&re_waitNext);
fscanf(pt,"%d",&patientNum);
start.hour=time;
start.minute=0;
room_en=new int[roomNum];
room_useTime=new Time[roomNum];
bed_useTime=new Time[bedNum];
patient=new PAT[patientNum];
for(i=0;i<patientNum;i++)
{
patient[i].code=i+1;
fscanf(pt,"%s",patient[i].name);
fscanf(pt,"%d",&patient[i].op_time);
fscanf(pt,"%d",&patient[i].re_time);
}
for(i=0;i<roomNum;i++)
room_en[i]=0;
setzero(bed_useTime,bedNum);
for(i=0;i<patientNum;i++)
{
arrangeOp(room_en,room_useTime,roomNum,patient[i],start,op_waitNext);
}
fclose(pt);
}
arrangeRe(bed_useTime,bedNum,patient,re_waitNext,patientNum,opToRe);
mywrite(patient,patientNum,roomNum,bedNum);
}
<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->
输入:
5 12 07 5 15 10 16
Jones
28 140
Smith
120 200
Thomps
23 75
Albrig
19 82
Poucher
133 209
Comer
74 101
Perry
93 188
Page
111 223
Roggio
69 122
Bright
42 79
Nute
22 71
Young
38 140
Bush
26 121
Cates
120 248
Johnson
86 181
White
92 140
输出:
Patient Operating Room Recovery Room
# Name Room# Begin End Bed# Begin End
1 Jones 1 7:00 7:28 3 7:33 9:53
2 Smith 2 7:00 9:00 1 9:05 12:25
3 Thomps 3 7:00 7:23 2 7:28 8:43
4 Albrig 4 7:00 7:19 1 7:24 8:46
5 Poucher 5 7:00 9:13 5 9:18 12:47
6 Comer 4 7:34 8:48 2 8:53 10:34
7 Perry 3 7:38 9:11 4 9:16 12:24
8 Page 1 7:43 9:34 6 9:39 13:22
9 Roggio 4 9:03 10:12 9 10:17 12:19
10 Bright 2 9:15 9:57 8 10:02 11:21
11 Nute 3 9:26 9:48 7 9:53 11:04
12 Young 5 9:28 10:06 3 10:11 12:31
13 Bush 1 9:49 10:15 10 10:20 12:21
14 Cates 3 10:03 12:03 8 12:08 16:16
15 Johnson 2 10:12 11:38 2 11:43 14:44
16 White 5 10:21 11:53 7 11:58 14:18
Facility Utilization
Type # Minutes %Used
Room 1 165 29.68
Room 2 248 44.60
Room 3 258 46.40
Room 4 162 29.14
Room 5 263 47.30
Bed 1 282 50.72
Bed 2 357 64.21
Bed 3 280 50.36
Bed 4 188 33.81
Bed 5 209 37.59
Bed 6 223 40.11
Bed 7 211 37.95
Bed 8 327 58.81
Bed 9 122 21.94
Bed 10 121 21.76
Bed 11 0 0.00
Bed 12 0 0.00