U E D R , A S I H C RSS

Bus Simulation/�협

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



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:39
Processing time 0.0055 sec