270 likes | 494 Views
8.11 배열을 함수로 전달하기 p.346. 배열 원소 전달 값에 의한 호출과 주소에 의한 호출 둘 다 사용 가능 배열 전체 전달 주소에 의한 호출 방식만 사용 가능 이유 ) 기억장소의 낭비와 시간 낭비 제거 직접 포인터를 이용하는 방법은 10 장에서 소개. 8.11 배열을 함수로 전달하기 p.346. 배열 원소 한 개 전달하기 p.346 배열 원소 : 배열명 [ 첨자 ] 함수 호출 함수명 ( 배열명 [ 첨자 ] ) 함수 정의 반환값형 함수명 ( 자료형 매개변수 ) {
E N D
8.11 배열을 함수로 전달하기 p.346 • 배열 원소 전달 • 값에 의한 호출과 주소에 의한 호출 둘 다 사용 가능 • 배열 전체 전달 • 주소에 의한 호출 방식만 사용 가능 이유) 기억장소의 낭비와 시간 낭비 제거 • 직접 포인터를 이용하는 방법은 10장에서 소개
8.11 배열을 함수로 전달하기 p.346 • 배열 원소 한 개 전달하기 p.346 배열 원소 :배열명[첨자] • 함수 호출 함수명( 배열명[첨자] ) • 함수 정의 반환값형함수명( 자료형 매개변수 ) { : 함수 본체 } • 2차원 배열원소라면?
8-13 배열 원소 두 개 중 큰 값을 함수를 이용해 구하기 p.347 5 int main() 6 { 7 int max, score[5] = {10, 8, 9, 7, 8}; 8 9 max = find_larger(score[3], score[4]); // 4째, 5째 원소를 전달 10 11 printf("score[3]=%d과 score[4]=%d 중 큰 값은 %d \n", score[3], score[4], max); 13 return 0; 14 } 16 // 두 정수 중 큰 값을 반환하는 함수 17 int find_larger(int first, int second) 18 { 19 if (first > second) 20 return first; 21 else 22 return second; 23 }
8.11.2 배열 전체를 함수로 전달하기 p.349 • 배열 전체 전달은 주소에 의한 호출 인수 전달 방식을 사용 • 함수 호출 함수명(배열명 ) • 함수 정의 반환값형함수명( 자료형배열명[배열원소수]) { : 함수 본체 } • 배열의 차원에 상관없이 무조건 배열명만 씀 • 배열 차원에 맞게 배열로 선언 • 2차원 배열이라면?
8.11.2 배열 전체를 함수로 전달하기 p.350 • 전달받은 배열을 함수에서 변경한다면? • 원래의 인수 배열 또한 수정됨이유)두 함수가 동일 배열을 같이 사용하기 때문 (값에 의한 호출 방식은 서로 다른 기억장소를 사용하므로 호출된 함수가 자신을 호출한 함수의 인수를 절대로 변경할 수 없음) • [프로그램 8-15] 유명인 인기도 조사 결과 출력하기 • 유명인 4명의 인기도 조사 후 • 각 유명인의 선택 수를 count 배열에 저장하고 • 이들의 인기도를 백분율로 출력
8-15 인기도 조사 결과를 백분율로 변환하기 p.351 2 #define N 4 4 void print_arr(int arr[N]); 5 void percentage(int arr[N]); 7 int main() 8 { 9 int count[N] = {42, 37, 83, 33}; 10 11 printf("인원수: "); 12 print_arr(count); // 배열 원래 내용 출력 13 14 percentage(count); // 인원수를 백분율로 변경 15 16 printf("\n백분율: "); 17 print_arr(count); // 백분율로 변경된 배열 내용 출력 19 return 0; 20 } 23 void print_arr(intarr[N]) // (intarr[])도 가능 24 {
8-15 인기도 조사 결과를 백분율로 변환하기 p.351 : 12 print_arr(count); // 배열 원래 내용 출력 : 23 void print_arr(intarr[N]) // (intarr[])도 가능 24 { 25 inti; 26 27 for (i=0; i<N; i++) 28 printf("%3d", arr[i]); 29 }
8-15 인기도 조사 결과를 백분율로 변환하기 p.351 : 14 percentage(count); // 인원수를 백분율로 변경 : 32 void percentage(intarr[N]) 33 { 34 inti, total = 0; 36 // 조사 참여 전체 인원 total구하기 37 for (i=0; i<N; i++) 38 total += arr[i]; 40 // 백분율 구하기 41 for (i=0; i<N; i++) 42 arr[i] = (int)((double)arr[i] / total * 100); 43 }
8.11.2 배열 전체를 함수로 전달하기 p.352 • 배열을 함수끼리 공유하는 이유 p.352 값에 의한 호출 방식에서 생기는기억 장소 낭비와 각 원소의 값을 복사하는 연산과 시간 낭비를 없애기 위해
8.11.2 배열 전체를 함수로 전달하기 p.353 • [프로그램 8-16] vs.[프로그램 8-17] • 문제 입력: 각 분기별 노트와 펜의 판매수 저장 배열 notebook과 pen 출력: 노트와 펜의 연 평균 판매수 • [프로그램 8-16]의 11~14행과 19~22행 • 배열의 평균을 구하는 코드가 두 번 반복됨 → 배열 평균 구하는 함수 compute_avg를 정의 후 이용 → [프로그램 8-17]
p.353 배열명만 다를 뿐 평균을 구하는 동일한 코드가 두 번 반복해서 나타난다 함수로 작성하자
8.11.2 배열 전체를 함수로 전달하기 p.354 • 크기가 다른 배열의 처리가 가능한 함수 • [프로그램 8-17]의 문제 • compute_avg함수는 원소수가 N이 아닌 배열은 사용 불가 • 해결 • 배열의 크기와 상관없이 평균을 구하는 일반적인 함수로 정의 • 배열의 원소수n을 매개변수로 전달받기 • 함수의 원형 • double array_avg(intarr[],int n)
8-18 배열의 크기와 상관없이 평균 구하는 함수 p.355 1 #include <stdio.h> 3 double array_avg(intarr[], int n); // 함수의 원형 선언 5 intmain() 6 { 7 intpen[4] = {4500, 5370, 4920, 6090}; 8 intmonthly_stock[12] = {505, 409, 389, 257, 450, 501, 9 500, 621, 480, 350, 389, 250}; 10 double average; 11 12 average = array_avg(pen, 4); 13 printf("펜 평균 판매수: %.1lf \n", average); 14 average = array_avg(monthly_stock, 12); 15 printf("평균 재고량: %.1lf \n", average); 16 17 return 0; 18 } 21 double array_avg(int arr[], int n) 22 { 23 int i, sum=0; 25 for (i=0; i<n; i++) 26 sum = sum + arr[i]; 28 return (double)sum / n; 29 }
함수의 장점 p.356 • 함수의 장점 • 동일 작업 반복 시 • 함수 이용 → 프로그램 길이가 단축 • 프로그램 분석 시 • 함수를 한 번 분석하면또 다른 함수 호출을 쉽게 해석 가능 →프로그램 가독성 증가 • 프로그램 수정 시 • 함수만 수정하면 일관되고 정확하게 수정 가능 함수를 사용하지 않았을 때 동일한 처리 부분이 여러 번 나타나는 경우 동일한 코드 범위를 정확히 찾아내 여러 번 수정해야 한다. • 다른 프로그램 개발 시 • 이미 만들어 둔 함수를 재사용 가능
8.14.3 반복문과 재귀 호출의 비교 p.386 • 재귀 함수의 장점 • 반복문 형태로 해결하기에 복잡한 문제가재귀 호출로 해결할 수 있도록 해석된다면 재귀 함수가 훨씬 더 문제에 정의에 가깝게 작성 가능하며 해석도 쉽고 코드 길이도 짧다. • 재귀 호출로 해결하는 대표 문제: 하노이 탑, 이진 탐색(binary search), 트리 탐색(tree search) 등(이 문제들은 기초 프로그래밍 과정이 아니므로 생략) • 재귀 함수의 단점 • 함수 호출에 드는 비용 (지역 변수를 위한 기억 장소 할당, 값 복사, 반환 값 전달)이 많으며 디버깅이 어렵다. 반복문으로 쉽게 해결할 수 있는 문제는 비용 면에서 반복문이 더 좋으며,해결 과정이 복잡하고 어려울 때 재귀 호출로 해결 가능하다면재귀 함수로 작성하는 것이 좋다.
C언어를 배우며 … 이걸 꼭 배워야 하나 의심도 나고 … 우울하고…
완전히 맥빠져잠만 오고... 잘 생각 안나 손톱이나 물어뜯게 되고…
머리 쓰느라 주름만 늘고… 그러나 담대하게 달려가면 꼭 좋은 결과가…
C언어 실습을 하며 • 감당 못할 실습 문제로 지칠 대로 지치기도 하고
C언어 실습을 하며 • 지금껏 알고 있던 내용도 새로운 시선으로 바라봐야 하고… 그래도 같이 해결해주는 친구와 조교 선생님과 교수님이 있어…
C언어 실습을 하며 • 나만 모른 것 아닌가 남몰래 눈물 흘리기도 하고…
C언어 실습을 하며 • 그래도 같이 해결해주는 친구와 조교 선생님과 무엇보다 교수님이 있어…잘 할 수 있을거라 믿습니다.
A C 아니 아니 아니되오~ 언어는 C 학점?
C언어 수업을 하며 • 꿈은 커야 하니깐…
그러려면 이제 누군가는 기말고사를 향하여 U-턴 할 때가 왔습니다. 그러려면 이제 누군가는 기말고사를 향하여 U-턴 할 때가 왔습니다.