2016년2학기 고급컴퓨터프로그래밍및실습 (36342-02)
LAB #8 함수 포인터와
동적 메모리 할당
1
(복습1) 함수 포인터
다음 프로그램은 함수 포인터 fp 를 정의하고, 이를 사용하여 sum( )을 호 출하는 예제이다. 이 프로그램을 이해하시오.
2
fp는 함수 포인터이다. 이는 (int, int) 를 파라미터로 받고, int 를
리턴하는 함수들을 가리킬 수 있다.
(복습2) 함수 포인터
함수 포인터 fp 를 사용하여 sum( ) 과 prod( ) 를 호출하는 예제. 실행시켜 보시오.
3
(실습1) 함수를 가리키는 함수 포인터
실수 2개를 입력으로 받아서, 덧셈을 한 후 그 결과값을 리턴하는 함수 dsum( )을 정의하시오. 뺄셈, 곱셈, 나눗셈에 대해서도 각각 ddiff( ),
dmult( ), ddiv( )를 정의하시오. main( ) 에서는 이들을 가리킬 수 있는 함수 포인터 fmighty를 정의하고, 이 포인터를 사용하여 정의된 함수들을 한 번 씩 호출해 보도록 하시오. 즉 main( ) 에는 다음 문장 4개가 포함되어야 한 다.
4
(실습2) 함수 포인터를 파라미터로 갖는 함수 (1/3)
다음 프로그램에는 실수 2개가 주어졌을 때, 최소값, 최대값, 합계, 평균을 구하는 함수 min( ), max( ), sum( ), avg( ) 가 포함되어 있다.
5
(실습2) 함수 포인터를 파라미터로 갖는 함수 (2/3)
6
(실습2) 함수 포인터를 파라미터로 갖는 함수 (3/3)
main( ) 에서는 min( ), max( ), sum( ), avg( ) 함수를 직접 호출하지 않고 compute( ) 함수를 통해 이들을 호출한다. compute( ) 함수는 함수명 또는 함수 포인터와 그 함수의 파라미터들을 전달받아, 전달받은 함수가 할 일을 대행해 준다.
예를 들어, compute( min, x, y) 는 min(x, y)를 계산해 주고, compute(max, x, y)는 max(x, y)를 계산해 준다. 이러한 역할을 하는 compute( ) 함수를 완 성하여 이 프로그램에 추가해 보시오. (Lab8 – prog2 - 이걸 쓰세요.txt) 파 일을 복사하여 작업해 보시오.
7
(복습2) void * 예제
다음 프로그램을 실행시켜 보시오.
8
void 형 포인터로 받아서 정수형 포인터로 변환하여 사용
정수형 포인터를 보냄
(복습2) void * 예제
다음 프로그램을 실행시켜 보시오.
9
void 형 포인터로 받아서 더블형 포인터로 변환하여 사용
더블형 포인터를 보냄
(실습3) void * 형 파라미터
두 수를 더하여 출력하는 add( ) 함수를 정의하려고 한다. add( ) 함수는 정 수값을 더하기도 하고, 실수값을 더하기도 한다. add( )의 세번째 파라미터 가 1이면 정수 덧셈을 하고, 2이면 실수 덧셈을 하도록 add( ) 함수를 정의 해 보시오.
10
(실습4) 두 수의 비교 함수
파라미터로 전달되는 두 정수를 비교하여, 앞의 수가 작으면 음수를 반환하 고, 뒤의 수가 작으면 양수를 반환하고, 같으면 0을 반환하는
CompareInt( ) 함수를 작성하시오. 함수 파라미터는 void * 형으로 하시오.
11
이 함수를 정의하시오.
(복습4) qsort( )로 정수배열 정렬하기
12
qsort( ) 를 사용하기 위해서는
원소 비교 함수만 정의해 주면 된다.
다음 프로그램을 실행시켜 보시오.
ACPL Lab11 - review4.txt
(복습4) qsort 로 정수배열 정렬하기
13
두 수가 같으면 0, 앞의 수가 크면 양수,
뒤의 수가 크면 음수를 반환함
(복습5) qsort 로 내림차순 정렬하기
14
qsort( ) 한테 크기에
대해 반대의 결과를
주면 된다.
(실습5) 더블형 배열의 오름차순 정렬
main( ) 이 다음과 같이 정의되어 있다고 하자. qsort( ) 가 배열 A[ ]를 오름 차순으로 정렬하도록 12~13쪽에 있는 (복습4)의 프로그램을 수정해 보시 오.
15
(실습6) 더블형 배열의 내림차순 정렬
(실습 5)의 프로그램을 수정하여, 이번에는 A[ ]가 내림차순으로 정렬되도 록 해 보시오.
16
(실습7) 문자 배열의 오름차순 정렬
main( ) 이 다음과 같이 정의되어 있다고 하자. qsort( ) 가 배열 A[ ]에 들어 있는 문자들을 오름차순으로 정렬하도록 (복습4)의 프로그램을 수정하시오.
17
(복습6) 동적메모리 정수배열
다음 프로그램을 이해해 보고 실행시켜 봅시다. 결과는?
18
p
(실습8) 동적메모리 실수 배열
(복습6)의 프로그램을 수정하여 10개의 더블형 숫자들을 저장할 수 있는 배 열 B[ ]를 동적으로 할당 받아보시오. 배열 B[ ]에 적당한 실수값을 저장하 고, 모두 출력해 보시오.
19
(실습9) 동적메모리 문자 배열
(복습6)의 프로그램을 수정하여 문자 20개를 저장할 수 있는
배열 Name[ ]를 동적으로 할당 받아보시오. 배열 Name[ ]에 자신의 이름을 저장하고, 그 이름을 출력해 보시오.
20
(실습10) 동적 메모리 구조체
프로그램이 다음과 같이 시작한다고 하자. point 형 구조체 하나를 저장할 수 있는 공간을 할당 받고, 이를 p 가 가리키도록 한다. p 가 가리키는 구조 체에 적당한 좌표를 저장한 후 그대로 출력해 보시오.
21
(실습11) 동적 2차원 배열 – 행단위 할당
정수 포인터 배열 p[5]를 선언하시오. 그리고 원소를 7개씩 갖는 1차원 배 열들을 동적으로 할당 받아 아래 그림과 같이 연결 시키시오. 그렇게 한 후, 이 2차원 배열의 모든 원소를 화면에 출력해 보시오.
22
p[0]
p[1]
p[2]
p[3]
p[4]
malloc( 정수 7개 ) malloc( 정수 7개 ) malloc( 정수 7개 ) malloc( 정수 7개 ) malloc( 정수 7개 )
(실습12) 동적 2차원 배열 – 배열 전체 한꺼번에 할당
정수 포인터 배열 p[5]를 선언하시오. 그리고 원소를 35개 갖는 1차원 배열 을 동적으로 할당 받아 아래 그림과 같이 연결 시키시오. 그렇게 한 후, 이 2차원 배열의 모든 원소를 화면에 출력해 보시오.
23
p[0]
p[1]
p[2]
p[3]
p[4]
malloc( 정수 35개 )
(실습13) 동적 2차원 배열 –
배열 포인터 사용
“7개의 원소를 갖는 1차원 배열”을 가리킬 수 있는 포인터 p를 선언하시오.
35개의 정수를 저장할 수 있는 배열을 (실습12)와 같이 malloc( )으로 할당 받은 후, p가 그 배열을 가리키도록 하시오. p를 5x7 2차원 배열의 이름 (또 는 포인터로 가정하고), p를 사용하여 그 배열에 값을 채운 후 모두 출력해 보시오.
24
p
malloc( 정수 35개 )
힌트: int (*p)[7];