2017年11月5日 星期日

[C_ST21-易] 文字及字母出現次數(C++)

**如果看不懂可以在底下留言發問**

**試著看懂別人的程式碼也是一種學習^ ^**

[C_ST21-易] 文字及字母出現次數

問題描述 :
在電腦科學上 ,計算一串文字上各個字母出現的頻率是常被用到的技術,這對壓縮來講是很重要的資訊,而計算字數也可以幫助人們作校正的工具。一行文字被空白、逗點或是句點所分隔而形成很多字,例如 ”I have a pencil.” 這行字就有 I , have , a , pencil 這四個字,即此行字數為 4 。所以現在要請你幫忙設計一個程式來計算一行文字的字 數及各個字母出現的次數。
輸入說明 :
輸入一行正常的英文文字,也就是不要有開頭是空白或是有連續兩個 空白的情形發生,並且內容只能包含英文字母、空白、逗點、句點。 注意 : 輸入的字串長度最多是 100 。
輸出說明 :
第一行輸出一個正整數 n ,表示此行文字的字數。 第二行開始依序輸出在此行文字中有出現的字母及出現的次數。 注意 : 大小寫要分開計算。
格式:出現的字母(空格):(空格)出現的次數
範例 :

Sample Input:Sample Output:
I had a dog4
a : 2
d : 2
g : 1
h : 1
I : 1
o : 1



  1. #include <iostream>  
  2. #include <string.h> //strcpy()    
  3. using namespace std;  
  4.   
  5. int main() {  
  6.     // [C_ST21-易] 文字及字母出現次數  
  7.     string text;  //輸入的字串  
  8.     int len = 0; //有多少句子  
  9.     getline(cin, text);//使用者輸入(整行讀取包含空白)  
  10.     int arr[26][2];//儲存大小寫英文的數量,[0]大寫,[1]小寫  
  11.     int count = text.size();//string 長度      
  12.      char result[count]; //存入結果      
  13.      strcpy(result, text.c_str());//string to char   
  14.      for(int i = 0;i < 26;i++)//陣列歸零  
  15.      {  
  16.         for(int j = 0;j < 2;j++)  
  17.         {  
  18.             arr[i][j] = 0;  
  19.         }  
  20.      }  
  21.      for(int i = 0;i < count;i++)  
  22.      {  
  23.         if(result[i] == 32 || result[i] == 46)  
  24.         //因為逗號後面都有一個空白,所以逗號不用算,算逗號後的空白即可  
  25.         {  
  26.             len++;  
  27.         }  
  28.         else if(90 >= result[i] && result[i] >= 65)//大寫  
  29.         {  
  30.             arr[result[i]-65][0]++;  
  31.         }  
  32.         else if(122 >= result[i] && result[i] >= 97)//小寫  
  33.         {  
  34.             arr[result[i]-97][1]++;  
  35.         }  
  36.           
  37.      }  
  38.      if((result[count-1] == 32 || result[count-1] == 44 || result[count-1] == 46)&&(result[0] == 32 || result[0] == 44 || result[0] == 46))  
  39.         {  
  40.             cout << len-1 << endl;  
  41.         }  
  42.      else if((result[count-1] == 32 || result[count-1] == 44 || result[count-1] == 46)||(result[0] == 32 || result[0] == 44 || result[0] == 46))  
  43.      {  
  44.         cout << len << endl;  
  45.      }  
  46.      else  
  47.      {  
  48.         cout << len+1 << endl;  
  49.      }  
  50.        
  51.      for(int i = 0;i < 26;i++)  
  52.      {  
  53.         for(int j = 0;j < 2;j++)  
  54.         {  
  55.             if(arr[i][j] != 0)  
  56.             {  
  57.                 if(j==0)//大寫  
  58.                 {  
  59.                     cout << char(i+65) << " : " << arr[i][j]<< endl;      
  60.                 }  
  61.                 if(j==1)//小寫  
  62.                 {  
  63.                     cout << char(i+97) << " : " << arr[i][j]<< endl;  
  64.                 }  
  65.             }  
  66.         }  
  67.      }  
  68.     return 0;  
  69. }  

沒有留言:

張貼留言