일
KNK Chap.6 (6.1) 본문
06 루프
루프loop란 구문(루프 본문loop body)을 반복해서 실행하는 구문임.
C의 모든 루프는 제어식controlling expression을 필요로 함.
루프 본문이 실행될 때마다 (루프의 한 반복iteration) 제어식이 평가됨.
만약 제어식이 참, 즉 0이 아닌 값을 갖는다면 루프는 계속 실행됨.
C의 반복문은 저번에 말했듯 while문, do문, for문이 있음. 6단원에서 배울 것임.
while문은 루프 본문 이전에 제어식이 평가되는 루프에 사용함.
do문은 루프 본문이 실행된 다음에 제어식이 평가되는 루프에 사용함.
for문은 루프가 특정 변수를 증감시킬 때 사용함.
루프의 접속 및 탈출에 사용되는 기능들은 break문, continue문, goto문이 있음.
break문은 루프에서 벗어나 루프 다음 구문으로 제어를 넘김.
continue무는 본 구문 이하의 루프 반복을 무시함.
goto문은 함수 내 특정 구문으로 도약함.
마지막으로 본문이 없는 루프를 생성할 때는 null문을 사용함.
6.1 while문
반복문 중 가장 간단하면서도 중요한 구문임. 구조는 아래와 같음.
while ( expression ) statement
괄호 내 표현식이 제어식이고, 괄호 다음 구문이 루프 본문임. 예제 ↓
while (i < n) /* 제어식 */
i = i * 2; /* 루프 본문 */
괄호 필수. 오른쪽 괄호와 루프 본문 사이에 추가될 건 없음.
(몇몇 프로그래밍 언어는 do를 필요로 함)
while문이 실행되면 일단 제어식이 평가됨.
제어식의 값이 0이 아닌 참이라면, 루프 본문이 실행되고 다음 제어식을 다시 평가함.
그래서 제어식의 값이 0이 될 때까지 계속 반복됨.
조금 더 구체적인 예제를 보자.
어떤 수 n보다 크거나 같은 수 중 가장 작은 2의 제곱수를 찾는 예제.
i = 1;
while (i < n)
i = i * 2;
여기서 n의 값이 10이라고 가정. while문의 동작 논리를 표로 만들어 보면 ↓
즉 제어식 (i < n)이 참이면 루프는 계속 돌아감.
루프 본문은 한개의 구문이어야 하지만, 여러 구문을 실행시키려면 중괄호로 복합문 만들면 됨.
그리고 중괄호가 굳이 필요하지 않은 상황이더라도 중괄호는 넣어주는게 실무에서 좋음.
반복문이 실행되는 예제를 또 하나 보겠음.
i = 10;
while (i > 0) {
printf("T 빼기 %d, 세는 중\n", i);
--i;
}
while문이 실행되기 전, i에 10이 할당됨.
10 > 0 이므로 본문이 실행되고 T 빼기 10, 세는 중 이라는 메시지가 출력됨.
i 값이 감소하여 T 빼기 1, 세는 중 이라는 메시지가 나올 때까지 실행되고,
i > 0의 값이 거짓이 되면 루프가 종료됨.
이 카운트다운 예제를 통해 while문의 특징을 알 수 있음.
○ 제어식이 거짓이면 while문 루프가 종료됨.
○ while문의 루프 본문이 아예 실행되지 않을 수도 있음.
○ 다양한 방식으로 while문이 작성될 수 있음.
예를 들어, 카운트다운 루프에서 i를 printf()의 호출 내에서 감소시켜 루프 길이를 줄일 수도 ↓
while (i > 0) {
printf("T 빼기 %d, 세는 중\n", --i);
}
무한 루프
제어식이 언제나 0이 아닌 값을 가져 종료되지 않는 while문.
의도적으로 무한 루프infinite loop를 만드는 경우가 많음.
[관용구]
while (1) ...
위와 같은 while문은 루프 본문에 루프 밖으로 벗어나게 해주는 구문이 없으면 평생 실행됨.
[프로그래밍] 제곱표 출력하기
제곱수를 표 형식으로 출력하는 프로그램을 만들어볼 것임.
우선 사용자로부터 숫자 n을 받음. 그 다음엔 n개 줄을 출력함.
1에서 n까지 각 줄에는 해당 번째 숫자와 그 숫자의 제곱수를 출력할 것임.
제곱수를 출력하고 싶은 만큼의 개수를 n이라는 변수에 저장할 것임.
그럼, 숫자 i와 그 숫자의 제곱수를 계속 출력하는 루프가 필요할 것임.
시작은 i가 1과 같은 때. i가 n보다 작거나 같을 때 루프는 계속 실행될 것임.
매 루프가 실행될 때마다 i에 1을 더해줄 것임.
여기서 변환규격을 %d 대신 %10d를 쓰기 때문에, 숫자가 규칙적으로 출력됨.
출력 길이가 지정되면 printf는 숫자를 우측 정렬함.
[프로그래밍] 수열의 합 구하기
사용자에게 정수열을 입력하게 하고, 그 정수열의 합을 출력하는 프로그램을 만들 것임.
눈치가 빠르면 scanf로 숫자를 읽어야 할 때, 수열의 합을 구할 때 루프가 필요해보일 것임.
n을 읽은 숫자, sum을 수열의 합이라고 하면 아래와 같이 코드 짤 수 있음 ↓
숫자를 입력받은 조건 n != 0을 판별해주었음.
이를 통해 루프가 가능한 순간 바로 종료됨.
또한 scanf를 똑같이 두 번 호출하는데, while문을 사용할 때 자주 발생하는 중복임.
'C' 카테고리의 다른 글
KNK Chap.6 (6.3) (0) | 2022.12.16 |
---|---|
KNK Chap.6 (6.2) (0) | 2022.12.16 |
KNK Chap.5 (Q&A) (0) | 2022.12.16 |
KNK Chap.5 (5.3) (0) | 2022.12.15 |
KNK Chap.5 (5.2) (0) | 2022.12.15 |