2012-09-12 59 views
1

我正在研究這個練習,想知道我的答案是否正確;K&R練習1-14解答

編寫一個程序,打印輸入中不同 字符頻率的直方圖。

我在網上看到了其他一些答案,但它們與我的差異很大。此外,如果我的代碼格式有任何問題或需要做出任何改進。歡迎任何建議。我不知道這個問題需要一個直方圖,但是一旦我有所需的數據,就可以很容易地創建一個。

#include <stdio.h> 
int main(){ 

    int userInput; 
    int arrayStuff[92]; 
    int i, j; 

    for(i = 0; i < 92; ++i){ 
     arrayStuff[i] = 0; 
    } 

    while((userInput = getchar()) != '\n'){ 
     if(userInput >= 30 && userInput <= 122){ 
      if(userInput != '\n'){ 
       ++arrayStuff[(userInput-30)]; 
      } 

      if(userInput == '\n'){ 
       break; 
      } 
     } 
    } 

    printf("Case\t|\tOccurances\n"); 

    for(i = 0; i < 92; ++i){ 
     printf("%c\t|\t%d\n", (i+30), arrayStuff[i]); 
    } 
} 
+0

'if(userInput =='\ n')'可以作爲'else',儘管'userInput'在循環中永遠不會是''n''。 – oldrinb

+3

問題是什麼?如果你想檢查你的代碼 - 它可能更適合[codereview.SE](http://codereview.stackexchange.com/) – amit

+0

我提供了包括實際問題和我的問題在內的所有內容。 – Andrei0427

回答

1

改進我會做:

  • 聲明並一氣呵成初始化int arrayStuff[92] = { 0 };和循環擺脫。這是保證將所有元素設置爲0.
  • 不要在各個地方使用幻數92,而應使用(sizeof arrayStuff/sizeof arrayStuff[0])來計算arrayStuff中的元素數量。
  • 括號中(1 + 30)是多餘的
  • 會發生什麼,如果用戶鍵入的字符EOF?它看起來像它永遠循環。
  • 「Occurances」不在我的字典中,而是出現。也許角色頻率是一個更好的術語?
  • arrayStuff?我不能過分強調簡潔明瞭的標識符命名的重要性。頻率浮現在腦海。
  • 它必須是int main (void)return 0;。這不是C++,其中一個空的參數列表等同於void。這是C,其中一個空參數列表的意思是「我是一箇舊式K & R參數列表,用於未知但固定數量的參數。」
0

Jens提到了92的「幻數」。幻數是你的代碼中的數字文字。建議避免使用它們,因爲如果將其替換爲常量變量名稱或MACRO名稱或計算,可以更容易地理解該值的用途或含義。我認爲30和122也會被視爲「神奇數字」。此代碼在輸入任何非圖形字符時終止。這意味着如果輸入標籤,它將停止,並且不會計算標籤字符,這可能不正確。

#include <stdio.h> 
#include <stdlib.h> 

#define FIRST_GRAPHIC_CHAR 32 
#define LAST_GRAPHIC_CHAR 126 
#define NUM_GRAPHIC_CHARS (LAST_GRAPHIC_CHAR - FIRST_GRAPHIC_CHAR + 1) 


int main(void) 
{ 

    int userInput; 
    int arrayStuff[NUM_GRAPHIC_CHARS] = {0}; 
    int i; 

    printf("enter a string of characters followed by <return>\n"); 

    userInput = getchar(); 
    while(userInput >= FIRST_GRAPHIC_CHAR && userInput <= LAST_GRAPHIC_CHAR) 
    { 
     ++arrayStuff[(userInput - FIRST_GRAPHIC_CHAR)]; 
     userInput = getchar(); 
    } 

    printf("Case\t|\tOccurances\n"); 

    for(i = 0; i < NUM_GRAPHIC_CHARS; ++i) 
    { 
     if ( i + FIRST_GRAPHIC_CHAR == ' ') 
      printf("<spc>\t|\t%d\n", arrayStuff[i]); 
     else 
      printf("%c\t|\t%d\n", (i + FIRST_GRAPHIC_CHAR), arrayStuff[i]); 
    } 
    return EXIT_SUCCESS; 
} 
+0

'return 0;'可能適用於C89。 – Jens

+0

@Jens對。我加了EXIT_SUCCESS,因爲我們正在談論魔術數字,但實際上並不知道C89時代是否會出現這種情況。 – Scooter

+0

那麼,根據這個帖子http://coding.derkeiler.com/Archive/C_CPP/comp.lang.c/2003-11/4816.html那是。 – Scooter