comment ¶
시간이 무한히 지나면 10대의 버스가 몰려가는 현상이 발견된다-_-
원래 이런건지 아니면 버그인지는 모르겠따;
원래 이런건지 아니면 버그인지는 모르겠따;
STL을 이용하고 함수별로 나누는 리팩토링이 필요하다 -ㅅ-
main.cpp ¶
#include <iostream>
#include <fstream>
#include <vector>
#include <windows.h> //sleep
#include <string>
#include <conio.h>
const int BusStationNo = 10; // 버스 정류장의 개수
const int BusNo = 10; // 버스의 대수
const long timerate = 1*60; // 시뮬레이터 할 때 한번 실행할 때마다 지나가는 시간
#include "class.h"
#include "function.h"
using namespace std;
void gotoxy(int x, int y);
int main()
{
BusType bus[BusNo]; //버스
int MinuteOfInterval=12*60; //버스 배차 간격 sec
long waitingPeopleInBusStation[BusStationNo] = {0,0,}; //각 정류장에서 기다리는 사람수
int IncreasePerMinute_People = 4; //버스 정류장에 사람들이 1분당 증가하는 정도
int ridingSecond = 2; //1사람이 버스에 타는데 걸리는 시간(초)
int LastMovingBusIndex=-1; //마지막 움직이기 시작한 버스의 인덱스
int LastMovingBusStartTime= -1 * MinuteOfInterval;
int i,j; //iterator
long Now=0;
while(1)
{
Now += timerate;
//버스 정류장 정보 화면에 표시하기
cout << endl << " ";
for(i=0,j=0;i<=bus->BusLanelength();++i) {
if(bus->BusStationPos(j)==i) {
gotoxy(i+j+2,1);
waitingPeopleInBusStation[j]+= timerate * (IncreasePerMinute_People/60.0);
cout << waitingPeopleInBusStation[j] ;
gotoxy(i+j+2,2);
cout << "*";
j++;
}
if(i<bus->BusLanelength()) cout << "-";
}
gotoxy(1,BusNo+3);
for(i=0;i<=bus->BusLanelength()+BusStationNo;++i ) cout<< "-";
cout << endl;
//버스 운행 시작하기, 배차간격 고려
if(bus[LastMovingBusIndex+1].ismove()==false && LastMovingBusIndex+1 <= BusNo
&& Now - LastMovingBusStartTime >= MinuteOfInterval) {
bus[LastMovingBusIndex+1].start();
LastMovingBusStartTime=Now;
LastMovingBusIndex++;
}
//버스 위치 표시하기
for(i=0;i<BusNo;++i) {
if(bus[i].isstation() != -1 ){ //버스 정류장일경우
int withdraw = zrnd(0,bus[i].getPassengers()); // 내리는 사람의 숫자
int cangetno = bus[i].getBusCapacity() - bus[i].getPassengers(); //버스에 태울수 있는 사람의 숫자
long& stationno = waitingPeopleInBusStation[bus[i].isstation()]; //버스 정류장에 있는 사람의 숫자
int ride_no =0;
//버스에서 내리기
bus[i].getPassengers(-1 * withdraw);
cangetno += withdraw;
//버스에 타기
if(stationno < cangetno){ // 태울수 있는 사람의 숫자가 더 많을 경우
ride_no=stationno;
while(timerate - ride_no * ridingSecond < 0)
ride_no--;
bus[i].getPassengers(ride_no);
waitingPeopleInBusStation[bus[i].isstation()]=stationno-ride_no;
} else { //탈수있는 사람수보다 정류장에 사람이 더 많을 경우
ride_no=cangetno;
while(timerate - ride_no * ridingSecond < 0)
ride_no--;
bus[i].getPassengers(ride_no);
stationno -= ride_no;
}
gotoxy(bus[i].getBusPos()+1,1);
cout << stationno << " ";
bus[i].movebus(timerate - ride_no * ridingSecond);
} else{ //버스 정류장이 아닐경우
bus[i].movebus();
}
gotoxy(bus[i].getBusPos()+1,i+3);
cout << i;
gotoxy(bus[i].getBusPos()+1,BusNo+4);
cout << i << endl;
}
//버스 위치 숫자 출력
for(i=0;i<BusNo;++i)
cout << i << ":" << bus[i].getBusPos() << "," << bus[i].isstation() << ", 승객수:" << bus[i].getPassengers() <<endl;
cout << Now;
//Sleep(100);
//ESC누르면 탈출
//if(getch()==27) break;
system("cls");
}
return 0;
}
void gotoxy(int x, int y)
{
COORD Pos = {x - 1, y - 1};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
class.h ¶
~cpp
class BusType
{
public:
int BusLanelength() { return busStation[BusStationNo-1]; } // 버스 노선의 총 길이를 알아 냄
int BusStationPos(int i) { return busStation[i]; } // 버스 정류장의 위치 반환
int getBusPos() { return buspos; } // 버스의 현재 위치
int pastTime(int sec) { return CurrentMinute += sec; }
void start() { movingbus=true;} // 버스를 움직이게 한다. 첫 출발할때!
double movebus(double sec = timerate) { // 버스를 sec초 동안 버스를 움직이고, 현재위치 반환
if (!ismove()) return -1; //운행중이지 않을 떄에는 움직이지 않는다.
buspos += (sec/3600.0)*KilloPerHour_Bus; //위치를 이동시키고
//버스가 모든 노선을 다돌았을 경우 처음으로 이동시킨다.
while(buspos > BusLanelength() + BusStationNo+1) buspos -= BusLanelength() + BusStationNo +1;
pastTime(sec); //시간 지연시키기
return buspos;
}
int isstation(){ //현재 버스가 있는 위치가 버스 정류장이면 TRUE
int i=0;
while(getBusPos() != busStation[i]+i+1 && i<= BusStationNo-1){
i++;
}
if(BusStationNo-1 < i) return -1; //버스정류장이 아닐경우
return i;
}
bool ismove() { return movingbus; } // 현재 운행중인가?
BusType()
{
KilloPerHour_Bus = 50.0; //버스의 속도 Km/h
MeterPerMinute_Bus = KilloPerHour_Bus * ( 1000.0 / 60.0 ); //버스의 속도 m/m
BusCapacity = 50; //버스 한대에 탈 수 있는 최대 사람수
busStation[0]=4; //시작 지점부터 각 버스 정류장 까지의 길이, 단위는 Km
busStation[1]=8;
busStation[2]=16;
busStation[3]=20;
busStation[4]=24;
busStation[5]=28;
busStation[6]=36;
busStation[7]=40;
busStation[8]=44;
busStation[9]=52;
CurrentMinute = 0; //현재 흐르 시간 sec
buspos = 0;
movingbus=false; // 현재 운행중인가?
passengers=0;
}
int getBusCapacity() { return BusCapacity;}
int getPassengers(int n=0) { return passengers+=n; }
private:
double MeterPerMinute_Bus; //버스의 속도 m/m
double KilloPerHour_Bus; //버스의 속도 Km/h
int BusCapacity; //버스 한대에 탈 수 있는 최대 사람수
int busStation[BusStationNo]; //10개의 버스 정류장, 버스 정류장의 위치를 나타낸다
long CurrentMinute; //현재 흐르 시간 sec
long DueMinute; //몇초 후의 상황을 볼것인지 입력 받는 값
//Bus buses[BusNo]; //10 대의 버스들이 운행된다.
int passengers; //현재 버스에 타고있는 승객의 숫자
double buspos; // 버스의 현재 위치
bool movingbus; // 현재 운행중인가?
};
function.h ¶
~cpp
#include <stdlib.h>
#include <time.h>
int zrnd(int start,int end)
{
int r;
srand(time(NULL));
r = rand()%(end-start+1) + start;
return r;
}










