Download presentation
Presentation is loading. Please wait.
1
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영
2
순서 함수의 개념 함수의 원형, 선언 및 정의 함수의 호출 함수 결과의 귀환 저장 클래스 함수간 데이터 전달 방법 순환문
제 6장 함수 함수의 개념 함수의 원형, 선언 및 정의 함수의 호출 함수 결과의 귀환 저장 클래스 함수간 데이터 전달 방법 순환문 테스트모드 함수와 메모리관리 함수
3
함수의 개념 중간 제목함수의 형식 함수형 함수이름 (인자1, 인자2, ...) { 선언문; 일반문; } 함수 인자
제 6장 함수 중간 제목함수의 형식 함수형 함수이름 (인자1, 인자2, ...) { 선언문; 일반문; } 함수 인자 괄호, `( )' 안에 쓰여지며, 함수에 전달되어지는 값 함수형 함수가 리턴 해주는 리턴값의 형 선언문과 일반문 main( ) 안에서 사용되는 것과 같은 방식으로 작성
4
함수의 개념 [예제 6-1] #include <stdio.h>
제 6장 함수 [예제 6-1] #include <stdio.h> int add(int x, int y){ /* add 함수의 정의 부분 */ int z; z = x + y; return z; /* 함수결과를 리턴해 주는 부분 */ } main(){ int a; a = add(10, 20); /* add함수 호출 */ printf("The sum of two number is %d\n", a); [실행결과] The sum of two number is 30
5
함수의 원형, 선언 및 정의 함수의 원형 함수의 정의 함수의 선언
제 6장 함수 함수의 원형 다른 함수에서 또 다른 어떤 함수를 사용 할 때 함수를 미리 선언하는 일 함수의 정의 실제로 함수가 만들어지는 것을 말함 함수의 선언 미리 정의된 함수들은 헤더파일에 선언되어 있음
6
함수의 원형, 선언 및 정의 [예제 6-2] /* 이 예제는 실행되지 않음 */ #include <stdio.h>
제 6장 함수 [예제 6-2] /* 이 예제는 실행되지 않음 */ #include <stdio.h> main(){ int a; a = add(10, 20); printf("The sum of two numbers is %d\n", a); } int add(int x, int y){ /* add함수 정의 */ int z; z = x + y; return z;
7
함수의 원형, 선언 및 정의 [예제 6-3] #include <stdio.h>
제 6장 함수 [예제 6-3] #include <stdio.h> int add(int, int); /* add함수 선언 */ /* 다음과 같이 선언해도 된다. int add(int x, int y); */ main(){ int a; a = add(10, 20); /* add함수 호출 */ printf("The sum of two number is %d \n", a); } int add(int x, int y){ /* add함수 정의 */ int z; z = x + y; return z; [실행결과] The sum of two number is 30
8
함수의 호출 다른 함수에서 특정의 함수를 사용하게 위해 부르는 것 함수가 하나의 문장으로 호출
제 6장 함수 다른 함수에서 특정의 함수를 사용하게 위해 부르는 것 함수가 하나의 문장으로 호출 단지 함수의 이름과 그 인자만 표시 clrscr(); 함수가 리턴값을 가질 때 함수를 C의 수식처럼 사용할 수 있음 a = add(10, 20); printf("%d \n",a); 재귀적인 호출 함수의 내부에서 자기 자신을 다시 호출하는 것
9
함수 결과의 귀환 : return 문 함수내에서 계산된 결과를 호출한 곳으로 되돌려 줌
제 6장 함수 함수내에서 계산된 결과를 호출한 곳으로 되돌려 줌 return 문의 여러 가지 올바른 형식 return 3; return a; return a * 4 -2; return (a); return (a * 4 - 2); return 문의 역할 어떤 값을 리턴해 줌 함수의 실행을 강제로 종료 시킴 void형 함수의 경우 원칙적으로 return문을 사용할 필요가 없음 return을 사용할 경우 단독으로 return만을 사용
10
함수 결과의 귀환 : return 문 [예제 6-4] #include <stdio.h>
제 6장 함수 [예제 6-4] #include <stdio.h> int power(int, int); /* power함수 선언 */ void main(){ int a, b, c; printf("Input two numbers \n"); printf("They must not be negative numbers \n"); scanf("%d %d", &a, &b); c = power(a, b); /* power함수 호출 */ if(c == -1){ printf("The input has (a) wrong number(s). \n"); return; /* 프로그램 종료 */ } printf("%d^%d is %d \n", a, b, c); 계속
11
함수 결과의 귀환 : return 문 [예제 6-4] 계속
제 6장 함수 [예제 6-4] 계속 int power(int x, int y) /* power함수 정의 */ { int i; int result = 1; if(x < 0 || y < 0) return -1; /* 첫 번째 return */ for( i = 1 ; i <= y ; i++) result *= x; return result; /* 두 번째 return */ } [실행결과] Input two numbers They must not be negative numbers 2 3 2^3 is 8
12
저장 클래스 저장 클래스의 종류와 통용범위 규칙 자동 변수
제 6장 함수 저장 클래스의 종류와 통용범위 규칙 자동 변수 선언된 함수나 구역 내부에서만 유지되고, 함수를 벗어나게 되면 자동으로 소멸되는 변수 메모리 스택에 위치 정적 변수 소멸되지 않고 프로그램 전체나 특정 함수 내에서 계속적으로 유지하는 변수 내부 정적 변수 선언된 함수나 구역 내에서만 효력이 있음 외부 정적 변수 함수 외부에서 정의되는 변수 정적 변수의 선언 방법 static 데이터형 변수명, 변수명, ;
13
저장 클래스 [예제 6-5] #include<stdio.h> main(){ int x;
제 6장 함수 [예제 6-5] #include<stdio.h> main(){ int x; printf("%d\n",x); x=5; { int x; [실행결과] printf("%d\n",x); x=10; printf("%d\n",x); } printf("%d\n",x); 5 }
14
저장 클래스 [예제 6-6] #include<stdio.h> void sub(void); main(){ sub();
제 6장 함수 [예제 6-6] #include<stdio.h> void sub(void); main(){ sub(); } void sub(void){ static int i = 1; /* static int i; 와 i = 1;로 나누어 쓰면 i 값은 항상 1이 됨 */ auto int j = 1; printf("i = %d\tj = %d \n", i, j); i++ ; [실행결과] j++ ; i = j = 1 } i = j = 1 i = j = 1
15
저장 클래스 [예제 6-7] #include<stdio.h>
제 6장 함수 [예제 6-7] #include<stdio.h> static int external ; /* 외부정적변수 */ int sub(int x); main(){ static int internal ; /* 내부정적변수 */ internal = 1 ; external = 2 ; printf("The summation of external and internal is %d \n", sub(internal) ) ; } int sub(int x){ int total ; total = x + external ; return(total) ; } [실행결과] The summation of external and internal is 3
16
저장 클래스 저장 클래스의 종류와 통용범위 규칙 외부 변수 프로그램의 모든 부분에 적용되는 변수 정의하는 위치가 함수 외부
제 6장 함수 저장 클래스의 종류와 통용범위 규칙 외부 변수 프로그램의 모든 부분에 적용되는 변수 정의하는 위치가 함수 외부 레지스터 변수 임시 기억장치인 레지스터에 저장되는 변수 빠른 속도로 프로그램 실행 터보 C 에서는 SI 레지스터와 DI 레지스터의 두 개의 레지스터만 사용할 수 있음 선언 방법 register 데이터형, 변수명, 변수명, . . .
17
저장 클래스 [예제 6-8] #include<stdio.h>
제 6장 함수 [예제 6-8] #include<stdio.h> int sub (int value1); /* 함수의 정의 */ char format; /* 외부 변수 정의 */ int number; /* 이 후의 모든 함수에서 사용가능 */ main(){ int imsi1 ; /* 자동 변수의 정의 */ float imsi2 ; imsi1 = sub(10) ; } char string ; /* 외부 변수의 정의 */ /* 이후에 나타나는 함수에서 사용 가능 */ int sub(int value1){ float imsi2 ; /* 자동 변수의 정의 */
18
저장 클래스 [예제 6-9] /* <file_1.c> */ int ext; /* 외부변수의 정의 */ main(){
제 6장 함수 [예제 6-9] /* <file_1.c> */ int ext; /* 외부변수의 정의 */ main(){ ext = 1 ; sub_1() ; sub_2() ; sub_3() ; } sub_1(){ ext++ ; /* ext 변수의 값은 2 */ /* <file_2.c> */ sub_2(){ /* 외부변수의 선언, file_1에서 ext=2 extern int ext ; 의 값을 그대로 이어 받는다. */ ext++ ; /* ext 변수의 값은 3 */
19
저장 크래스 [예제 6-10] #include<stdio.h> main(){ register int i ;
제 6장 함수 [예제 6-10] #include<stdio.h> main(){ register int i ; register char c ; register int k; /* 두 개 이상의 레지스터변수이므로 자동변수로 정의 */ for (i = 0 ; i < 3 ; i++){ c = i + 65 ; printf("ASCII value of %c is %d\n", c, c) ; } [실행결과] ASCII value of A is 65 ASCII value of B is 66 ASCII value of C is 67
20
저장 클래스 함수와 저장 클래스 함수에 적용할 수 있는 저장 클래스는 외부 형의 함수와 정적 함수 두 가지뿐이다
제 6장 함수 함수와 저장 클래스 함수에 적용할 수 있는 저장 클래스는 외부 형의 함수와 정적 함수 두 가지뿐이다 정적함수의 형식 선언 static 함수형 함수명(매개변수 리스트); 정의 static 함수형 함수명 (매개변수 리스트) { }
21
함수간 데이터 전달 방법 return 문에 의한 직접 전달 값에 의한 전달 함수에서 실행된 연산결과를 호출한 함수에 돌려줌
제 6장 함수 return 문에 의한 직접 전달 함수에서 실행된 연산결과를 호출한 함수에 돌려줌 return 문의 형식 return(돌려줄 값) ; 값에 의한 전달 가장 일반적으로 쓰이는 전달 방법 매개변수라는 형식으로 값을 주고받음 매개변수에는 실매개변수와 형식매개변수가 있음 형식 매개변수의 값을 변화시켜도 실매개 변수의 값은 변하지 않음
22
함수간 데이터 전달 방법 [예제 6-11] #include<stdio.h>
제 6장 함수 [예제 6-11] #include<stdio.h> void change (int x,int y); /* change 함수 선언 */ main(){ int a,b; a = 1; b = 2; change (a, b); /* 함수 호출 */ printf("a = %d\tb = %d \n",a,b); } void change (int x, int y){ /* 두 변수의 값을 교환하는 함수 */ int temp ; temp = x ; x = y ; [실행결과] y = temp ; x = 2 y = 1 printf("x = %d\ty = %d \n",x,y) ; a = 1 b = 2
23
함수간 데이터 전달 방법 참조에 의한 전달 데이터가 저장된 번지를 전달하는 방법 번지 연산자와 간접지정 연산자 번지 연산자 &
제 6장 함수 참조에 의한 전달 데이터가 저장된 번지를 전달하는 방법 번지 연산자와 간접지정 연산자 번지 연산자 & &x : x가 저장되어 있는 선두 번지값을 나타냄 간접지정 연산자 *px : 변수 px 가 가리키는 곳의 데이터 값 px는 데이터가 있는 장소와 데이터 값의 종류에 관한 정보만 가지고 있음 : 간접 지정 연산자로 불림 참조에 의한 실매개변수의 변환 하위함수로 실매개변수가 있는 번지를 보내 주는 간접적인 지정에 의해 실매개변수에 접근 가능
24
함수간 데이터 전달 방법 [예제 6-12] #include<stdio.h> main(){
제 6장 함수 [예제 6-12] #include<stdio.h> main(){ int x=100; /* 변수 선언 및 초기화*/ int *px; /* 포인터선언 */ px = &x; /* x의 주소를 px에 대입 */ printf("%d \n",x); /* x를 출력 */ printf("%d \n",px); /* px를 출력 */ printf("%d \n",&px); /* px의 주소를 출력 */ printf("%d \n",*px); /* px가 가리키는 데이터 출력 */ } [실행결과] 100 4094 4090
25
함수간 데이터 전달 방법 [예제 6-13] #include<stdio.h>
제 6장 함수 [예제 6-13] #include<stdio.h> void change (int *x,int *y); /* change 함수 선언 */ main(){ int a,b ; a = 1 ; b = 2 ; change(&a, &b); /* a, b 의 번지값을 change 함수로 넘김 */ printf("a = %d \t b = %d \n",a,b); } void change (int *x, int *y){ /* 두 변수의 값을 교환시키는 함수 */ int temp ; temp = *x ; *x = *y ; *y = temp ; [실행결과] printf("x = %d \t y = %d \n",*x,*y) ; x = 2 y = 1 } a = 2 b = 1
26
순환문 함수가 자기 자신을 다시 호출하는 것 자신을 그만 불러낼 시기를 알기 위해 반드시 함수내에 초기화 루틴이 있어야 함
제 6장 함수 함수가 자기 자신을 다시 호출하는 것 자신을 그만 불러낼 시기를 알기 위해 반드시 함수내에 초기화 루틴이 있어야 함 장점 프로그램이 매우 간결해지고 이해하기 쉬움 단점 메모리를 많이 사용하게 되어 처리속도가 느려짐
27
순환문 [예제 6-14] #include <stdio.h> double factorial (int n);
제 6장 함수 [예제 6-14] #include <stdio.h> double factorial (int n); void main(){ int number ; printf("Input integer number : ") ; scanf("%d", &number) ; printf("%d!=%.15g\n", number, factorial(number)); } double factorial(int n){ if(n == 0) return 1 ; else return ((double) n * factorial(n-1)) ; } [실행결과] Input integer number :3 3!=6
Similar presentations