1063 : [기초 - 삼항 연산] 두 정수 입력받아 큰 수 출력하기
문제 설명 : https://codeup.kr/problem.php?id=1063
입력된 두 정수 중 큰 수를 출력하는 문제다.
- 조건 연산자(삼항 연산자)를 배운다.
조건 연산자(삼항 연산자)를 의미하는 연산자는 '? :'이다.
조건 연산자는 C언어의 유일한 삼항 연산자다.
사용방법이나 문법구조가 지금까지 배운 연산자들과는 전혀 다르게 피연산자로 조건식이 필요하다.
그 조건의 결과로 피연산자인 두 개 항에서 하나를 선택한다.
삼항 연산자의 문법구조는 '조건식 ? x : y' 이렇게 된다. 이때, 조건식이 참이면 A를 선택하지만 거짓이면 B를 선택한다.
따라서 A와 B가 동시에 선택될 수 없다.
조건식은 대부분 관계 연산식이나 논리 연산식이며 결과에 따른 선택의 대상은 구문이 아니라 '항'이다.
따라서 보통은 변수나 상수다.
간단한 연산식을 괄호로 묶어서 한 항으로 기술하기도 한다.
만일 선택 대상 피연산자가 연산식이면 반드시 괄호로 묶어야 한다.
삼항 연산자는 자주 사용되지는 않지만, 복잡한 계산식이나 조건 처리, 비교 구조를 매우 간단히 표현할 수 있다.
#include <stdio.h>
int main()
{
int x, y;
scanf("%d %d", &x, &y);
printf("%d", x > y ? x : y);
return 0;
}
1064 : [기초 - 삼항 연산] 정수 3개 입력받아 가장 작은 수 출력하기
문제 설명 : https://codeup.kr/problem.php?id=1064
입력된 세 정수 중 가장 작은 값을 출력하는 문제다.
- 삼항 연산자를 배운다.
- 삼항 연산자를 응용한다.
삼항 연산자가 복합적으로 있을 때는 정말 헷갈린다. 본인은 헷갈릴 때는 앞에서부터 하나씩 곱씹어본다.
#include <stdio.h>
int main()
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
printf("%d", (x < y) ? ((x < z) ? x : z) : ((y < z) ? y : z));
// (x < y)가 참이면 ((x < z) ? x : z) 실행하고 ((x < z) ? x : z)에서 (x < z)가 참이면 x 거짓이면 z
// (x < y)가 거짓이면 ((y < z) ? y : z) 실행하고 (( y < z) ? y : z)에서 (y < z)가 참이면 y 거짓이면 z
return 0;
}
1065 : [기초 - 조건/선택 실행구조] 정수 3개 입력받아 짝수만 출력하기
문제 설명 : https://codeup.kr/problem.php?id=1065
정수 3개가 입력되었을 때, 짝수만 출력하는 문제다.
- 기본 제어문을 배운다.
- 기본 제어문 중 if문을 배운다.
if문의 기본 구조
if(조건식)
{
//조건식이 참(True) 일 때 수행될 문장들을 적는다.
} //코드 블록의 끝
if문은 조건식을 근거로 구문들의 절차상 흐름을 변경한다.
if문은 가장 기본적인 제어문이며 사용빈도가 가장 높다. 그리고 다른 제어문들도 사실상 if문을 기본으로 한다.
그러므로 문법적 특성은 물론 의미 하나하나를 명확히 이해해야 한다.
제어문은 연산자가 포함된 구문의 흐름을 제어한다. 그러므로 조건식을 만족하는 경우와 그렇지 못한 경우에 구문 단위 흐름이 어떻게 달라지는지 명확히 알아야 한다. 그리고 연산에 참여하는 변숫값의 변화를 구문 단위로 추적할 수 있어야 한다.
if문의 조건식이 참이면 if문에 속한 나머지 구문을 수행하고 그렇지 않으면 if문 전체를 생략한다.
if문의 주의할 점은 조건식을 묶고 있는 괄호 끝에 세미콜론이 없다는 점이다.
if문에서 조건식을 만족할 때 수행할 구문이 여러 개면 반드시 스코프({ })로 묶어야 한다. 그렇지 않으면 조건식 이후 첫 번째 구문만 if문으로 판단한다.
짝수는 2로 나눴을 때 어떻게 되는지를 생각해야 한다.
#include <stdio.h>
int main()
{
int x, y ,z;
scanf("%d %d %d", &x, &y, &z);
if(x % 2 == 0) // x를 2로 나눈 나머지가 0이면,
{
printf("%d\n", x); // x를 출력한다.
}
if(y % 2 == 0)
{
printf("%d\n", y);
}
if(z % 2 == 0)
{
printf("%d\n", z);
}
return 0;
}
1066 : [기초 - 조건/선택 실행구조] 정수 3개 입력받아 짝/홀 출력하기
문제 설명 : https://codeup.kr/problem.php?id=1066
정수 3개가 입력되었을 때, '짝수', '홀수'를 출력하는 문제다.
- 기본 제어문을 배운다.
- 제어문 중 if else문을 배운다.
if else문의 기본 구조
if (조건식)
{
// 조건식이 참(0이 아닌 값) 일 때 수행될 구문들을 적는다.
}
else
{
// 조건식이 거짓(0) 일 때 수행될 구문들을 적는다.
}
if문이 조건식을 만족하는 경우만 처리하는 제어문인 반면, if else문은 조건식을 만족하는 경우와 그렇지 않은 경우 모두를 처리할 수 있는 제어문이다.
두 가지 경우에 대응하는 구문들을 처리할 수 있다는 뜻이지 두 경우에 해당하는 코드가 모두 실행된다는 뜻이 아니다.
상호 배타적으로 실행됨을 의미하며, 이는 삼항 조건 연산자와 일치한다.
if문의 사용방법과 같지만 else문 오른쪽에는 조건식이 없다.
else문에도 여러 구문을 수행하고 싶다면 스코프({ })로 묶어야 한다.
나중에 배울 다중 if문과 if else문을 혼동할 수 있다. 이것을 조심해야 한다.
#include <stdio.h>
int main()
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
if(x % 2 == 0) // x를 2로 나눈 나머지가 0이면(참) 밑 구문 실행.
{
printf("even\n"); // even을 출력.
}
else // x를 2로 나눈 나머지가 0이 아니면(거짓) 밑 구문 실행.
printf("odd\n"); // odd를 출력한다.
if(y % 2 == 0)
{
printf("even\n");
}
else
printf("odd\n");
if(z % 2 == 0)
{
printf("even\n");
}
else
printf("odd\n");
return 0;
}
1067 : [기초 - 조건/선택 실행구조] 정수 1개 입력받아 분석하기
문제 설명 : https://codeup.kr/problem.php?id=1067
정수를 입력받아 정수 형태를 파악해 출력하는 문제다.
- 기본 제어문을 배운다.
- 중첩된 제어문을 배운다.
중첩된 제어문이란 제어문 내부에 또 다른 제어문을 기술하여 두 개 이상의 제어문을 한 덩어리로 묶은 것을 뜻한다.
중첩된 제어문이라고 하지만 결국엔 if문, if else문의 응용이다.
#include
int main()
{
int x;
scanf("%d", &x);
if (x > 0) // x가 0보다 클 때(참) 밑 구문을 실행. 거짓이면 else문으로 이동.
{
if (x % 2 == 0) // x를 2로 나눈 나머지가 0이면(참) 밑 구문을 실행 거짓이면 else로 이동
{
printf("plus\neven"); // plus \n(개행) 후 enve 출력.
}
else // x를 2로 나눈 나머지가 0이 아니면(거짓) 밑 구문을 실행.
printf("plus\nodd"); // plus \n(개행) 후 odd 출력.
}
else // 이 else문은 ( x > 0)을 참조해 x가 0보다 크지 않을 때(거짓) 밑 구문을 실행.
{
if (x % 2 == 0)
{
printf("minus\neven");
}
else
printf("minus\nodd");
}
return 0;
}
1068 : [기초 - 조건/선택 실행구조] 정수 1개 입력받아 평가 출력하기
문제 설명 : https://codeup.kr/problem.php?id=1068
점수를 입력받아 평가를 출력하는 문제다.
- 기본 제어문을 배운다.
- 제어문 다중 if문을 배운다.
다중 if문의 기본 구조
if(조건 1) { 구문;}
else if (조건 2) { 구문;}
else if (조건 3) { 구문;}
else { 구문;}
다중 if문은 if else문 여러 개를 연이어 붙인 것처럼 작동하는 제어문이다.
따라서 조건식이 구문 내부에 중첩되는 것이 아니라 여러 조건식이 순차적으로 늘어선 형태가 된다.
마치 게임에서 처 번째 임무를 완성하지 못하면 다음 단계로 넘어가지 못하는 방식과 유사하다.
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
if(x >= 90) // x가 90 이상일 때 밑 구문을 실행.
{
printf("A");
}
else if(x >= 70) // x가 70 이상이면 밑 구문을 실행.
{
printf("B");
}
else if(x >= 40) // x가 40 이상이면 밑 구문을 실행.
{
printf("C");
}
else // x가 40 미만이면 밑 구문을 실행.
printf("D");
return 0;
}
/* 90점 미만이고, 70점 이상인 사람에게 'B'학점을 주는 조건이라면, 조건식이 (x > = 70 && x < 90)이 되어야 하는데 그럼에도 불구하고 조건식이 (x >= 70)이라고 쓸 수 있는 것은 첫 번째 조건식인 (x >= 90)이 거짓이기 때문이다. (x >= 90)이 거짓이라는 것은 (x < 90)이 참이라는 뜻이므로 두 번째 조건식에서 (x < 90)이라는 조건을 중복해서 확인할 필요가 없다. 세 번째 조건식도 같은 이유로(x > = 40 && x < 70)이 아닌, (x >= 40)과 같이 간단히 쓸 수 있다. */
1069 : [기초 - 조건/선택 실행구조] 평가 입력받아 다르게 출력하기
문제 설명 : https://codeup.kr/problem.php?id=1069
평가를 입력받아 내용을 다르게 출력하는 문제다.
- 기본 제어문을 배운다.
- 제어문 중 switch문을 배운다.
switch문 기본 구조
switch(변수 혹은 식)
{
case 값 1 :
조건식의 결과가 값 1과 같을 경우 수행될 구문;
break;
case 값 2:
조건식의 결과가 값 2와 같을 경우 수행될 구문;
break;
default :
// 조건식의 결과와 일치하는 case문이 없을 때 수행될 구문;
}
if문은 조건식의 결과가 참과 거짓, 두 가지밖에 없기 때문에 경우의 수가 많아질수록 else if문을 계속 추가해야 하므로 조건식이 많아져서 복잡해지고 여러 개의 조건식을 계산해야 하므로 처리시간도 많이 걸린다.
if문과 달리 switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고 표현도 간결하므로 알아보기 쉽다. 그래서 처리할 경우의 수가 많은 경우에는 if문 보다 switch문으로 작성하는 것이 좋다.
다만 switch문은 제약조건이 있기 때문에 경우의 수가 많아도 어쩔 수 없이 if문으로 작성해야 하는 경우가 있다.
switch문은 조건식을 먼저 계산한 다음 그 결과와 일치하는 case문으로 이동한다. 이동한 case문 아래에 있는 구문들을 수행하며, break문을 만나면 전체 switch문을 빠져나간다.
break문은 연산을 즉시 멈추고 자신이 속한 스코프를 벗어나도록 흐름을 변경하는 제어문이다.
#include <stdio.h>
int main()
{
char x;
scanf("%c", &x); // 입력받아 변수 x에 저장
switch(x) // 조건식이 x
{
case 'A' : printf("best!!!"); // x에 A가 저장됐을 때 실행.
break; // break문을 만나 switch문을 빠져나감.
case 'B' : printf("good!!"); // x에 B가 저장됐을 때 실행.
break; // break문을 만나 switch문을 빠져나감.
case 'C' : printf("run!");
break;
case 'D' : printf("slowly~");
break;
default: printf("what?"); // 앞의 네 가지 경우에 해당하지 않는 나머지 경우 실행.
break;
}
return 0;
}
1070 : [기초 - 조건/선택 실행구조] 월 입력받아 계절 출력하기
문제 설명 : https://codeup.kr/problem.php?id=1070
월을 입력받아 계절을 출력하는 문제다.
- switch문의 응용이다.
- break문의 특성을 배운다.
switch문에서 break문은 각 case문의 영역을 구분하는 역할을 하는데 만일 break문을 생략하면 case문 사이의 구분이 없어지므로 다른 break 문을 만나거나 switch문 블록 { }의 끝을 만날 때까지 나오는 모든 구문들을 수행한다. 이러한 이유로 각 case문의 마지막에 break문을 빼먹는 실수를 하지 않도록 주의해야 한다.
default문은 if문의 else와 같은 역할을 한다고 보면 이해가 쉽다. default문의 위치는 어디라도 상관없으나 보통 마지막에 놓기 때문에 break문을 쓰지 않아도 된다.
#include <stdio.h>
int main()
{
int month;
scanf("%d", &month); // 숫자를 입력받아 변수 month에 저장
switch(month) // 조건식은 변수 month
{
case 3: case 4: case 5:
// 조건식의 값이 3, 4, 5면 밑 구문을 실행하고 break를 만나 switch문 빠져나감
printf("spring");
break;
case 6: case 7: case 8:
// case문 각각 break가 없으므로 조건식의 값이 6, 7, 8일 때 밑 구문을 실행 (6, 7, 8을 한 번에 실행)
printf("summer");
break;
case 9: case 10: case 11:
printf("fall");
break;
default: case 12: case 1: case 2:
printf("winter");
break; // 생략 가능
}
return 0;
}
'CodeUp 기초 100제 > C' 카테고리의 다른 글
CodeUp[코드업] C언어 1078 ~ 1085 : [기초 - 종합] (0) | 2019.12.09 |
---|---|
CodeUp[코드업] C언어 1071 ~ 1077 : [기초 - 반복 실행구조] (0) | 2019.12.09 |
CodeUp[코드업] C언어 1053 ~ 1062 : [기초 - 논리 연산] ~ [기초 - 비트단위 논리 연산] (0) | 2019.12.09 |
CodeUp[코드업] C언어 1047 ~ 1052 : [기초 - 시프트 연산] ~ [기초 - 비교 연산] (0) | 2019.12.08 |
CodeUp[코드업] C언어 1038 ~ 1046 : [기초 - 산술 연산] (0) | 2019.12.08 |
댓글