2010-03-08 73 views
1

我遇到了一段時間以來我一直在努力的作業問題。 我不確切地知道爲什麼這個問題是要問的,需要澄清一些問題並推動正確的方向。計算包含在與C數組中的字母字符

這裏是這樣的問題:

(2)解決使用計數器的一個單標數組這個問題。該程序使用C初始化功能定義的一組字符。該程序計算每個字母字符a到z的編號(僅對小寫字符進行計數),並打印出一個報告(在整潔的表格中)找到的每個小寫字符的出現次數。只打印出現至少一次字母的計數。如果計數爲零,則不打印計數。不要在解決方案中使用switch語句。注意:如果x是char類型,則x-'a'是x中字符和字符'a'的ASCII碼之間的差異。例如,如果x保存字符'c',則x-'a'的值爲2,而如果x保存字符'd',則x-'a'的值爲3.使用以下字符串提供測試結果:

「這是文本鍛鍊(2)的例子。」

這裏是我的源代碼至今:

#include<stdio.h> 

int main() { 

    char c[] = "This is an example of text for exercise (2)."; 
    char d[26]; 

    int i; 
    int j = 0; 
    int k; 

    j = 0; 

    //char s = 97; 

    for(i = 0; i < sizeof(c); i++) { 
     for(s = 'a'; s < 'z'; s++){ 
      if(c[i] == s){ 

       k++; 
       printf("%c,%d\n", s, k); 
       k = 0; 

      } 
     } 
    } 
    return 0; 

} 

正如你看到的,我目前的解決方案是一個貧血。 感謝您的幫助,我知道網上的每個人都不一定喜歡幫助其他人的作業。 ,P

回答

2
char c[] = "This is an example of text for exercise (2)."; 
int d[26] = {0}, i, value; 

for(i=0; i < sizeof(c) - 1; i++){ //-1 to exclude terminating NULL 
    value = c[i]-'a'; 
    if(value < 26 && value >= 0) d[value]++; 
} 

for(i=0; i < 26; i++){ 
    if(d[i]) printf("Alphabet-%c Count-%d\n", 'a'+i, d[i]); 
} 

校正。謝謝caf和Leffler。

+0

謝謝你,我看我是怎麼想的答案了複雜化。 – Craig 2010-03-08 05:45:02

+1

該解決方案寫入數組'd'的定義範圍之外。 – caf 2010-03-08 05:45:03

+1

這有問題 - 空間,圓括號,數字,點(和終端NUL)呢? – 2010-03-08 05:45:15

2

這個問題的目的是讓你弄清楚如何有效地將'a''z'之間的字符轉換爲0到25之間的一個索引。顯然你可以假定ASCII(儘管C標準不能保證任何特定的字符集),其具有字符'a''z'的值是連續的有用屬性。

一旦你這樣做了,你可以增加數組中相應的插槽d(注意,你需要初始化該數組爲0開始,這可以簡單地用char d[26] = { 0 };完成。 ,您將掃描陣列d,並打印出大於零的計數以及相應的字符(這將涉及逆向轉換 - 從索引0到25轉換爲字符'a''z')。

2

對您而言,幸運的是,您似乎不需要生產可在EBCDIC機器(大型機)上運行的解決方案。

你內環需要由條件所取代:

if (c[i] is lower-case alphabetic) 
    increment the appropriate count in the d-array 

結束串後,您就需要一個遍歷d陣列掃描,打印出相應的條目,並計數信與之相關聯。

你的d數組使用'char'作爲計數;這對於練習是可以的,但是您可能需要使用更大的整數類型作爲通用解決方案。你也應該確保它被初始化爲全零;很難從隨機垃圾中獲得有意義的信息(並且語言不能保證垃圾以外的任何東西都會存放在d-array所在的堆棧中)。

0

for(s = 'a'; s < 'z'; s++){ 
    j=0; 
    for(i = 0; i < sizeof(c); i++) { 
     if(c[i] == s) 
      j++; 
    } 
    if (j > 0) 
     printf("%c,%d\n", s, j); 
} 
+0

你確定嗎?你嘗試過運行它嗎? – 2010-03-08 05:47:01

+0

我運行它,if語句中有一些缺失的括號,但除了一些小的語法錯誤,它很好。 – Craig 2010-03-08 05:53:59

+0

好的 - 我把自己的縮進視爲準確。不喜歡K&R放置大括號的另一個原因。 – 2010-03-08 06:00:27

0
char c[] = "This is an example of text for exercise (2)."; 
char d[26]; 
int i; 
int j; 

for(i = 0; i < 26; i++) 
{ 
    d[i] = 0; // Set the frequency of the letter to zero before we start counting. 
    for(j = 0; j < strlen(c); j++) 
    { 
     if(c[j] == i + 'a') 
      d[i]++; 
    } 
    if(d[i] > 0) // If the frequency of the letter is greater than 0, show it. 
     printf("%c - %d\n", (i + 'a'), d[i]); 
} 
相關問題