혼자 공부하는 C언어 9챕터 도전실전예제
문제
키보드로 실수 3개를 입력한 다음 큰 숫자부터 작은 숫자로 정렬한 뒤 출력하는 프로그램을 작성합니다. 다음 코드와 출력 결과를 참고하여 line_up 함수를 작성하세요. line_up 함수에는 이미 정의된 swap 함수를 호출하여 구현하세요.
풀이과정:
이미 만들어져 있는 swap 함수는 max, mid, min 중 두 숫자의 위치를 바꾸는 역할을 한다.
가장 큰 숫자를 3, 중간 숫자를 2, 가장 작은 숫자를 1이라고 하자
숫자를 배열하여 나올수 있는 가짓수는 다음과 같다.
321 312 231 213 132 123
321 이면 정상적으로 배열이 되어있는 상태이다.
312 이면 min와 mid을 바꾼다.
231 이면 mid와 max를 바꾼다.
213 이면 min와 mid을 바꾼다. 그 다음 mid와 max를 바꾼다.
132 이면 mid와 max를 바꾼다. 그 다음 min와 mid을 바꾼다.
123 이면 min와 mid을 바꾼다. 그 다음 mid와 max를 바꾼다. 그 다음 min와 mid을 바꾼다.
결국 123일 때의 경우 대로 min mid , mid max, min mid 순서대로 바꾸어준다면 다른 모든 경우도 커버할 수 있다.
이를 토대로 코드를 짜면 다음과 같다.
#include <stdio.h>
void swap(double* pa, double* pd);
void line_up(double* maxp, double* midp, double* minp);
int main(void) {
double max, mid, min;
printf("실수값 3개 입력 : ");
scanf("%lf%lf%lf", &max, &mid, &min);
line_up(&max, &mid, &min);
printf("정렬된 값 출력 : %.1lf, %.1lf, %.1lf\n", max, mid, min);
return 0;
}
void swap(double* pa, double* pb) {
double temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}
//여기까지는 미리 작성된 코드
void line_up(double* maxp, double* midp, double* minp) {
if (*minp > *midp) {
swap(minp, midp);
}
if (*midp > *maxp) {
swap(midp, maxp);
}
if (*minp > *midp) {
swap(minp, midp);
}
}