분기문

int main()
{
	if (isDead)
		cout << "몬스터를 처치했습니다." << endl;

	if (isDead)
		cout << "몬스터를 처치했습니다." << endl;
	else
	{
		if (hp <= 20)
			cout << "몬스터가 도망가고있습니다." << endl;
		else
			cout << "몬스터가 반격했습니다." << endl;
	}

	if (isDead)
		cout << "몬스터를 처치했습니다." << endl;
	else if (hp <= 20)
		cout << "몬스터가 도망가고있습니다." << endl;
	else
		cout << "몬스터가 반격했습니다." << endl;
}

실행문이 여러개인 경우 중괄호로 묶어서 사용
if문이 중첩될 경우 if-elseif문으로 가독성을 향상시킬 수 있음

int main()
{
	const int ROCK = 0;
	const int PAPER = 1;
	const int SCISSORS = 2;

	int input = 40;

	if (input == ROCK)
		cout << "바위를 냈습니다." << endl;
	else if (input == PAPER)
		cout << "보를 냈습니다." << endl;
	else if (input == SCISSORS)
		cout << "가위를 냈습니다." << endl;
	else
		cout << "뭘 낸겁니까?" << endl;

	switch(input)
	{
		case ROCK:
			cout << "바위를 냈습니다." << endl;
			break;
		case PAPER:
			cout << "보를 냈습니다." << endl;
			break;
		case SCISSORS:
			cout << "가위를 냈습니다." << endl;
			break;
		default:
			cout << "뭘 낸겁니까?" << endl;
	}
}

조건문이 여러개인 경우 `switch-case-break`문을 사용할 수도 있음    

반복문

int main()
{
	int count = 0;

	while (count < 5)
	{
		cout << "Hello World" << endl;
		count++;
	}

	do
	{
		cout << "Hello World" << endl;
		count++;
	} while (count < 5);
}

무한루프 발생에 주의
do-while문은 조건식이 참이 아니더라도 최소한 한번은 실행문을 실행함

for (int count = 0; count < 5; count++)
{
	cout << "Hello World" << endl;
}

whilefor문은 기능적으로 완벽하게 호환 가능함

int main()
{
	int round = 1;
	int hp = 100;
	int damage = 10;

	while (true)
	{
		hp -= damage;
		if (hp < 0)
			hp = 0;
		cout << "Round " << round << " 몬스터 체력" << hp << endl;

		if (hp == 0)
		{
			cout << "몬스터 처치!" << endl;
		}

		if (round == 5)
		{
			cout << "제한 라운드 종료" << endl;
			break;
		}
	}

	for (int count = 1; count <= 10; count++)
	{
		bool isEven = ((count % 2) == 0);
		if (isEven)
			continue;
		cout << count << endl;
	}
}

breakcontinue로 반복문의 제어가 가능함


연습문제 (별찍기와 구구단)

// exercise1

#include <iostream>
using namespace std;

int main()
{
	int n;

	cout << "정수 입력 : ";
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
			cout << '*';
		cout << endl;
	}
}
// exercise2

#include <iostream>
using namespace std;

int main()
{
	int n;

	cout << "정수 입력 : ";
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j <= i; j++)
			cout << '*';
		cout << endl;
	}
}
// exercise3

#include <iostream>
using namespace std;

int main()
{
	int n;

	cout << "정수 입력 : ";
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		for (int j = n; j > i; j--)
			cout << '*';
		cout << endl;
	}
}

가위바위보

// rokc-scissors-paper

#include <iostream>
using namespace std;

void pr(int n);
void win_p(int win, int total);

int main()
{
	int you, com;
	int win = 0, total = 0;

	while(1)
	{
		srand(time(0));

		cout << "가위(1) 바위(2) 보(3) 골라주세요!\n";
		cout << "현재 승률 : ";
		win_p(win, total);

		cin >> you;
		if (!(you >= 1 && you <= 3))
		{
			cout << "잘못된 값을 입력하였습니다. 프로그램을 종료합니다.\n";
			break;
		}

		com = 1 + rand() % 3;
		if (you == com)
		{
			pr(you);
			cout << "(님) vs ";
			pr(com);
			cout << "(컴퓨터)" << " 비겼습니다.\n";
		}
		else if (you == com % 3 + 1)
		{
			pr(you);
			cout << "(님) vs ";
			pr(com);
			cout << "(컴퓨터)" << " 이겼습니다.\n";
			win++;
		}
		else
		{
			pr(you);
			cout << "(님) vs ";
			pr(com);
			cout << "(컴퓨터)" << " 졌습니다.\n";
		}
		total++;
	}
}

void pr(int n)
{
	const int SCISSORS = 1;
	const int ROCK = 2;
	const int PAPER = 3;
	switch(n)
	{
		case SCISSORS:
			cout << "가위";
			break;
		case ROCK:
			cout << "바위";
			break;
		case PAPER:
			cout << "보";
			break;
	}
}

void win_p(int win, int total)
{
	if (total == 0)
		cout << "없음\n";
	else
		cout << win * 100 / total << endl;
}

열거형

enum
{
	ENUM_SCISSORS,
	ENUM_ROCK,
	ENUM_PAPER
};

열거형으로 여러 상수들을 한번에 정의할 수 있음
const와는 달리 초기값 설정이 필요하지 않으며, 초기값이 지정되지 않았을 시 첫 값을 0으로 둠
두번째 값부터는 이전 값 + 1으로 정의됨

const로 상수를 정의할 경우, 경우에 따라 해당 상수들이 메모리에 저장되어 메모리 공간이 낭비될 수 있음
열거형으로 상수를 정의한 경우 메모리 공간을 차지하지 않음

#define DEFINE_SCISSORS 1
#define DEFINE_TEST cout << "Hello World" << endl;

#은 전처리 지시문을 나타냄
#define은 매크로를 만드는 키워드로, 선언한 매크로를 전처리 과정에서 통째로 대체함
사용 우선순위는 가장 낮으며 권장되지 않음