1 / 18

7.2 함수의 원형 선언 p.193 함수의 원형 (prototype)

리턴형 함수명 ( 가인수 선언부 ); void main() { : 함수명 ( 실인수 ); : } 리턴형 함수명 ( 가인수 선언부 ) { : }. 7.2 함수의 원형 선언 p.193 함수의 원형 (prototype) 실제로 함수를 정의하기 전에 함수를 호출하여 사용하는 경우 컴파일러에게 정보를 제공하도록 함수의 원형을 첫 호출문이 있기 전에 선언한다. 함수 원형 선언. 함수 호출. 함수 정의. 예제 7.2.

jemima
Download Presentation

7.2 함수의 원형 선언 p.193 함수의 원형 (prototype)

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. 리턴형 함수명(가인수 선언부); void main() { : 함수명(실인수); : } 리턴형 함수명(가인수 선언부) { : } • 7.2 함수의 원형 선언 p.193 • 함수의 원형(prototype) • 실제로 함수를 정의하기 전에 함수를 호출하여 사용하는 경우 컴파일러에게 정보를 제공하도록 함수의 원형을 첫 호출문이 있기 전에 선언한다. 함수 원형 선언 함수 호출 함수 정의

  2. 예제 7.2 float avrg(intx,int y);     // 함수 원형 선언문 void show_avrg(int, int, float); // 함수 원형 선언문 void main() { inti, j; float f;   i = 2; j = 3;      f = avrg(i, j);            // avrg() 호출문 show_avrg(i, j, f);             // show_avrg() 호출문 } float avrg(intj,int k) { int total; float f;       total = j + k; f = total / 2.0;       return f;   } void show_avrg(int a, int b, float c) {      printf("\n%d와 %d의 평균",a,b);         printf("값은 %3.1f입니다.“,c);       } 가인수 이름은 생략할 수 있다. • 프로그램내용은 분석할 필요 없으며 함수 원형 선언만 확인합니다. • 일반적으로 main()함수뒤에 다른 사용자 정의 함수를 만들며, 그대신 사용자 정의 함수의 첫줄을 이용한 함수의 원형 선언을 main()함수이전에 한다.

  3. 7.3 함수에서 인수 전달 방식 p.198 • 함수들은 서로 다른 함수의 변수들을 참조할 수 없다. 인수전달이 필요함 : call by value / call by address • 값에 의한 호출(Call by Value) • 함수가 호출되면 가인수의 메모리가 할당된 후실인수의 값이 가인수의 메모리에 복사(전달)되어 저장됨 • 함수 안에서 가인수의 값을 바꾸어도 함수 종료 후 호출한 곳으로 돌아 갔을 때 실인수의 값은 원래의 값 그대로이다. • 함수간의 독립성이 보장된다. (함수의 리턴 값을 실인수에 다시 대입하는 경우가 아닌 한 디버깅할 때도 실인수의 값을 추적하기 위해 함수 내용을 추적할 필요가 없다. 왜? 함수에서는 실인수의 값을 변경할 수 없으므로)

  4. 100 200 ma mb sa sb p.198 • Call by Value • 실인수의 값이 가인수의 값으로 복사됨 • function()이 호출될 때 메모리를 확보받으며함수가 종료되면 메모리가 해제된다. •  함수 종료후main() 함수에서 sa변수의 값을 출력하려고 시도한다면 에러!

  5. 실인수 가인수 ▶ 그림 7.7 : 값에 의한 호출 방식의 수행 • 만일 가인수의 이름을 실인수와 똑 같이 한다면? • 동명이인(同名異人)과 같이 변수명은 같더라도 메모리가 다르므로 서로 다른 변수이다.  다음 슬라이드 확인하기

  6. 100 200 a b a b 가인수와 실인수의 관계 • Call by Value • 실인수의 값이 가인수의 값으로 복사됨 • function() 함수가호출되면 a와 b의 메모리가 확보된다. • 즉 main()의 a,b와 상관없이 별도의 a와 b가 생기게 된다. • ma다. in()의 a  function()의 a (동명이인) • 함수를 작성하는 사람은 가인수의 이름을 자신이 원하는 대로 정할 수 있다.(누가 이 함수를 호출하느냐에 상관없이)

  7. 값에 의한 호출로 해결할 수 없는 예 • 예제 7.4 • 실인수와 가인수는 서로 다른 기억장소를 사용하므로 함수 안에서 가인수 a, b의 값을 서로 교환시켜 놓았지만 함수를 종료 후 main()으로 돌아왔을 때 main()의 변수 a,b는 전혀 변하지 않았다. 함수에서 main()의 a, b를 직접 변경하려면 ‘주소에 의한 호출’을 이용한다. 실인수 가인수

  8. 111 222 a b a b p.200 예제 7.4 void swap(int a, int b); void main(void) { int a = 111, b = 222;     printf(“ swap(a,b) 호출 전 : a는 %d, b는 %d.\n", a,b); swap(a, b);   printf(“ swap(a,b) 호출 후 : a는 %d, b는 %d.\n", a,b); } void swap(int a, int b) { int t = a;    a = b;              b = t;    printf(“ swap(a,b)의 내부  : a는 %d, b는 %d.\n", a,b); } swap(a,b) 호출 전 : a는 111, b는 222. swap(a,b)의 내부  : a는 222, b는 111. swap(a,b) 호출 후 : a는 111, b는 222. • 해결) 함수 swap 안에서는 a,b 값이 교환되었으나 main()으로 돌아 온 후 main()의 a,b는 그대로이다.  주소에 의한 호출(Call by Address)을 이용하여 main()의 a,b가 변경되도록 해야한다.

  9. 함수 실습 2 • 짝수 여부를 리턴하는 함수 int even(int no)를 정의하기 가인수 no가 짝수라면 1을, 짝수가 아니라면 0을 린턴하는 함수 • void main() • { • intsu; • scanf(“%d”, &su); • if (even(su) == 1) • printf(“%d는 짝수입니다.”, su); • else • printf(“%d는 홀수입니다.”, su); • } • int even(int no) • { • if (no % 2 == 0) • return 1; • else • return 0; • } int even(int no);

  10. 함수 실습 2 • year 해의 윤년 여부를 리턴하는 함수 leapYear() 작성하기 • 함수 원형이 intleapYear(int year)인 함수 • 가인수 year이 윤년이면 1을 아니라면 0을 리턴 • 윤년? 1. 400으로 나눠 떨어질 때 2. 4로 나눠 떨어지되 100으로 나눠 떨어지지 않을 때  2000, 2004 는 윤년, 2100년은 윤년이 아님 • 다른 함수에서 이 함수의 활용 예 • if ( leapYear(2006) == 1 ) daysInFeb = 29; • void main() 함수 • 사용자가 입력한 해의 윤년 여부 출력하기 윤년인지 궁금한 해는? 2100 2100년은 윤년이 아닙니다.

  11. 함수 실습 2-1 • yy년도의 총 일수를 구해주는 함수 daysInYear() 작성하기 • intdaysInYear(intyy) 함수 • 가인수 yy년의 1년 일수를 리턴 • 가인수 yy년이 윤년이라면 366일 아니라면 365일이 된다. yy년의 윤년 여부를 알기위해leapYear()를 호출하여리턴된 값이 1이라면 366을 아니라면 365를 리턴한다. • void main() 함수 • 연도를 입력받은 후 daysInYear()를 호출하여 그 해의 총 일수를 구하여 출력한다. main()의 int형 변수 yy 연도는? 2004 2004년은 총 366일 입니다. main() 함수안에서함수 daysInYear()를 호출하여 구한 값

  12. 2 1

  13. 배열을 함수에 전달하기 • call by address 방식으로 함수간에 기억장소를 공유하게 함  피호출함수 안에서 배열의 내용을 바꾸고 리턴하면호출함수에서 변경된 결과를 얻게된다.

  14. 배열명 intvalue[N] = {90, 80, 70, 90, 100}; division(value); for (i=0; i<N; i++) printf(“%d”, value[i]); void division( intary[N]) { inti; for (i=0; i<5; i++) ary[i] = ary[i]/10; } 결과는? • division() 함수에서는 ary이름의 배열로서 사용하면 된다. main() 함수와 같은 기억공간을 공유하게 되므로 division에서 배열 내용을 수정하고 main()으로 돌아오면 main()의 value 배열의 내용도 바꿔져 있게 된다.

  15. 배열 원소를 함수에 전달하기 : call-by-value

  16. 1차원 배열의 내용을 출력하는 함수 display()를 작성해보자/1 • void main() { • int kor[SIZE] = {95, 88, 76, 54, 85}; • int eng[SIZE] = {90, 78, 86, 74, 75}; • printf(“국어점수:”); display( kor ); • printf(“영어점수:”); display( eng ); • } • void display(int ary[]) { • for (i=0; i<SIZE; i++) { • printf(“ary[%d] = %d \n”, i, ary[i]); • } • } eng 배열의 원소수가 SIZE 개가 아니라 10이라면? display() 함수는 원소수가 SIZE 개인 배열만 출력하므로 뒤의 5 개의 원소값은 출력할 수 없다. 해결) 원소의 수에 제한없이 사용할 수 있도록 함수를 수정 ?

  17. 배열의 평균을 구하는 함수 intaveAry(intary[], int size) double aveAry( intary[] , intsize); void main() { intkor[5] = {95, 88, 76, 54, 85}; intpoint[7] = {1, 2, 3, 2, 1, 3, 2}; printf(“kor의 평균: %.2lf”, aveAry( kor, 5 ); printf(“point의 평균: %.2lf”, aveAry(point, 7); } double aveAry( intary[] , intsize ) {  int sum=0; for (i = 0; i < size; i++) sum += ary[i]; return (double) sum / size; } 팁: 배열 원소 수를 인수로 전달함으로써 배열 원소 수와 상관없이 언제나 배열의 평균을 구할 수 있다.

  18. #include <stdio.h> #define N 5 void main() { int score[N]={80,90,51,60,70}; inti, max; max= score[0]; for ( i=1 ; i< N ; i++) { if (max < score[i]) max = score[i]; } printf("최대치: %d \n", max); } • #include<stdio.h> • __________________ • void main() { • int score[N] ={99,90,51,60,70}; • inti, max; • max=maximum(____________); • printf("최대치: %d \n", max); • } int maximum( 배열선언) { // 전달된 배열의 최대치 리턴하기 }

More Related