Download presentation
Presentation is loading. Please wait.
1
7장 함수(Function)
2
7장 함수(function) 함수(Function) 함수의 선언과 호출 인수 전달(Parameter Passing) 재귀함수
수원과학대학 컴퓨터정보과 1학년 1학기 7장 함수(function) 함수(Function) 함수의 선언과 호출 인수 전달(Parameter Passing) 재귀함수 주기억 장소관리(Memory Management)
3
함수(function) 함수 함수의 종류 함수 사용의 장점 특정 작업을 수행하는 코드의 집합
수원과학대학 컴퓨터정보과 1학년 1학기 함수(function) 함수 특정 작업을 수행하는 코드의 집합 함수의 종류 ( ) : C 언어에서 제공하는 함수 사용자 정의 함수: 사용자가 작성한 함수 main( )함수: ( ) 서브 함수(sub function) 함수 사용의 장점 코드의 재사용성을 향상, 개발시간을 단축 여러 사람이 나누어 작성가능, 큰 시스템 개발에 효과적 에러수정이 용이함, 프로그램 유지보수에 효과적
4
수원과학대학 컴퓨터정보과 1학년 1학기 함수(function)- 기본요소
5
함수의 정의 1 입, 출력이 모두 있는 함수 x, y를 입력 받아 sum() 함수의 기능을 처리하고 int형으로출력
수원과학대학 컴퓨터정보과 1학년 1학기 함수의 정의 1 입, 출력이 모두 있는 함수 x, y를 입력 받아 sum() 함수의 기능을 처리하고 int형으로출력 출력 형태가 있어서 함수 내에서 반드시 return문을 사용해야 함 출력 형태 있음 (int) 입력 형태 있음 (int x, int y) result = x + y result x, y
6
함수의 정의 2. 입력은 없고, 출력만 있는 함수 입력 받는 값 없이 함수의 기능을 처리하고 int형으로 출력
수원과학대학 컴퓨터정보과 1학년 1학기 함수의 정의 2. 입력은 없고, 출력만 있는 함수 입력 받는 값 없이 함수의 기능을 처리하고 int형으로 출력 출력 형태가 있어서 함수 내에서 반드시 return문을 사용해야 함 출력 형태 있음 (int) 입력 형태 없음 (void) scanf(“%d”, num); num
7
함수의 정의 3. 입력은 있고, 출력이 없는 함수 x값을 입력받아 함수의 기능을 처리하고 출력은 하지 않음
수원과학대학 컴퓨터정보과 1학년 1학기 함수의 정의 3. 입력은 있고, 출력이 없는 함수 x값을 입력받아 함수의 기능을 처리하고 출력은 하지 않음 출력 형태가 void이므로 함수 내에서 return 문 생략가능 출력 형태 없음 (void) 입력 형태 있음 (int x) x printf(“%d”, a);
8
함수의 정의 4. 입, 출력이 모두 없는 함수 입력 없이 함수의 기능을 처리하고 출력은 하지 않음
수원과학대학 컴퓨터정보과 1학년 1학기 함수의 정의 4. 입, 출력이 모두 없는 함수 입력 없이 함수의 기능을 처리하고 출력은 하지 않음 출력 형태가 void이므로 함수 내에서 return 문 생략가능 출력 형태 없음 (void) 입력 형태 printf(“Hello”); printf(“world”);
9
함수의 호출 함수의 ( ) 함수의 입출력 목록이 있는 문장 함수의 ( ) 함수의 기능을 정의한 문장
수원과학대학 컴퓨터정보과 1학년 1학기 함수의 호출 함수의 ( ) 함수의 입출력 목록이 있는 문장 함수의 ( ) 함수의 기능을 정의한 문장 함수의 ( ) 정의한 함수를 호출 하는 문장 첫 번째 방법 함수의 ( ) 함수의 ( ) 두 번째 방법 함수의 ( ) 함수의 ( ) 함수의 ( )
10
수원과학대학 컴퓨터정보과 1학년 1학기 함수의 호출(첫번째 방법)
11
수원과학대학 컴퓨터정보과 1학년 1학기 함수의 호출(첫번째 방법)
12
수원과학대학 컴퓨터정보과 1학년 1학기 함수의 호출(두번째 방법)
13
함수의 호출(P164) 호출할때 실인수 i,j의 값은 가인수 x, y의 값으로 복사된다 가인수와 실인수의 개수는 같아야한다
수원과학대학 컴퓨터정보과 1학년 1학기 함수의 호출(P164) 호출할때 실인수 i,j의 값은 가인수 x, y의 값으로 복사된다 가인수와 실인수의 개수는 같아야한다 가인수와 실인수는 나열된 순서대로 각 인수의 형태가 같아야 한다
14
예제- 입출력이 없는 함수(p164) #include <stdio.h>
수원과학대학 컴퓨터정보과 1학년 1학기 예제- 입출력이 없는 함수(p164) #include <stdio.h> void display1( ) { /* 가인수와 결과 값이 없는 함수 */ printf("\n *** Function display1( ) *** \n"); } void display2( ) { printf("\n === Function display2( ) ===\n"); int main(void) { printf(" Call function display1( )\n"); display1( ); printf(" Call function display2( )\n"); display2( ); return 0;
15
예제- 입력 인수만 있는 함수(p165) #include <stdio.h>
수원과학대학 컴퓨터정보과 1학년 1학기 예제- 입력 인수만 있는 함수(p165) #include <stdio.h> void space(int n) { /* n은 가인수 */ int i; for (i = 0; i < n; i++) printf(" "); } int main( ) { for (i = 0; i < 10; i++) { space(i); /* i는 실인수 */ printf("Hello everybody\n"); return 0;
16
예제- 입출력이 모두 있는 함수( P166) 정수의 절대값을 구하는 함수(입력인수 1개)
수원과학대학 컴퓨터정보과 1학년 1학기 예제- 입출력이 모두 있는 함수( P166) 정수의 절대값을 구하는 함수(입력인수 1개) #include <stdio.h> int abs(int k) { /* k는 가인수 */ int m; m = (k<0)? -k : k; return(m); /*함수의 출력형태가 int 이므로 정수값(int m)을 반환 */ } void main( ) { int a=10, b= -20, c=30; int x, y, z; x = abs(a); /* a는 실인수 */ y = abs(b); /* b는 실인수 */ z = abs(c); /* c는 실인수 */ printf(" a = %d\t b = %d\t c = %d\n", a, b, c); printf(" x = %d\t y = %d\t z = %d\n", x, y, z); return 0;
17
예제- 입출력이 모두 있는 함수(P167) 함수를 이용해 두수의 합구하기(입력인수 2개)
수원과학대학 컴퓨터정보과 1학년 1학기 예제- 입출력이 모두 있는 함수(P167) 함수를 이용해 두수의 합구하기(입력인수 2개) #include <stdio.h> int plus(int x, int y){ /* x,y는 가인수 */ int z; z = x+y; return(z); } int main( ) { int a, b, c; a = 4; b = 5; c = plus(a, b); /* a,b는 실인수 */ printf(" %d + %d = %d\n", a, b, c); return 0;
18
인수 전달(Parameter passing)
수원과학대학 컴퓨터정보과 1학년 1학기 인수 전달(Parameter passing) 인수(Parameter) 함수간에 서로 주고 받을 자료 ( ): 호출되는 함수의 인수(자료를 넘겨 받음) ( ): 호출하는 함수의 인수(자료를 넘겨 줌) 인수 전달 방식 ( )에 의한 호출(call by value) ( )에 의한 호출(call by reference)
19
인수 전달 방식 1. ( )에 의한 호출(call by value) 2. ( )에 의한 호출(call by reference)
수원과학대학 컴퓨터정보과 1학년 1학기 인수 전달 방식 1. ( )에 의한 호출(call by value) 호출시에 실인수의 값이 가인수로 복사된다. 가인수와 실인수는 독립적인 복사본 관계 가인수의 값이 변경되도 실인수의 값은 영향이 없다 2. ( )에 의한 호출(call by reference) 호출시에 실인수의 주소가 가인수로 복사된다. 가인수가 실인수의 값을 참조한다 가인수가 참조하는 값을 변경하면 실인수의 값에 영향이 있다.
20
수원과학대학 컴퓨터정보과 1학년 1학기 값에 의한 호출(call by value)
21
참조에 의한 호출(call by reference)
수원과학대학 컴퓨터정보과 1학년 1학기 참조에 의한 호출(call by reference)
22
예제- call by value (p173) int power(int x, int y) { int i, p; p = 1;
수원과학대학 컴퓨터정보과 1학년 1학기 예제- call by value (p173) int power(int x, int y) { int i, p; p = 1; for (i = 1; i <= y; i ++) p = p * x; return(p); } int main( ) { int base, i, value; base = 2; for (i = 0; i <= 20; i++) { value = power(base, i); printf("%d ** %d = %d\n", base, i, value); return 0;
23
재귀함수 재귀함수(recursive call) 직접 재귀함수 간접 재귀함수 함수 내에서 ( )을 호출하는 함수
수원과학대학 컴퓨터정보과 1학년 1학기 재귀함수 재귀함수(recursive call) 함수 내에서 ( )을 호출하는 함수 주의사항: ( ) 직접 재귀함수 간접 재귀함수
24
재귀함수- 예제1(p175) int function_A(int i) {
수원과학대학 컴퓨터정보과 1학년 1학기 재귀함수- 예제1(p175) int function_A(int i) { if (i == 10) return 0; /* 끝나는 조건 */ else { printf("recursion parameter i = %d \n", i); i++; function_A(i); /* 재귀 함수 호출 */ } int main( ) { int i = 5; /* 정수 변수 i를 5로 초기화 */ printf("Start recursion function \n "); function_A(i); printf("End of recursion function"); return 0;
25
재귀함수- 예제2(P176) #include <stdio.h> int factorial(int k){
수원과학대학 컴퓨터정보과 1학년 1학기 재귀함수- 예제2(P176) #include <stdio.h> int factorial(int k){ if(k>1) return k*factorial(k-1); else return 1; } int main( ) { int i; scanf("%d", &i); printf("\n %d factorial=%d", i, factorial(i)); printf("\n\n"); return 0;
26
재귀함수- 예제3(P177) #include <stdio.h> void function_A(int i);
수원과학대학 컴퓨터정보과 1학년 1학기 재귀함수- 예제3(P177) #include <stdio.h> void function_A(int i); void function_B(int i); int main( ) { int i = 0; function_A(i); return 0; } void function_A(int i) { if ( i == 10) return; else { printf("Function_A ::: "); function_B(i); void function_B(int i) { if (i == 10) return; else { printf(" Function _B( ) i = %d \n", i++); function_A(i); /* function_A를 재귀 호출 */ }
27
재귀함수- 예제4(p178) 역승 #include <stdio.h> int power(int x, int y) {
수원과학대학 컴퓨터정보과 1학년 1학기 재귀함수- 예제4(p178) 역승 #include <stdio.h> int power(int x, int y) { return (y == 0)? 1 : x*power(x,y-1); } int main( ) { int m=2, k, c; for (k=0; k<=10; k++){ c = power(m,k); printf(" %d ^ %d = %3d\n", m, k, c); return 0;
28
재귀함수- 예제5(p178) #include <stdio.h> #include <conio.h>
수원과학대학 컴퓨터정보과 1학년 1학기 재귀함수- 예제5(p178) #include <stdio.h> #include <conio.h> void dasi( ); void main( ){ int ch; printf("Please input. \n Q ==> end\n"); ch = getch( ); printf("Input == %c character\n", ch); if(ch != 'q' && ch != 'Q') dasi( ); } void dasi( ) { main( );
29
Main()함수에 인수를 전달하는 방법-(P179)
수원과학대학 컴퓨터정보과 1학년 1학기 Main()함수에 인수를 전달하는 방법-(P179) 인수 ( )를 저장하는 인수 #include <stdio.h> int main(int argc, char *argv[ ]) { int i; for (i=0; i<argc; i++) printf("Argument(가인수)의 수=%d,\t 값=%s\n", i, argv[i]); printf("Argc = %d\n", argc); return 0; } 인수( )들을 저장하는 인수
30
예제- main()함수의 인수-(p179) void usage( ) { printf("\n");
수원과학대학 컴퓨터정보과 1학년 1학기 예제- main()함수의 인수-(p179) void usage( ) { printf("\n"); printf("Usage : argc2 [file-name]\n"); } int main(int argc, char *argv[]) { if (argc !=2){ usage( ); printf("argv[1] == %s\n", argv[1]); return 0;
31
주기억 장소 관리 기억장소에서의 변수의 위치 주기억 장소의 할당(P184그림참조) ( ) : ( 전역변수, Static 변수)
수원과학대학 컴퓨터정보과 1학년 1학기 주기억 장소 관리 기억장소에서의 변수의 위치 주기억 장소의 할당(P184그림참조) ( ) : ( 전역변수, Static 변수) 함수 시작시 할당 함수 종료시 소멸 ( )
32
변수의 범위(scope) 지역변수(Local variable) 전역변수(Global variable)
수원과학대학 컴퓨터정보과 1학년 1학기 변수의 범위(scope) 지역변수(Local variable) 선언된 함수또는 블록 내에서만 사용 조건문 또는 반복문의 중괄호({ }) 내부에서 사용 함수의 인수(Parameter) 즉, 함수의 입력 변수들 초기화하지 않으면 쓰레기값이 들어가 있다. 함수가 종료될때 소멸된다. 전역변수(Global variable) 중괄호({ }) 외부에서 사용, 즉 모든 함수에서 사용 초기화하지 않아도 자동으로 0으로 초기화된다. 프로그램이 종료될 때 소멸된다
33
변수의 범위(scope) ( ) (Static variable) ( )(Extern variable)
수원과학대학 컴퓨터정보과 1학년 1학기 변수의 범위(scope) ( ) (Static variable) 자료형 앞에 ( ) 키워드를 붙임 함수내 지역변수를 함수종료 후에도 유지시킬때 사용 함수밖 전역변수를 외부화일에서 참조하지 못하도록 할때 ( )(Extern variable) 다른 파일(외부)에 있는 전역 변수를 이용할때 사용 자료형 앞에 ( ) 키워드를 사용 ( )(Register variable) CPU 내부의 레지스터에 변수를 할당하는 변수 처리속도가 빠름
34
변수의 범위(scope)-(p188) 전역 변수 외부변수 (전역 변수) 전역 변수 지역 변수 레지스터변수 외부변수 (무시된다)
수원과학대학 컴퓨터정보과 1학년 1학기 변수의 범위(scope)-(p188) 전역 변수 외부변수 (전역 변수) 전역 변수 지역 변수 레지스터변수 외부변수 (무시된다) 정적 변수 전역 변수 전역 변수 외부변수 (지역 변수) 지역 변수
35
지역변수(local variable)-(p189)
수원과학대학 컴퓨터정보과 1학년 1학기 지역변수(local variable)-(p189) #include <stdio.h> void sub( ) { int i =2; printf("함수 sub( ) --> i == %d\n",i); } int main( ) { int i =7; sub( ); printf("함수 main( ) --> i == %d\n",i); return 0; 지역적으로 전혀 다른 지역 변수 우린 서로 달라!
36
전역변수(Global variable)-(p190)
수원과학대학 컴퓨터정보과 1학년 1학기 전역변수(Global variable)-(p190) #include <stdio.h> int i=7; /* 전역 변수 */ void sub( ) { i = i + 1; printf("함수 sub( ) → i == %d\n",i); } void main( ) { printf("함수 main( ) → i == %d\n",i); sub( );
37
정적변수(Static variable)-(p191)
수원과학대학 컴퓨터정보과 1학년 1학기 정적변수(Static variable)-(p191) #include <stdio.h> void sub1( ){ int j=0; j = j + 1; printf("local variable j = %d\n", j); } void sub2( ){ static int k=0; /* 정적변수 */ k = k + 1; printf("global variable k = %d\n", k); void main( ){ int i; for (i=0;i<5; i++) sub1( ); for (i=0;i<5; i++) sub2( );
38
지역변수와 전역변수 예제(p192) void sub1( ); void sub2( ); int main( ) {
수원과학대학 컴퓨터정보과 1학년 1학기 지역변수와 전역변수 예제(p192) void sub1( ); void sub2( ); int main( ) { int i=0; /*지역변수*/ sub1( ); sub2( ); printf("함수 main( ) --> i == %d\n", i); return 0; } static int i; /*전역변수 */ void sub1( ) { ++i; printf("함수 sub1( ) --> i == %d\n", i); void sub2( ) { printf("함수 sub2( ) --> i == %d\n", i); static을 생략해도 결과는 같다. static을 붙임으로 외부화일에서 참조하는 것을 금한다.
39
정적변수와 지역변수의 비교-(P192) #include <stdio.h> void sub( );
수원과학대학 컴퓨터정보과 1학년 1학기 정적변수와 지역변수의 비교-(P192) #include <stdio.h> void sub( ); int main( ) { printf("STATIC\t AUTO\n"); printf(" \n"); sub( ); sub( ); sub( ); return 0; } void sub( ) { static int i=1; /*정적변수*/ auto int k=1; /*지역변수, auto 를 생략해도 됨*/ printf("i == %d\t k == %d\n",i,k); i++; k++;
40
외부변수(Extern variable)-(p193)
수원과학대학 컴퓨터정보과 1학년 1학기 외부변수(Extern variable)-(p193) file1.c 외부화일(file2.c) 에서 정의한 함수를 사용하고자 할때 #include <stdio.h> //#include "file2.c" void sub1( ); void sub2( ); int x; void main( ) { x = 10; sub1( ); sub2( ); sub3( ); sub4( ); } void sub1( ){ x++; printf("함수 sub1( ) → x == %d\n",x); void sub2( ){ printf("함수 sub2( ) → x == %d\n",x); file2.c sub3( ) { extern int x; /* 외부변수*/ x++; printf("함수 sub3( ) → x == %d\n",x); x = 300; } sub4( ) { int x = 400; /* 지역 변수 */ printf("함수 sub4( ) → x == %d\n",x); 외부화일(file1.c) 에서 정의한 변수를 사용하고자 할때
41
레지스터 변수(Register variable)-(p194)
수원과학대학 컴퓨터정보과 1학년 1학기 레지스터 변수(Register variable)-(p194) #include <stdio.h> int main( ) { register int k,m; /*레지스터 변수 */ for(k=m=0; k<=100; k++) m+=k; /* m = m + k;와 같다 */ printf("합계는 %d 입니다.\n", m); return 0; }
Similar presentations