반복 루프를 사용하다가 입력될 데이터의 정확한 개수를 모르거나 너무 많아서 개수를 알기가 어려운 경우에는 데이터의 끝에다 끝을 알리는 특수한 데이터를 놓는다. 프로그램에서는 이러한 특수한 데이터가 감지되면 데이터의 입력을 중단한다. 이것은 센티널 또는 보초값이라고한다.
보통 센티널 또는 보초값은 일반적인 데이터값에서는 절대로 나올수 없는 값으로 선택한다.
이전강의까지는 알고리즘을 생각할 필요가 없는 순차 구조만을 사용하였지만 선택구조, 반복 구조가 들어가게 되면서 알고리즘을 고려할 때가 되었다.
알고리즘을 만드는 기초적인 방법은 문제를 더 작은 크기의 단계들로 분해하는 것이다.
ex1)
기존 |
분해 과정 1 |
성적의 평균을 구한다. |
1. 필요한 변수를 초기화. 2. 성적을 입력받고 합계를 수하고 개수를 센다. 3. 평균을 계산하고 화면에 출력한다. |
평균을 구한다를 크게 3가지로 분해하였다. 하지만 아직은 부족하다. 더 분해가 가능하다.
분해 과정1 |
분해 과정2 |
1. 필요한 변수를 초기화. |
sum을 0으로 초기화. n을 0으로 초기화. grade를 0으로 초기화. |
2. 성적을 입력받고 합계를 수하고 개수를 센다. |
while (성적이 0 이상이면) 사용자로부터 성적을 읽어서 grade에 저장. sum에 이 점수를 누적 n을 하나 증가. |
3. 평균을 계산하고 화면에 출력한다. |
sum을 n으로 나누어서 average에 저장한다. average를 화면에 출력한다. |
이정도 까지 분해를 하면 프로그래밍 언어의 문장으로 일대일 변환이 가능하다. 한번 해보자.
//성적의 평균을 구하는 프로그램
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <stdio.h> int main() { int grade, n; double 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; } | cs |
실행 결과
//최대 공약수 찾기
while루프를 이용하여 최대 공약수를 구해본다. 최대 공약수란 두개의 정수의 공통 약수 중에서 가장 큰 수를 의미한다.
알고리즘 |
1. 두 수 가운데 큰 수를 x, 작은 수를 y라 한다. 2. y가 0이면 최대 공약수는 x와 같고 알고리즘을 종료한다. 3. r ← x % y 4. x ← y 5. y ← r 6. 단계 2. 로 되돌아간다. |
위 알고리즘에서는 반복이 존재한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> int main() { 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; } | cs |
실행 결과
'C 프로그래밍 > 5. 반복문' 카테고리의 다른 글
5-5-2 for 문 2 (0) | 2019.05.21 |
---|---|
5-5-1 for 문 1 (0) | 2019.05.21 |
5-4 do_while문 (0) | 2019.05.21 |
5-2 while문 (0) | 2019.05.19 |
5-1 반복의 개념 (0) | 2019.05.18 |