1 / 19

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

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

spence
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(intj,int k);     // 함수 원형 선언문 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. void main() • { • printf(“연도는?”); • scanf(“%d”, &input); • printf(“%d년은 총 %d일 입니다.”, • input, daysInYear(input) ); • } 1 • intdaysInYear(intyy) • { • leapYear함수를호출하여 • 리턴된 값을 확인하여 • 윤년이면 return 366; • 아니라면 return 365; • } 4 2 • intleapYear(int year) • { • year에 전달된연도가 • 윤년이면 return1; • 아니면 return 0; • } 3

  13. 1 4 2 3

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

  15. 배열명 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 배열의 내용도 바꿔져 있게 된다.

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

  17. 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 개의 원소값은 출력할 수 없다. 해결) 원소의 수에 제한없이 사용할 수 있도록 함수를 수정 ?

  18. 배열의 평균을 구하는 함수 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; } 팁: 배열 원소 수를 인수로 전달함으로써 배열 원소 수와 상관없이 언제나 배열의 평균을 구할 수 있다.

  19. #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> #define N 5 __________________ void main() { int score[N] ={99,90,51,60,70}; inti, max; max=maximum(____________); printf("최대치: %d \n", max); } int maximum( 배열 선언) { // 전달된 배열의 최대치 리턴하기 } • 실습 • main에서직접 score 배열의최대치를 구하는 것이 아니라 maximum 함수 호출시score배열을 전달하고 함수에서 구한 최대치를 리턴받아서 출력하도록 수정한다.

More Related