do~while문
또 하나 반복을 수행하는 구문을 살펴보기로 한다. 여기서는 do ~ while문을 다룬다. 이 구문에서는 마지막에 지정한 조건이 true인 동안 코드 내의 처리를 반복한다.
[구문 : do ~ while]
do {
문장;
...
} while(조건)
do~while문이 while문과 다른 경우는 조건을 판단하기 전에 블록 내의 처리를 수행한다는 것이다. while문에서는 반복 처리의 최초의 조건이 false이면 한 번도 블록 내의 처리가 수행되지 않는다. 한편 do~while문에서는 최소 1회는 반드시 블록 내의 처리가 수행된다.
예제) do~while문의 사용
do~while문으로 문장을 반복 출력하는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
int i = 1;
do {
cout << i << "번째의 반복입니다.\n"; //이 부분이 반복된다.
i++;
} while (i <= 5); //i <= 5가 false이면 반복을 종료한다.
cout << "반복을 종료했습니다.\n";
return 0;
}
이것은 do~while문을 사용하고 있지만, 이전의 예제와 똑같이 처리되고 있다. 이와 같이 같은 처리를 수행하고 있어도 여러 가지 구문을 사용해서 나타내는 경우가 있다.
예제) do~while문의 사용
1에서부터 키보드로 입력받은 임의의 수까지의 짝수의 합과 개수를 출력하는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
int even_sum, num, i, temp;
even_sum = i = 0;
cout << "임의의 수를 입력하세요=> ";
cin >> num;
temp = 1;
do {
if (temp % 2 == 0) { //[if (temp % 2 == 0)]의 조건이 참이면 짝수합과 개수를 개산한다.
even_sum += temp;
cout << temp << '+';
i++; //변수 i는 짝수 개수를 저장한다.
}
temp++;
} while (temp <= num);
cout << '\b' << '=' << even_sum << '\n';
cout << "짝수의 개수 = " << i << '\n';
return 0;
}
for문의 중첩
조건문, 반복문 등의 구문에서는 여러 개의 문장을 중첩시킬 수 있다.
예를 들면, 다음과 같이 for문 내에 for문을 사용하는 복잡한 기술을 할 수 있다.
[구문 : for문의 중첩]
for (식1-1; 식 2-1; 식 3-1) {
...
for (식1-2; 식 2-2; 식 3-2) {
...
}
}
예제) for문의 중첩
실행 결과와 같이 바깥쪽 루프를 1회 처리할 때마다 안쪽 루프는 3회 처리되며, 바깥쪽의 루프는 모두 5회가 처리되도록 for문의 중첩을 사용해서 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
cout << "i = " << i << " , j = " << j << '\n';
}
}
return 0;
}
이 코드에서는 변수 i를 증가하는 for문 내에 변수 j를 증가하는 for문을 넣어서 중첩하고 있다.
if문과의 조합
상기에서는 for문 내에 for문을 넣었지만 다른 종류의 문장을 넣어도 상관없다. 예를 들면, for문과 if문을 조합시킬 수도 있다.
예제) if문과의 조합
for문 내에 if문을 사용해서 실행 결과와 같이 출력하는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
int ch = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (ch == 0) {
cout << '*';
ch = 1;
}
else {
cout << '-';
ch = 0;
}
}
cout << '\n';
}
return 0;
}
이 코드에서는 2개의 for문과 1개의 if~else문을 사용하고 있다. * 또는 -를 출력할 때마다 변수 ch에 교대로 0과 1을 대입한다. 이렇게 함으로써 다음에 어느 쪽의 문자를 출력할 것인가를 if문 내의 [ch == 0]이라는 조건을 평가함으로써 판단할 수 있다.
내측의 루프가 종료하면 \n으로 개행하기 때문에 출력은 5 문자마다 개행을 하고 있다.
처리의 흐름 변경
break문
반복문에는 일정한 처리의 흐름이 있다는 것을 알 수 있다. 그러나 때에 따라서는 이와 같은 처리의 흐름을 강제적으로 변경할 경우가 있다.
C++에서는 처리의 흐름을 변경하는 문장으로 break문과 continue문이 있다. 먼저 break문을 보면 break문은 처리의 흐름을 강제적으로 종료하고, 그 블록에서 빠져나가는 처리를 수행하는 문장이다. 다음과 같이 코드 내에 기술한다.
[구문 : break문]
break;
다음의 코드에서는 break문을 사용해서 키보드로부터 지정한 횟수로 반복의 처리를 강제적으로 종료시켜 보도록 한다.
예제) break문으로 블록 탈출
1~10 사이의 값을 키보드로부터 입력하면, 입력한 값만큼 반복 수행하고 반복문을 빠져나오는 코드를 작성해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
int res;
cout << "몇 번째에서 루프를 중지합니까(1~10)?";
cin >> res;
for (int i = 1; i <= 10; i++) {
cout << i << "번째의 처리입니다.\n";
if (i == res)
break; //1~10 사이의 입력한 값의 지정된 횟수째에서 처리가 종료된다.
}
return 0;
}
위 예제에서는 본래 모두 10회의 반복을 수행하는 for문을 사용하고 있다. 그러나 여기서는 사용자가 입력한 횟수로 break문을 실행하고, 루프를 강제적으로 종료시켜 보았다. 4회째 이후의 반복 처리는 수행되어 있지 않다.
또한 반복문을 중첩하고 있는 경우 그 내측의 문에서 break문을 사용하면, 내측의 블록을 빠져나가고 한 번 더 외측의 블록으로 처리가 넘어가는 것으로 되어 있다.
switch문 내에 break문을 사용
switch문에서 살펴본 것 같이 switch문 내에서는 break문이 사용되어 왔다. 이때 사용되는 break문은 이 절에서 설명하고 있는 break문과 같은 것이다. 즉, switch문 내에 break문을 응용하면 다음과 같은 처리를 할 수 있다.
예제) switch문 내에 break문 사용
1~5까지의 정수를 입력하여 1과 2이면 "좀 더 노력하세요.", 3과 4를 입력하면 "우수합니다.", 5를 입력하면 "매우 우수합니다."라고 출력하는 코드를 작성하시오.
#include <iostream>
using namespace std;
int main()
{
int res;
cout << "성적을 입력하세요.(1~5)=> ";
cin >> res;
switch (res) {
case 1:
case 2:
cout << "좀 더 노력하세요.\n"; //res가 1 또는 2일 때 이 문장이 처리된다.
break;
case 3:
case 4:
cout << "우수합니다.\n"; //res가 3 또는 4일 때 이 문장이 처리된다.
break;
case 5:
cout << "매우 우수합니다.\n";
break;
default:
cout << "1~5 사이의 정수를 입력하세요.\n";
break;
}
return 0;
}
위 예제는 입력한 정수의 성적에 의해 여러 가지 메시지를 표시하는 프로그램이다. 코드 내의 break문의 삽입 위치에 주의해야 한다. case1과 case3에는 break문이 없기 때문에 각각 case2 또는 case4와 같이 처리를 하도록 되어 있다. 이와 같이 break문의 삽입 위치에 따라 처리를 제어할 수 있다.
continue 문
또 1개 문장의 흐름을 강제적으로 변경하는 문장으로 continue문이 있다. continue문은 블록 내의 처리를 건너 뛰어, 블록의 시작 위치로 돌아가서 다음의 처리를 계속한다는 문장이다.
[구문 : continue문]
continue;
continue문을 사용한 코드를 살펴보도록 한다.
예제) continue문의 사용
앞선 예제에서 break문 대신 continue문을 사용하여 문장의 처리 흐름을 확인해 보도록 한다.
#include <iostream>
using namespace std;
int main()
{
int res;
cout << "몇 번째의 처리를 건너뜁니까(1~10)?";
cin >> res;
for (int i = 1; i <= 10; i++) {
if (i == res)
continue;
cout << i << "번째의 처리입니다.\n";
}
return 0;
}
위 예제를 실행하여 처리를 넘기는 회수로 [3]을 입력해 보았다. 그러면 3번째의 반복 처리는 continue문의 처리가 수행됨으로써 강제적으로 종료시키고 블록의 시작 즉, 다음의 반복 처리로 넘긴다. 따라서 상기에서는 [3번째의 처리입니다.]라는 출력은 수행하지 않는다.
출처: 박흥복, 서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당