본문 바로가기
카테고리 없음

로또 함수화

by ByteBridge 2013. 2. 20.
반응형

/-
로또 6개의 숫자와 보너스 숫자를 뽑아서
수동 또는 자동으로 입력된 숫자 6개와 같은지를 검색해서
모두 같으면 1등 
5개가 같고 보너스와 나머지 1개가 일치하면 2등으로 처리 
나머지는 꽝..
단/ 중복수는 처리되지 않게
1/2 , 1/3 , 1/4, 1/5, 1/6
2/3,  2/4, 2/5, 2/6
3/4,  3/5 , 3/6
4/5, 4/6
5/6
*-
#include <iostream>
#include <ctime> //< time.h
#include <windows.h>
using namespace std;
//< 메뉴 출력 
void OutputMenu( void );
//< 선택 입력 
int InputSelect( void );
//< 범위 검사
bool CheckScopeNumber( int nCheckNumber , int nMinNumber, int nMaxNumber );
//< 중복 체크
bool CheckDuplication( int* pArray, int nArraySize );
//< 당첨 확인
int CheckJackpot( int* pUserArray, int nUserArraySize, 
int* pComArray, int nComArraySize );
//< 섞기
void Shuffle( int* pLottoArray, int nLottoArraySize );
//< 바꾸기
void Swap( int* pDest, int* pSrc );
//< 당첨 개수 확인 
int LottoEqualNumberCount( int* pUserArray, int nUserArraySize, 
  int* pComArray, int nComArraySize );
//< 수동 번호 입력
bool UserSelectNumber( int* pUserArray, int nUserArraySize );
//< 자동 번호 입력
bool UserAutoSelectNumber( int* pUserArray, int nUserArraySize );
int main(void)
{
//< 변수 선언 
//< comNumber, UserNumber , 숫자 입력 여부(bool)
int nUser[6];
int nCom[45];
//< 랜덤 시드 설정 
srand((unsigned int)time(0));
for( int i = 0 ; i < 45 ; i++ )
{
nCom[i] = i + 1;
}
//< 반복
while( true )
{
Shuffle( nCom , 45 );
system("cls");
int nSelectMenuNumber = -1;
//< 메뉴 출력 
OutputMenu();
//< 유저 선택 입력
nSelectMenuNumber = InputSelect();
//< 메뉴에 따른 처리 
if( nSelectMenuNumber == 0 )
{
cout <<"꺼져!!"<<endl;
break;
}
switch( nSelectMenuNumber )
{
//< 유저 숫자 입력
case 1: //< 수동 입력
{
//< 수동뽑기
UserSelectNumber( nUser, 6 );
//< 당첨 확인
CheckJackpot( nUser, 6, nCom, 7);
}
break;
case 2: //< 자동 입력
{
//< 자동
UserAutoSelectNumber( nUser, 6);
//< 당첨확인
CheckJackpot( nUser, 6, nCom, 7 );
}
}
cout << endl;
Sleep( 200 );
}
return 0;
}
//< 메뉴 출력 
void OutputMenu( void )
{
//< 메뉴 출력 
cout <<"1: 수동입력" << endl;
cout <<"2: 자동입력" << endl;
cout <<"0: 종료" << endl;
cout <<"선택:";
}
//< 선택 입력 
int InputSelect( void )
{
int nInput;
cin >> nInput;
return nInput;
}
//< 범위 검사
bool CheckScopeNumber( int nCheckNumber , int nMinNumber, int nMaxNumber )
{
//< 두수확인 ( 작은수와 큰수가 바꼈는지 확인 )
if( nMaxNumber < nMinNumber )
{
//< 바꼇으면 다시 바꾸기 
Swap(&nMinNumber,&nMaxNumber);
}
//< 범위 체크
if( nMinNumber <= nCheckNumber && nCheckNumber <= nMaxNumber )
{
return true;
}
return false;
}
//< 중복 체크
bool CheckDuplication( int* pArray, int nArraySize )
{
//< 널포인터 인지 체크
if( pArray == NULL )
{
return false;
}
//< 중복 체크
for( int i = 0 ; i < nArraySize ; i++ )
{
for( int j = 0 ; j < nArraySize ; j++ )
{
//< 같은 인덱스 처리 안하기
if( i == j )
{
continue;
}
//< 중복
if( pArray[i] == pArray[j] )
{
return true;
}
}
}
//< 결과 반환
return false;
}
//< 당첨 확인 1/ 2/ 0
int CheckJackpot( int* pUserArray, int nUserArraySize, 
 int* pComArray, int nComArraySize )
{
//< 포인터 확인 (유저와 컴)
if( pUserArray == NULL || pComArray == NULL )
{
return false;
}
cout <<"당첨 번호 : ";
for( int i = 0 ; i < nComArraySize ; i++ )
{
if( i != 6 )
{
cout << pComArray[i] << " , ";
}
else
{
cout <<"\t보너스번호 : " << pComArray[i] <<endl;
}
Sleep(100);
}
//< 당첨개수 확인
int nEqualCount = LottoEqualNumberCount( pUserArray, nUserArraySize ,
pComArray, nComArraySize );
//< 등수 판별
switch( nEqualCount )
{
case 6:
{
cout <<"1등" << endl;
Sleep(500);
return 1;
}
break;
case 5:
{
bool bBonus = false;
//< 보너스 확인
for( int i = 0 ; i < nUserArraySize ; i++ )
{
if( pUserArray[i] == pComArray[nComArraySize-1]) 
{
//< 플래그 처리 
bBonus = true;
break;
}
}
if( bBonus == true )
{
cout <<"2등" << endl;
Sleep(500);
return 2;
}
else
{
cout <<"3등" << endl;
Sleep(500);
return 3;
}
}
break;
}
return 0;
}
//< 섞기
void Shuffle( int* pLottoArray, int nLottoArraySize )
{
//< 포인터 화인
if( pLottoArray == NULL )
{
return;
}
//< 지정된 횟수만큼 섞기
for( int i = 0 ; i < 100 ; i++ )
{
int nDest = rand()%nLottoArraySize;
int nSrc = rand()%nLottoArraySize;
//< 바꾸기
Swap( &pLottoArray[nDest] , &pLottoArray[nSrc] );
}
}
//< 바꾸기
void Swap( int* pDest, int* pSrc )
{
//< 포인터 확인
if( pDest == NULL || pSrc == NULL )
{
return;
}
//< 두수 바꾸기
int nTemp = *pDest;
*pDest = *pSrc;
*pSrc = nTemp;
}
//< 당첨 개수 확인 
int LottoEqualNumberCount( int* pUserArray, int nUserArraySize, 
  int* pComArray, int nComArraySize )
{
//< 포인터 확인
if( pUserArray == NULL || pComArray == NULL )
{
return 0;
}
//< 중복개수 확인
int nEqualCount = 0;
for( int i = 0 ; i < nUserArraySize ; i++ )
{
for( int j = 0 ; j < nUserArraySize ; j++ )
{
if( pUserArray[i] == pComArray[j] )
{
nEqualCount++;
break;
}
}
}
//< 중복개수 반환
return nEqualCount;
}
//< 수동 번호 입력
bool UserSelectNumber( int* pUserArray, int nUserArraySize )
{
//< 포인터 확인
if( pUserArray == NULL )
{
return false;
}
//< 유저선택만큼 중복없이 입력
while( true )
{
for( int i = 0 ; i < nUserArraySize ; i++ )
{
cout << i + 1 << "번째 숫자 입력 : ";
cin >> pUserArray[i];
}
bool bDuplication = CheckDuplication( pUserArray , nUserArraySize );
if( bDuplication == false )
{
break;
}
cout <<"중복있다..다시해" << endl;
}
//< 결과 리턴
return true;
}
//< 자동 번호 입력
bool UserAutoSelectNumber( int* pUserArray, int nUserArraySize )
{
//< 포인터 확인
if( pUserArray == NULL )
{
return false;
}
//< 유저선택만큼 중복없이 입력
while( true )
{
for( int i = 0 ; i < nUserArraySize ; i++ )
{
pUserArray[i] = rand () % 45;
}
bool bDuplication = CheckDuplication( pUserArray , nUserArraySize );
if( bDuplication == false )
{
break;
}
}
//< 결과 리턴
return true;
}

반응형