C, C++

20/02/10 C++공부

1can 2021. 2. 10. 12:56

열거체, switch문과 반복문, 

enum 열거체의 실용적 의미(플래그)

system()함수, system("pause"), system("cls")

rand()함수의 중복확률존재

들을 알았다. 난수 발생은 rand()로 하지말라고 하는데

난수 발생 알고리즘이나 코드를 심화 학습해봐야겠다.

더보기

#include <iostream>
#include <time.h>
using namespace std;

/*열거체 : 연속된 숫자에 이름을 부여할 수 있는 기능
enum 열거체형 {}의 형태
열거체명을 이용해서 열거체 타입의 변수를 선언도 가능하다.
즉, 열거체 자체가 사용자정의 변수 타입이 될 수도 있다.
열거체는 숫자에 이름을 붙여주는 기능이다.
*/
enum NUM {
NUM_0, //아무것도 부여하지 않을 경우 0부터 1씩 차레로 값이 부여
NUM_1,
NUM_2,
NUM_3
};
// 전처리기 #define
#define NUM_4 4

enum SRP
{
SRP_S = 1,
SRP_R,
SRP_P,
SRP_END
};
int main()
{
/*
switch 문 : 분기문의 한 종류이다. if문이 조건을 체크하는 분기문이라면
switch 문은 값이 뭔지를 체크하는 분기문이다.
형태 : switch(변수) {}의 형태, 코드블럭 안에는 case break 구문이 들어감
*/
int iNumber;
cout << "숫자를 입력하세요 : ";
cin >> iNumber;

switch (iNumber) {
case NUM_1:
cout << "입력한 숫자는 1입니다." << endl;
break; // break를 만나게 되면 switch문을 빠져나감

case NUM_2:
cout << "입력한 숫자는 2입니다." << endl;
break; // break를 만나게 되면 switch문을 빠져나감
case NUM_3:
cout << "입력한 숫자는 3입니다." << endl;
break; // break를 만나게 되면 switch문을 빠져나감
case NUM_4:
cout << "입력한 숫자는 4입니다." << endl;
break; // break를 만나게 되면 switch문을 빠져나감
default: //case로 지정되어 있지 않은 숫자
cout << "그 외의 숫자입니다" << endl;

}

//열거체 타입의 변수를 선언했다.
//열거체 타입 변수는 무조건 4byte를 차지한다.
//열거체를 이용해서 선언한 변수는 값의 표현 범위가
//열거체에 나열된 값들 안에서 선택해서 사용한다.
NUM eNum;
//sizeof(타입or변수) 메모리 크기 구해줌.
cout << sizeof(NUM) << endl;
//typeid(타입or변수).name()을 하게 되면 typeid 안에
//들어간 타입 혹은 변수의 타입을 문자열로 반환해준다.
cout << typeid(eNum).name() << endl;

/*
반복문 : 특정 작업을 반복해서 수행해주는 기능이다.
종류 : for, while, do while, 3종류
while(조건식) {}의 형태
*/
iNumber = 0;
while (iNumber < 10) {
cout << iNumber << endl;
++iNumber;

if (iNumber == 4)
break;
}

//화면을 깨끗히 지워준다.
system("cls");
//가위바위보 게임
//난수테이블 생성
srand((unsigned int)time(NULL));
int iPlayer, iAI;
while (true)
{
cout << "1. 가위" << endl;
cout << "2. 바위" << endl;
cout << "3. 보" << endl;
cout << "4. 종료" << endl;
cout << "메뉴를 선택하세요 : ";
cin >> iPlayer;
//예외 처리
if (iPlayer < SRP_S || iPlayer > SRP_END)
{
cout << "잘못된 값을 입력하였습니다." << endl;
//프로그램 일시 정지
system("pause");
continue;
}

else if (iPlayer == SRP_END)
break;

//봇이 선택을 한다.
iAI = rand() % 3 + SRP_S;

switch (iAI)
{
case SRP_S:
cout << "AI : 가위" << endl;
break;
case SRP_R:
cout << "AI : 바위" << endl;
break;
case SRP_P:
cout << "AI : 보" << endl;
break;
}

int iWin = iPlayer - iAI;

if (iWin == 1 || iWin == -2)
cout << "Player 승리" << endl;
else if (iWin == 0)
cout << "비김" << endl;
else
cout << "AI 승리" << endl;

system("pause");
}
/*
for(int i=0; i< 100; ++i)
{
}
*/

/*
for문: 반복문의 한 종류이다.
형태 : for(초기값; 조건식; 증감값) {}의 형태
조건식이 true이면 코드블럭의 코드가 동작
for(;;){}을 해주면 무한으로 돌아감
잘알아서 생략
*/

/*
배열 : 여러개의 변수를 한번에 생성해줄 수 있는 기능
형태 : 변수타입 배열명[개수];의 형태로 선언
특징 : 배열은 연속된 메모리 블럭ㅇ 공간이 할당된다.
*/

//배열 뿐만 아니라 일반 변수들도 선언을 하고 초기화하지 않을 경우
//쓰레기 값이 들어가게 도니다.
int iArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
iArray[1] = 1234;
cout << iArray[5] << endl;

/*
배열 개수를 2개 지칭하면 이채원배열 3개 지정하면 3차원 배열
*/
int iArray2[10][10] = { {1,2,3},{4,5,6} };

system("cls");
srand((unsigned int)time(NULL));
//Lotto Program
int iLotto[45] = {};

for (int i = 0; i < 45; ++i)
{
iLotto[i] = i + 1;
}

// swap 알고리즘
int iNum1 = 1, iNum2 = 2, iNum3;
iNum3 = iNum1;
iNum1 = iNum2;
iNum2 = iNum3;

//Shuffle
int iTemp, idx1, idx2;
//100번정도 골고루 섞어준다.
for (int i = 0; i < 100; ++i)
{
idx1 = rand() % 45;
idx2 = rand() % 45;

iTemp = iLotto[idx1];
iLotto[idx1] = iLotto[idx2];
iLotto[idx2] = iTemp;
}
for (int i = 0; i < 6; ++i)
{
cout << iLotto[i] << '\t';
}
cout << "보너스번호 : " << iLotto[6];
}