카운터 제어 while 반복문
#include <iostream>
using namespace std;
int main()
{
int counter = 0;
while (counter < 10) {
cout << counter << endl;
counter++; //카운터를 증감시키지 않으면 무한 루프 발생
}
return 0;
}
반복 횟수를 알고 있다면 카운터를 사용해 while문을 종료시킬 수 있다.
while문을 카운터 조건을 통해 종료하려고 하는데, 카운터를 증가시키거나 감소시키는 코드를 까먹고 적지 않았다면 무한루프가 발생할 우려가 있다. 조건은 구문이 시작될 때 적어야 하는데, 조건을 충족할 수 있게 제어하는 코드는 while문 내부에 있어서 이런 실수가 발생할 확률은 은근히 높다.
따라서 이 경우에는 for문을 사용하는 것이 일반적이다.
이벤트 제어 while 반복문
몇 번 반복해야 할지는 모르지만, 어떤 상황에 반복을 멈춰야 할지는 알고 있다면 이벤트 제어를 통해 while 반복문을 종료시킬 수 있다.
센티넬 제어
센티넬(sentinel)은 보초, 감시병을 뜻한다. 데이터 처리에서는 처리를 중지하기 위한 특별한 항목을 의미한다.
#include <iostream>
using namespace std;
/*-1이 나올 때까지 입력받은 정수를 더하는 코드*/
int main()
{
int num;
int sum{0};
cin >> num;
while (num != -1) {
sum += num;
cin >> num;
}
cout << sum;
return 0;
}
센티넬은 리스트의 다른 항목과 같은 자료형이면서 특별한 의미가 있어야 한다. 위 코드에서는 -1이 센티넬이다. 값으로 센티넬이 입력되는 순간 프로그램은 종료된다.
EOF 제어
더 이상 키보드로 입력할 데이터가 없거나, 파일의 끝부분에 도달했다는 것을 알리기 위한 센티넬로 EOF(End of File) 마커가 있다.
Unix 환경에서는 Ctrl+d, 윈도우 환경에서는 Ctrl+z를 입력하면 프로그램은 더 이상 받아들일 데이터가 없다고 판단해 반복을 종료한다.
EOF를 사용하려면 >> 연산자를 입력하면 된다. 이 연산자는 스트림에서 항목을 읽다가 EOF를 만나면 false를 리턴한다.
//키보드
while(cin >> num)
{
...
}
//파일
while(infile >> num)
{
...
}
//키보드 입력 EOF로 반복 종료하기
#include <iostream>
using namespace std;
int main()
{
int num;
int sum{0};
while (cin >> num) {
sum += num;
}
cout << sum;
return 0;
}
Ctrl+z를 입력하면 콘솔에서는 ^Z로 표시되고, 입력을 마치면 반복이 종료되어 합이 출력된다.
플래그 제어
플래그(flag)는 특정 조건이 발생하면 값을 true로 바꾸어 조건으로 활용하는 bool 변수의 다른 표현이다. 보통 센티넬은 리스트의 마지막 항목으로 배치되는데, 중간에 프로그램을 종료하고 싶을 때 사용한다.
조건이 발생하지 않을 수도 있기 때문에 다른 제어 메커니즘을 함께 활용해야 한다.
#include <iostream>
using namespace std;
int main()
{
int num;
bool flag = false;
while (!flag && (cin >> num)) {
if (num >= 100) flag = true;
}
cout << num;
return 0;
}
처음에 플래그를 false로 설정하고, 반복문 내에서 100 이상인 숫자가 입력되면 true로 바꾼다. 다음 조건 확인 때 첫 번째 조건이 거짓이 되므로 프로그램은 종료된다. 이 예시에서는 센티넬과 유사하게 사용되었지만, 활용하기 나름이다.
'프로그래밍 > C, C++' 카테고리의 다른 글
[C++] 생성자와 소멸자 (0) | 2022.12.13 |
---|---|
[C++] 클래스의 구조 (0) | 2022.12.11 |
[C++] 조정자를 사용해 입출력 형식을 지정하는 방법 (0) | 2022.12.07 |
[C++] 변수를 초기화하는 세 가지 방법 (0) | 2022.11.18 |
[C++] 입출력(cin, cout)과 네임스페이스(namespace) (0) | 2022.11.17 |