C언어 사용자정의함수와 포인터를 사용해서 내림차순

2018. 10. 12. 23:52개발노트

사용자 정의 함수는 void main이 아닌 곳에 정의해줍시다.

필요한 사용자 정의 함수는 

입력, 출력, 순서변환 함수이기때문에


각각 void InputData()

void Display()

void DecendingOrder()

라고 정의 해주겠습니다.


그리고 배열과 포인터를 사용해서 값들을 전달해주기위해


void main(void)에 배열과 포인터를 정의해줍니다.


{

int n[5]; //배열만들기

int *ptr; //포인터만들기

ptr = &n[0] //포인터를 배열과 연결

}


이제 만들어진 포인터를 각각의 함수들과도 연결시켜야 합니다.


void InputData(int* ptr)

void Display(int* ptr)

void DecendingOrder(int* ptr)


이렇게하면 포인터 연결이 끝났습니다.

이제 함수를 만들면 됩니다.


1
2
3
4
5
6
7
8
void InputData(int* ptr) {
    printf("정수5개입력 \n");
    
    for (int i = 0; i < 5; i++)
    {
        scanf("%d", ptr + i);
    }
}
cs

정수 5개를 입력받는 함수입니다.

scanf("%d", ptr + i); 로 포인터 번호를 늘려가며 입력해줍니다.


1
2
3
4
5
6
7
void Display(int *ptr) {
    for (int i = 0; i < 5; i++)
    {
        printf("%d "*(ptr + i));
    }
    printf("\n");
}

cs

입력받은대로 표시해줍시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void DescendingOrder(int *ptr)
{
    int temp = 0;
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if (*(ptr + j) < *(ptr + j + 1))
            {
                temp = *(ptr + j);
                *(ptr + j) = *(ptr + j + 1);
                *(ptr + j + 1= temp;
            }
        }
    }
}
cs

for문을 두번 도는 이유는 각각의 값들을 비교해주기 위해서 인데

for (int i = 0; i < 4; i++) 정렬을 위한 반복횟수(한번만해서는 완벽한 정렬이 되지 않기때문)

for (int j = 0; j < 5; j++) 포인터의 값들을 비교하기위한 반복

if문은 포인터 n번지와 n+1번지의 값을 비교해서 n번지값이 n+1번지의 값보다 작다면

temp에 n번지의 값을 임시로 저장해놓고

n번지에 n+1번지의 값을 채워넣습니다.

마지막으로 n+1번지의 값에는 임시로 저장했던 temp의 값을 넣습니다.


이제 main으로 가서 함수를 호출하면 끝입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
void main(void)
{
    int n[5];
    int *ptr;
    ptr = &n[0];
    InputData(ptr);       //사용자 정의 함수
    printf("[입력 데이터]\n");
    Display(ptr);   //사용자 정의 함수
    DescendingOrder(ptr);  //사용자 정의 함수
    printf("[내림차순으로 정렬된 데이터]\n");
    Display(ptr);
}
 
cs

함수를 호출할때 함수의 괄호에 ptr이 들어가는 이유는

함수에 포인터 ptr을 전달해주기 위해서입니다.