~cpp
//BusSimulation.h
/* 는 모 는 Meter minute .
받는 Km Hour, Minute 등 받는.*/
class Bus {
private:
int m_people; // 는 람
double m_velocity; // K/m
long m_Minute; // 부 러
int m_currentDistance; // 부 몇 Meter 는 리
int m_totalSectionLength; // 는 km
public:
Bus();
void SetVelocity(double v) {m_velocity=v;}; // 를 .
void SetMinute(int m) {m_Minute=m;}; // 부 른
void IncreasePassenger(int n) {m_people+=n;}; //를 .
void IncreaseMinute(int t) ; // .
long GetMinute() {return m_Minute;}; //() 리.
int GetDistance() {return m_currentDistance;}; //리(미) 리.
int GetPeopleNumber() {return m_people;}; //람를 리.
void IncreaseDistance(double n) {m_currentDistance+=n;}; // 부 리를 .
};
Bus::Bus()
{
m_people=0;
m_velocity=0; // K/m
m_Minute=0;
m_currentDistance=0;
m_totalSectionLength = 52; // 는 리 52km
}
void Bus::IncreaseMinute(int t) // 부.. 는 벤는 른 데 끼 른
{ // 벤를 는 보면 .
m_Minute+=t; //
IncreaseDistance(t*((m_velocity*1000)/60)); // 리
if(m_currentDistance>=m_totalSectionLength*1000) // 는 노 리
{ //는 벤 떻 .
// 리 55km 노리 50km면 5km.변
// 됨.
m_currentDistance= m_currentDistance%(m_totalSectionLength*1000);
m_people=0; // 람 내림.
}
}
class BusSimulation {
private:
double m_MeterPerMinute_Bus; // m/m
double m_KilloPerHour_Bus; // Km/h
int m_IncreasePerMinute_People; // 람들 1 는
int m_MinuteOfInterval; // 배
int m_ridingSecond; //1람 는데 리는 ()
int m_BusCapacity; // 대 는 대 람
Bus m_buses[10]; //10 대 들 .
int m_busStation[10]; // 10
long m_CurrentMinute; // 르
long m_DueMinute; //몇 볼 받는
long m_waitingPeopleInBusStation[10]; // 리는 람
public:
BusSimulation(); // 들
void Process(); //
void PrintResult(); //
void IncreaseTime(); //1 만 러
void CheckBusStation(); // 는
void StationStopProcess(Bus &CheckedBus, int Station); //
//루 들 리는
};
//BusSimulation.cpp
#include <iostream>
using namespace std;
#include "BusSimulation.h"
/* 3/1 내린 */
BusSimulation::BusSimulation()
{
m_KilloPerHour_Bus = 24; // 24km/h
m_MeterPerMinute_Bus = (m_KilloPerHour_Bus*1000)/60; // m/m
m_IncreasePerMinute_People = 5; // 람
m_MinuteOfInterval = 15; //배 15
m_CurrentMinute = 0; //0부
m_ridingSecond = 1;
m_BusCapacity = 100;
for(int i=0;i<10;i++)
{
m_waitingPeopleInBusStation[i] = 0;
}
for(i=0;i<10;i++)
m_buses[i].SetVelocity(m_KilloPerHour_Bus);
m_busStation[0]=4; // 부 , 는 Km
m_busStation[1]=8;
m_busStation[2]=16;
m_busStation[3]=20;
m_busStation[4]=28;
m_busStation[5]=24;
m_busStation[6]=36;
m_busStation[7]=40;
m_busStation[8]=44;
m_busStation[9]=52;
}
void BusSimulation::Process() //모 벤들 만는 메
{
m_buses[0].SetMinute(1); // 0번 만.
while(m_CurrentMinute!=m_DueMinute) // 목 .
IncreaseTime();
}
void BusSimulation::PrintResult() //
{
cout<<"Bus Simulation\n";
cout<<"는 몰 ? 를 !\n";
cout<<" : "<<m_KilloPerHour_Bus<<"K/m\t"
<<" 람 는 : "<<m_IncreasePerMinute_People<<"\n";
cout<<"몇 보? \n";
cout<<" : ";
int hour;
cin>>hour;
cout<<" : ";
int minute;
cin>>minute;
m_DueMinute = hour*60 + minute;
Process();
cout<<" . \n";
for(int i=0;i<10;i++)
{
cout<<i+1<<"번 ( 부) : "<<m_buses[i].GetDistance()
<<"Meter\t"<<" : "<<m_buses[i].GetPeopleNumber()<<"\n";
}
}
void BusSimulation::IncreaseTime() //모 벤들 면 므 메는 른 모 벤들
{ //는 는 벤 . 멈면 떤 벤
// 는는 보면 .
m_CurrentMinute++; //먼 .
for(int i=0;i<10;i++) //0~9번 ...
{
if(m_buses[i].GetMinute()!=0) // 부 0 면..
m_buses[i].IncreaseMinute(1); // 면,
if(i!=0 && m_buses[i-1].GetMinute()==m_MinuteOfInterval) // 15
m_buses[i].IncreaseMinute(1); // 부 1 만듬. 부
// 볼
}
for(int j=0;j<10;j++)
m_waitingPeopleInBusStation[j] += 1; //모 리는 람를 .
CheckBusStation(); // 는
}
void BusSimulation::CheckBusStation()
{
for(int i=0;i<10;i++) //0~9번
{
for(int j=0;j<10;j++) //0~9번
if(m_buses[i].GetDistance()==(m_busStation[j]*1000)) //는 본
StationStopProcess(m_buses[i],j); // 는 벤들
//는 메를
}
}
void BusSimulation::StationStopProcess(Bus &CheckedBus, int Station)
{
int decreaseNumber = int(CheckedBus.GetPeopleNumber()/4);
CheckedBus.IncreasePassenger(-(decreaseNumber));
int peopleCount = m_waitingPeopleInBusStation[Station];
int sum = peopleCount+CheckedBus.GetPeopleNumber();
int real_passenger=0;
if(sum>=m_BusCapacity)
{
real_passenger = m_BusCapacity-CheckedBus.GetPeopleNumber();
m_waitingPeopleInBusStation[Station]-=real_passenger;
}
else
{
real_passenger = m_waitingPeopleInBusStation[Station];
m_waitingPeopleInBusStation[Station] = 0;
}
CheckedBus.IncreasePassenger(real_passenger);
int consumptionTime = real_passenger*((m_ridingSecond)/60);
for(int k=0;k<10;k++)
{
if(m_buses[k].GetMinute()!=0)
m_buses[k].IncreaseMinute(consumptionTime);
}
}
void main()
{
BusSimulation ex;
ex.PrintResult();
}