07. 조건문
기본적인 조건문
자연수 하나를 입력 받아 짝수이면 짝수임을 알려주는 프로그램은 다음과 같이 작성할 수 있습니다.
int num;
printf("자연수를 입력하세요: ");
scanf("%d", &num);
if (num % 2 == 0)
{
printf("%d는 짝수입니다!\n", num);
}
짝수를 입력한 결과
자연수를 입력하세요: 4
4는 짝수입니다!
홀수를 입력한 결과
자연수를 입력하세요: 3
1) 관계연산자
=과 ==의 차이
=은 대입연산자로 우측의 값을 좌측의 변수에 넣어줍니다.
==은 관계연산자의 일종으로 좌우의 값이 같으면 참, 다르면 거짓을 반환합니다.
만약
num % 2 = 0
이라고 한다면 num % 2
가 상수이기 때문에 상수에 값을 대입할 수 없고 따라서 오류가 납니다.관계연산자의 종류
관계연산자는 수학에서 사용하는 기호와 거의 비슷하므로 따로 외울 필요는 없습니다.
연산자 | 의미 |
---|---|
== | 좌우가 같으면 참, 다르면 거짓 |
> | 좌측이 더 크면 참, 작거나 같으면 거짓 |
< | 우측이 더 크면 참, 작거나 같으면 거짓 |
>= | 좌측이 더 크거나 같으면 참, 더 작으면 거짓 |
<= | 우측이 더 크거나 같으면 참, 더 작으면 거짓 |
!= | 좌측과 우측이 다르면 참, 같으면 거짓 |
이때 !=이 어째서 저런 의미를 갖는지 의아하신 분들은 !도 연산자임을 알아야 합니다.
연산자 | 의미 |
---|---|
! | 참이면 거짓을, 거짓이면 참을 반환 |
예를 들어
6 % 2 == 0
은 참이지만 !(6 % 2 == 0)
은 거짓입니다.2) if문
사용하는 법
if (num % 2 == 0)
{
printf("%d는 짝수입니다!\n", num);
}
먼저 if를 적고 그 옆 괄호안에 조건을 적습니다.
괄호 안의 조건이 참이면 중괄호 안의 내용이 실행되고, 조건이 거짓이면 실행되지 않고 그냥 넘어갑니다.
중괄호 안에는 여러줄의 명령이 올 수 있고, 심지어 또다른 조건문이 와도 됩니다.
if문
이러한 조건문을 if라는 키워드를 사용하기 때문에 주로 if문이라고 부릅니다.
if문의 구조를 간단히 하면 다음과 같습니다.
if (조건)
{
**참**일 때 실행되는 명령들
}
if-else문
만약 참일 때와 거짓일 때 각각 서로 다른 명령을 하고 싶으면 else라는 키워드를 사용하면 됩니다.
if (조건)
{
**참**일 때 실행되는 명령들
}
else
{
**거짓**일 때 실행되는 명령들
}
예를 들면 홀수 짝수 예제를 다음과 같이 바꿀 수 있습니다.
int num;
printf("자연수를 입력하세요: ");
scanf("%d", &num);
if (num % 2 == 0)
{
printf("%d는 짝수입니다!\n", num);
}
else
{
printf("%d는 홀수입니다!\n", num);
}
짝수를 입력한 결과
자연수를 입력하세요: 4
4는 짝수입니다!
홀수를 입력한 결과
자연수를 입력하세요: 3
3는 홀수입니다!
else if
만약 if문의 조건이 한 가지가 아니라면 이렇게 할 수도 있습니다.
int num;
printf("자연수를 입력하세요: ");
scanf("%d", &num);
if (num % 2 == 0)
{
printf("%d는 2의 배수입니다!\n", num);
}
else if (num % 3 == 0)
{
printf("%d는 3의 배수입니다!\n", num);
}
else
{
printf("%d는 2의 배수도, 3의 배수도 아닙니다!\n", num);
}
결과
자연수를 입력하세요: 8
8는 2의 배수입니다!
자연수를 입력하세요: 9
9는 3의 배수입니다!
자연수를 입력하세요: 7
7는 2의 배수도, 3의 배수도 아닙니다!
if를 여러번 쓰는 것과 else if의 차이
두 예제를 비교해봅시다.
(if 여러번 쓰기)
int num;
printf("자연수를 입력하세요: ");
scanf("%d", &num);
if (num % 2 == 0)
{
printf("%d는 2의 배수입니다!\n", num);
}
if (num % 3 == 0)
{
printf("%d는 3의 배수입니다!\n", num);
}
결과
자연수를 입력하세요: 12
12는 2의 배수입니다!
12는 3의 배수입니다!
(if else 쓰기)
int num;
printf("자연수를 입력하세요: ");
scanf("%d", &num);
if (num % 2 == 0)
{
printf("%d는 2의 배수입니다!\n", num);
}
if (num % 3 == 0)
{
printf("%d는 3의 배수입니다!\n", num);
}
결과
자연수를 입력하세요: 12
12는 2의 배수입니다!
두 예제의 차이는 if문의 작동 방식을 생각해보면 알 수 있습니다.
if문의 조건이 참이면 중괄호 내의 명령을 실행한 뒤, 뒤에 있는 else if와 else의 내용을 모두 건너뜁니다.
else if는 앞의 조건에는 거짓이고 이번 조건에는 참인 경우를 말하는 것이기 때문입니다.
그래서 나머지 조건들을 건너뛰어 시간을 절약하는 것입니다.
따라서 두 조건이 중복될 수 있는 경우 if문을 따로 써주는 것이 맞습니다.
3) if문 중첩
조건안의 조건
만약 2의 배수이면서 동시에 3의 배수인지 검사하고 싶다면 if문 안에 if문을 사용하면 됩니다.
int num;
printf("자연수를 입력하세요: ");
scanf("%d", &num);
if (num % 2 == 0)
{
printf("%d는 2의 배수입니다!\n", num);
if (num % 3 == 0)
{
printf("%d는 6의 배수입니다!\n", num);
}
}
결과
자연수를 입력하세요: 4
4는 2의 배수입니다!
자연수를 입력하세요: 12
12는 2의 배수입니다!
12는 6의 배수입니다!
이처럼 if문 안에 또 if문을 적는 것을 if문 중첩이라고 합니다.
4) 삼항연산자 '?'
삼항연산자
일반적으로
a+b
와 같이 두개의 항이 들어가는 연산자를 이항연산자라고 합니다.
마찬가지로 항이 세개 들어가는 연산자를 삼항연산자라고 하며,
?
가 대표적입니다.
기본적인 구조는 다음과 같습니다.
(조건) ? (참일때의 값) : (거짓일때의 값)
구조 익히기
다음과 같은 방법으로
a
의 절댓값을 구할 수 있습니다.int abs = (a > 0) ? (a) : (-a);
만약 a가 양수라면 a가 들어가고, 양수가 아니라면 -a가 들어갑니다. (0이면 무엇을 고르더라도 0이지요.)
다음과 같은 방법으로
a
, b
중 큰 값을 고를 수 있습니다.int max = (a > b) ? (a) : (b);
만약 a가 b보다 크다면 a가 들어가고, 그렇지 않다면 b가 들어갑니다. (같으면 무엇을 고르더라도 같겠지요.)
5) 논리연산자
논리연산자의 종류
논리연산자는 논리(참, 거짓)끼리의 연산을 다룹니다.
연산자 | 의미 |
---|---|
&& | and 연산자 |
||
는 or 연산자라고 하며 좌우에 하나라도 참이 있으면 참이 됩니다.&&
는 *and 연산자라고 하며 좌우가 모두 참이 있으면 참이 됩니다.or 연산자
좌 | 연산자 | 우 | 결과 |
---|---|---|---|
참 | or | 참 | 참 |
참 | or | 거짓 | 참 |
거짓 | or | 참 | 참 |
거짓 | or | 거짓 | 거짓 |
예를 들어
i == 0 || j == 0
은 i가 0이거나 j가 0이다라는 표현입니다.
참을 1, 거짓을 0으로 보면 or 연산자는 마치 곱셈과 같아서 논리곱이라고도 합니다.
and 연산자
좌 | 연산자 | 우 | 결과 |
---|---|---|---|
참 | and | 참 | 참 |
참 | and | 거짓 | 거짓 |
거짓 | and | 참 | 거짓 |
거짓 | and | 거짓 | 거짓 |
예를 들어
i == 0 && j == 0
은 i가 0이고 j가 0이다라는 표현입니다.
참을 1, 거짓을 0으로 보면 and 연산자는 마치 덧셈과 같아서 논리합이라고도 합니다.
6) switch-case문
사용하는 법
switch (조건식)
case 값1:
값1일때 실행될 내용;
break;
case 값1:
값1일때 실행될 내용;
break;
...
default:
이도저도 아닐때 실행될 내용;
break;
먼저 switch를 적고 그 옆 괄호안에 식을 적고 caes옆에 식의 값을 조건으로 적습니다.
switch-case문
이러한 조건문을 switch와 case라는 키워드를 사용하기 때문에 주로 switch-case문이라고 부릅니다.
switch문의 구조를 예시를 통해 보면 다음과 같습니다.
switch (i % 3)
case 0:
printf("%d를 3으로 나눈 나머지는 0입니다.\n", i);
break;
case 1:
printf("%d를 3으로 나눈 나머지는 1입니다.\n", i);
break;
case 2:
printf("%d를 3으로 나눈 나머지는 2입니다.\n", i);
break;
default:
break;
if문과 비슷한 구조로 사용할 수 있다는 것을 볼 수 있습니다,
break
예시를 보면 반드시 하나의 case당 하나의 break를 사용하는 것을 볼 수 있는데 만약 break를 지운다면 결과가 달라집니다.
switch (i % 3)
case 0:
printf("%d를 3으로 나눈 나머지는 0입니다.\n", i);
case 1:
printf("%d를 3으로 나눈 나머지는 1입니다.\n", i);
case 2:
printf("%d를 3으로 나눈 나머지는 2입니다.\n", i);
default:
break;
이 경우,
i % 3
이 0이라면 모든 printf가 다 실행됩니다.
switch-case문은 조건에 따라 해당 case로 이동해주기만 하지, case에서 자동으로 빠져나가지 않기 때문입니다.
의도적으로 break를 빼는 경우도 있는데 그럴 땐 가급적 주석으로 표시해주는 것이 좋습니다.
댓글 없음:
댓글 쓰기