- 函式
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轉成字串