~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(); }