본 내용은 해당 강의 토대로 작성
조건 / 분기
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표현
위의 명령어에서 c
와 d
는 다르지만, 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의 문법과 비슷한 면이 있어서 이해는 잘 되었다. 하지만, 아무것도 보지 않고 코딩을 하기는 아직 어려운 것 같다… 지금 머릿속에 여러가지 언어들이 얕게나마 지식으로 들어있는데 서로 충돌할까봐 걱정이다… 한 번은 배움을 멈추고 정리할 시간이 필요할 것 같긴 하다.
'programming study > C' 카테고리의 다른 글
[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (6)(2020.12.28) (0) | 2020.12.28 |
---|---|
[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (5)(2020.12.27) (2) | 2020.12.27 |
[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (4)(2020.12.27) (0) | 2020.12.27 |
[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (2)(2020.12.26) (0) | 2020.12.26 |
[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (1)(2020.12.25) (0) | 2020.12.25 |