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