반복문의 옵션이 있다
1. continue
2. break
1. continue란?
- 더 이상 아래 문장을 실행하지 않고, 반복문 처음으로 돌아가라
- 반복문에서만 사용한다.
- continue가 계속적인 느낌이여서 아래로 내려가야 할 것같지만
- 반복문 '처음'으로 돌아가는 것 주의하자.
- 조건이 참일 때 continue 수행
2. break란?
- 반복문을 빠져나감
- 반복문에서도 사용가능하다
- switch나 if문 등에서도 사용 가능하다.
- 조건이 참일 때 break 수행
** 다중for문은 하단에서 다루겠습니다.
continue ex1
for(i=0, sum=0; i<3; i++) {
if(i==1) continue;
sum++;
}
printf("%d", sum)
해설
for문 구조 다시복습
for(초기값, 조건, 실행 후 증감) {
실행할 내용
}
i | i==1 | sum | 실행 후 증감 i ++ | |
초기값 | 0 | 0 | ||
i<3 0<3 참 -> if문 실행 |
0==1 거짓 ->거짓이므로 continue 안가고 if문을 나와서 sum++ |
1 | 1 | |
i<3 1<3 참 -> if문 실행 |
1 | 1==1 -> 참이므로 continue로 가서 i++수행 | 2 | |
i<3 2<3 참-> if문 실행 |
2 | 2==1-> 거짓이므로 continue 안가고 if문을 나와서 sum++ | 2 | 3 |
i<3 3<3 거짓 -> for문 빠져나온다 |
2 |
답
sum값 2
continue ex.2
#include<stdio.h>
int main(){
int i, sum = 0;
for(i=1, i<=10; i+=2) {
if(i%2 &&i %3) continue;
sum += i;
}
printf("%d", sum);
return 0;
}
해설
조건 | i | i%2 && i %3 | sum | sum+=i (sum = sum =i) | i+=2(실행 후 증감) |
초기값 | 0 | ||||
for i =1 | 1 | ||||
(i<=10) 1<=10 참이므로 if 수행 |
1%2 && 1 %3 = 참 [1 && 1 = 1] -> continue |
i=3 | |||
(i<=10) 3<=10 참이므로 if수행 |
3 | 3%2 && 3%3 = 거짓 [1 && 0 = 0] |
0 | 0+3 = 3 | i=5 |
(i<=10) 5<=10 참이므로 if수행 |
5 | 5%2 && 5%3 = 참 [1 && 2 = 참] -> continue |
i=7 | ||
(i<=10) 7<=10 참이므로 if수행 |
7 | 7%2 && 7%3 = 참 [1 && 1 = 참] -> continue |
i=9 | ||
(i<=10) 9<=10 참이므로 if수행 |
9 | 9%2 && 9%3 = 거짓 [1 && 0 = 거짓] |
3 | 3+9 = 12 | i=11 |
(i<=10) 11<=10 거짓이므로 for문 빠져나온다. |
12 |
for문 구조 또 복습
for(초기값, 조건, 실행 후 증감){
조건에 따른 실행
}
헷갈리는 POINT
- int i, sum = 0 -> i와 sum 둘 다 0이 아니고, i는 공간만 만들어놓고, sum에 0 할당
- i%2 && i%3 -> %가 나와서 자리수를 표현하는 게 아니고, 나눠서 몫과 나머지 중 나머지를 표현하는 의미
- i%2 && i%3이 참이면 continue를 수행해라-> 반복문 처음으로 돌아가라 -> i+=2로 올라가서 수행
- i%2 && i%3이 거짓이면 반복문 처음으로 돌아가지 말고 밑으로 수행 (이 문제에서는 sum +=)
- ※ 주의 i%2 && i%3이 거짓일 때 continue로 안가고 하단 sum +=i 실행 한 다음에, 다시 위로 올라가서 for문을 바로 수행 하는 것이 아니라 실행 후 증감(i +=2)을 진행 해야한다
답 12
break ex.1
for(i=0, sum=0; i<3; i++) {
if(i == 1) break;
sum ++;
}
printf("%d", sum);
해설
i | i == 1 | sum | sum++ | i++ (수행 후 증감) | |
초기값 | 0 | 0 | |||
i<3 0<3 참 -> if문 수행 |
0 == 1 거짓이므로 break수행 안하고 sum++ 수행 |
1 | 1 | ||
i<3 1<3 참-> if문 수행 |
1 | 1 ==1 참이므로 break 수행 -> 반복문 빠져 나와서 printf수행 |
|||
printf("%d", sum); | 1 |
sum: 1
- break를 만나는 순간 실행 후 증감 처리도 없이 그냥 for문 밖으로 빠져 나오면 된다.
다중 for문의 이해
쉽게... 구구단처럼 생각하자
다중 반복문 ex
for( i = 0; i<3; i++) {
for(j = 0; j<2; j++){
printf("i:%d, j: %d", i, j);
}
}
i | i<2 | j | j<2 | print("i:%d, j: %d", i, j) | j++내부 for 증감 | i++ 외부 for증감 |
0 | 참 -> 다시 for문 만남 | 0 | 0<2 참 |
i: 0, j: 0 | 1->내부 for문 처음으로 | |
1<2 참 |
i: 0, j: 1 | 2->내부 for문 처음으로 | ||||
2<2 거짓 내부 for문 빠져나와서 외부 for문으로 가는데, 증감부터 |
1 | |||||
1 | 1<2 참 -> 내부for 들어가는데, j최초 값인 0부터다시 | 0 | 0<2 참 |
i: 1, j: 0 | 1->내부 for문 처음으로 | |
1 | 1<2 참 |
i: 1, j: 1 | 2->내부 for문 처음으로 | |||
2 | 2<2 거짓 내부 for문 빠져나와서 외부 for문으로 가는데, 증감부터 |
2 | ||||
2 | 2<2 거짓 -> 드디어 외부 for문도 빠져나오면 끝 |
답
i: 0, j: 0 |
i: 0, j: 1 |
i: 1, j: 0 |
i: 1, j: 1 |
continue, break, 다중for문 다 합친 문제
#include<stdio.h>
void main() {
int i, j, sum =0;
for(i=1; i<10; i++) {
for(j=1; j<10; j++) {
if(j%3 ==0) continue;
if(i%4 == 0) break;
sum++;
}
}
printf("%d", sum);
}
해설
i | i<10 | j | j<10 | j%3==0 | i%4==0 | sum | sum++ | 수행 후 j++ | 수행 후 i++ | |
초기값 | 0 | |||||||||
1 | 1<10 참 -> 내부 for문으로 드가자 |
1 | 1<10 참-> if문 수행 |
1%3 1==0 거짓이므로 continue수행 안하고 아래로 |
1%4 1==0 거짓이므로 break수행 안하고 아래로 |
0 | 1 | 2 | ||
2 | 2<10 참-> if문 수행 |
2%3 2==0 거짓이므로 continue수해 안하고 아래로 |
1%4 1==0 거짓이므로 break 수행 안하고 아래로 |
1 | 2 | 3 | ||||
3 | 3<10 참-> if문 수행 |
3%3 0==0 참이므로 continue수행 -> j++로 |
4 | |||||||
4 | 4<10 참->if문 수행 |
4%3 1==0 거짓이므로 continue수행 안하고 아래로 |
1%4 1==0 거짓이므로 break 수행 안하고 아래로 |
2 | 3 | 5 | ||||
5 | 5<10 참->if문 수행 |
5%3 2==0 거짓이므로 continue수행 안하고 아래로 |
1%4 1==0 거짓이므로 break 수행 안하고 아래로 |
3 | 4 | 6 | ||||
6 | 6<10 참->if문 수행 |
6%3 0==0 참이므로 continue수행 -> j++로 |
7 | |||||||
7 | 7<10 참->if문 수행 |
7%3 1==0 거짓이므로 continue수행 안하고 아래로 |
1%4 1==0 거짓이므로 break 수행 안하고 아래로 |
4 | 5 | 8 | ||||
8 | 8<10 참->if문 수행 |
8%3 2==0 거짓이므로 continue수행 안하고 아래로 |
1%4 1==0 거짓이므로 break 수행 안하고 아래로 |
5 | 6 | 9 | ||||
9 | 9<10 참->if문 수행 |
9%3 0==0 참이므로 continue수행 -> j++로 |
10 | |||||||
10 | 10<10 거짓이므로 내부 for문 빠져나오고, 빠져나오면서 i증감 수행 |
6 | 2 | |||||||
2 | ||||||||||
하......................
내부 for문 한 싸이클을 돌리면 엄청난 노가다가 앞으로 필요해지는 것이 느껴집니다..
이후에는 패턴을 분석해서 식을 찾는 것이 중요하겠습니다.
** sum 값이 더해진 곳을 보시면 j가 1~9까지 돌 때 3,6,9일 때 더해 지지 않고 1,2,4,5,7,8일 때 1씩 더해지는 것을 알 수 있습니다. (j가 1증가할 때마다 6증가)
** 식을 보면 i==0일 때 즉 i값이 4,8이 됐을 때 break문을 만나고 빠져나오게 되면 j값은 증가를 하지 않기 때문에
for문을 빠져나올 때 값만 제외시켜 주면 됩니다.
즉 표로 정리하면
i가 1증가할때마다 6씩 오르고
i가 9까지 증가하므로
i값 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
내부 for문에서의 sum의 합 | 6 | 6 | 6 | 0 | 6 | 6 | 6 | 0 | 6 |
답
sum값은 42
헷갈릴 만한 POINT
* i가 4일 때 break를 만나면, 내부 for문만 빠져나오게 되고 외부 for문은 여전히 실행한다.
연습용으로만 풀어보고... 다시는 뒤돌아보지 맙시다....
'iOS > 정보처리기사' 카테고리의 다른 글
[정보처리기사] C언어 - 포인터의 이해(feat. 포인터변수, 주소, 주소값) (0) | 2022.06.09 |
---|---|
[정보처리기사] C언어 - 배열의 이해와 배열 문제풀이 (0) | 2022.06.03 |
[정보처리기사] C언어 - while과 if문이 같이 있는 문제 박살내기 (0) | 2022.06.01 |
[정보처리기사] C언어 - for, while, do~while 차이 모르겠다면..(for while차이, for while복합문제) (0) | 2022.05.30 |
[정보처리기사] C언어 - 제어문(if문, switch문) (0) | 2022.05.27 |