1 / 26

8.11 배열을 함수로 전달하기 p.346

8.11 배열을 함수로 전달하기 p.346. 배열 원소 전달 값에 의한 호출과 주소에 의한 호출 둘 다 사용 가능 배열 전체 전달 주소에 의한 호출 방식만 사용 가능 이유 ) 기억장소의 낭비와 시간 낭비 제거 직접 포인터를 이용하는 방법은 10 장에서 소개. 8.11 배열을 함수로 전달하기 p.346. 배열 원소 한 개 전달하기 p.346 배열 원소 : 배열명 [ 첨자 ] 함수 호출 함수명 ( 배열명 [ 첨자 ] ) 함수 정의 반환값형 함수명 ( 자료형 매개변수 ) {

kelly-rojas
Download Presentation

8.11 배열을 함수로 전달하기 p.346

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 8.11 배열을 함수로 전달하기 p.346 • 배열 원소 전달 • 값에 의한 호출과 주소에 의한 호출 둘 다 사용 가능 • 배열 전체 전달 • 주소에 의한 호출 방식만 사용 가능 이유) 기억장소의 낭비와 시간 낭비 제거 • 직접 포인터를 이용하는 방법은 10장에서 소개

  2. 8.11 배열을 함수로 전달하기 p.346 • 배열 원소 한 개 전달하기 p.346 배열 원소 :배열명[첨자] • 함수 호출 함수명( 배열명[첨자] ) • 함수 정의 반환값형함수명( 자료형 매개변수 ) { : 함수 본체 } • 2차원 배열원소라면?

  3. 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 }

  4. 8.11.2 배열 전체를 함수로 전달하기 p.349 • 배열 전체 전달은 주소에 의한 호출 인수 전달 방식을 사용 • 함수 호출 함수명(배열명 ) • 함수 정의 반환값형함수명( 자료형배열명[배열원소수]) { : 함수 본체 } • 배열의 차원에 상관없이 무조건 배열명만 씀 • 배열 차원에 맞게 배열로 선언 • 2차원 배열이라면?

  5. 8.11.2 배열 전체를 함수로 전달하기 p.350 • 전달받은 배열을 함수에서 변경한다면? • 원래의 인수 배열 또한 수정됨이유)두 함수가 동일 배열을 같이 사용하기 때문 (값에 의한 호출 방식은 서로 다른 기억장소를 사용하므로 호출된 함수가 자신을 호출한 함수의 인수를 절대로 변경할 수 없음) • [프로그램 8-15] 유명인 인기도 조사 결과 출력하기 • 유명인 4명의 인기도 조사 후 • 각 유명인의 선택 수를 count 배열에 저장하고 • 이들의 인기도를 백분율로 출력

  6. 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 {

  7. 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. 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 }

  9. 8.11.2 배열 전체를 함수로 전달하기 p.352 • 배열을 함수끼리 공유하는 이유 p.352 값에 의한 호출 방식에서 생기는기억 장소 낭비와 각 원소의 값을 복사하는 연산과 시간 낭비를 없애기 위해

  10. 8.11.2 배열 전체를 함수로 전달하기 p.353 • [프로그램 8-16] vs.[프로그램 8-17] • 문제 입력: 각 분기별 노트와 펜의 판매수 저장 배열 notebook과 pen 출력: 노트와 펜의 연 평균 판매수 • [프로그램 8-16]의 11~14행과 19~22행 • 배열의 평균을 구하는 코드가 두 번 반복됨 → 배열 평균 구하는 함수 compute_avg를 정의 후 이용 → [프로그램 8-17]

  11. p.353 배열명만 다를 뿐 평균을 구하는 동일한 코드가 두 번 반복해서 나타난다  함수로 작성하자

  12. p.354

  13. 8.11.2 배열 전체를 함수로 전달하기 p.354 • 크기가 다른 배열의 처리가 가능한 함수 • [프로그램 8-17]의 문제 • compute_avg함수는 원소수가 N이 아닌 배열은 사용 불가 • 해결 • 배열의 크기와 상관없이 평균을 구하는 일반적인 함수로 정의 • 배열의 원소수n을 매개변수로 전달받기 • 함수의 원형 • double array_avg(intarr[],int n)

  14. 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 }

  15. 함수의 장점 p.356 • 함수의 장점 • 동일 작업 반복 시 • 함수 이용 → 프로그램 길이가 단축 • 프로그램 분석 시 • 함수를 한 번 분석하면또 다른 함수 호출을 쉽게 해석 가능 →프로그램 가독성 증가 • 프로그램 수정 시 • 함수만 수정하면 일관되고 정확하게 수정 가능 함수를 사용하지 않았을 때 동일한 처리 부분이 여러 번 나타나는 경우 동일한 코드 범위를 정확히 찾아내 여러 번 수정해야 한다. • 다른 프로그램 개발 시 • 이미 만들어 둔 함수를 재사용 가능

  16. 8.14.3 반복문과 재귀 호출의 비교 p.386 • 재귀 함수의 장점 • 반복문 형태로 해결하기에 복잡한 문제가재귀 호출로 해결할 수 있도록 해석된다면 재귀 함수가 훨씬 더 문제에 정의에 가깝게 작성 가능하며 해석도 쉽고 코드 길이도 짧다. • 재귀 호출로 해결하는 대표 문제: 하노이 탑, 이진 탐색(binary search), 트리 탐색(tree search) 등(이 문제들은 기초 프로그래밍 과정이 아니므로 생략) • 재귀 함수의 단점 • 함수 호출에 드는 비용 (지역 변수를 위한 기억 장소 할당, 값 복사, 반환 값 전달)이 많으며 디버깅이 어렵다. 반복문으로 쉽게 해결할 수 있는 문제는 비용 면에서 반복문이 더 좋으며,해결 과정이 복잡하고 어려울 때 재귀 호출로 해결 가능하다면재귀 함수로 작성하는 것이 좋다.

  17. C언어를 배우며 … 이걸 꼭 배워야 하나 의심도 나고 … 우울하고…

  18. 완전히 맥빠져잠만 오고... 잘 생각 안나 손톱이나 물어뜯게 되고…

  19. 머리 쓰느라 주름만 늘고… 그러나 담대하게 달려가면 꼭 좋은 결과가…

  20. C언어 실습을 하며 • 감당 못할 실습 문제로 지칠 대로 지치기도 하고

  21. C언어 실습을 하며 • 지금껏 알고 있던 내용도 새로운 시선으로 바라봐야 하고… 그래도 같이 해결해주는 친구와 조교 선생님과 교수님이 있어…

  22. C언어 실습을 하며 • 나만 모른 것 아닌가 남몰래 눈물 흘리기도 하고…

  23. C언어 실습을 하며 • 그래도 같이 해결해주는 친구와 조교 선생님과 무엇보다 교수님이 있어…잘 할 수 있을거라 믿습니다.

  24. A C 아니 아니 아니되오~ 언어는 C 학점?

  25. C언어 수업을 하며 • 꿈은 커야 하니깐…

  26. 그러려면 이제 누군가는 기말고사를 향하여 U-턴 할 때가 왔습니다. 그러려면 이제 누군가는 기말고사를 향하여 U-턴 할 때가 왔습니다.

More Related