260 likes | 457 Views
7 주 강의. Functions. Functions. Top-down programming type function_name ( parameter_list ) { declarations statements } int factorial(int n) { int i, product = 1; for (i=2; i<= n; ++I) product *=i; return product; } fact = facorial(5) ;.
E N D
7주 강의 Functions
Functions • Top-down programming • type function_name (parameter_list) { declarations statements } • int factorial(int n) { int i, product = 1; for (i=2; i<= n; ++I) product *=i; return product; } • fact = facorial(5) ;
예 • void nothing(void) { } /* do nothing */ • double twice(double x) { return (2.0 * x) ; } • int all_add(int a, int b) { int c; …. return(a+b+c) }
Functions in traditional C • void f(a, b, c, x, y) int a, b, c; double x, y { …. }
The return Statement • return_statement ::= return ; | return expression ; • return; return ++a; return (a * b); • double_absolute_value (double x) { if (x>=0.0) return x; else return –x; }
Function Prototypes • Functions should be declared before they are used • double sqrt(double) • type function_name(parameter type list) ; • Identifier is optional (void f(char c, int i); void f(char, int) • double sqrt(); /* traditional C style */ • 203 page 예제 설명
Function declarations from the compiler’s viewpoint • function invocation, function definition, function declaration, function prototypes • Function storage class는 extern이나 static이어야지 auto나 register는 안 된다 • function definition이 있으면 function prototype은 없어도 되지만 쓰는 게 좋다. • 아무 선언 없이 f(x)를 쓰면 ‘int f();’로 보거나 오류 • int f(x) /* f(1)은 오류가 될 수 있다 */ double x; • int f(double x) /* 이 때는 int가 double로 바뀜 */
An alternate style #include <stdio.h> #define N 7 void prn_heading(void) { …} long power(int m, int n) {…} … int main(void) {prn_heading(); …}
Function invocation and call-by-value • main()에서 수행을 시작 • Function 이름을 만나면 invoked(called)된다 • Function의 argument 수와 type이 일치해야 • call-by-value를 사용
Function invocation order • Each expression in argument list(actual parameters) is evaluated • 그 결과가 formal parameter(형식인자)의 형과 다르면 변환한다 • body를 수행한다 • return문을 수행한다 • return문이 expression을 가졌으면 수행하고, 형이 맞지 않으면 변환한다 • return에 아무 expression이 없으면 아무 결과도 안 돌려준다
Developing a large program • 큰 프로그램이 다수 파일에 있을 때는 “make”를 사용 • #include “pgm.h” 현재 주소 검사, 시스템에 제공하는 곳 조사 • 210, 211 page를 설명
Using assertions • #include <assert.h> #include <stdio.h> ….. c=f(a,b); assert(c>0); …. • NDEBUG
Scope rules • 변수의 범위규칙 • { int a,b; …. {float b; …. } {float a; …. } }
Using a block for debugging • { static int cnt = 0; print(“*** debug: cnt =%d v = %d\n”, ++cnt, v); • Local변수를 이용한 오류 찾기
Storage Classes • auto, extern, register, static • auto ::: by default • automatic의 준말 • auto int a, b, c; auto float f; • ㅁuto는 block에 들어갈 때마다 기억장소를 배정, 초기화되지 않음
extern • extern ::: variables declared outside a function • memory를 계속 유지, 초기화함(0으로), 전역변수(global variable) • 예 ::: 217page • extern int a=1, b=2; /*extern은 없어도 됨; 전통 C는 안 된다*/ int main(void) …
extern for separate compiling • int a=1, b=2, c=3; int f(void) int main(void) { …} int f(void) { extern int a; …} • Side effect가 일어남 • extern double sin(double) /* function prototype */ • extern double sin(double x) { … }
The storage class register • { register int i; for (i=0; I<LIMIT; ++i) { …} } • register i; register int i • 값이 초기화되지 않음
The storage class static • Void f(void) { static int cnt = 0; ++cnt; if (cnt % 2 ==0) ….. else ….. }
Static external variable • void f(void) { … /* v is not available here */ } static int v; /* static external variable */ void g(void) { … /* v can be used here */ } • 221, 222 page 프로그램 설명
Default initialization • automatic, register ::: 초기화 안 됨 • external, static ::: 초기화됨
Recursion • int sum(int n) { if (n <= 1) return n; else return (n + sum(n-1)); }
Factorial • int factorial(int n) { if (n <= 1) return 1; else return (n*factorial(n-1)); }
Recursion and efficiency • recursion은 수행속도가 느리다. 그러나 개념적으로 보면 명확한 표현이 가능하다. 그리고 모든 recursion은 stack을 이용하면 iteration으로 바꿀 수 있다… • Factorial을 iteration으로 바꿀 수 있다 • 227page 설명
Towers of Hanoi • 설명
숙제 • 학교에서 ::: 1, 3, 5, 15, 17, 22 • 집 ::: 7, 8, 11, 14, 16, 23, 26