home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
listings
/
v_11_03
/
1103083a
< prev
next >
Wrap
Text File
|
1993-01-05
|
3KB
|
109 lines
#include "sim.hpp"
#include ...
#define nmbrOfPhysicians 4
#define openingHours 480.0
#define openPeriod 480.0
#define consultationLow 5.0
#define consultationHigh 20.0
#define arrivalsExpected 0.25
float treatmentPeriod(void)
{ return(fUniform(consultationLow,consultationHigh)); }
float periodBeforeNextArrival(void)
{ return(fNegexp(arrivalsExpected)); }
class clinic : public process
{public:chain lunchRoom,waitingRoom;
float closingTime,totalWaitingTime;
int totalNmbrOfPatients;
clinic(int nrOfPhysicians,float Period);
void main(void);
};
class physician : public process
{ clinic* theClinic;
public: physician(clinic* cl) {theClinic=cl;}
void main(void);
};
class patient : public process
{ clinic *theClinic;
public: float startWaitingAt,startTreatmentAt,
finishedAt;
patient(clinic* cl) {theClinic=cl;}
void main(void);
};
clinic::clinic(int nrOfPhysicians, float Period)
{ int i;
totalWaitingTime=0.0;
totalNmbrOfPatients=0;
closingTime=currentTime() + Period;
for (i=0;i<nrOfPhysicians;i++)
activate(new physician(this),currentTime());
}
void clinic::main(void)
{ patient* ptnt;
physician* phsn;
hold(periodBeforeNextArrival());
while (currentTime() < closingTime)
{ ptnt=new patient(this);
totalNmbrOfPatients++;
waitingRoom.append(ptnt);
activate(ptnt,currentTime());
if (!lunchRoom.empty())
{ phsn=(physician*)lunchRoom.
getfirst();
activate(phsn,currentTime());
}
hold(periodBeforeNextArrival());
}
}
void physician::main(void)
{ patient *ptnt;
while(1)
{ if (theClinic->waitingRoom.empty())
{ theClinic->lunchRoom.append(this);
passivate();
}
else
{ ptnt=(patient*)theClinic->waitingRoom.
getfirst();
activate(ptnt,currentTime());
hold(treatmentPeriod());
activate(ptnt,currentTime());
}
}
}
void patient::main(void)
{
startWaitingAt=currentTime();
passivate();
startTreatmentAt=currentTime();
passivate();
finishedAt=currentTime();
theClinic->totalWaitingTime+=
(startTreatmentAt-startWaitingAt);
}
void main(void)
{ clinic *clnc;
initRandom();
initProcesses();
hold(openingHours - currentTime());
activate(clnc=new clinic(
nmbrOfPhysicians,openPeriod),
currentTime());
hold(10000.0);
cout << "Total number of patients = "
<< clnc->totalNmbrOfPatients << endl;
cout << "Average waiting time = "
<< clnc->totalWaitingTime/
clnc->totalNmbrOfPatients << endl;
}