2009-11-14 103 views
0

這是作業!但我無論如何需要幫助。分配是輸入一個句子,然後輸出單詞的數量,以及每個字母的出現次數。輸出必須按字母順序排列。到目前爲止,我已經能夠計算單詞的數量,並將所有的字母都寫成小寫字母,這樣我就可以繼續計數。我的問題是如何實際保持字母的數量。輸出的 例子:C++字符串操作/輸入

I say Hi. 

3 words 
1 a 
1 h 
2 i 
1 s 
1 y 

下面是我到目前爲止的代碼:

#include <iostream> 
#include <string> 
#include <cctype> 

using namespace std; 

int main() 
{ 
    int letters[26]; 
    char letter; 
    int word = 0; 

    cout << "Please enter a sentence: "<< endl; 

    do 
     { 
     cin.get(letter); 
     if(isspace(letter)) 
      word++; 

     letter = tolower(letter); 
     cout << letter; 

     } 
    while (letter != '\n'); 


cout << "The number of words = " << word << endl; 

return 0; 

} 

我應該直接輸入到一個C-字符串?或者會把這個字數搞亂?

+1

你聲明的那些字母[26]數組的目的是什麼? – 2009-11-14 21:47:28

+1

如果您的輸入包含前導,尾隨或冗餘空間,您的wordcount會如何撰寫? 「我說嗨。「 – pilcrow 2009-11-14 21:53:36

+0

我知道某個地方我應該有一個數組來保持字母出現的次數 就字數而言,我沒有編碼來防止冗餘空間,我知道這是一個潛在的問題,但我我只是試圖寫出基本的代碼 我有一個可怕的傾向,讓我的代碼比實際更困難 – MageWyntyr 2009-11-16 00:36:07

回答

3

如果您可以使用STL,請使用std :: map將字母映射到計數器。它還會對信件進行分類。

否則,將字符視爲計數器數組中的索引並對其進行增加。

+0

std :: map已經結束了,你不需要設置整個紅色 - 只有26個節點的黑樹,當一個簡單的連續數組可以正常工作時 – 2009-11-14 22:21:53

0

提示:tolower的(字母) - 'A' 是:

0 if letter is a 
1 if letter is b 
... 
0

嗯,只是幾個點,讓您的家的任務更有助於你(和你的代碼更正確):

  • 想想如果你的文件連續有幾個空格(單詞計數)會發生什麼情況。
  • 想想如何用'字母'更正確(至少檢查isalpha())。同樣,isalpha()對於使用固定數組[256]更簡單的計數來說可能是關鍵(這可能甚至是性能vs std :: map使用的最佳解決方案,無論如何都要檢查std :: map文檔)。
  • 想想更有效的文件輸入。至少要立即行。
3

我的問題是如何真正保持字母

這是相當直截了當的 計數。只需創建一個由26個整數組成的數組(每個字母一個),並將其初始化爲零。

int letters[26] = { 0 }; // Initialize array to zero

數組中的每個值對應於一個特定的字母的計數。數組索引0引用'a',數組索引1引用'b',依此類推。然後,每次遇到一封信時,都會在數組中增加適當的值。您可以使用字符'a'(ASCII值97)作爲起始偏移量。因此,考慮到變量char letter;你會做:

++letters[tolower(letter) - 'a']; 

但始終確保你遞增數組中的相應值之前,你檢查isalpha(letter) && islower(letter),以確保你的信是小寫的範圍AZ;否則您將訪問超出數組邊界的索引。您也可以通過說if (letter >= 'a' && letter <= 'z')來測試這種情況。

+0

準確地說,我想說的是,char的長度只有一個字節(通常是8位),因此你可以執行任何整數運算如果你不熟悉ASCII表是什麼,那麼谷歌它應該更有意義。 – 2009-11-14 22:17:55