본문 바로가기

programming study/C

[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (3)(2020.12.26)

본 내용은 해당 강의 토대로 작성


조건 / 분기

C에서 조건 / 분기는 다음과 같다

  • if / else if / else
  • break
  • continue
  • and / or
  • switch

if / else if / else

조건문 if else의 문법은 아래와 같다

if(조건){ 실행할 명령 }

else{ 실행할 명령 }

위 문법을 이용해서, 초등학생 (8~13) / 중학생(14~16) / 고등학생(17~19)으로 구분하여 출력해보자.

#include <stdio.h>
int main(void)
{
int age = 25;
if(age >= 8 && age <= 13)
{
  printf("초등학생입니다\n");
}
else if (age >= 14 && age <= 16)
{
  printf("중학생입니다\n");
}
else if (age >= 17 && age <= 19)
{
  printf("고등학생입니다\n");
}
else
{
  printf("학생이 아닌가봐요\n");  //모든 조건에 해당하지 않으면 여기로 들어옴
}
return 0;
}

여러개의 조건이 있을 때, else if 를 여러번 선언할 수 있다.

&&: and의 의미

위의 경우, age 는 25인데 순차적으로 조건문을 거쳐간다. 25는 8과 13사이도, 14와 16사이도, 17과 19사이도 아니므로 if ,else if문들을 거쳐가서 어느 조건에도 속하지 않으므로 else의 명령을 수행한다. 즉, "학생이 아닌가봐요"가 출력된다.

break / continue

1번부터 30번까지 있는 반에서 1번에서 5번까지 조별 발표를 할 때 명령어는 다음과 같이 작성한다.

#include <stdio.h>
int main(void)
{
for (int i = 1; i <= 30; i++)
{
  if(i >= 6)
  {
    printf("나머지 학생은 집에 가세요");
    break; //for문을 탈출
  }
  printf("%d 번 학생은 조별 발표 준비를 하세요\n", i);
}
return 0;
}

break : 해당 명령을 만나면 반복문을 종료한다.

for 에 의해서 정수 i는 1부터 30까지 "%d 번 학생은 조별 발표 준비를 하세요"라고 출력할 것이다. 하지만, 문제에서는 5번까지만 발표를한다고 했으므로 if 를 이용해서, i가 6이상이면 "나머지 학생은 집에 가세요"라는 문구를 출력한 뒤 break문을 만나, for를 종료시킨다.

1번부터 30번까지 있는 반에서 7번 학생은 아파서 결석하였을 때, 이 학생을 제외하고 6번부터 10번까지 조별발표를 하라는 문구를 출력한다.

#include <stdio.h>
int main(void)
{
for (int i = 1; i <= 30; i++)
{
  if (i >= 6 && i <= 10)
  {
    if (i == 7)
    {
      printf("%d 번 학생은 결석입니다\n", i);
      continue;   //다시 반복문으로
    }
    printf("%d 번 학생은 조별 발표 준비를 하세요\n", i);
  }
}
return 0;
}

continue: 이후 명령을 실행하지 않고 다시 반복문으로

if의 조건에 의해서, 6번부터 10번까지 조별 발표 문구가 출력되는데, 하위의 if의 조건인 i == 7 로 인해 결석 문구가 나온다. 그리고 continue 를 만나서 for문으로 이동하게 된다.


and / or

and는 A와 B라는 논리값이 있을 때, 둘 다 참이어야 참을 출력한다.

#include <stdio.h>
int main(void)
{
int a = 10;
int b = 10;
int c = 12;
int d = 12;
if (a == b && c == d)
{
  printf("a와 b는 같고, c와 d 도 같습니다\n");
}
else
{
  printf("값이 서로 다르네요\n");
}
return 0;
}

위의 명령어에서, a == b 이므로 참, c == d이므로 참이다. 즉, 둘 다 참이므로 "a와 b는 같고, c와 d도 같습니다"문구가 출력된다.

or는 A와 B중 하나라도 참이면 참을 출력한다.

#include <stdio.h>
int main(void)
{
int a = 10;
int b = 10;
int c = 12;
int d = 13;
if (a == b || c == d)
{
  printf("a와 b, 혹은 c와 d 의 값이 같습니다\n");
}
else
{
  printf("값이 서로 다르네요\n");
}
return 0;
}

|| : C에서의 or표현

위의 명령어에서 cd는 다르지만, a == b이므로 참이다.

Random

컴퓨터에게 숫자 하나 아무거나 고르는 것을 시킬 수 있다. 이를 난수(Random)라고 한다.

난수를 사용하기 전에, 상단에 아래의 명령어들을 입력한다

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

난수 선언은 아래와 같다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int num = rand() %3;
return 0;
}

변수 하나를 지정하고 거기에 rand()를 입력한다. rand()뒤의 %3은 난수의 범위를 지정한다. 3이므로 0~2가 난수로 지정되었다. 만약, 1~3 으로 난수를 지정하고 싶다면 %3+1을 입력하면 된다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
printf("난수 초기화 이전..\n");
for (int i = 0; i < 10; i++)
  printf("%d ", rand() % 10); //7 9 3 8 0 2 4 8 3 9 출력
return 0;
}

위의 경우, 7 9 3 8 0 2 4 8 3 9이 출력되었다. 하지만, 다음 실행에서도 같은 수가 나온다. 이 경우, 난수를 초기화하지 않아서 그렇다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
srand(time(NULL));  //난수 초기화
printf("\n\n난수 초기화 이후..\n");
for (int i = 0; i < 10; i++)
  printf("%d ", rand() % 10);
return 0;
}

stand(time(NULL))은 난수를 초기화 한다. 이제, 명령을 매번 실행하면 다른 숫자가 나온다.

난수를 사용해서 아래와 같이 가위바위보게임을 만들 수 있다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
// 가위 0 바위 1 보 2
srand(time(NULL));
int i = rand() % 3; // 0~2 반환
if ( i == 0)
{
  printf("가위\n");
}
else if ( i == 1 )
{
  printf("바위\n");
}
else if ( i == 2)
{
  printf("보\n");
}
else
{
  printf("몰라요\n");
}
return 0;
}

switch case

switch case를 사용해서 위의 가위,바위,보 문제를 더 효율적으로 만들 수 있다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
srand(time(NULL));
int i = rand() % 3; // 0 ~ 2 반환
switch (i)
{
  case 0:printf("가위\n"); break; //각 case에 break를 넣음
  case 1:printf("바위\n"); break; //switch문 탈출
  case 2:printf("보\n"); break;
  default:printf("몰라요\n"); break;
}
return 0;
}

switch는 위 처럼 각 경우를 case 를 지정해서 명령을 출력할 수 있다. default는 지정한 값 외의 경우 실행할 명령이다. 이 때, 각 case가 끝날 때마다 break문을 써줘야한다. 왜냐하면, 난수가 0이 나왔을 때 "가위"를 정상적으로 출력하나 그 아래의 명령들도 다 실행해 버려서 "가위, 바위, 보, 몰라요"전부 출력이 된다. 그러므로, 한 break 를 붙여줌으로 한 case 가 실행이 되었을 때 switch문을 탈출 시킨다.

전에 if로 작성했던 초등학생/중학생/고등학생 구분도 switch case 로 간단히 할 수 있다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int age = 17;
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;
default : printf("학생이 아닌가봐요\n"); break;
}
return 0;  
}

나이가 17살일 때, case 17을 만족한다. 그리고 그 상태로 내려가서, "고등학생입니다"를 출력하고 break문으로 인해 switch문이 종료된다.

Up and Down

1부터 100까지의 무작위 숫자를 맞추는 게임을 만들어보자.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
srand(time(NULL));                                                    //난수 초기화
int num = rand() % 100+1 ;                  // 정답은 1 ~ 100 사이의 난수
printf("숫자 : %d\n", num);
int answer = 0;                             // 대답
int chance = 5;                             // 기회
while (1)                                   //1(참)이므로 계속 수행(무한루프)
{
  printf("남은 기회 %d 번\n", chance--);                //1번 수행하고 chance를 -1
  printf("숫자를 맞혀보세요 (1~100) : ");
  scanf("%d", &answer);                     //정답을 숫자로 받아, answer에 입력

  if (answer > num)                        //대답이 정답보다 작으면
  {
    printf("Down \n\n");                   //Down을 출력
  }
  else if (answer < num)                   //대답이 정답보다 크면
  {
    printf("Up \n\n");                     //Up을 출력
  }
  else if (answer == num)                  //대답이 정답을 맞추면
  {
    printf("정답입니다! \n\n");              
    break;                                 //반복문 종료
  }
  else
  {
    printf("알 수 없는 오류가 발생했어요 \n\n");  //오류 메시지
  }
  if (chance == 0)                         //찬스를 다 쓴 경우
  {
    printf("모든 기회를 다 사용하셨네요. 아쉽게 실패샜습니다\n"); //문구 출력후 종료
    break;
  }
}
return 0;
}

정답 num은 난수로 받아준다. 게임 참가자가 입력하는 대답은 answer변수로 정수형 선언한다. 총 5번의 기회가 있으므로 chance 에 5를 입력한다. 반복문 while에 1을 입력하여 무한 루프를 만든다. 게임 참가자의 대답이 정답보다 높으면 "up", 낮으면 "down"을 출력한다. 정답을 맞추는 경우, 찬스를 다 사용한 경우의 조건문에 break문을 넣어서 루프를 벗어나도록 한다.


느낀점

생각보다 Python의 문법과 비슷한 면이 있어서 이해는 잘 되었다. 하지만, 아무것도 보지 않고 코딩을 하기는 아직 어려운 것 같다… 지금 머릿속에 여러가지 언어들이 얕게나마 지식으로 들어있는데 서로 충돌할까봐 걱정이다… 한 번은 배움을 멈추고 정리할 시간이 필요할 것 같긴 하다.