안녕하세요 파일입니다. 오늘 알아볼 것은 반복문입니다.
컴퓨터는 우선 노가다를 잘합니다. 물론 1~1000까지 다 더하려면 가우스 합공식을 이용하는 게 사람, 컴퓨터 둘 다에게 빠르나 컴퓨터는 반복 작업을 통해 1~1000까지 모두 더하는 게 가능합니다.
For문, While문은 프로그래밍에서 반복처리를 할 때 100% 활용하기 때문에 꼭 알아두시는 게 좋습니다.
다른 프로그래밍 언어를 하셨더라면 C언어에서 for, while의 사용 방식도 거의 동일합니다.
While문
while문은 조건이 참인동안 반복입니다.
사용 방법은 다음과 같습니다.
while(조건)
{
반복 내용
}
조건이 참 일동 안 만 반복하기 때문에 약간 헷갈릴 수는 있습니다만 그때그때 잘 생각하면 됩니다.
아래 예제를 봅시다.
#include <stdio.h>
int main(){
int n = 0;
while(n<100){ //n이 100보다 작을경우 반복
printf("n : %d \n", n);
n++;
}
printf("While 문 끝"); //n이 100 이상일경우 while문 끝.
return 0;
}
n : 0
n : 1
n : 2
n : 3
n : 4
n : 5
n : 6
n : 7
n : 8
n : 9
n : 10
(...) 생략
n : 99
While 문 끝
다음 예제는 0~99까지의 숫자를 출력하는 예제입니다.
For문, While문을 모른다면 0~99까지 일일이 printf를 작성해야 하지만 이렇게 while문을 통해 간단하게 처리할 수 있습니다. while문 안의 조건이 n <100입니다.
n의 초기값은 0이기 때문에 printf로 n의 값을 출력하고 n을 1더합니다.
이것이 반복되다가 n이 99를 넘어가는 시점부터는 n <100의 조건에 맞지 않기 때문에 while문이 종료됩니다.
결괏값을 보면 n : 99에서 출력이 끝나는 걸 알 수 있습니다.
While 무한 반복문
그런데 위 예제에서 끝에 n++; 가 없다면 어떻게 될까요?
n의 값이 변동하지 않기 때문에 while문 조건 안에 갇히게 되고 n : 0 이 무한으로 출력될 것입니다.
#include <stdio.h>
int main(){
while(1){ //C언어에서 1은 참이다
printf("무한출력중... \n");
}
}
다음은 while 무한 루프 예제입니다.
C언어에서 1은 참이므로 while문안의 조건이 항상 참으로 설정되어 무한 반복되게 됩니다.
이런 식으로요. 콘솔은 Ctrl+C로 강제 종료 가능합니다.
근데 while문을 강제로 탈출하는 방법은 없을까요?
있습니다. break를 사용하면 되는데요. break란 이름 그대로 반복문을 강제 탈출할 때 사용합니다.
#include <stdio.h>
int main(){
int i = 1;
while(1){ //C언어에서 1은 참이다
printf("무한출력중... \n");
i++;
if (i>10){
printf("10회 이상 강제탈출");
break;
}
}
return 0;
}
무한출력중...
무한출력중...
무한출력중...
무한출력중...
무한출력중...
무한출력중...
무한출력중...
무한출력중...
무한출력중...
무한출력중...
10회 이상 강제탈출
--------------------------------
Process exited after 0.02002 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
다음은 무한출력 중을 10회 출력하고 while문을 끝내는 코드입니다.
정수 변수 i를 이용해 반복 횟수를 판별하고 i가 10을 넘어가면 break로 while문을 탈출합니다.
For문
for문의 영어적 의미로는 ~하는 동안이 있습니다.
for문 역시 특정 조건에서 반복하는데 While문과 다르게 반복 횟수를 지정하기 더 쉽다는 장점이 있습니다.
구구단처럼 반복 횟수가 한정적이라면 while보다는 for문의 사용이 조금 더 좋습니다.
for(초기값; 조건값; 증감값){
반복내용
}
for문의 사용방법입니다. 세미콜론에 유의해주세요
#include <stdio.h>
int main(){
for(int i = 1; i<10; i++)
{
printf("%d \n", i);
}
return 0;
}
1
2
3
4
5
6
7
8
9
--------------------------------
Process exited after 0.01904 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
다음은 자연수 1~9를 출력하는 예제입니다. 위의 while 문에서는 초기값을 밖에서 설정했지만 for문은 안에서도 설정이 가능합니다. i라는 초기값을 1로 초기화하고 i <10 인 조건에서 계속하여 반복하며 i의 증감 값이 1만큼 이라는 얘기입니다. while문과 for문을 보면 알겠지만 초기값, 증감 값, 조건값이 대부분 포함되어 있습니다.
#include <stdio.h>
int main(){
int sum = 0;
for(int i = 1; i<=100; i++)
{
sum+= i;
}
printf("%d", sum);
return 0;
}
5050
--------------------------------
Process exited after 0.01904 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
1~100까지의 자연수를 sum이라는 변수에 차례대로 반복해서 더하고 결괏값을 출력하는 소스입니다.
중첩 For문
중첩 for문은 for문을 여러 개 겹쳐서 사용하는 겁니다.
예를 들면 구구단이 있습니다.
구구단을 만들 때는 각 자릿수마다 1~9까지 곱한 값을 출력하고 각 자릿수는 2~9까지 반복이 되죠.
총반복의 횟수는 9 x 8 = 72(회)입니다.
#include <stdio.h>
int main()
{
for (int i = 2; i <= 9; i++) //2~9까지 반복
{
for (int j = 1; j <= 9; j++)
{
printf("%d x %d = %d\n", i, j, (i*j));
}
printf("\n");
}
return 0;
}
구구단 출력 소스입니다. for문 내부에서는 초기값 j로 1~9까지 곱해주는 값,
for문 외부에서는 초기값 i로 곱할 수를 2~9까지 반복해줍니다.
for문을 여러 개 사용할 때는 저 초기값 변수 이름이 겹치지 않게 해줘야 합니다.
증감 값, 초기값 생략하기
프로그래밍 대회(정보 올림피아드)에서 for, while 반복문 출력 값을 물어보는 질문이 있는데요.
for문의 증감 값이나 초기값을 생략해서 주는 경우가 있습니다.
음? 필수적인 건데 생략을 해도 되나요 라는 의문이 들겠지만 여기서 생략은 for문 내에서 말하는 겁니다.
실제로 for문 밖에서 for문 내에 생략된 내용이 다 담겨있습니다.
말로만 하면 이해가 잘 안 되죠? 바로 예제로 가겠습니다.
#include <stdio.h>
int main(){
int i = 1, factorial = 1; //초기값 설정
//9! Method
for( ; i<10; )
{
factorial = factorial * i;
i++; //증감값 설정
}
printf("%d", factorial);
return 0;
}
362880
--------------------------------
Process exited after 0.01762 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
다음은 9! 을 반복문으로 계산하는 예제입니다.
보시면 알겠지만 for( ; i <10; )처럼 초기값인 int i와 증감 값 i++ 가 생략되어 있습니다. 조금 생소하죠?
소스코드를 넓게 보면 초기값이 for문 외부에서 int i = 1; 로 선언되어 있고
증감값 i++가 for문 중괄호 안에서 선언되어 있습니다.
#include <stdio.h>
int main(){
int factorial = 1;
//9! Method
for(int i=1 ; i<10; i++)
{
factorial = factorial * i;
}
printf("%d", factorial);
return 0;
}
362880
결괏값은 증감 값, 초기값을 생략하나 안 하나 동일한 걸 확인해볼 수가 있고요.
그러면 조건값을 생략하게 되면 어떻게 될까요?
#include <stdio.h>
int main(){
for(int i=1 ; ; i++)
{
printf("%20d", i);
}
return 0;
}
이 소스코드는 직접 실행시켜보세요..
수들이 흡사 터미네이터를 보는 것처럼 계속 출력됩니다. 무한 반복된다는 의미입니다.
조건값을 생략하게 되면 무한루프가 일어납니다.
아까 While 무한 반복문에서 1이 True니 조건에 1을 주면 무한 반복한다고 했습니다
그러면 For문도 조건을 1로 주면 무한반복이 될 것입니다.
#include <stdio.h>
int main(){
for(int i=1 ; 1 ; i++)
{
printf("%20d", i);
}
return 0;
}
역시 위 예제와 동일한 결과네요.
% 20d와 같은 출력이 기억나지 않으시다면
https://pgh268400.tistory.com/9?category=1072473
여기서 필드 폭 지정을 다시 보고 옵시다..
Do~While 문
앞에서 while , for , 중첩 , 무한루프를 배웠습니다.
마지막으로 배울 것은 Do~While 문입니다.
앗 아까 배운 While 문이 나왔네요 그런데 앞에 Do 가 추가되었습니다.
Do가 뭔가요. 영어 단어로 하다는 의미죠?
While문은 조건 성립시만 실행되고 조건이 성립 안되면 아무것도 안 합니다.
그런데 Do~While 문은 일단 Do로 한번 실행하고 그다음에 While로 조건을 따집니다.
#include <stdio.h>
int main(){
int n = 1;
do
{
printf("%d \n", n);
n++;
} while(n <= 10);
}
Do~While 문의 사용방법입니다.
Do 안에 실행할 코드를 두고, while문을 밖에 빼고 세미콜론으로 마무리 지으면 됩니다.
그러면 Do안에 있는 코드가 선행되고 그다음에 while로 조건을 따지게 됩니다.
위 코드도 n초기값이 1이니 1을 우선 출력하고 그다음부터 while(n <= 10)의 조건을 따져서 실행하는 겁니다.
보통 Do While문이 사용되는 곳은 일단 우선 한번 scanf으로 입력을 받고 그 다음부터 검사해야할 상황이 올때 사용합니다.
어떤가요? 오랜만에 C언어 강의를 작성하는데 여기 부분은 짧아서 좀 편했네요.
그리 내용은 많지 않지만 프로그래밍에서 매우 핵심적인 내용이기 때문에 확실히 이해해두는 편이 좋습니다.
For문 While문 둘 다 반복의 역할이지만 그때그때 효율적으로 사용하는 게 다릅니다.
구구단 같이 반복 횟수가 확실히 정해져 있다면 For문, 특정값까지(조건) 기다리는 형태의 처리라면 While문이 적합할 것입니다.
다음 강의에선 If문, Switch/Case문을 알아보겠습니다. 감사합니다.
'프로그래밍 강좌 > C' 카테고리의 다른 글
[C언어 강좌] #10 함수(Function) (0) | 2020.01.18 |
---|---|
[C언어 강좌] #9 조건문 (If, ElseIf, Switch) (5) | 2020.01.08 |
[C언어 강좌] #7-2 자료형(Data Type) (0) | 2019.11.24 |
[C언어 강좌] #7-1 자료형(Data Type) (0) | 2019.11.19 |
[C언어 강좌] #6-2 연산자(Operator) (5) | 2019.11.15 |