배열을 포인터로 전달해서 직접 함수 호출
1. 정수 5개로 이루어진 배열에 대해 다음 조건을 만족하는 프로그램을 작성하시오.
- 포인터를 이용해서 배열을 전달하고, 평균, 최솟값, 최댓값을 계산할 것
- 평균은 실수형으로 계산하고 소수 첫째 자리까지 출력할 것
- main() 에서 포인터 초기화 후 함수를 호출하고 결과를 출력할 것
/*다음과 같이 포인터로 배열 데이터 주소를 함수에 넘기시오*/
int *p = num; //배열명==주소
average = avr(p);
<답안>
#include <stdio.h>
#define N 5
//함수 선언: 포인터를 받아 평균, 최소, 최대, 총합을 계산하는 함수 - 배열을 포인터로 받아서 접근
float avr(int *v);
int min(int *v);
int max(int *v);
int total(int *v);
int main(void) {
int num[N] = { 1, 2, 3, 4, 5 }; //배열 선언
int *p = num; //배열을 참조하는 포인터 선언
float average; //평균 - 실수형
int min_y, max_y; //최소, 최대 - 정수형
average = avr(p); //함수 호출 - 포인터 p를 인자로 전달
min_y = min(p);
max_y = max(p);
printf("average: %.1f, min: %d, max: %d\n", average, min_y, max_y); //결과 출력
system("pause");
return 0;
}
//총합 구하는 함수
int total(int *v) {
int s = 0; //결과값을 저장할 변수 선언
for (int i = 0; i < N; i++)
s += *v++; //포인터 연산을 통해 배열의 다음 요소로 이동하며 총합 계산
return s;
}
float avr(int *v) {
int sum;
float a;
sum = total(v); //total 함수 호출
a = (float)sum / (float)N; //형변환
return a;
}
int min(int *v) {
int m = *v; //첫 번째 값을 m에 대입해 초기 최솟값으로 설정
for (int i = 1; i < N; i++)
v++; //포인터 다음 위치로 이동
if(m>*v) //현재 값이 이전 최솟값보다 작다면
m=*v; //최솟값 갱신
return m;
}
int max(int *v) {
int m = *v;
for (int i = 1; i < N; i++)
v++;
if(m<*v)
m=*v;
return m;
}
함수 주소를 저장하고, 간접 호출하는 함수 포인터 사용
2. 정수 5개로 이루어진 배열의 총합, 평균을 계산하는 프로그램을 작성하시오.
- 함수 포인터를 선언해 연산을 수행할 각각의 함수를 호출할것
- 평균과 합 모두 실수형으로 반환할 것
- call by value 로 접근할 것 (원본 값 변경X)
/*다음과 같이 함수 포인터를 선언하고, 함수의 주소를 포인터로 넘기시오 */
float (*p)(int *);
p = sum; //함수의 이름(함수의 주소)를 포인터에 넘김
total = p(arr); //배열명(배열의 주소)를 넘김
<답안>
#include <stdio.h>
#define N 5
//함수 선언
float sum(int *q);
float avr(int *q);
//p를 사용해서 함수 호출 - 값에 의한 참조
int main(void) {
int arr[N] = { 11, 12, 13, 14, 15 };
float average, total;
float(*p)(int*); //정수형을 받아 실수형을 반환하는 함수를 참조하는 포인터 선언
//참조, 호출
p = sum;
total = p(arr); //배열명은 주소임. 배열의 첫 요소 주소를 넘긴것!
p = avr;
average = p(arr);
printf("sum: %.1f\tavr: %.1f\n", total, average); //탭 정렬
system("pause");
return 0;
}
float sum(int *q) {
int hap = 0;
for (int i = 0; i < N; i++)
hap += *q++;
return (float)hap;
}
float avr(int* q) {
float av = sum(q) / (float)N;
return av;
}
함수 포인터 이해
3. 정수 5개로 이루어진 배열에 대하여, 배열의 합을 구하는 프로그램을 작성하시오.
- 배열의 합을 구하는 함수 int sum(int *arr, int n)을 정의할것 (배열과 그 크기를 넘김)
- 함수 포인터를 선언해 sum 함수를 호출할 것
- 결과를 "합계: 150" 형식으로 출력할 것
<답안>
#include <stdio.h>
#define N 5
//함수 선언 - 배열과 그 크기를 받음
int sum(int* arr, int n) {
//배열의 총합을 계산해 반환함
int s = 0;
for (int i = 0; i < N; i++)
s += arr[i];
return s;
}
int main(void) {
int arr[N] = { 10, 20, 30, 40, 50 };
int result = 0;
int (*p)(int*, int); //함수 포인터 선언
p = sum; //sum 함수 참조
result = p(arr, N); //함수 호출
printf("합계: %d\n", result);
system("pause");
return 0;
}
함수 포인터 활용
4. 5개의 정수를 저장하는 배열에 대하여 배열의 합을 구하시오.
- 포인터를 사용하여 배열의 합을 계산하는 함수 int sum(int *q) 를 정의할것 (포인터 연산 수행)
- 함수 포인터를 선언하고, sum 함수를 호출할 것
- 결과를 "합계: 15" 형식으로 출력할것
<답안>
#include <stdio.h>
#define N 5
//함수 선언 - 배열과 그 크기를 받음
int sum (int *q) {
int s = 0;
for (int i = 0; i < N; i++)
s += *q++;
return s;
}
int main(void) {
int arr[N] = { 10, 20, 30, 40, 50 };
int result = 0;
int (*p)(int*); //함수 포인터 선언
p = sum; //실제 참조 - 포인터에 함수의 주소 대입
result = p(arr); //호출 - 포인터에 배열의 주소 대입
printf("합계: %d\n", result);
system("pause");
return 0;
}
포인터 증감 연산 + 포인터 활용
5. 배열 int arr[5] = {5, 9, 2, 7, 3} 에 대하여 다음 조건을 만족하는 프로그램을 작성하시오.
- 포인터를 인수로 받아 배열의 합(정수), 평균(실수), 최솟값 (정수) , 최댓값(정수)을 구하는 함수를 각각 정의할 것
- 함수 내에서 포인터 연산을 사용할 것
- 함수 포인터를 선언해 위 함수를 호출할 것
- 결과는 다음 형식으로 출력할 것
합계: 26
평균: 5.2
최솟값: 2
최댓값: 9
<답안>
#include <stdio.h>
#define N 5
int sum(int *p) {
int s = 0;
for (int i = 0; i < N; i++)
s += *p++;
return s;
}
float avr(int *p) {
int s = 0;
for (int i = 0; i < N; i++)
s += *p++;
return (float)s / N;
}
int min(int *p) {
int m = *p++;
for (int i = 1; i < N; i++) {
if (*p < m)
m = *p;
p++;
}
return m;
}
int max(int *p) {
int m = *p++;
for (int i = 1; i < N; i++) {
if (*p > m)
m = *p;
p++;
}
return m;
}
int main() {
int arr[N] = {5, 9, 2, 7, 3};
int (*fp1)(int *) = sum;
float (*fp2)(int *) = avr;
printf("합계: %d\n", fp1(arr));
printf("평균: %.1f\n", fp2(arr));
printf("최솟값: %d\n", min(arr));
printf("최댓값: %d\n", max(arr));
return 0;
}
끝
예제는 교재에서 가져오거나 유사하게 응용하였습니다.
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 - 간단한 문법 예제 (중간 직전 review!) (0) | 2025.04.29 |
---|---|
C언어: 포인터의 활용 - 개념 (0) | 2025.04.13 |
C언어 기초 문법 빠르게 복습하기 (2) (0) | 2025.04.13 |
C언어 기초 문법 빠르게 복습하기 (1) (0) | 2025.04.12 |
댓글