| 
統計在程式設計裡面,佔有相當重要角色,無論是實用上或是比賽,都會遇到, 
出現率幾乎百分之百,以下介紹常用統計技巧。 
 
統計技巧 
  | (一)  | 計數 
 |  
  
     | 
    假設隨機輸入一字串為 "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 指令。 
      
 
  | 
   
 
 
 
 |