Programming/C, C++

코딩 자율 학습단 7일차 - switch

주눅 2024. 7. 1. 02:30

 

바로 시작!!!!!!!


 

4장의 마지막에서 배울 것은 바로 switch문인데,

그 전에 먼저 난수의 개념을 배운다. 

 

C언어에서는 난수를 생성할 때 rand()라는 함수를 사용한다.

rand()함수를 사용하기 위해서는 time.h, stdlib.h 파일을 추가할 필요가 있다.

 

다음과 같이 전처리기 지시문을 사용해 프로그램에 헤더 파일을 추가한다.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(void) {
	return 0;
}

 

rand() 함수는 다음과 같은 형식으로 사용한다.

rand() & 어떤 수;

 

여기서 어떤 수란, 내가 뽑고 싶은 숫자의 범위를 지정하는 역할을 한다.

숫자 3개 중에서 하나를 고른다면, 어떤 수에 3을 적으면 된다.

 

rand() % 3; //0~2

 

이렇게 코드를 작성할 경우,

컴퓨터가 0, 1, 2의 세가지 숫자 중 무작위 하나를 선택하게 된다.

 

시작하는 숫자가 0이 아닌 1이라는 점을 꼭 알아둬야 하는데,

수를 1부터 세길 원한다면 앞의 문장에 1을 더해주면 된다.

 

rand() % 3 + 1; //1~3

 

또, 난수를 뽑기 전에는 항상 초기화를 해줘야 하는데,

초기화해주지 않으면 난수가 제대로 생성되지 않는다.

 

난수의 초기화는 난수를 생성하는 코드의 위에 작성한다.

srand(time(NULL));
rand() % 3 + 1; //1~3

 

 

다음 예제를 통해 난수의 초기화에 대해 실제로 알아보겠다.

우선, 다음과 같이 예제를 작성한다.

 

#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main(void) {
	printf("난수 초기화 이전...\n");
	
	for (int i = 0; i < 10; i++) {
		printf("%d", rand() % 10);
	}

	return 0;
}

실행 결과

 

실행 결과, 숫자가 무작위로 선택되었다.

하지만 해당 코드를 다시 실행하더라도 여전히 같은 숫자가 나오게 된다.

난수 초기화를 해야하는 이유가 바로 이것이다.

 

코드를 살짝 수정해서 다시 실행해보겠다.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main(void) {
	printf("난수 초기화 이전...\n");
	
	for (int i = 0; i < 10; i++) {
		printf("%d", rand() % 10);
	}

	srand(time(NULL)); //난수 초기화
	printf("\n\n난수 초기화 이후... \n");
	for (int i = 0; i < 10; i++) {
		printf("%d", rand() % 10);
	}

	return 0;
}

실행 결과

 

실행 결과, 제대로 난수가 선택되었다는 것을 알 수 있다.

이처럼 난수를 제대로 생성하려면 난수를 먼저 초기화 한 이후에 rand() 함수를 사용해야 한다.

 


이어서 switch 문에 대해 알아본다.

 

이를 위해 예제를 작성하는데, 컴퓨터가 가위, 바위, 보 중 하나를 뽑는 게임이다.

가위는 0, 바위는 1, 보를 2로 지정하고 코드를 작성한다.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main(void) {
	srand(time(NULL));
	rand() & 3;//0~2

	return 0;
}

 

이어서, 선택된 난수와 가위 바위 보 중 어떤 것이 골라졌는지를 화면에 포함시킨다.

 

#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main(void) {
	srand(time(NULL));
	int i = rand() & 3;//0~2

	if (i == 0) {
		printf("가위");
	}
	else if (i == 1) {
		printf("바위");
	}
	else if (i == 2) {
		printf("보");
	}
	else {
		printf("몰라요");
	}

	return 0;
}

 

실행 결과는 '가위', '바위', '보', '몰라요' 중 하나가 무작위로 출력된다.

근데 0부터 2까지 셋 중 하나를 고르는데 왜 '몰라요'가 나오는 걸까

 

0이 가위, 1이 바위, 2가 보면

다른 난수가 나올 일이 없는 거 아닌가

어렵...

 


 

위의 예제와 같이 조건에 따라 수행할 문장이 달라질 때에는

if-else 문 외에도, switch 문이라는 다른 조건문을 사용할 수도 있다.

 

switch 문은 다음과 같은 형식으로 사용한다.

switch (조건) {
case 값1:
	//수행할 문장
	break;
case 2: 값2:
	//수행할 문장
	break;
...
default:
	//어떤 값도 해당하지 않을 때 수행할 문장
}

 

switch 문은 조건으로 값을 받고, 값고 일치하는 case 문으로 이동해 해당 문장을 수행한다.

그리고, 조건과 일치하는 case 문이 없을 경우 default를 수행한다. 

 

앞에서 작성한 가위바위보 게임을 switch 문으로 바꿔보자.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main(void) {
	srand(time(NULL));
	int i = rand() & 3;//0~2

	switch (i) {
	case 0:
		printf("가위\n");
	case 1:
		printf("바위\n");
	case 2:
		printf("보\n");
	default:
		printf("몰라요\n");
	}

	return 0;
}

실행 결과

 

실행 결과, 가장 먼저 '바위'가 나온 것을 보니 아마 i의 값은 1이었던 것 같다.

하지만 뒤의 보, 몰라요도 함께 출력되었단 것을 알 수 있다.

 

이는 일치하는 case를 발견하면 그 뒤의 있는 모든 문장을 실행하기 때문에 발생하는 문제로,

모든 case 문 안에 break를 넣으면 해결할 수 있다.

 

#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main(void) {
	srand(time(NULL));
	int i = rand() & 3;//0~2

	switch (i) {
	case 0:
		printf("가위\n");
		break;

	case 1:
		printf("바위\n");
		break;

	case 2:
		printf("보\n");
		break;

	default:
		printf("몰라요\n");
		break;
	}

	return 0;
}

실행 결과

 

switch 문에서 break를 만나면 나머지의 경우를 모두 무시하고 switch 문을 탈출한다.

 

이와 같이 switch 문에서는 각 case 문이 끝날 때 break를 넣어

조건에 맞는 경우만 수행하게끔 처리한다.

하지만, default 문은 switch 문의 가장 마지막에 오므로 break를 넣지 않아도 된다.

 

 

하지만, 이런 식으로 코드를 작성하다 보면 같은 문장을 여러번 반복해야만 한다.

이를 해결하기 위해, 다음과 같이 동일한 문장을 없애버릴 수도 있다!

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(void) {
	int age = 9;

	switch (age) {
	case 8:
	case 9:
	case 10:
	case 11:
	case 12:
	case 13:
		printf("초등학생입니다.\n");
		break;
	case 14:
	case 15:
	case 16:
		printf("중학생입니다.\n");
		break;
	case 17:
	case 18:
	case 19:
		printf("고등학생입니다.\n");
		break;
	}

	return 0;
}

 


 

마지막으로, 4장에서 배운 내용을 '숫자 맞히기' 게임을 제작하며 복습한다.

책에 적혀 있는 프로그램 구상들을 차차 따라하며 직접 프로그램을 작성해 보았다.

 

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(void) {
	srand(time(NULL));
	int num = rand() % 100 + 1;
	int answer = 0;
	int chance = 5;

	printf("정답: %d\n", num);

	while(1){
		printf("남은 기회: %d회\n", chance--);
		printf("숫자를 맞히세요. (1~100):");
		scanf_s("%d", &answer);

		if (answer > num) {
			printf("DOWN ↓\n\n");
		}
		else if (answer < num) {
			printf("UP ↑\n\n");
		}
		else if (answer == num) {
			printf("정답입니다!\n\n");
			break;
		}
		else {
			printf("오류 발생\n\n");
		}

		if (chance == 0) {
			printf("모든 기회를 전부 사용했습니다.\n");
			break;
		}
	}

	return 0;
}