模組化程式設計,就是撰寫副程式。
常用的功能寫成一支副程式,由主程式呼叫執行,是模組化重要方式。
模組化也會涉及參數的傳遞,必須詳加掌握。
副程式可以寫在main之前或之後,最好先做副程式宣告。
先看幾個例子:
預先宣告
主程式呼叫 - 傳值呼叫 Call by value
上圖的答案後詳。
宣告:void 函式名稱();
清除緩衝區副程式呼叫寫法
第2行宣告副程式名稱與無參數。
因為Enter也是一個字元,所以在輸入過數字之後必須清除,否則會被第9行的scanf("%c")讀取,造成第10行字元輸出看起來是空白。
※清除緩衝區副程式呼叫寫法※
宣告:void 函式名稱(傳入參數資料型態);
例:void count1(int n); //無回傳、傳入整數
回傳值資料型態 函式名稱();
例:int count3(); //回傳整數
例2:成績等第計算回傳
90~100 等第A
80~89 等第B
70~79 等第C
60~69 等第D
<60 等第E
回傳值資料型態 函式名稱(傳入參數資料型態);
例:int count2(int n); //回傳整數、傳入整數
解答
100
-12
-13
-12
這些都是「傳值呼叫」,主程式將值傳入副程式之後,原主程式的變數不會被副程式所改變,傳入的副程式值,只存活於副程式執行期間。意即,副程式內的變數記憶體位置與主程式變數記憶體位置不同,因此主程式內的變數自然不受影響。
※欲在副程式內改變主程式變數內容,必須使用『傳址呼叫』,傳入主程式變數的記憶體位址。
一維陣列元素表示
int A[5];
索引法:A[index]
位址法:int* p=A;
取值:*(p+shift)
void 函式名稱(int[]);
例:void test(int[]); //無回傳、傳入一維整數陣列
二維陣列元素表示
int B[2][3];
索引法:B[row][col]
位址法:int* p =B; //取得二維陣列開頭記憶體位址
取值:*(*(B+row)+col)
傳入函數(式)的參數的 資料型態,稱之為「形參」。
方法有以下幾類:
一、形參為「二維陣列」(、「長度」)
二、形參為「指標陣列」(陣列每一列的開頭位址)
三、形參為「陣列位址」(陣列第一個元素的位址)
一、傳入形參為「二維陣列」。
※傳入的是整個陣列。※
※必須明確指定二維陣列大小,不能使用動態陣列(變數)宣告,否則編譯不會過。
宣告:void 函式名稱(int 陣列名稱[2][3]) {...} 或
void 函式名稱(int 陣列名稱[ ][3]) {...}
呼叫:函式名稱(陣列名稱);
範例:
void init(int[2][3], int);
或 void init(int[][3], int);
main(){
int a[2][3]; //明確指定大小
init(a);//呼叫給初值函式
}
void init(int p[2][3],int row) {
for(int i=0;i<3;i++){
for(int j=0;j<row;j++){
p[i][j]=0; //索引值存取
}
}
}
或
void init(int p[2][3]) {
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
*(p[i] + j)=0; //第幾列p[i]、第幾欄j
//或 *(*(p+i) + j)=0; //第幾列*(p+i)的位置、第幾欄j
}
}
}
二、傳入形參為「指標陣列」。
※傳入的是陣列每一列的開頭位址。※
宣告:void 函式名稱(int**);
呼叫:函式名稱(指標變數的指標);
範例:
void initArray2(int**,int,int);
void initArray(int** p,int row,int col){
for(int i=1;i<=row;i++){
for(int j=1;j<=col;j++){
p[i][j]=0; //直接使用索引表示元素位置
}
}
}
呼叫:
int a[n][n];
int* p1[n]; //存每一列開頭位址
for(int i=0;i<n;i++)
p1[i]=a[i]; //取得二維陣列每一列開頭位址
initArray2(p1,n,n);
三、傳入形參為「位址」。
※傳入的是第一個元素的位址。※
宣告:void 函式名稱(int*);
呼叫:函式名稱(指標變數);
範例:
void initArray(int*,int,int);
void initArray(int* p,int row,int col){
for(int i=1;i<=row;i++){
for(int j=1;j<=col;j++){
*(p+((i*col)+j))=0;
}
}
}
呼叫:
int a[n][n];
int* p1=&a[0][0]; //取得陣列第一個元素位址
initArray(p1,n,n);