숫자를 입력받고 사칙연산을 할 수 있게 되었지만, 아직 프로그램을 작성하기에는 많은 부분이 부족합니다.
지금부터는 프로그램의 "흐름"을 제어할 수 있는 부분들에 대해서 다루게 될 것이며, 그 시작은 특정한 조건에 따라 다른 결과를 내놓을 수 있게 하는 조건문입니다.
고등교육에서의 조건문
고등수학을 열심히 이수하신 여러분들께서는,
이런 정리를 접하신 적이 있을 겁니다.
이때 x는 a보다 크거나 같은 모든 값에서 g(x) 를 따르며,
a보다 작은 모든 값에서서는 h(x) 를 따릅니다.
이를 프로그래밍에서도 그대로 구현할 수 있습니다.
C++ 흐름의 단위, 블록
계속 이야기하고 있는 "흐름" 이란 무엇일까요
C++언어에서 프로그램은 반드시 위에서 아래로 흐르며,
순서대로 모든 줄을 한번씩 실행하게 됩니다.
하지만, 이러한 규칙은 중괄호 {}
로 묶인 같은 블록 내에서만 성립합니다.
지금까지 저희가 본 int main(){}
에서도 {}
를 통해 하나의 블록을 만들어 주었기 때문에, 위에서 아래로 훑으며 실행될 수 있었습니다.
#include <bits/stdc++.h>
using namespace std;
int main(){ // 블록의 시작.
int N;
cin >> N;
cout << N;
return 0;
} // 블록의 끝.
보다 복잡한 프로그램을 작성하고자 할 때는, 이 블록을 원하는 순서대로 적절히 배치해서 우리가 원하는 순서에 맞게 프로그램이 실행될 수 있도록 해주어야 합니다.
이때 각각의 블록들은 실행되지 않을수도 있으며, 여러번 반복해서 실행될 수도 있고, 블록 안에 블록이 겹쳐질수도 있습니다.
조건문 if
if문의 문법은 다음과 같습니다
if(조건){실행할 내용}
조건이 충족될 때에만, 바로 뒤에 있는 {}
블록을 실행시킵니다.
이 블록 안에는 또다시 수많은 구문들이 작성될 수 있습니다.
예제 문제를 통해서 if구문을 보도록 하겠습니다.
#include <bits/stdc++.h>
using namespace std;
int main(){
int A,B;
cin >> A >> B;
if(A==B){ // A와 B가 같다면
cout << "==";
}
if(A>B){ // A가 B보다 크다면
cout << ">";
}
if(A<B){ // B가 A보다 크다면
cout << "<";
}
return 0;
}
A>B
와 A<B
두 구문은 수학에서도 일반적으로 사용하고 있고,A==B
는 A와 B가 같을 때를 의미하는 조건입니다.
각각의 조건이 맞을때 해당하는 {}
블록을 실행시키고,
그 블록들은 위에서 아래로 실행되며 출력문을 실행시킵니다.
조건문 else
if구문은 확장이 가능합니다.
확장을 통해 else 구문을 추가하면 다음과 같습니다.
if(조건){
실행할 내용1
}
else{
실행할 내용2
}
if문 안의 조건이 충족될 때에는 if문 뒤의 블록을 실행시키고
if문 안의 조건이 충족되지 못할때는, else문 뒤에 붙어있는 블록을 실행시킵니다.
반드시 두개 중 하나는 실행되며,
둘 모두가 실행되지 못하거나 둘 모두가 실행되는 경우는 존재하지 않습니다.
조건문 else if
한번 더 확장할 시 다음과 같아집니다.
if(조건1){
실행할 내용1
}
else if(조건2){
실행할 내용2
}
else{
실행할 내용3
}
조건1은 충족시키지 못했지만, 조건 2는 충족시킨 경우 else if 구문 뒤의 블록이 실행됩니다.
논리연산자
if문을 사용한 보다 복잡한 프로그램을 작성할 때에는, 해당 블록의 실행 여부 를 결정시키는 "조건" 의 역할이 중요하게 됩니다.
C++에서는 이러한 조건을 논리연산자
라는 방법으로 구현했고,연산자
의 맥락에서 보듯 일반적인 사칙연산과 똑같이 소괄호 ()
으로 묶어 우선순위를 줄 수도 있습니다.
숫자 등의 일반적인 값에 대한 논리 연산자의 종류는 다음과 같습니다
A == B
어떠한 두 값 A와 B가 서로 같음A < B
A보다 B가 더 큼A > B
A가 B보다 더 큼A <= B
A보다 B가 더 크거나 같음A >= B
A가 B보다 더 크거나 같음A != B
A와 B가 서로 같지 않음 (A==B
의 반대 )
이렇게 두 값을 비교했을때, 조건에 맞다면 1(True) 를, 조건에 맞지 않다면 0(False) 라는 값을 가지게 됩니다.
계산한 논리값에 대해서도 연산을 진행할 수 있습니다.
논리값에 대한 논리연산자의 종류는 다음과 같습니다
!A
논리값 A의 반대(T->F, F->T)A && B
논리값 A와 B가 모두 참이어야 함 (A 그리고 B)A || B
논리값 A와 B중 하나만 참이면 됨 (A 또는 B)
이 논리연산자를 적절히 조합하면
문제를 해결할 수 있습니다.
#include <iostream>
using namespace std;
int main(){
int year;
cin >> year;
if((year%4==0 && year%100!=0)||year%400==0){
cout << 1;
}
else{
cout << 0;
}
return 0;
}
윤년의 조건은
- 년도가 4의 배수이면서
- 년도가 100의 배수는 아니고
- 년도가 400의 배수이면 포함
첫 번째 조건은 year%4==0
이라는 논리식으로 구성되었고,
두 번째 조건은 year%100!=0
이라는 논리식으로 작성했습니다.
이 두 조건은 둘 모두 성립해야 윤년이기 때문에 &&
으로 연결해주고, 이 조건을 먼저 계산하기 위해서 ()
으로 한번 감싸주었습니다.
세 번째 조건은 앞선 조건과 관계없이 년도가 400의 배수이면 포함시키기 때문에 ||
연산자로 연결시켰고, year%400==0
이라는 논리식을 사용했습니다.
결론
조건문과 논리식은 프로그램의 흐름을 결정지을 수 있다는 강력한 역할을 가지기 때문에, 앞으로 더없이 자주 사용하게 될 것입니다.
그와 동시에 논리식을 작성해서 프로그램을 작성하는 부분부터는 개발자의 주관이 들어갈 수 있어서, 언어 사용 능력이 아닌 프로그래밍 실력에 영향을 받기 시작하는 부분이기도 합니다.
외국어에 비교하자면 드디어 기초적인 단어 정도를 떼고, "회화" 라는것을 준비해볼 수 있게 되었다의 느낌입니다.
본 개념을 사용하면, 문제 > 새싹 > 조건
부분을 해결하실 수 있습니다.
이쪽은 전부 풀어보시는걸 추천드립니다.