8. 函數定義 (Definition)
定義一個函數的語法如下:
資料型態 函數名稱 ( 引數部份 )
{
函數內 部變數宣告
主體敘述
}
int diff(int x, int y);
int diff(int x, int y);
int diff(int x, int y) // ANSI C
int diff(int x, int y) // ANSI C
{{ // begin function body
// begin function body
int z;
int z; // declare local variable
// declare local variable
zz= xx--y;
= y;
return z;
return z;
}}
8
11. 參數傳遞
呼叫函數時 , 傳遞參數的方式
1. 傳值呼叫 Call by value
• 傳變數的數值資料
1. 傳址呼叫 Call by address
• 傳變數的記憶體位址
• 若想讓函數存取呼叫函數裡的變數時
11
12. 範例 - 傳值呼叫
#include <stdio.h>
#include <stdio.h>
int imin(int n, int m); // declaration
int imin(int n, int m); // declaration
int main(void)
int main(void)
{{
int x=50,y=100;
int x=50,y=100;
printf("The lesser of %d and %d is %d.n",
printf("The lesser of %d and %d is %d.n",
x, y, imin(x,y));
x, y, imin(x,y));
return 0;
return 0;
}}
int imin(int x,int y)
int imin(int x,int y) // definition
// definition
{{
return ((x<y)? xx::y);
return ((x<y)? y);
}}
12
13. 範例 - 數值交換 1
/* swap1.c -- first attempt at aaswapping function */
/* swap1.c -- first attempt at swapping function */
#include <stdio.h>
#include <stdio.h>
void interchange(int u, int v); /* declare function */
void interchange(int u, int v); /* declare function */
int main(void)
int main(void)
{{
int xx==5, yy==10;
int 5, 10;
printf("Originally xx==%d and yy==%d.n", xx, ,y);
printf("Originally %d and %d.n", y);
interchange(x, y);
interchange(x, y);
printf("Now xx==%d and yy==%d.n", x, y);
printf("Now %d and %d.n", x, y);
return 0;
return 0;
}}
void interchange(int u, int v) /* define function */
void interchange(int u, int v) /* define function */
{{
int temp;
int temp;
temp ==u;
temp u; Originally x = 5 and y = 10.
uu==v;
v; Now x = 5 and y = 10.
vv==temp;
temp;
}}
13
14. void enable_bit(unsigned short val,unsigned short mask ););
void enable_bit(unsigned short val,unsigned short mask
void disable_bit(unsigned short val,unsigned short mask ););
void disable_bit(unsigned short val,unsigned short mask
int main(void)
int main(void)
{{
unsigned short REG16=0xff03;
unsigned short REG16=0xff03;
printf("REG:%#xn",REG16);
printf("REG:%#xn",REG16);
enable_bit(REG16,0x18);
enable_bit(REG16,0x18);
printf("REG:%#xn",REG16);
printf("REG:%#xn",REG16);
disable_bit(REG16,0x18);
disable_bit(REG16,0x18);
printf("REG:%#xn",REG16);
printf("REG:%#xn",REG16);
return 0;
return 0;
}}
void enable_bit(unsigned short val,unsigned short mask ) )
void enable_bit(unsigned short val,unsigned short mask
{{
val |=mask;
val |=mask;
printf("FUNC_enable_bit:REG:%#xn",val);
printf("FUNC_enable_bit:REG:%#xn",val);
}}
void disable_bit(unsigned short val,unsigned short mask ) )
void disable_bit(unsigned short val,unsigned short mask
{{
val &=~mask;
val &=~mask;
printf("FUNC_disable_bit:REG:%#xn",val);
printf("FUNC_disable_bit:REG:%#xn",val);
}}
14
15. Pointers: A First Look
a pointer is a variable (or, more generally, a data
object) whose value is an address
Address operator : & and *
int *ptr;
int *ptr;
Int nurse = 22;
Int nurse = 22;
ptr = &nurse; /* pointer to nurse */
ptr = &nurse; /* pointer to nurse */
int val = *ptr;
int val = *ptr;
printf(“ptr=%p, addr of nurse=%p, ptr=%x”,
printf(“ptr=%p, addr of nurse=%p, ptr=%x”,
ptr,&nurse,*ptr);
ptr,&nurse,*ptr);
15
16. 範例 - 數值交換 2
#include <stdio.h>
#include <stdio.h>
void interchange(int **u, int **v);
void interchange(int u, int v);
int main(void)
int main(void)
{{
int xx==5, yy==10;
int 5, 10;
printf("Originally xx==%d and yy==%d.n", x, y);
printf("Originally %d and %d.n", x, y);
interchange(&x, &y); /* send addresses to function */
interchange(&x, &y); /* send addresses to function */
printf("Now xx==%d and yy==%d.n", x, y);
printf("Now %d and %d.n", x, y);
return 0;
return 0;
}}
void interchange(int **u, int **v)
void interchange(int u, int v)
{{
int temp;
int temp;
temp ==*u;
temp *u; /* temp gets value that uupoints to */
/* temp gets value that points to */
*u ==*v;
*u *v;
*v ==temp;
*v temp;
}}
16
18. 遞迴函式撰寫法則
1) 找出遞迴關係式
2) 指出遞迴終止條件
1. 計算 N 階乘
• n! = n*(n-1)*…*2*1 if n > 0
•1 if n=0
1. 費氏數列
• f(n)=f(n-1)+f(n-2) if n > 2
• f(n)=n if n<=2
1. 河內之塔
18
19. 範例 2- 遞迴呼叫
n!=n*(n-1)*…*1
n! = n * (n-1)! if n >0
1 if n=0
long fac (( int n ))
long fac int n
{{
if (n <= 1)
if (n <= 1)
return 1;
return 1;
return n*fac(n-1) ;;
return n*fac(n-1)
}}
19
26. #include <stdio.h>
#include <stdio.h>
#define TWO 22
#define TWO
#define OW "Consistency is the last refuge of the unimagina
#define OW "Consistency is the last refuge of the unimagina
tive. - -Oscar Wilde"
tive. Oscar Wilde"
#define FOUR TWO*TWO
#define FOUR TWO*TWO
#define PX printf("X is %d.n", x)
#define PX printf("X is %d.n", x)
#define FMT "X is %d.n"
#define FMT "X is %d.n"
int main(void)
int main(void)
{{
int xx==TWO;
int TWO;
PX;
PX;
xx==FOUR;
FOUR;
printf(FMT, x);
printf(FMT, x);
printf("%sn", OW);
printf("%sn", OW);
printf("TWO: OWn");
printf("TWO: OWn");
return 0;
return 0;
}}
26
38. Configuration of your program
#define WITH_DEVICE_A
//#define WITH_DEVICE_B
#define VERSION 2
#if (VERSION == 3)
#error ”new function for version 3.0”
#endif
#ifdef WITH_DEVICE_B
#warning “drivers of Device-B”
#endif
38
39. defined()
defined(name) - evaluates to 1 if name has been
defined
#if defined(DEBUG) is the same as #ifdef DEBUG
#if expression - if expression evaluates to a non-
zero value, process the following code
#if 0
#if 0
/*code which should not be compiled*/
/*code which should not be compiled*/
#endif
#endif
7-39
41. Lab #5
將 Lab #4 中,判斷某點是否在某個矩形範圍內 的功
能更改為 function 。
Main.c, Button.h, Button.c
int get_L_T_W_H(int *L…) ;
int check_boundary(int x, int y) ;
41
42. Lab #5-2
Please implement power(x,n) function for
your homework1. ( 一般函數 & 遞迴函數 )
int power(int x, int n)
{ int power(int x, int n)
int sum = 1 ; {
int i ; if(n == 0)
return 1 ;
for(i=0;i<n;i++) else
{
{
sum = sum*x ;
}
return x * power(x,n-1) ;
}
return sum ;
} }
42