본문 바로가기
c언어

c언어 배열을 함수를 이용하여 다루기(배열의 복사, 배열의 비교, 배열의 변경, 학생들의 성적 평균 구하기)

by 개발자 L 2022. 12. 6.
반응형

c언어 배열을 함수를 이용하여 다루기(배열의 복사, 배열의 비교, 배열의 변경, 학생들의 성적 평균 구하기)

네 안녕하세요, 이번 포스팅에서는 배열을 함수를 이용하여 다뤄보는 시간을 가져보려 합니다.

배열 역시 일반 변수들처럼 함수에 전달이 가능합니다.

그래서 이러한 특징이 있어서 다량의 데이터를 한 번에 처리를 할 수가 있습니다.

그럼 바로 시작을 해보도록 하겠습니다.

 

1. 함수를 이용하여 배열 복사하기

이전 포스팅에서는 배열을 그냥 복사를 했지만,

함수를 이용하면 배열을 통으로 복사를 할 수가 있습니다.

사실 우리가 필요로 하는 것은 데이터를 하나씩 보는 것이 아니라 통째로 보는 것이죠?
그래서 그걸 구현을 해보려고 합니다.

그럼 바로 보여드리도록 하겠습니다.

#include <stdio.h>

#define SIZE 10

void array_print(int A1[], int size); // 배열 출력 함수
void array_copy(int A2[], int B2[], int size); // 배열 복사 함수
 
int main()
{
    int A[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int B[SIZE] = {0};
 
    array_print(A, SIZE);
    array_copy(A, B, SIZE);
    array_print(B, SIZE);

    return 0;
}

void array_print(int A1[], int size)
{
    for(int i = 0; i < SIZE; i++)
    {
        printf("%d", A1[i]);
    }

    printf("\n");
}

void array_copy(int A2[], int B2[], int size)
{
    int tmp;

    for(int i = 0; i < SIZE; i++)
    {
        tmp = A2[i];
        B2[i] = tmp;
        B2[i] = A2[i];
    }

    printf("\n");
}

코드가 좀 길죠?

여기에서는 두 개의 사용자 정의 함수를 쓰게 되었기 때문에 그렇습니다.

각각의 함수는 배열을 출력할 때 쓰는 함수, 그리고 배열을 복사할 때 쓰는 함수를 작성을 한 것입니다.

그래서 제일 처음에 배열 A를 찍어내고, 그 후에 배열 A를 복사하여 배열 B에 붙여 넣는 식이 됩니다.

그럼 결과를 한 번 보도록 하겠습니다.

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

이렇게 잘 복사가 되어서 나온 것을 볼 수 있습니다.

 

2. 배열의 비교

배열도 사용자 정의 함수를 이용하여 비교를 할 수 있습니다.

이전에 보여드렸던 방법은 정확도가 조금 떨어지는 면이 있었는데,

사용자 정의 함수를 작성하여 비교를 하면 더 정확한 결과를 얻을 수 있습니다.

그럼 지금 바로 작성을 해보도록 하겠습니다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 10

void array_print(int A1[], int size);
int array_compare(int A2[], int B2[], int size);

int main()
{
    srand((unsigned)time(NULL));

    int A[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int B[SIZE] = {1, 1, 2, 3, 4};
    int result;

    array_print(A, SIZE);
    array_print(B, SIZE);
    printf("\n");

    result = array_compare(A, B, SIZE);

    if(result == 0)
    {
        printf("두 배열은 서로 다릅니다.\n");
    }

    else
    {
        printf("두 배열은 서로 같습니다.\n");
    }

    return 0;

}

void array_print(int A1[], int size)
{
    for(int i = 0; i < SIZE; i++)
    {
        printf("%d", A1[i]);
    }

    printf("\n");
}

int array_compare(int A2[], int B2[], int size)
{
    for(int i = 0; i < SIZE; i++)
    {
        if(A2[i] != B2[i])
        {
            return 0;
            break;
        }

        else
        {
            continue;
        }

        return 1;
    }
}

이렇게 작성을 해봤습니다.

여기에서 주의를 할 점은 배열을 출력하는 함수는 아무런 값을 반환하지 않기 때문에 void로 두어야 하고,

비교를 하는 함수는 각각의 배열 요소의 일치 여부에 따라서 정수형 값을 반환을 하기 때문에 int형으로 두었다는 것입니다.

일단 배열이 서로 다른 경우를 먼저 작성을 해봤는데, 이 결과 먼저 보도록 하겠습니다.

1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 0 0 0 0 0

두 배열은 서로 다릅니다.

두 배열이 다름을 컴파일러가 인지하여 출력을 한 것을 볼 수 있습니다.

다음으로 같을 경우의 코드입니다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 10

void array_print(int A1[], int size);
int array_compare(int A2[], int B2[], int size);

int main()
{
    srand((unsigned)time(NULL));

    int A[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int B[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int result;

    array_print(A, SIZE);
    array_print(B, SIZE);
    printf("\n");

    result = array_compare(A, B, SIZE);

    if(result == 0)
    {
        printf("두 배열은 서로 다릅니다.\n");
    }

    else
    {
        printf("두 배열은 서로 같습니다.\n");
    }

    return 0;

}

void array_print(int A1[], int size)
{
    for(int i = 0; i < SIZE; i++)
    {
        printf("%d", A1[i]);
    }

    printf("\n");
}

int array_compare(int A2[], int B2[], int size)
{
    for(int i = 0; i < SIZE; i++)
    {
        if(A2[i] != B2[i])
        {
            return 0;
            break;
        }

        else
        {
            continue;
        }

        return 1;
    }
}

코드는 같고, 배열의 원소만 똑같이 나열했습니다.

그럼 결과를 바로 보도록 하겠습니다.

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

두 배열은 서로 같습니다.

결과가 잘 나오는 것을 볼 수가 있습니다.

반응형

 

3. 원본 배열의 변경

그리고 원본 배열을 변경도 할 수 있어야겠죠?

우리가 배열을 다룬다는 것은 매개 변수를 이용하여 원본을 참조하는 것이라서 항상 조심해야 합니다.

그래서 우리가 배열을 변경하는 것은 매개 변수를 통해 원본 배열의 변수를 변경을 하는 것과 같습니다.

그럼 바로 보여드리도록 하겠습니다.

#include <stdio.h>

#define SIZE 6

void array_modify(int A1[], int size);
void print_array(int A2[], int size);

int main()
{
    int A[SIZE] = {1, 2, 3, 4, 5, 6};

    print_array(A, SIZE);
    array_modify(A, SIZE);
    print_array(A, SIZE);

    return 0;
}

void array_modify(int A1[], int size)
{
    for(int i = 0; i < size; i++)
    {
        ++A1[i];
    }
}

void print_array(int A2[], int size)
{
    for(int i = 0; i < size; i++)
    {
        printf("%d", A2[i]);
    }

    printf("\n");
}

이렇게 한 번 작성을 해봤습니다.

여기에서는 배열을 인수로 받아서 배열 내에 있는 모든 요소를 증가시키는 방법을 택해야 하기 때문에 후위 연산을 해야 합니다.

그럼 결과를 보여드리도록 하겠습니다.

1 2 3 4 5 6
2 3 4 5 6 7

결과가 잘 나온 것을 볼 수 있습니다.

 

3 - 1. 원본 배열 변경 금지시키기

원본 배열을 변경을 할 수 있다면, 반대로 원본 배열의 변경을 하지 못하게 막을 수도 있어야겠죠?
배열이 함수의 매개 변수로 전달이 되는 경우에 함수 안에서 배열 요소들의 값을 변경할 수 있는데,

개발자가 의도를 하지 않았음에도 불구하고, 배열에 있는 요소들의 값이 변경이 되는 경우가 생깁니다.

그래서 그러한 것을 방지하고자 우리는 변수를 상수화 시켰던 것 처럼 const 지정자를 써서 방지를 할 수 있습니다.

이렇게 쓰시면 됩니다.

void print_array(const int A[], int size)
{
    ...
    A[0] = 1000; // 컴파일 시 오류가 발생(배열의 값을 변경하겠다는 말이기 때문에, 상수화 시킨 배열과 충돌하여 오류가 일어남)
}

이렇게 const만 붙여서 본인이 선언한 배열에 대하여 상수화를 시킬 수가 있습니다.

 

4. 배열을 함수로 다룬 간단한 예시 - 학생들의 성적을 평균 계산하기

배열을 함수로 다룬 가장 쉬운 예제는 바로 성적 계산을 하는 것입니다.

다수의 학생의 성적을 배열에 입력을 하여 평균을 구하는 것입니다.

그럼 바로 작성을 해보도록 하겠습니다.

#include <stdio.h>

#define STUDENTS 5

int get_avg(int scores1[], int size);

int main()
{
    int avg, scores[STUDENTS] = {10, 45, 56, 23, 99};

    avg = get_avg(scores, STUDENTS);

    printf("평균은 %d입니다.\n", avg);

    return 0;
}

int get_avg(int scores1[], int size)
{
    int sum = 0;

    for(int i = 0; i < size; i++)
    {
        sum += scores1[i];
    }

    return sum / size;
}

이렇게 작성을 했습니다.

평균은 정수로 받기 때문에 반환값이 존재해야 합니다.

그럼 결과를 바로 보도록 하겠습니다.

평균은 46입니다.

결과도 잘 나오는 것을 볼 수가 있습니다.

 

여기까지 배열을 함수로 다루는 방법에 대하여 알아보았습니다.

다음 포스팅에서는 정렬을 하는 방법에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다 ~

반응형

댓글