CS/C

[2021W C프로그래밍과 실습][함수 문제5] 평균보다 작은 점수를 모두 반환하는 함수 작성하기

아이스얼그레이 2022. 2. 9. 22:24

교수님이 주신 함수 문제중 좀 까다로운 문제이다.

6명의 점수를 입력받아서 평균을 구한 다음, 평균보다 작은 점수를 모두 반환하는 small() 함수를 작성하시오.

1. 전처리부와 main() 함수

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

double sum(double* arr);
double* small(double* arr);

int main(void)
{
	double arr[6], * result;
	int i;

	for (i = 0; i < 6; i++)
	{
		printf("%d번째 점수 : ", i + 1);
		scanf("%lf", &arr[i]);
	}

	result = small(arr);

	printf("평균보다 작은수\n\n");

	for (i = 0; i < 6 && result[i] != 0; i++)
		printf("%5.2lf  \n", *(result + i));
}

배열 원소들의 합을 구하기 위한 sum() 함수를 임의로 선언하였다. 그리고 small() 함수는 매개변수도 double형 포인터 변수로 받고 반환 타입도 double형 포인터 변수이다.

for문에서 6명의 점수를 입력받는다. 이때 점수는 double형이다.

그리고 result라는 double형 포인터 변수에 small(arr)의 반환값을 저장한다.

2. small() 함수 (sum() 함수는 간단해서 생략)

double* small(double* arr)
{
	int i, j = 0;
	double avg = sum(arr) / 6;
	double* ptr;

	ptr = (double*)calloc(6, sizeof(double));

	for (i = 0; i < 6; i++)
		if (*(arr + i) < avg)
		{
			*(ptr + j++) = *(arr + i);
		}

	return ptr;
}

굳이 메모리 동적할당을 복습하고자 double형 포인터 변수 ptr을 선언하고 double 크기의 메모리를 6개 할당시켰다. 그리고 for문에 들어간다. 이때 입력받은 arr의 원소가 avg보다 작다면 (ptr + j++) 라는 주소에 값을 저장한다.

ptr에 avg보다 작은 원소들이 저장되었고 ptr을 반환해준다.

여기서도 10-10에서 헷갈렸던 부분이 나온다. 배열의 시작주소를 반환하면 함수가 종료되어도 배열의 원소들이 사라지는 것이 아니다! 할당된 배열의 주소와 원소들이 같이 return된다.

그래서 반환된 ptr을 main()에서 출력하면 평균보다 작은 점수가 모두 출력된다.

이때 메모리 동적할당 시 calloc을 사용했는데, malloc을 사용하면 주소가 지칭하는 값이 쓰레기값으로 저장되어서 main()의 result[i] != 0을 쓸 수가 없다. 그래서 할당시 0으로 값이 0으로 초기화되는 calloc을 사용해 메모리를 할당했다.