我要學會 C 語言(七):寫一遍就能用好幾遍好方便的函式
C 語言中,可以把重複的程式提出來寫成函式(function),而需要的時候直接呼叫這個函式就好,也就是模組化的概念。
什麼叫模組化?簡單來說,就是把特定功能分出來當成一個模組,需要的時候只要呼叫這個模組就好;而需要修正的時候也只要修正模組即可。
比方說,有一個可以算 1+2+…+100 的程式如下:
#include <stdio.h>
int main(){
int i, sum=0;
for(i=1;i<=100;i++){
sum += i;
}
printf("%d", i);
return 0;
}
而其中第 4 行到第 8 行是用來計算和輸出的程式碼。我們可以把它獨立出來,寫成一個函式,必且在 main 主程式中呼叫它。例如我們把這個部分命名為 Count1To100
:
#include <stdio.h>
void Count1To100(){
int i, sum=0;
for(i=1;i<=100;i++){
sum += i;
}
printf("%d", i);
}
int main(){
Count1To100();
return 0;
}
這樣就算寫好一個簡單的函式囉!
不過你也許會說,程式好好的幹嘛沒事寫成一個函式?這樣看起來沒感覺,當你程式很多地方都需要重複寫它的時候,你就有感覺了。另外,函式還有更好用的一個地方,就是它可以傳入和回傳值。
傳入值和回傳值是什麼?
這大概要先從數學上的函數開始講起了。 $f(x) = x + 1$,看到這個函數你想到什麼?
在數學的函數中,可以把 $x$ 代入不同的數,得到不同的對應值,例如 $f(2)=3$、$f(3)=4$、$f(4)=5$……等等。以 $f(2)=3$ 來說,$2$ 就是傳入值,$3$ 就是回傳值。
而函數的代入值也不見得只有一個,例如 $f(x, y) = x+y+2$。那就會得到 $f(1, 1)=4$、$f(2, 3)=7$…… 等等。
函式、函數,傻傻分不清楚?
函式和函數在英文都是 function,只是翻譯問題而已。原則上是一樣的東西。
C 語言的函式呢?
C 語言的函式和數學上的函數用法基本上是一樣的。要先看看函式有幾個傳入值,把相對應的傳入值傳進去後,就會做指定動作,然後回傳一個回傳值。
好饒舌啊 QQ,更饒舌的是 C 語言的函數不一定要有傳入值和回傳值。
在開始之前,來回顧一下資料型態吧。變數有不同的形態,常見的有 int
、double
等等。另外,如果空的話會寫成 void
。
那,來看看一個簡易的加法函式好了:
int plus(int a, int b){
return a+b;
}
首先一開始宣告這個函式的資料型態,也就是要回傳的資料型態,接著打函式的名字,小括號內放的是傳入值的資料型態和名稱。接著就和一般寫程式沒有兩樣了,只是最後要把結果用 return 來回傳。
例如這個函式會回傳 int
型態,名字叫做 plus
,使用的時候需要傳入兩個 int
,一個叫 a
、一個叫 b
,最後把 a+b
的結果回傳回去。
那要怎麼用它呢?以下這個範例程式:
#include <stdio.h>
int plus(int a, int b){
return a+b;
}
int main(){
int m, n;
scanf("%d %d", &m, &n);
int result = plus(m, n);
printf("%d", result);
}
一開始把 plus
函式寫在前面,main
主程式裡面做的事情是:開兩個整數 m
、n
,用 scanf
得到兩個使用者輸入的數,分別存到 m
、n
變數裡面。
接著我再開一個變數叫 result
,存放 plus(m, n)
的計算結果。為什麼 result
要開 int
而不是 double
或其他資料型態?因為 plus
函式的開頭是寫 int
,代表回傳值會是 int
類型。
這時,result
裡面存放的已經是 m
和 n
相加結果的值了,可以直接用 printf
把它輸出。
另外,為什麼函式的傳入值是
a
、b
,但main
丟的是m
、n
?這樣也可以?在 C 語言裡面,每個變數在自己的函式裡面都是獨立的,
main
裡面宣告的變數和其他函式宣告的變數不會互相影響。例如這個例子中main
在呼叫plus
函式時,丟的其實是m
、n
的值,而plus
函式也只是把這個值接過來而已,它們並不在意變數到底怎麼命名的。
要是能夠理解這裡在說什麼的話,其實也可以把函式當作一個變數使用。例如剛剛那個範例的 main
裡面可以改成這樣:
int main(){
int m, n;
scanf("%d %d", &m, %n);
printf("%d", plus(m, n));
return 0;
}
就不用另外去開一個變數來儲存。
對了,值得注意的是:函式一遇到 return,就會把後面的值傳出去,然後函式裡剩下的東西都不會執行了唷!
OK 到這裡還是不能理解的話,建議你先多看幾遍。**函式之間是怎麼運作的比怎麼寫函式還重要!**畢竟函式並沒有一定的寫法,你是要把 plus
當成 int
回傳,還是要把 plus
當 void
在裡面直接 printf
,這些都是可以視情況而定的,更何況等你熟練了以後還可以直接去套別人寫好的函式來用,根本不用自己寫函式。