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 ¶
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 ¶
#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; }