統計在程式設計裡面,佔有相當重要角色,無論是實用上或是比賽,都會遇到,
出現率幾乎百分之百,以下介紹常用統計技巧。

統計技巧
(一) 計數
假設隨機輸入一字串為 "0fE3-x" (故定 6 個字),如何統計小寫英文字母的字數?
以下的方法盡量讓程式碼相似,相似度越高,就越能移植到重複結構上。

string str = "";
int sum = 0; //統計數量歸零
cin >> str; // 假設隨機輸入 "0fE3-x"
if ( (str[0]>='a') && (str[0]<='z') ) sum = sum + 1;
if ( (str[1]>='a') && (str[1]<='z') ) sum = sum + 1;
if ( (str[2]>='a') && (str[2]<='z') ) sum = sum + 1;
if ( (str[3]>='a') && (str[3]<='z') ) sum = sum + 1;
if ( (str[4]>='a') && (str[4]<='z') ) sum = sum + 1;
if ( (str[5]>='a') && (str[5]<='z') ) sum = sum + 1;

上面程式碼每一行是不是很像? 每一行程式就是針對 str 每一個字作處理。
if ( (str[0]>='a') && (str[0]<='z') ) sum = sum + 1; 的意思是
如果 str 第 0 字是在 'a' 與 'z' 的範圍內,則 sum + 1 (計數)
依此類推到第 5 字 str[5] (剛好 6 個字)

上面程式碼可以再變形成:
sum = sum + ( (str[0]>='a') && (str[0]<='z') ? 1 : 0 );
sum = sum + ( (str[1]>='a') && (str[1]<='z') ? 1 : 0 );
sum = sum + ( (str[2]>='a') && (str[2]<='z') ? 1 : 0 );
sum = sum + ( (str[3]>='a') && (str[3]<='z') ? 1 : 0 );
sum = sum + ( (str[4]>='a') && (str[4]<='z') ? 1 : 0 );
sum = sum + ( (str[5]>='a') && (str[5]<='z') ? 1 : 0 );

在 'a' 與 'z' 的範圍判斷不變情況下,使用三元運算傳回 1 或 0 。因此
sum = sum + ( (str[0]>='a') && (str[0]<='z') ? 1 : 0 ) 的意思是:
如果 str 第 0 字是在 'a' 與 'z' 的範圍內,則 sum + 1,否則 sum + 0

上面程式碼可以再變形成:
sum = sum + ( (str[0]>='a') && (str[0]<='z') );
sum = sum + ( (str[1]>='a') && (str[1]<='z') );
sum = sum + ( (str[2]>='a') && (str[2]<='z') );
sum = sum + ( (str[3]>='a') && (str[3]<='z') );
sum = sum + ( (str[4]>='a') && (str[4]<='z') );
sum = sum + ( (str[5]>='a') && (str[5]<='z') );

利用 C 對邏輯運算結果為 true 時,轉型 int 會變成 1,false 會變成 0 。因此
sum = sum + ( (str[0]>='a') && (str[0]<='z') ); 的意思是:
如果 str 第 0 字是在 'a' 與 'z' 的範圍內,則 sum + true,否則 sum + false
又因 true = 1,false = 0,所以變成:
如果 str 第 0 字是在 'a' 與 'z' 的範圍內,則 sum + 1,否則 sum + 0

再讓指令簡潔一點,於是變成如下程式碼:
sum += ( (str[0]>='a') && (str[0]<='z') );
sum += ( (str[1]>='a') && (str[1]<='z') );
sum += ( (str[2]>='a') && (str[2]<='z') );
sum += ( (str[3]>='a') && (str[3]<='z') );
sum += ( (str[4]>='a') && (str[4]<='z') );
sum += ( (str[5]>='a') && (str[5]<='z') );

ppt 範例教學

(二) 壘計
針對問題,某些數的總和,例如等差級數的和,需使用累計技巧,
下面範例介紹計算等差數列1、2、3、4、5 的和。

sum = 0;
sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
sum = sum + 4;
sum = sum + 5;

上面範例針對每一數做累計,若寫成 sum = 1+2+3+4+5; 雖然結果一樣,
但無法移植到重覆結構。
ppt 範例可以參考下面單元 重複結構 for 指令。