我要學會 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 語言的函數不一定要有傳入值和回傳值

在開始之前,來回顧一下資料型態吧。變數有不同的形態,常見的有 intdouble 等等。另外,如果空的話會寫成 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 主程式裡面做的事情是:開兩個整數 mn,用 scanf 得到兩個使用者輸入的數,分別存到 mn 變數裡面。

接著我再開一個變數叫 result,存放 plus(m, n) 的計算結果。為什麼 result 要開 int 而不是 double 或其他資料型態?因為 plus 函式的開頭是寫 int,代表回傳值會是 int 類型。

這時,result 裡面存放的已經是 mn 相加結果的值了,可以直接用 printf 把它輸出。

另外,為什麼函式的傳入值是 ab,但 main 丟的是 mn?這樣也可以?

在 C 語言裡面,每個變數在自己的函式裡面都是獨立的,main 裡面宣告的變數和其他函式宣告的變數不會互相影響。例如這個例子中 main 在呼叫 plus 函式時,丟的其實是 mn 的值,而 plus 函式也只是把這個值接過來而已,它們並不在意變數到底怎麼命名的。

要是能夠理解這裡在說什麼的話,其實也可以把函式當作一個變數使用。例如剛剛那個範例的 main 裡面可以改成這樣:

int main(){
	int m, n;
	scanf("%d %d", &m, %n);
	printf("%d", plus(m, n));
	return 0;
}

就不用另外去開一個變數來儲存。

對了,值得注意的是:函式一遇到 return,就會把後面的值傳出去,然後函式裡剩下的東西都不會執行了唷!

OK 到這裡還是不能理解的話,建議你先多看幾遍。**函式之間是怎麼運作的比怎麼寫函式還重要!**畢竟函式並沒有一定的寫法,你是要把 plus 當成 int 回傳,還是要把 plusvoid 在裡面直接 printf,這些都是可以視情況而定的,更何況等你熟練了以後還可以直接去套別人寫好的函式來用,根本不用自己寫函式

我要學會 C 語言 目錄