iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 6
0
Software Development

C++ 30天屠龍記系列 第 6

第6天:一文拆解C++函數

前言:面向過程編程的定義

面向過程是一種以步驟為中心的編程設計方法。編程的時候把解決問題的步驟拆分出來,並用函數把這些步驟實現出來,或者說包裝起來,便是面向過程的意思了。那麼,如果我們要用C++進行一個未知數的四則運算,那麼該怎麼拆分步驟呢?

  1. 先界定我們要尋找的range
  2. 把昨日的Code寫進來
  3. 分開 + - x ÷四種情況做運算
  4. 把運算結果返回

你會發現都是順序的結果

函數需要標明型別的!!

如果忘記了C++有什麼類型可以會第4天看最底的小表格

函數

我假設大家都聽過數學的函數,數學的函數裡的表示是這樣的: sin(x) , f(y),你可以看見函數有一個名字,而在括弧裡的就是你要傳入的數值。如果要定義一個函數做什麼,和返回的數值是什麼。那麼就要用以下的方法。

我們假設要做一個 叫 add(x,y) 的函數,當中我們希望他計算出 x + y 的總和,那麼就可以這樣做。

auto sumOf(int x, int y){
	auto sum = x + y;
	
	//return 就是把我們希望要的答案輸出到主函數裡
	return sum;
}

那麼怎麼獲得這個函數計算出的數值呢?,可以這樣

auto onePlusTwo = sumOf(1, 2);
auto ThreePlus15 = sumOf(15, 3);

如此類推,我們可以得出以下的函數

auto differenceOf(int x, int y){
	auto sum = x - y;
	
	//return 就是把我們希望要的答案輸出到主函數裡
	return sum;
}
auto productOf(int x, int y){
	auto product = x * y;
	
	//return 就是把我們希望要的答案輸出到主函數裡
	return product;
}

auto quotientOf(int x, int y){
	auto quotient = x / y;
	
	//return 就是把我們希望要的答案輸出到主函數裡
	return quotient;
}

那麼我們下一步就是查詢數式究竟是 + - x ÷ 了

auto calculate(auto x, char operators, auto y){
	switch(operators){
		case '+': return sumOf(x,y); break;
		case '-': return differenceOf(x,y); break;
		case '*': return productOf(x,y); break;
		case '/': return quotientOf(x,y); break;
}
  • 我們現在就已經弄了一個最基本的Parser 了

然後再寫一個四則驗算器。

auto check(int x, char oeprators, int y, int z){
	return calculate(x,operators,y) == z;
}
  • 這個運算器會在三個數值都正確的時候返回 true,反之 false

下一步便是寫出計算的For Loops了

auto evaluateX(char operators, int y, int z){
	for(auto x = 0; x < 1000 ;x++){
		if(check(x,operators,y,z)) return static_cast<double>(x);
		else if(check(-x,operators,y,z)) return static_cast<double>(x);
		else continue;
	}

這個程序的範圍從-1000到1000,能應付簡單的計算,static_cast應付小數的

那怎麼使用函數呢?其實上面的函數有不少都有使用其他函數的,而下面就是在Main中使用。

int main(){
	auto x = evalutateX('+',10,12);
	cout << x << endl;
	//輸出了 2
	auto y = evalutateX('*',10,12);
	cout << y << endl
	//輸出了 1.2
	auto z = evaluateX('/',10,18);
	cout << z << endl;
	//輸出了 180
}

這樣,我們一個並不是很Flexible的 Function就完成啦。回顧一下函數結構

|-- evaluateX()
|----check()
|--------calculate()
|------------sumOf()
|------------differenceOf()
|------------quotientOf()
|----check()
|--------calculate()
|------------sumOf()
|------------differenceOf()
|------------quotientOf()

明天會換個話題,講一講Vector,在第九天應該會講一種更強大的函數式Lamba,同時完善我們的程式


上一篇
第五天:一文學懂判斷式與迴圈
下一篇
C++ 30天屠龍記(第7天): Vector 與他的兄弟(一)
系列文
C++ 30天屠龍記30

1 則留言

0
小瓜
iT邦新手 5 級 ‧ 2019-10-15 13:52:50

differenceOf 這個方法是不是寫錯了?
X0y?
不是x-y?

alantsui iT邦新手 5 級 ‧ 2019-10-16 19:36:23 檢舉

謝謝你了

我要留言

立即登入留言