티스토리 뷰

#include<iostream>
#include<cstdlib>
#include<time.h>
#include<Windows.h>
using namespace std;
class Rnd// 랜덤숫자를 만드는 클레스
{
private:
	int start;
	int end;        
public:
	Rnd()
	{
		start =0;end = 9;
	}	
	void setRange(int pStart, int pEnd)
	{		
		start = pStart;
		end = pEnd;
	}
	int getRNumber() 
	{
		int rn = (int)( (rand() % (end-start+1)) + start ); 
		return rn;      
	}
};
class SEQ_R//SEQ-R에대한 클래스
{
private:
	int num; // 채널 개수
	int a; // 노드 개수
	int* numarr; // 채널 배열
	int* node; // 노드 배열

public:
	SEQ_R(int x)
	{
		num=x; // 사용자가 입력한 숫자를 클레스에 입력한다.

	}
	~SEQ_R()
	{
		delete[] numarr;
		delete[] node;
	}
	void seq_rSet()
	{
		int i,j,k;
		int x;
		Rnd R;

		numarr = new int[num];

		a = num*(num+1); // 내가 입력한 숫자를 가지고 배열을 동적 할당한다.
		node = new int[a];

		R.setRange(1,num);

		for(i=0; i<num ; i++)//중복없이 사용자가 입력한수를 배열에 넣는다.
		{
			x = R.getRNumber();
			numarr[i] = x;
			for(j=0 ; j<i ; j++)
			{
				if(numarr[j] == x)
				{
					i--;
					break;
				}
			}
		}

		for(i=0,k=0 ; i<a,k<num ; i++,k++)//랜덤으로 뽑은 배열을 가지고 SEQ-R 노드를 만든다.
		{
			node[i] = numarr[k];
			for(j=0 ; j<num ; j++,i++)
			{
				if(j==0)
				{
					i++;
					node[i]=numarr[j];
				}
				else
				{
					node[i]=numarr[j];
				}
			}
			i--;
		}
	}
	void print()//기본노드를 출력한다
	{
		int i;

		for(i=0 ; i<a ; i++)
		{
			cout << " " << node[i];
		}
		cout << "\n";
	}
	int nodecompare()//SEQ-R에 대하여 두개의 노드를 만든뒤에 비교한다.
	{
		Rnd R;
		int i,j,k;

		int startTime1=0;//노드1번 배열의 시작점
		int startTime2=0;//노드2번 배열의 시작점
		int rendezvousTime=0; // 얼마나 걸렸는지 확인후 반환값
		int* ST1arr;
		int* ST2arr;

		ST1arr = new int[a];
		ST2arr = new int[a];

		R.setRange(1,a-1);// 시작점의 범위를 설정

		startTime1 = R.getRNumber();//노드1의 시작점 램덤으로 설정
		startTime2 = R.getRNumber();//노드2의 시작점 랜덤으로 설정

		for(i=0, j=startTime1 ,k=startTime2 ; i<a,j<a,k<a ; i++,j++,k++) // 노드1,2의 배열 설정
		{
			ST1arr[i]=node[j];
			ST2arr[i]=node[k];
			if(j==a-1)
			{
				j=-1;
			}
			if(k==a-1)
			{
				k=-1;
			}
			if(i==a)
			{
				break;
			}
		}
		for(i=0 ; i<a ; i++)
		{
			if(ST1arr[i] == ST2arr[i])
			{
				rendezvousTime = i+1; 
				break;
			}
		}
		return rendezvousTime;
	}
};

class DRSEQ
{
private:
	int num; // 채널 개수
	int a; // 노드 개수
	int* numarr; // 채널 배열
	int* node; // 노드 배열

public:
	DRSEQ(int x)// 사용자의 채널의 갯수를 입력받는다.
	{
		num=x;

	}
	~DRSEQ()
	{
		delete[] numarr;
		delete[] node;
	}
	void drseqSet()
	{
		int i,j;
		int e=0; // e에 해당 
		Rnd R;

		numarr = new int[num];

		a = num*2+1;// 동적 배열의 갯수를 설정한다.
		node = new int[a];

		R.setRange(1,num);
		e=R.getRNumber(); // e에 해당,e에는 난수를 넣는다. 

		for(i=0,j=1; i<num ; i++,j++)//numarr에 채널숫자를 순서대로 입력한다.
		{
			numarr[i] = j;
		}

		for(i=0 ; i<num ; i++)//node에 1~채널수 까지 입력한다.
		{
			node[i] = numarr[i];
		}

		node[i] = e;//채널수 입력다음 e(난수)를 입력한다.
		i++;
		for(j=num-1 ; j>=0 ; i++,j--)//node에 채널수~1까지 반대로 입력한다.
		{
			node[i] = numarr[j];
		}
	}
	void print()//기본노드를 출력한다.
	{
		int i;

		for(i=0 ; i<a ; i++)
		{
			cout << " " << node[i];
		}
		cout << "\n";
	}
	int nodecompare()// 시작점이 다른 두노드를 서로 비교한다.
	{
		Rnd R;
		int i,j,k;

		int startTime1=0;//노드1번의 시작점
		int startTime2=0;//노드2번의 시작점
		int rendezvousTime=0;//몇번째레 같아지는지 반환값
		int* ST1arr;
		int* ST2arr;

		ST1arr = new int[a];
		ST2arr = new int[a];

		R.setRange(1,a-1);//시작점 범위설정


		startTime1 = R.getRNumber();//노드1의 시작점 램덤으로 설정
		startTime2 = R.getRNumber();//노드2의 시작점 랜덤으로 설정

		for(i=0, j=startTime1 ,k=startTime2 ; i<a,j<a,k<a ; i++,j++,k++) // 노드1,2의 배열 설정
		{
			ST1arr[i]=node[j];
			ST2arr[i]=node[k];
			if(j==a-1)
			{
				j=-1;
			}
			if(k==a-1)
			{
				k=-1;
			}
			if(i==a)
			{
				break;
			}
		}
		for(i=0 ; i<a ; i++)
		{
			if(ST1arr[i] == ST2arr[i])
			{
				rendezvousTime = i+1; 
				break;
			}
		}

		return rendezvousTime;
	}
};
int main(void) 
{
	int x;
	int i;
	int seqr=0;
	int Ssum=0;
	double Savr=0.0;
	int dresq=0;
	int Dsum=0;
	double Davr=0.0;
	srand((unsigned int)time(NULL));

	cout << "채널의 개수를 선택하세요<3~10>: ";
	cin >> x;

	SEQ_R s(x);
	s.seq_rSet();
	DRSEQ d(x);
	d.drseqSet();
	cout << "SEQ-R 시퀸스: " ;
	s.print();
	cout << "DRSEQ 시퀸스 : ";
	d.print();

	for(i=1 ; i<1001 ; i++)
	{
		seqr=s.nodecompare();
		dresq=d.nodecompare();
		cout << "[" << i << "번째 시도] <SEQ-R, DRSEQ>=<"<<seqr<<","<<dresq<<">"<<endl;
		Ssum = Ssum + seqr;
		Dsum = Dsum + dresq;
	}
	Savr = Ssum / 1000.0;
	Davr = Dsum / 1000.0;
	cout << "SEQ-R 만나는데 걸리는 평균 : "<< Savr<<endl;
	cout << "DRESQ 만나는데 걸리는 평균 : "<< Davr<<endl;

	return 0;
}

   체널 랑데부 프로그램 개요
1. 채널의 개수 선택
2. SEQ-R  DRSEQ 시퀸스 출력
3. SER-R  DRSEQ start time에서 end time까지의 시간
rendezvous time 1000회를 측정 및 출력
4. 평균 만나는데 걸리는 시간 각각 출력

 구현한 클레스 설명
 
 Rnd 클래스는 설정한 범위 중 숫자를 난수 생성하는 기능을 가진 클래스이다.
1. 기본 생성자
- 0~9 까지 범위 초기화
2. void setRange(int pStart, int pEnd)
- 범위를 pStart~pEnd까지 설정한다.
3. int get RNumber()
- rand함수로 난수를 생성한다. 

 SEQ_R 클래스는 매개변수 생성자, 소멸자, seq_rSet(), print(),
nodecompare()로 구성 되어있다.
1. 매개변수 생성자
- 사용자가 입력한 채널의 개수를 SEQ_R 클래스에 저장한다.
2. 소멸자
- 동적할당 받은 변수를 delete 시켜준다.
3. void seq_rSet()
- SEQ-R 채널 랑데부 노드를 배열에 저장시킨다.
4. void print()
- SEQ-R 채널 랑데부 노드를 배열을 출력한다.
5. int nodecompare()
- 만들어 놓은 채널 랑데부 노드를 시작점을 달리해서 두개의 노드를 만든다.
그리고 두 노드를 비교해서 언제 만나는지 확인한 후 반환한다.
 
 DRSEQ클래스는 매개변수 생성자, 소멸자, dresqSet(), print(),
nodecompare()로 구성 되어있다.
1. 매개변수 생성자
- 사용자가 입력한 채널의 개수를 SEQ_R 클래스에 저장한다.
2. 소멸자
- 동적할당 받은 변수를 delete 시켜준다.
3. void dresqSet()
- DRESQ 채널 랑데부 노드를 배열에 저장시킨다.
e 는 랜덤으로 입력해서 확률을 높인다.
4. void print()
- DRESQ 채널 랑데부 노드를 배열을 출력 시킨다.
5. int nodecompare()
- 만들어 놓은 채널 랑데부 노드를 시작점을 달리해서 두개의 노드를 만든다.
그리고 두 노드를 비교해서 언제 만나는지 확인한 후 반환한다.

 메인함수
- 채널의 개수를 입력 받아 클래스에 입력한다
- 1000회 동안 걸리는 시간을 계산에서 평균을 출력한다.

 프로그램 실행

'IT > Back-end' 카테고리의 다른 글

[C++] Bingo game 빙고게임  (0) 2022.03.28
[C++] RFID 충돌방지기법, 질문트리 프로토콜  (0) 2022.03.28
[C++] 무선 링크 및 개수 구하기  (0) 2022.03.28
JPA와 JDBC ?  (0) 2021.04.04
c++과 JAVA(자바) 차이점?  (0) 2021.03.27
댓글
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total
Today
Yesterday
최근에 올라온 글
최근에 달린 댓글
공지사항
글 보관함