[나도코딩] Up & Down

타키탸키·2021년 5월 6일
0

C언어(C, C++, C#)

목록 보기
3/14

🤖 개요

  • 조건/분기
    • if else
    • break
    • continue
    • switch

🤖 if else

// 버스를 탄다고 가정하고 학생 / 일반인(20세 이상)으로 구분

int age = 15;

if (age >= 20)
{
  printf("일반인입니다\n");
}
else
{
  printf("학생입니다\n");
}
학생입니다
  • if (조건) {} else {}
  • else: if에 해당하지 않는 조건
  • printf 함수만 있을 때에는 괄호 생략 가능
int age = 8;

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");
}
초등학생입니다
  • else if
    • 추가적으로 조건을 적고 싶을 때
    • 여러 번 사용 가능
    • 조건에 맞으면 함수 실행하며 조건식 탈출
  • &&
    • 논리 연산자
    • AND
    • 두 조건 다 맞아야 통과
  • 아무 조건식에도 맞지 않으면 출력값 없음(else 설정 안했을 때)
  • 조건 세밀하게 나누는 것이 중요

🤖 break / continue

// break / continue
// 1번부터 30번가지 있는 반에서 1번에서 5번까지 조별 발표를 합니다

for (int i = 1; i <= 30; i++)
{
  if (i >= 6)
  {
	printf("나머지 학생은 집에 가세요\n");
	break;
  }
  printf("%d번 학생은 조별 발표 준비를 하세요\n", i);
}
1번 학생은 조별 발표 준비를 하세요
2번 학생은 조별 발표 준비를 하세요
3번 학생은 조별 발표 준비를 하세요
4번 학생은 조별 발표 준비를 하세요
5번 학생은 조별 발표 준비를 하세요
나머지 학생은 집에 가세요
  • i가 30이 될 때까지 조건문을 반복해서 확인한다
  • break
    • 조건에 부합하면 반복문 탈출
// 1번부터 30번까지 있는 반에서 7번 학생은 아파서 결석합니다
// 7번을 제외하고 6번부터 10번까지 조별 발표를 하세요

for (int i = 1; i <= 30; i++)
{
  if (i >= 6 && i <= 10)
  {
    if (i == 7)
    {
      printf("%d번 학생은 결석입니다\n", i);
      continue;
    }
    printf("%d번 학생은 조별 발표 준비를 하세요\n", i);
  }
}
6번 학생은 조별 발표 준비를 하세요
7번 학생은 결석입니다
8번 학생은 조별 발표 준비를 하세요
9번 학생은 조별 발표 준비를 하세요
10번 학생은 조별 발표 준비를 하세요
  • continue
    • 반복문 탈출하지 않고 다음 인덱스로 넘어가서 반복
    • 7번이 조건에 부합하기 때문에 7번만 빼고 계속 출력
    • 인덱스 통째로 건너뛰기 때문에 if문 밖의 printf 함수는 실행하지 않는다

🤖 and / or

  • &&: 두 조건이 모두 부합할 때
  • ||: 두 조건 중 하나만이라도 부합할 때
int a = 10;
int b = 10;
int c = 11;
int d = 12;

if (a == b && c == d)
{
	printf("a와 b는 같고, c와 d도 같습니다\n");
}
else
{
	printf("값이 서로 다릅니다\n");
}

if (a == b || c == d)
{
	printf("a와 b 혹은 c와 d가 같습니다\n");
}
else
{
	printf("모든 값이 서로 다릅니다\n");
}
값이 서로 다릅니다
a와 b 혹은 c와 d가 같습니다

🤖 random

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

int main(void)
{
  srand(time(Null));
  int num = rand() % 3 + 1;

...(생략)
}
  • rand 함수 사용하기 위해 라이브러리 <time.h> 혹은 <stdlib.h>까지 불러온다
  • rand()%정수
    • 정수 개의 경우의 수 중 랜덤으로 하나의 수를 뽑는다
    • 시작하는 수는 0
    • 따라서 수의 범위는 0부터 정수-1까지
    • 원래 의도대로 수를 뽑으려면 % 뒤 정수를 정수 + 1로 작성한다
    • 예를 들어, 1부터 3까지를 원하면 rand() % 3 + 1
  • 랜덤 수를 뽑기 위해서 초기화를 해야 한다
    • srand(time(Null))를 하면 난수(랜덤 수)가 초기화 된다
printf("난수 초기화 이전..\n");
for (int i = ; i < 10; i++):
    print("%d ", rand() % 10);
1 7 4 0 9 4 8 8 2 4
1 7 4 0 9 4 8 8 2 4
  • 난수 초기화를 하지 않으면 위와 같이 나타난다
    • 이 사례가 문제인 이유는 다시 실행했을 때, 같은 수가 출력되기 때문이다
    • 난수는 다시 실행하면 이전과 다른 수가 나와야 한다
srand(time(NULL));
printf("\n\n난수 초기화 이후..\n");
for (int i = ; i < 10; i++):
    print("%d ", rand() % 10);
난수 초기화 이전
1 7 4 0 9 4 8 8 2 4

난수 초기화 이후
3 1 0 1 3 9 7 4 4 5
난수 초기화 이전
1 7 4 0 9 4 8 8 2 4

난수 초기화 이후
6 2 4 8 7 2 6 1 3 5
  • 위와 같이 난수 초기화를 하면 다시 실행했을 때 다른 수가 나온다

🤖 switch case

// 가위 0 바위 1 보 2
srand(time(NULL));
int i = rand() % 3;
switch (i)
{
  case 0:printf("가위\n"); break;
  case 1:printf("바위\n"); break;
  case 2:printf("보\n"); break;
  default:printf("몰라요\n"); break;
}
  • 분기가 나뉘는 조건은 switch...case로 작성한다
  • switch 옆 괄호에는 변수명을 적어준다
  • case 옆에는 조건에 대한 을 적어주고 : 뒤에는 실행할 명령어를 적어준다
  • default는 else와 같다
  • break문이 없으면 모든 조건에 있는 명령어를 실행한다
바위
보
몰라요
// 학생 판별 switch ...case
int age = 15;
switch (age)
{
  case 14:
  case 15:
  case 16:printf("중학생입니다\n"); break;
  case 17:
  case 18:
  case 19:printf("고등학생입니다\n"); break;
  default:printf("학생이 아닌가 봅니다\n"); break;
}
중학생입니다
  • 조건을 따로 지정하지 않고 case를 나열하면 명령어가 나올 때까지 범위에 속한다
    • 14, 15, 16은 16에서 명령어가 나오므로 하나의 범위에 속한다

🤖 프로젝트

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

int main(void)
{
  srand(time(NULL));
  int num = rand() % 100 + 1;
  # printf("숫자: %d\n", num);
  int answer = 0;
  int chance = 5;
  while (1)
  {
    printf("남은 기회 %d 번\n", chance--);
    printf("숫자를 맞혀보세요 (1~100): ");
    scanf("%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;

}
  • num은 랜덤 함수가 뽑는 문제의 정답, answer는 사용자가 입력한 수
  • scanf_s
    • visual studio에서만 사용하는 함수
    • 다른 IDE에서 동작 안 할 수 있다
    • 그럴 때에는 scanf 사용
  • while의 조건문에 1이 들어가는 이유
    • 원래는 chance > 0일 때만 동작하도록 작성했으나, 기회를 모두 사용했을 때 이를 알려주는 문구를 출력하기 위해 참값인 1을 넣어준다
    • 무한루프 조심
    • break문 반드시 작성
  • chance--
    • 남은 기회를 알려주는 문구가 출력될 때마다 기회 수 하나 감소
* 출처: 나도코딩 "C 언어 무료 강의 (입문부터 게임 개발까지)"
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글