程序设计大赛---医院设备利用

来源:互联网 发布:衣服烘干机 知乎 编辑:程序博客网 时间:2024/04/30 06:28

/******************************************************************
程序名:医院设备利用
作者:许文发
时间: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 515 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

FacilityUtilization

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

原创粉丝点击