C 과제: 평균 구하는 함수 작성

2 분 소요

문제

괄호 안에 알맞은 코드를 작성하시오.

double average() {
  ();

  t = (a+b) / (2*1.0);

  return t;
}

int main() {
  int a, b, tot;
  double avg;

  avg = average(a, b);

  printf();
}

아래의 해설을 보지 마시고, 최대한 고민해서 이 문제를 풀어보시기 바랍니다.

해설

이 문제에서처럼 코드가 사전에 작성되어 있는 문제의 경우에는 다음의 사실(fact)을 알고 접근하시면

실제 시험에 이 문제가 출제되었을 때 신속하게 문제풀이를 진행하실 수 있습니다.

“C언어에서 코드 실행의 시발점은 main 함수이기 때문에, 가장 먼저 main 함수 내의 코드부터 위에서 아래로 차근차근 분석해나가야 한다.”

  • 위에서 아래로 분석을 하는 이유는 C언어가 절차적인 특성을 지니기 때문입니다.

언뜻 보기엔 특별해보일 것이 없음에도 사실 가장 중요한 지침이라 할 수 있습니다.

그러므로 main 함수부터 살펴봅시다.

int main() {
  int a, b, tot;
  double avg;

  avg = average(a, b);

  printf();
}

main 함수에는 처음에 다음의 코드가 등장합니다.

int a, b, tot;

이 코드는 3개의 정수형 변수 a, b, tot를 선언하는 문장이며,

변수의 이름과 자료형만 확인하시고 바로 아래 코드로 내려가시면 되겠습니다.

그 아래 코드는 다음과 같으며,

double avg;

자료형은 double이고 변수의 이름은 avg인 실수형 변수를 선언하는 구문입니다.

avg = average(a, b);

위 코드부터 본격적으로 main 함수에서 하나의 기능을 수행하는 함수 average로의 이동이 수반되므로, 이전 코드들에 비해 그 중요도가 상승한다고 볼 수 있겠습니다.

위 코드에서 먼저 c average(a, b);의 구문부터 수행하는 데,

double average() {

}

average 함수에 인자를 전달받을 수 있는 매개변수의 선언이 존재하지 않으므로, 먼저 매개변수부터 선언을 해줘야 합니다.

매개변수의 선언 역시 변수의 선언과 다르지 않기 때문에, 변수 선언과 동일한 방식으로 진행하시면 되겠습니다.

  • 인자(Argument): 어떤 함수 호출 시 전달하는 값

  • 매개변수(Parameter): 전달된 인자를 받아들이는 변수

단, 해당 함수에서 Call by Reference, Call by Value 중 어느 방식으로 인자를 전달받아 기능을 수행하였는지를 먼저 확인해야 하므로,

average 함수의 내부를 살펴볼 필요가 있습니다.

double average() {
  ();

  t = (a+b) / (2*1.0);

  return t;
}

위 코드를 보시면 아시겠지만, 함수 내부에서 포인터 연산이 진행되고 있지 않다는 사실로 미루어 보아 Call by Value로 인자를 전달받아 처리함을 알 수 있습니다.

그러므로 매개변수의 선언부는 다음과 같이 두 개의 정수형 인자(이름은 각각 a와 b)를 전달받을 수 있도록 작성해주시면 되겠습니다.

매개변수의 이름이 각각 a와 b여야 하는 이유는 average 함수 내에서 다음의 연산이 진행되고 있기 때문입니다.

t = (a+b) / (2*1.0);

위의 a와 b는 우리가 선언한 적이 없는 변수들이기 때문에 매개변수를 a, b로 각각 선언하게 되면 average 함수 내에서 이 변수들의 값들을 이용하게 될 것입니다.

또한 t 역시 우리가 선언하지 않은 변수이기 때문에 이것 역시 선언을 해줘야 합니다.

그런데 해당 코드의 위 코드를 보시면 괄호로 작성되어 있으므로, 이곳에 t 변수의 선언문이 위치하면 문제없이 해당 코드를 수행하게 될 것입니다.

t 변수는 정수형 변수 a와 b를 더한 후 (2*1.0)의 값으로 나눠주고 있는데, 나누는 값에 1.0이라는 실수가 들어있으므로 t 변수의 자료형은 실수형이 되어야 합니다.

실수 자료형의 대표격은 double이므로 이 자료형을 사용하여 t 변수의 선언문을 작성해주시면 되겠습니다.

그러므로 average 함수의 코드는 다음과 같습니다.

double average(int a, int b) {
  double t;

  t = (a+b) / (2*1.0);

  return t;
}

위의 average 함수에서 return 문을 제외한 나머지 구문들이 모두 정상 수행되었다는 가정 하에 마지막의 return 문을 수행하면,

t 값을 이 함수를 호출한 곳으로 보내면서 이 함수는 종료가 됩니다.

이 함수를 호출한 곳은 main 함수이므로 t에 저장되어 있는 값을 가지고 다시 main 함수로 이동하시면 됩니다.

main 함수에서는 다음의 구문이 존재하므로,

avg = average(a, b);

average에서 반환한 t 값은 avg라는 변수에 저장될 것입니다.

이제 마지막으로 아래의 괄호 안에 내용을 작성해주시면 되는데, average라는 함수는 인자로 보낸 두 값의 평균을 산출하여 그 값을 반환하였고,

결국에 avg에 그 값이 들어갔으므로 이 avg 값을 출력해주면 평균 값을 확인할 수 있을 것입니다.

그런데 avg 역시 double형이므로 서식문자인 %f를 사용하여 값을 출력해주면 되겠습니다.

printf("%f\n", avg);

코드의 잘못된 부분이나, 궁금한 점이 있으시다면 댓글 남겨주시면 감사드리겠습니다.

댓글남기기