C Programming Ch7 : 반복문
1. 반복의 개념
반복(iteration)
-
같은 내용의 처리 과정을 여러 번 되풀이하는 것을 의미한다.
-
프로그램에서의 반복적인 작업은 반드시 필요하다.
반복 구조
-
어떤 조건이 만족될 때까지 루프 형태로 반복하여 도는 구조이다.
반복문의 종류
-
while 루프
-
주어진 조건이 만족되면 반복을 계속 진행하는 구조이다.
-
반복 횟수를 알 수 없고 조건에 따라서 반복을 제어하여야 할 때에 사용된다.
-
-
for 루프
- 정해진 횟수만큼 반복을 제어하여야 할 때에 사용된다.
2. while 문
while 문
-
주어진 조건이 만족되는 동안 문장들을 반복하여 실행하는 구조이다.
while 문을 사용한 예제
while 문의 실행 과정
-
while 문의 조건식을 확인한다.
-
조건식이 참인 경우에 while 문 내부의 문장들을 실행한다. 이때, 문장들이 실행되는 도중에 조건식의 값을 변형시키는 방법이 가장 일반적으로 사용된다.
-
문장 실행이 모두 완료되면 조건식을 다시 확인한다.
-
3에서 확인 결과가 거짓일 때까지 1~3을 반복한다.
-
3에서 결과가 거짓인 경우에는 while 문에서 빠져나온다.
예제 : while 문을 활용한 구구단 출력 프로그램
// gugu.c
/* while 문을 이용한 구구단 출력 프로그램 */
#include <stdio.h>
int main(void)
{
int n;
int i = 1;
printf("출력하고 싶은 단: ");
scanf("%d", &n);
while (i <= 9) {
printf("%d x %d = %d \n", n, i, n * i);
i++;
}
return 0;
}
출력하고 싶은 단: 9
9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
예제 : while 문을 활용한 합계 프로그램
// sum1.c
/* while 문을 이용한 합계 프로그램 */
#include <stdio.h>
int main(void)
{
int i, n, sum;
i = 0; // 변수 초기화
sum = 0; // 변수 초기화
while (i < 5)
{
printf("값을 입력하시오: ");
scanf("%d", &n);
sum = sum + n; // sum += n;과 같다.
i++;
}
printf("합계는 %d입니다.\n", sum);
return 0;
}
값을 입력하시오: 10
값을 입력하시오: 20
값을 입력하시오: 30
값을 입력하시오: 40
값을 입력하시오: 50
합계는 150입니다.
while 문에서 주의할 점
- 반복 루프를 생성하기 위해서 중괄호를 반드시 작성해야 한다.
int i=0;
while(i < 3) // 중괄호 존재 x
printf("반복중입니다.\n");
i++;
- 조건 뒤에 세미클론 ';'이 있으면 반복문이 실행되지 않는다.
int i = 0;
while(i < 3); // 하나의 문장으로 취급되므로 해당 문장만 반복
{
printf("반복중입니다.\n");
i++;
}
- 조건식의 변수를 제어하는 문장이 while문에 존재하지 않으면, 반복이 무한히 지속되는 무한 루프(infinite loop) 현상이 이루어진다.
int i = 0;
while(i < 3)
{
printf("반복중입니다.\n");
}
예제 : while 문의 조건식에서 참과 거짓의 처리
- while 문의 조건식에서는 0이 아닌 값들을 전부 참이고, 0을 거짓으로 처리한다.
#include <stdio.h>
int main(void)
{
int i = 3;
while (i) // while(i != 0) 과 같은 의미
{
printf("%d는 참입니다.\n", i);
i--;
}
printf("%d은 거짓입니다.\n", i);
return 0;
}
3는 참입니다.
2는 참입니다.
1는 참입니다.
0은 거짓입니다.
if 문과 while 문의 비교
3. 센티널(보초값)의 이용
센티널(sentinel)
-
입력되는 데이터의 끝을 알리는 특수한 값을 의미한다.
-
일반적으로 센티널의 값은 음수(-1)를 사용한다.
예제 : 센티널 값을 활용한 성적의 평균 구하기
// average.c
/* while 문을 이용한 성적의 평균 구하기 프로그램 */
#include <stdio.h>
int main(void)
{
int grade, n;
float sum, average;
// 필요한 변수들을 초기화한다.
n = 0;
sum = 0;
grade = 0;
printf("성적 입력을 종료하려면 음수를 입력하시오\n");
// 성적을 입력받아서 합계를 구하고 학생 수를 센다.
while (grade >= 0)
{
printf("성적을 입력하시오: ");
scanf("%d", &grade);
sum += grade;
n++;
}
sum = sum - grade; // 마지막 데이터를 제거한다.
n--; // 마지막 데이터를 제거한다.
// 평균을 계산하고 화면에 출력한다.
average = sum / n;
printf("성적의 평균은 %f입니다.\n", average);
return 0;
}
성적 입력을 종료하려면 음수를 입력하시오
성적을 입력하시오: 10
성적을 입력하시오: 20
성적을 입력하시오: 30
성적을 입력하시오: 40
성적을 입력하시오: 50
성적을 입력하시오: -1
성적의 평균은 30.000000입니다.
예제 : 최대 공약수 구하기
// gcd.c
/* while 문을 이용한 최대 공약수 구하기 프로그램 */
#include <stdio.h>
int main(void)
{
int x, y, r;
printf("두개의 정수를 입력하시오(큰수, 작은수): ");
scanf("%d%d", &x, &y);
while (y != 0)
{
r = x % y;
x = y;
y = r;
}
printf("최대 공약수는 %d입니다.\n", x);
return 0;
}
두개의 정수를 입력하시오(큰수, 작은수): 6 2
최대 공약수는 2입니다.
4. do-while 문
do-while 문
-
while 문에서 반복 조건을 루프의 처음이 아니라 루프의 끝에서 검사하여 실행하는 구조이다.
-
적어도 한 번은 반복문장(do 루프)를 실행한다는 특징을 지니고 있다.
예제 : 숫자 추측 게임
// game.c
/* do-while 문을 활용하여 숫자 알아맞히기 게임을 구현한 프로그램*/
#include <stdio.h>
int main(void)
{
int answer = 59; // 정답
int guess;
int tries = 0;
// 반복 구조
do {
printf("정답을 추측하여 보시오: ");
scanf("%d", &guess);
tries++;
if (guess > answer) // 사용자가 입력한 정수가 정답보다 높으면
printf("제시한 정수가 높습니다.\n");
if (guess < answer) // 사용자가 입력한 정수가 정답보다 낮으면
printf("제시한 정수가 낮습니다.\n");
} while (guess != answer);
printf("축하합니다. 시도횟수=%d\n", tries);
return 0;
}
정답을 추측하여 보시오: 50
제시한 정수가 낮습니다.
정답을 추측하여 보시오: 30
제시한 정수가 낮습니다.
정답을 추측하여 보시오: 57
제시한 정수가 낮습니다.
정답을 추측하여 보시오: 60
제시한 정수가 높습니다.
정답을 추측하여 보시오: 59
축하합니다. 시도횟수=5
5. for 문
for 문
-
정해진 횟수만큼 반복하여 실행하는 구조이다.
-
for 문은 초기식(initialization), 조건식(expression), 증감식(increment)의 3부분으로 이루어져 있다.
for 문을 사용한 예제
for 문의 실행 과정
-
for 문에서 초기식이 한 번만 실행된다.
-
조건식이 검사되고, 만약 조건식이 참이면 루프(문장)이 실행된다.
-
루프의 실행이 끝나면 증감식이 실행된다.
-
조건식을 다시 확인한다.
-
4에서 확인 결과가 거짓일 때까지 1~3을 반복한다.
-
4에서 결과가 거짓인 경우에는 for 문에서 빠져나온다.
예제 : 1~10의 정수합 출력하기
// sum_for.c
/* 반복을 이용한 정수합 프로그램 */
#include <stdio.h>
int main(void)
{
int sum;
sum = 0;
for (int i = 1; i <= 10; i++) // i는 1부터 10까지 증가
sum += i; // sum = sum + i;와 같음
printf("1부터 10까지의 정수의 합= %d\n", sum);
return 0;
}
1부터 10까지의 정수의 합= 55
while 루프와 for 루프의 관계
증감수식의 형태 사용
-
for 문에서의 증감식은 주로 증가식이 사용되지만, 때에 따라서는 감소식도 사용 가능하다.
-
for 문에서의 증감식의 증감 범위 역시 조절 가능하다.
-
for 문에서 증감식 부분은 증감 이외에도 다른 연산자(곱셈, 나눗셈, 복합대입 등) 사용이 가능하다.
-
경우에 따라서 필요한 경우, 증감식 부분에 어떤 수식이라도 사용 가능하다.
-
for 문의 3 부분을 생략하고 세미클론만 작성한 경우에는 무한 반복 루프가 실행되게 된다.
중첩 반복문(nested loop)
-
반복문 안에 다른 반복문이 위치된 구조를 의미한다.
예제 : 중첩 for 문을 사용하여 x를 사각형 모양으로 출력하기
//nested_loop1.c
/* 중첩 for 문을 이용하여 'x'를 사각형 모양으로 출력하는 프로그램 */
#include <stdio.h>
int main(void)
{
for (int y = 0; y < 5; y++) // 바깥 반복문
{
for (int x = 0; x < 10; x++) // 안쪽 반복문
printf("*");
printf("\n"); // 안쪽 반복문이 종료될때마다 실행
}
return 0;
}
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
break 문
-
반복 루프안에서 빠져 나오는 데 사용한다.
-
일반적으로 반복문 실행 도중에 특수하게 중단이 필요한 경우에 사용된다.
예제 : break 문을 사용하여 실수의 제곱근을 출력하기
// square_root.c
/* break를 이용하여 무한루프를 탈출하는 프로그램 */
#include <stdio.h>
#include <math.h>
int main(void)
{
double v;
while (1)
{
printf("실수값을 입력하시오: ");
scanf("%lf", &v);
if (v < 0.0)
break;
printf("%f의 제곱근은 %f입니다.\n", v, sqrt(v));
}
return 0;
}
실수값을 입력하시오: 9
9.000000의 제곱근은 3.000000입니다.
실수값을 입력하시오: 25.0
25.000000의 제곱근은 5.000000입니다.
실수값을 입력하시오: -1
continue 문
-
현재 반복을 중단하고 다음 반복을 시작하게 해야 할 때에 사용한다.
예제 : 소문자를 대문자로 변경하는 프로그램
// to_upper.c
/* 소문자를 대문자로 변경하는 프로그램 */
#include <stdio.h>
int main(void)
{
char letter;
while (1)
{
printf("소문자를 입력하시오: ");
scanf(" %c", &letter); // 공백 문자 제외
if (letter == 'Q')
break;
if (letter < 'a' || letter > 'z')
continue;
letter -= 32; // 소문자 -> 대문자
printf("변환된 대문자는 %c입니다.\n", letter);
}
return 0;
}
소문자를 입력하시오: a
변환된 대문자는 A입니다.
소문자를 입력하시오: b
변환된 대문자는 B입니다.
소문자를 입력하시오: c
변환된 대문자는 C입니다.
소문자를 입력하시오: q
변환된 대문자는 Q입니다.
소문자를 입력하시오: Q
Author And Source
이 문제에 관하여(C Programming Ch7 : 반복문), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ten0213/C-Programming-Ch7-반복문저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)