C언어 (7) 반복문
반복문이랑 동일한 문장을 여러 번 반복하는 구조이다.
동일한 작업을 계속해야 한다면 똑같은 문장을 crtl+c, crtl+v하는 것보다 반복문을 사용하는 편이 좋다.
반복문
노트북을 구매하기 위해 월급을 받아 저축하는 사람의 경우를 프로그램으로 만들어보자.
저축한 돈이 240만원 이상이 될때까지 아르바이트를 하고, 이상이면 노트북을 구매할 수 있어 일이 끝날 것이다.
이 아르바이트를 하고, 월급을 저축하고, 저축한 돈이 240만원 이상인지 확인하는 부분이 반복된다.
어떻게 코드로 표현할 수 있을까?
while문
while은 ~하는 동안이라는 뜻으로 while(조건문)에서 조건문이 참인 동안 반복한다.
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main() {
int i = 1, sum = 0;
while (i <= 5) {
sum += i;
i++;
}
printf("1부터 5까지의 합 : %d \n", sum);
return 0;
}
1에서 5까지의 합을 구하는 while문은 이렇게 생겼다.
i는 맨 처음에 1이고, sum에 1을 더한다. 그리고 i++가 실행되어 2가 된다.
i<=5는 참이므로 같은 과정을 반복한다.
그렇게 i가 5가 될때까지 반복하고, 6이 되면 조건문이 거짓이 되어 반복문을 탈출한다.
만약 처음부터 while 조건문이 거짓이라면 while 안의 코드는 실행되지 않는다.
do-while문
do-while문은 while문과 거의 비슷하지만 반복 조건을 반복문의 끝에서 검사한다.
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main() {
int i = 1, sum = 0;
do {
sum += i;
i++;
} while (i < 1);
printf(" sum : %d \n", sum);
return 0;
}
만약 while 조건문이 반복 루프 맨 앞에 있었으면 i<1 조건이 거짓이기에 한번도 실행이 안되고
sum은 0이 출력이 되었을 것이다.
하지만 do-while문은 조건문이 끝에 있기에 do를 적어도 한 번 실행하게 되고 sum의 값은 1이 된다.
무한 루프
while문은 무한히 실행되는 반복문을 만들기 용이하다.
C언어에서 1은 참이라고 했다. 그렇다면 while(1)이라는 반복문은 어떻게 실행될까?
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main() {
int i = 1, sum = 0;
while (1) {
sum += i;
if (i == 10)break;
}
return 0;
}
break는 switch case에서 봤는데 실행하고 있는 코드 블럭을 벗어나는 명령어이다.
while(1)은 항상 참인 조건을 가지는 반복문으로 무한히 반복한다.
그러므로 조건문을 통해 break를 해줘 원하는 결과가 나올 때까지 무한히 반복하는 반복문을 만들 수 있다.
이렇게 무한 루프와 조건문을 합치면 여러가지 프로그램을 만들 수 있다.
for문
for문은 초기화식, 조건식, 증감식으로 구성되어 있고 while과 똑같이 조건식이 참일 때 실행된다.
1
2
3
4
5
6
7
8
#include <stdio.h>
int main() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
return 0;
}
이렇게 하면 int i = 1이 초기화식, i<=100이 조건식, i++이 증감식이다.
i가 1부터 100까지 증가하며 sum에 더해지는 함수를 만들 수 있다.
보통 for문 안에 사용하는 변수는 i, j, k 순서로 많이 사용한다.
중첩 반복문
for문이나 while문은 여러개가 중첩될 수도 있다.
구구단 프로그램처럼 2개의 변수가 규칙적으로 변화하는 프로그램에서 사용하게 된다.
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
printf("%d x %d = %d\n", i, j, i * j);
}
}
return 0;
}
이렇게 되면 i=1일 때 j는 1~9로 변화하고, i=2가 되면 다시 j는 1~9… 이렇게 반복한다.
중첩 반복문을 이용한 유명한 문제로는 별 찍기가 있다.
해당 사이트의 1~9번까지 풀어보면 중첩 반복문에 대한 이해는 충분히 될 것 같다.
백준 별 찍기
break와 continue
반복문에 유용하게 사용되는 명령어로 break와 continue가 있다.
두 명령어 모두 if문과 보통 같이 사용된다.
반복문 내에서 특정 조건이 만족되었을 때 break은 반복문을 벗어나고, continue는 남은 부분을 실행하지 않고 처음으로 돌아간다.
1
2
3
4
5
6
7
8
9
10
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int num;
while (1) {
scanf("%d", &num);
if (num < 0)break;
}
return 0;
}
이렇게 숫자를 입력받다가 음수를 받으면 종료하는 프로그램을 break를 통해 만들 수 있다.
1
2
3
4
5
6
7
8
#include <stdio.h>
int main() {
for (int i = 0; i <= 100; i++) {
if (i % 2 == 0)continue;
printf("%d\n", i);
}
return 0;
}
continue를 활용해 짝수일때는 출력하지 않고 홀수일때만 출력하는 프로그램도 만들 수 있다.
조건문은 이전까지 했던 것들보다 쉽게 할 수 있던 것 같다.
별 찍기 문제를 꼭 풀어보면서 변수가 어떻게 변하는지 흐름을 잘 잡으면 좋겠다.
다음은 여러개의 변수로 이루어진 새로운 자료구조를 알아보자.