第六章 函式

      在〈第六章 函式〉中尚無留言
  • 函式

Basic中,無傳回值叫副程式,有傳回值叫函數。但C統稱函數

可將大程式切割多人開發,利於分工

可縮短程式長度,可重複使用

可讀性高,易於除錯維護

srand, rand,即是內建函式

  • 建立函式

傳回值 函式名(參數1, 參數2, …){}

若無傳回值 void

若無傳回值,則無需return

int getArea(int w, int h){return w*h;}

 

呼叫 int area=getArea(5,4);

函數需寫於呼叫之前,若是寫於呼叫之後,需先宣告函式原型

int getArea(int, int);

int main(){

printf (“Area= %d\n”, getArea(5,4));

system(“pause”);

return 0;

}

int getArea(int w, int h){

return w*h;

}

函式原型可寫資標頭檔內,再include進來

Java不需要宣告原型

  • Return返回

強迫返回時,就算是void,可用return;

  • 參數

Call by value : 傳值呼叫,呼叫者與函式,二者為獨立的變數,不會改變原參數的值

 

Call by reference :傳參考呼叫

主 : newSpeed=trubo(speed);

副 : int turbo(int &speed);

int turbo(int &speed){

speed=speed*2;

return speed;

}

int main(){

int speed=5;

printf (“Turbo= %d\n”, turbo(speed));

printf(“new Speed : %d\n”, speed);

system(“pause”);

return 0;

}

Call by address : 傳址呼叫 :

主 : newSpeed=trubo(&speed);

副 : int turbo(int *speed);

int turbo(int *speed){

*speed=*speed*2;

return *speed;

}

int main(){

int speed=5;

printf (“Turbo= %d\n”, turbo(&speed));

printf(“new Speed : %d\n”, speed);

system(“pause”);

return 0;

}

Call by address好像比較機車,但卻是主流,反而call by reference不常用到

 

返回指標

int *turbo(int *speed){

*speed=*speed*2;

return speed;

}

int main(){

int speed=5;

int *t=turbo(&speed);

printf (“Turbo= %d\n”, *turbo(&speed));

printf(“new Speed : %d\n”, speed);

}

 

陣列參數,一律為傳址呼叫

void turbo(int a[]){

for (int i=0;i<4;i++){

a[i]=a[i]*2;

}

}

int main(){

int a[]={1,2,3,4};

turbo(a);

for(int i=0;i<4; i++){

printf(“%d “, a[i]);

}

system(“pause”);

return 0;

}

  • 遞迴 : 自己呼叫自己,一定要有結束點

int factorial(int n){

if (n==0)return 1;

else return n*factorial(n-1);

}

int main(){

printf(“1*2*3*…*5 = %d “, factorial(5));

}

  • 標頭檔

將函數原型宣告寫在標頭檔裏

 

 

test.h

#include <iostream>

#include <stdio.h>

#include <string.h>

int count();

 

主程式:

#include “test.h”

using namespace std;

int main(){

printf(“count 1 = %d\n”, count());

printf(“count 2 = %d\n”, count());

system(“pause”);

return 0;

}

int count(){

static int n=0;

n++;

return n;

}

  • 多載

函式名稱可以使用多個相同的名稱,但參數需不同

返回值型態無關簽名

int add(int a, int b){

return a+b;

}

int add(float a, float b){

return a+b;

}

string add(string a, string b){

return a+b;

}

int main(){

printf(“5+3 = %d\n”, add(5,3));

printf(“5+3.0 = %d\n”, add(5,3.0));

printf(“abc+def=%s\n”, add(“abc”, “def”).c_str());

}

  • 變數存取範圍

區塊變數 : 宣告在迴圈內

區域變數 : 宣告在函式內

全域變數 : 宣告在函式外

靜態變數 : static

區域變數一結束就死亡,若要保留值,就要宣告為static, 但僅區域內可用

若要區域外也可用,就要在函式外宣告為全域靜態變數

int count(){

static int n=0; ç比較把static拿掉的結果

n++;

return n;

}

int main(){

printf(“count 1 = %d\n”, count());

printf(“count 2 = %d\n”, count());

}

  • 內建函式

rand : 擲骰子遊戲

Math 數學函數 : abs(int), acos(double)反餘弦, ceil(double)大於或等於參數的最小整數, floor(double)小於或等於參數的最大整數, max(int x, int y), min(int x, int y), pow(int x, int y)xy , sqrt(double)參數的平方根

char 字元陣列函數 :

strlen : 字串長度, 不包含 \0

strcmp(char *s1, char *s2) : s1==s2為0, s1>s2為1, s1<s2為-1

strcpy(char *s2, char *s1) : 將s1 copy給s2

strcat(char *s1, char *s2) : s1, s2合併,並指派給s1

tolower(char s) : 將字元轉小寫

toupper(char s) : 將字元轉大寫

字串數值型別轉換

atoi, atof, atoll(string), 將字串轉int, float, long

itoa(int) : 將int轉成字串

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *