분기문
데이터를 메모리에 할당하고 가공하는 방법에 대해 알아 봤다. 그런데 가공한 데이터를 이용해서 무언가를 하고 싶다면?? 어떤 방법을 써야할까??
가령 예를 들어서 플레이어가 몬스터를 죽였을 때, 경험치를 획득하는 코드를 짠다고 해보자.
#include <iostream>
using namespace std;
// 데이터를 메모리에 할당하고 가공하는 방법에 대해 알아봄
// 가공한 데이터를 이용해서 무언가를 하고 싶다면??
int main()
{
#pragma region 분기문
int hp = 100; // 몬스터 Hp
int damage = 100; // 플레이어 데미지
hp -= damage; // 피격 판정
bool isDead = hp <= 0; // 처치 판정
// 몬스터가 죽었으면 경험치 추가
// 어셈블리에서 CMP JMP 한것과 비슷하다.
#pragma endregion
}
여기서 사용해야할 건 바로 if 라는 분기문이다.
#include <iostream>
using namespace std;
// 데이터를 메모리에 할당하고 가공하는 방법에 대해 알아봄
// 가공한 데이터를 이용해서 무언가를 하고 싶다면??
int main()
{
#pragma region 분기문
int hp = 100; // 몬스터 Hp
int damage = 100; // 플레이어 데미지
hp -= damage; // 피격 판정
bool isDead = hp <= 0; // 처치 판정
// 몬스터가 죽었으면 경험치 추가
// 어셈블리에서 CMP JMP 한것과 비슷하다.
if (isDead)
cout << "몬스터를 처치했습니다" << endl;
if (!isDead)
cout << "몬스터가 반격했습니다" << endl;
#pragma endregion
}
이렇게 어셈블리에서 CMP 한것 처럼 분기를 나누어서 가공한 데이터를 처리할 수 있게된다. 다만 isDead가 true일 경우 밑의 if이 당연히 실행된다. 그 말은 두 개의 코드를 하나로 합칠 수 있다.
else를 사용해서 처리한다.
#include <iostream>
using namespace std;
// 데이터를 메모리에 할당하고 가공하는 방법에 대해 알아봄
// 가공한 데이터를 이용해서 무언가를 하고 싶다면??
int main()
{
#pragma region 분기문
int hp = 100; // 몬스터 Hp
int damage = 100; // 플레이어 데미지
hp -= damage; // 피격 판정
bool isDead = hp <= 0; // 처치 판정
// 몬스터가 죽었으면 경험치 추가
// 어셈블리에서 CMP JMP 한것과 비슷하다.
if (isDead)
cout << "몬스터를 처치했습니다" << endl;
else
cout << "몬스터가 반격했습니다" << endl;
#pragma endregion
}
또 한번에 여러 조건을 검사해야할 때가 있다. 그때는 else if 문을 추가로 사용해 처리할 수 있다.
#include <iostream>
using namespace std;
// 데이터를 메모리에 할당하고 가공하는 방법에 대해 알아봄
// 가공한 데이터를 이용해서 무언가를 하고 싶다면??
int main()
{
#pragma region 분기문
int hp = 100; // 몬스터 Hp
int damage = 100; // 플레이어 데미지
hp -= damage; // 피격 판정
bool isDead = hp <= 0; // 처치 판정
// 몬스터가 죽었으면 경험치 추가
// 어셈블리에서 CMP JMP 한것과 비슷하다.
if (isDead)
cout << "몬스터를 처치했습니다" << endl;
else if (hp <= 20) {
cout << "몬스터가 도망칩니다" << endl;
}
else
cout << "몬스터가 반격했습니다" << endl;
#pragma endregion
}
그렇다면 만약 가위바위보 게임을 만든다고 해보자.
if else를 잘 이용하면 분명 구현할 수 있을 것이다. 그러나 매우 반복적인 코드르 반복해야할 것이다. 그래서 이용할 것은 바로 switch-case 문이다.
switch(조건) 을 하면 그 조건에 따라 결과를 표출한다.
#include <iostream>
using namespace std;
// 데이터를 메모리에 할당하고 가공하는 방법에 대해 알아봄
// 가공한 데이터를 이용해서 무언가를 하고 싶다면??
int main()
{
#pragma region 분기문
const int ROCK = 0;
const int PAPER = 1;
const int SCISSORS = 2;
int input = ROCK;
switch (input)
{
case ROCK:
cout << "바위를 냈습니다" << endl;
break;
case PAPER:
cout << "보를 냈습니다" << endl;
break;
case SCISSORS :
cout << "가위를 냈습니다" << endl;
break;
default:
cout << "뭐를 낸거야?" << endl;
break;
}
#pragma endregion
}
if-else문과 switch-case문의 어셈블리 값을 뜯어보면 알겠지만 둘의 코드가 매우 비슷하다. 즉, 성능 차이가 크게 나진 않는다. 직접 어셈블리를 까보길 바란다.
반복문
어셈블리에서는 loop나 cmp jmp를 조합하여 특정 조건까지 반복해서 동작하게끔 만들 수 있었다. C++에서도 그러한 기능이 있는 키워드가 있다.
첫 번째는 While이다.
#include <iostream>
using namespace std;
// 데이터를 메모리에 할당하고 가공하는 방법에 대해 알아봄
// 가공한 데이터를 이용해서 무언가를 하고 싶다면??
int main()
{
#pragma region 반복문
// while
// 하지만 한 번만 실행하는게 아니라 특정 조건까지 계속 반복해야하는 상황
// ex) 목적지에 도달할 때 까지 ~ 계속 이동하라
int count = 0;
while (count < 5)
{
cout << "Hello, World" << endl;
count++;
}
// 한번이라도 코드를 실행한다
do
{
cout << "Hello, World" << endl;
} while (count < 5);
#pragma endregion
}
while 문을 사용해 웬만한 것을 표현할 수 있을것이다. 그런데 이렇게 보면 아쉬운게 있다. 바로 count를 초기화 하는것과 조건을 분별하는 것과 count를 증가하는것과 실행할 코드가 약간 정보가 떨어져 있어, 가독성이 안좋은 것을 확인 할 수 있다. 그래서 이용할 수 있는 것은 for문이다.
#include <iostream>
using namespace std;
// 데이터를 메모리에 할당하고 가공하는 방법에 대해 알아봄
// 가공한 데이터를 이용해서 무언가를 하고 싶다면??
int main()
{
#pragma region 반복문
// while
// 하지만 한 번만 실행하는게 아니라 특정 조건까지 계속 반복해야하는 상황
// ex) 목적지에 도달할 때 까지 ~ 계속 이동하라
for (int count = 0; count < 5; count++) {
cout << "Hello, World" << endl;
}
#pragma endregion
}
연습 문제
별찍기
유저들이 어떤 정수를 입력하면 n *n개의 별을 찍어라.
#include <iostream>
using namespace std;
int main()
{
int num;
cin >> num;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num; j++) {
cout << "*";
}
cout << endl;
}
}
별찍기 2
1개부터 시작해서 순차적으로 줄 마다 증가하게 수정해라.
#include <iostream>
using namespace std;
int main()
{
int num;
cin >> num;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < i + 1; j++) {
cout << "*";
}
cout << endl;
}
}
별찍기 3
N개부터 시작해서 줄마다 1개씩 줄어드는 형태로 수정해라.
#include <iostream>
using namespace std;
int main()
{
int num;
cin >> num;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num -i; j--) {
cout << "*";
}
cout << endl;
}
}
'C++ > 기초' 카테고리의 다른 글
[C++] 함수 (1) | 2023.11.24 |
---|---|
[C++] 코드의 흐름 제어 - 2 (가위-바위-보, 열거형) (1) | 2023.11.23 |
[C++] 데이터 가지고 놀기 - 2 (데이터 연산, const) (0) | 2023.11.23 |
[C++] 데이터 가지고 놀기 - 1 (정수, 불리언, 부동소수점, 문자열) (1) | 2023.11.22 |
[Assemble] SASM - 5 (1) | 2023.11.21 |